Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
5.9 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: Lightmap only shader
  4. //
  5. // $Header: $
  6. // $NoKeywords: $
  7. //=============================================================================//
  8. #include "BaseVSShader.h"
  9. #include "shatteredglass.inc"
  10. #include "shatteredglass_envmap.inc"
  11. #include "shatteredglass_envmapsphere.inc"
  12. // memdbgon must be the last include file in a .cpp file!!!
  13. #include "tier0/memdbgon.h"
  14. BEGIN_VS_SHADER( ShatteredGlass_DX8,
  15. "Help for ShatteredGlass_DX8" )
  16. BEGIN_SHADER_PARAMS
  17. SHADER_PARAM( DETAIL, SHADER_PARAM_TYPE_TEXTURE, "shadertest/Detail", "detail" )
  18. SHADER_PARAM( DETAILTRANSFORM, SHADER_PARAM_TYPE_MATRIX, "center .5 .5 scale 1 1 rotate 0 translate 0 0", "detail scale" )
  19. SHADER_PARAM( ENVMAP, SHADER_PARAM_TYPE_TEXTURE, "shadertest/shadertest_env", "envmap" )
  20. SHADER_PARAM( ENVMAPFRAME, SHADER_PARAM_TYPE_INTEGER, "", "" )
  21. SHADER_PARAM( ENVMAPTINT, SHADER_PARAM_TYPE_COLOR, "[1 1 1]", "envmap tint" )
  22. SHADER_PARAM( UNLITFACTOR, SHADER_PARAM_TYPE_FLOAT, "0.7", "0.0 == multiply by lightmap, 1.0 == multiply by 1" )
  23. END_SHADER_PARAMS
  24. SHADER_INIT_PARAMS()
  25. {
  26. if( !params[ENVMAPTINT]->IsDefined() )
  27. {
  28. params[ENVMAPTINT]->SetVecValue( 1.0f, 1.0f, 1.0f );
  29. }
  30. if( !params[UNLITFACTOR]->IsDefined() )
  31. {
  32. params[UNLITFACTOR]->SetFloatValue( 0.3f );
  33. }
  34. // No texture means no self-illum or env mask in base alpha
  35. if ( !params[BASETEXTURE]->IsDefined() )
  36. {
  37. CLEAR_FLAGS( MATERIAL_VAR_BASEALPHAENVMAPMASK );
  38. }
  39. // If in decal mode, no debug override...
  40. if (IS_FLAG_SET(MATERIAL_VAR_DECAL))
  41. {
  42. SET_FLAGS( MATERIAL_VAR_NO_DEBUG_OVERRIDE );
  43. }
  44. }
  45. SHADER_FALLBACK
  46. {
  47. if ( IsPC() && g_pHardwareConfig->GetDXSupportLevel() < 80 )
  48. {
  49. return "ShatteredGlass_DX7";
  50. }
  51. return 0;
  52. }
  53. SHADER_INIT
  54. {
  55. if ( params[BASETEXTURE]->IsDefined() )
  56. {
  57. LoadTexture( BASETEXTURE );
  58. if ( !params[BASETEXTURE]->GetTextureValue()->IsTranslucent() )
  59. {
  60. if ( IS_FLAG_SET( MATERIAL_VAR_BASEALPHAENVMAPMASK ) )
  61. {
  62. CLEAR_FLAGS( MATERIAL_VAR_BASEALPHAENVMAPMASK );
  63. }
  64. }
  65. }
  66. if ( params[DETAIL]->IsDefined() )
  67. {
  68. LoadTexture( DETAIL );
  69. }
  70. if ( params[ENVMAP]->IsDefined())
  71. {
  72. LoadCubeMap( ENVMAP );
  73. }
  74. }
  75. SHADER_DRAW
  76. {
  77. bool bHasEnvmap = params[ENVMAP]->IsTexture();
  78. bool bHasVertexColor = IS_FLAG_SET(MATERIAL_VAR_VERTEXCOLOR);
  79. // Base
  80. SHADOW_STATE
  81. {
  82. // alpha test
  83. pShaderShadow->EnableAlphaTest( IS_FLAG_SET(MATERIAL_VAR_ALPHATEST) );
  84. // Alpha blending, enable alpha blending if the detail texture is translucent
  85. bool detailIsTranslucent = TextureIsTranslucent( DETAIL, false );
  86. if ( detailIsTranslucent )
  87. {
  88. if ( IS_FLAG_SET( MATERIAL_VAR_ADDITIVE ) )
  89. EnableAlphaBlending( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE );
  90. else
  91. EnableAlphaBlending( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE_MINUS_SRC_ALPHA );
  92. }
  93. else
  94. {
  95. SetDefaultBlendingShadowState( BASETEXTURE, true );
  96. }
  97. // Base texture and envmapmask
  98. unsigned int flags = VERTEX_POSITION;
  99. pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
  100. // Lightmap
  101. pShaderShadow->EnableTexture( SHADER_SAMPLER1, true );
  102. // Detail texture
  103. pShaderShadow->EnableTexture( SHADER_SAMPLER3, true );
  104. // Envmap
  105. if ( bHasEnvmap )
  106. {
  107. flags |= VERTEX_NORMAL;
  108. pShaderShadow->EnableTexture( SHADER_SAMPLER2, true );
  109. }
  110. if ( bHasVertexColor )
  111. {
  112. flags |= VERTEX_COLOR;
  113. }
  114. pShaderShadow->VertexShaderVertexFormat( flags, 3, 0, 0 );
  115. Assert( !bHasVertexColor );
  116. if ( !bHasEnvmap )
  117. {
  118. shatteredglass_Static_Index vshIndex;
  119. pShaderShadow->SetVertexShader( "shatteredglass", vshIndex.GetIndex() );
  120. pShaderShadow->SetPixelShader( "shatteredglass" );
  121. }
  122. else
  123. {
  124. if ( !IS_FLAG_SET(MATERIAL_VAR_ENVMAPSPHERE) )
  125. {
  126. shatteredglass_envmap_Static_Index vshIndex;
  127. pShaderShadow->SetVertexShader( "shatteredglass_envmap", vshIndex.GetIndex() );
  128. }
  129. else
  130. {
  131. shatteredglass_envmapsphere_Static_Index vshIndex;
  132. pShaderShadow->SetVertexShader( "shatteredglass_envmapsphere", vshIndex.GetIndex() );
  133. }
  134. pShaderShadow->SetPixelShader( "shatteredglass_envmap" );
  135. }
  136. DefaultFog();
  137. }
  138. DYNAMIC_STATE
  139. {
  140. SetVertexShaderTextureTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_0, BASETEXTURETRANSFORM );
  141. SetVertexShaderTextureTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_2, DETAILTRANSFORM );
  142. BindTexture( SHADER_SAMPLER0, BASETEXTURE, FRAME );
  143. pShaderAPI->BindStandardTexture( SHADER_SAMPLER1, TEXTURE_LIGHTMAP );
  144. BindTexture( SHADER_SAMPLER3, DETAIL );
  145. if( !bHasEnvmap )
  146. {
  147. shatteredglass_Dynamic_Index vshIndex;
  148. vshIndex.SetDOWATERFOG( pShaderAPI->GetSceneFogMode() == MATERIAL_FOG_LINEAR_BELOW_FOG_Z );
  149. pShaderAPI->SetVertexShaderIndex( vshIndex.GetIndex() );
  150. }
  151. else
  152. {
  153. BindTexture( SHADER_SAMPLER2, ENVMAP, ENVMAPFRAME );
  154. if ( !IS_FLAG_SET(MATERIAL_VAR_ENVMAPSPHERE) )
  155. {
  156. shatteredglass_envmap_Dynamic_Index vshIndex;
  157. vshIndex.SetDOWATERFOG( pShaderAPI->GetSceneFogMode() == MATERIAL_FOG_LINEAR_BELOW_FOG_Z );
  158. pShaderAPI->SetVertexShaderIndex( vshIndex.GetIndex() );
  159. }
  160. else
  161. {
  162. shatteredglass_envmapsphere_Dynamic_Index vshIndex;
  163. vshIndex.SetDOWATERFOG( pShaderAPI->GetSceneFogMode() == MATERIAL_FOG_LINEAR_BELOW_FOG_Z );
  164. pShaderAPI->SetVertexShaderIndex( vshIndex.GetIndex() );
  165. }
  166. }
  167. if (IS_FLAG_SET(MATERIAL_VAR_ENVMAPSPHERE) || IS_FLAG_SET(MATERIAL_VAR_ENVMAPCAMERASPACE))
  168. {
  169. LoadViewMatrixIntoVertexShaderConstant( VERTEX_SHADER_VIEWMODEL );
  170. }
  171. SetModulationVertexShaderDynamicState();
  172. EnablePixelShaderOverbright( 0, true, true );
  173. SetPixelShaderConstant( 2, ENVMAPTINT );
  174. // Blend between lightmap + unlit based on the unlit factor to make it look better
  175. float flUnlitFactor[4];
  176. flUnlitFactor[0] = flUnlitFactor[1] = flUnlitFactor[2] = flUnlitFactor[3] = params[UNLITFACTOR]->GetFloatValue();
  177. pShaderAPI->SetPixelShaderConstant( 3, flUnlitFactor, 1 );
  178. }
  179. Draw();
  180. }
  181. END_SHADER