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.

181 lines
5.6 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #include "BaseVSShader.h"
  8. #include "convar.h"
  9. #include "d3dx.h"
  10. DEFINE_FALLBACK_SHADER( PortalStaticOverlay, PortalStaticOverlay_DX60 );
  11. BEGIN_VS_SHADER( PortalStaticOverlay_DX60,
  12. "Help for PortalStaticOverlay_DX60 shader" )
  13. BEGIN_SHADER_PARAMS
  14. SHADER_PARAM_OVERRIDE( COLOR, SHADER_PARAM_TYPE_COLOR, "{255 255 255}", "unused", SHADER_PARAM_NOT_EDITABLE )
  15. SHADER_PARAM_OVERRIDE( ALPHA, SHADER_PARAM_TYPE_FLOAT, "1.0", "unused", SHADER_PARAM_NOT_EDITABLE )
  16. SHADER_PARAM( STATICAMOUNT, SHADER_PARAM_TYPE_FLOAT, "0.0", "Amount of the static blend texture to blend into the base texture" )
  17. SHADER_PARAM( STATICBLENDTEXTURE, SHADER_PARAM_TYPE_TEXTURE, "", "When adding static, this is the texture that gets blended in" )
  18. SHADER_PARAM( STATICBLENDTEXTUREFRAME, SHADER_PARAM_TYPE_INTEGER, "0", "" )
  19. SHADER_PARAM( ALPHAMASKTEXTURE, SHADER_PARAM_TYPE_TEXTURE, "", "An alpha mask for odd shaped portals" )
  20. SHADER_PARAM( ALPHAMASKTEXTUREFRAME, SHADER_PARAM_TYPE_INTEGER, "0", "" )
  21. SHADER_PARAM( NOCOLORWRITE, SHADER_PARAM_TYPE_INTEGER, "0", "" )
  22. END_SHADER_PARAMS
  23. SHADER_INIT_PARAMS()
  24. {
  25. SET_FLAGS( MATERIAL_VAR_TRANSLUCENT );
  26. }
  27. SHADER_FALLBACK
  28. {
  29. return 0;
  30. }
  31. SHADER_INIT
  32. {
  33. if( params[STATICBLENDTEXTURE]->IsDefined() )
  34. LoadTexture( STATICBLENDTEXTURE );
  35. if( params[ALPHAMASKTEXTURE]->IsDefined() )
  36. LoadTexture( ALPHAMASKTEXTURE );
  37. if( !params[STATICAMOUNT]->IsDefined() )
  38. params[STATICAMOUNT]->SetFloatValue( 0.0f );
  39. if( !params[STATICBLENDTEXTURE]->IsDefined() )
  40. params[STATICBLENDTEXTURE]->SetIntValue( 0 );
  41. if( !params[STATICBLENDTEXTUREFRAME]->IsDefined() )
  42. params[STATICBLENDTEXTUREFRAME]->SetIntValue( 0 );
  43. if( !params[ALPHAMASKTEXTURE]->IsDefined() )
  44. params[ALPHAMASKTEXTURE]->SetIntValue( 0 );
  45. if( !params[ALPHAMASKTEXTUREFRAME]->IsDefined() )
  46. params[ALPHAMASKTEXTUREFRAME]->SetIntValue( 0 );
  47. if( !params[NOCOLORWRITE]->IsDefined() )
  48. params[NOCOLORWRITE]->SetIntValue( 0 );
  49. }
  50. SHADER_DRAW
  51. {
  52. SHADOW_STATE
  53. {
  54. SetInitialShadowState();
  55. FogToFogColor();
  56. //pShaderShadow->EnablePolyOffset( SHADER_POLYOFFSET_DECAL ); //a portal is effectively a decal on top of a wall
  57. pShaderShadow->DepthFunc( SHADER_DEPTHFUNC_NEAREROREQUAL );
  58. pShaderShadow->EnableDepthWrites( true );
  59. pShaderShadow->EnableAlphaTest( true );
  60. pShaderShadow->EnableColorWrites( params[NOCOLORWRITE]->GetIntValue() == 0 );
  61. }
  62. DYNAMIC_STATE
  63. {
  64. pShaderAPI->SetDefaultState();
  65. }
  66. if( params[ALPHAMASKTEXTURE]->IsTexture() )
  67. StaticPass_WithAlphaMask( pShaderShadow, pShaderAPI, params ); //portal static texture blending, with an alpha mask
  68. else
  69. StaticPass_NoAlphaMask( pShaderShadow, pShaderAPI, params ); //portal static texture blending
  70. }
  71. void StaticPass_NoAlphaMask( IShaderShadow *pShaderShadow, IShaderDynamicAPI *pShaderAPI, IMaterialVar **params )
  72. {
  73. SHADOW_STATE
  74. {
  75. pShaderShadow->DrawFlags( SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD0 );
  76. pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
  77. pShaderShadow->EnableBlending( true );
  78. pShaderShadow->BlendFunc( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE_MINUS_SRC_ALPHA );
  79. pShaderShadow->EnableCustomPixelPipe( true );
  80. pShaderShadow->CustomTextureStages( 1 );
  81. pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
  82. SHADER_TEXCHANNEL_COLOR,
  83. SHADER_TEXOP_SELECTARG1,
  84. SHADER_TEXARG_TEXTURE, SHADER_TEXARG_TEXTURE );
  85. pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
  86. SHADER_TEXCHANNEL_ALPHA,
  87. SHADER_TEXOP_BLEND_CONSTANTALPHA,
  88. SHADER_TEXARG_ZERO, SHADER_TEXARG_ONE );
  89. }
  90. DYNAMIC_STATE
  91. {
  92. BindTexture( SHADER_SAMPLER0, STATICBLENDTEXTURE, STATICBLENDTEXTUREFRAME );
  93. pShaderAPI->Color4f( 0.0f, 0.0f, 0.0f, params[STATICAMOUNT]->GetFloatValue() );
  94. }
  95. Draw();
  96. SHADOW_STATE
  97. {
  98. pShaderShadow->EnableCustomPixelPipe( false );
  99. }
  100. }
  101. void StaticPass_WithAlphaMask( IShaderShadow *pShaderShadow, IShaderDynamicAPI *pShaderAPI, IMaterialVar **params )
  102. {
  103. SHADOW_STATE
  104. {
  105. pShaderShadow->DrawFlags( SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD0 | SHADER_DRAW_TEXCOORD1 );
  106. pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
  107. pShaderShadow->EnableTexture( SHADER_SAMPLER1, true );
  108. pShaderShadow->EnableBlending( true );
  109. pShaderShadow->BlendFunc( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE_MINUS_SRC_ALPHA );
  110. pShaderShadow->EnableCustomPixelPipe( true );
  111. pShaderShadow->CustomTextureStages( 2 );
  112. //portal static
  113. pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
  114. SHADER_TEXCHANNEL_COLOR,
  115. SHADER_TEXOP_SELECTARG1,
  116. SHADER_TEXARG_TEXTURE, SHADER_TEXARG_TEXTURE );
  117. pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
  118. SHADER_TEXCHANNEL_ALPHA,
  119. SHADER_TEXOP_BLEND_CONSTANTALPHA,
  120. SHADER_TEXARG_ZERO, SHADER_TEXARG_ONE );
  121. //alpha mask
  122. pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1,
  123. SHADER_TEXCHANNEL_COLOR,
  124. SHADER_TEXOP_SELECTARG1,
  125. SHADER_TEXARG_PREVIOUSSTAGE, SHADER_TEXARG_PREVIOUSSTAGE );
  126. pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1,
  127. SHADER_TEXCHANNEL_ALPHA,
  128. SHADER_TEXOP_MODULATE,
  129. SHADER_TEXARG_TEXTUREALPHA, SHADER_TEXARG_PREVIOUSSTAGE );
  130. }
  131. DYNAMIC_STATE
  132. {
  133. BindTexture( SHADER_SAMPLER0, STATICBLENDTEXTURE, STATICBLENDTEXTUREFRAME );
  134. BindTexture( SHADER_SAMPLER1, ALPHAMASKTEXTURE, ALPHAMASKTEXTUREFRAME );
  135. pShaderAPI->Color4f( 0.0f, 0.0f, 0.0f, params[STATICAMOUNT]->GetFloatValue() );
  136. }
  137. Draw();
  138. SHADOW_STATE
  139. {
  140. pShaderShadow->EnableCustomPixelPipe( false );
  141. }
  142. }
  143. END_SHADER