aboutsummaryrefslogtreecommitdiff
path: root/mp/src/materialsystem/stdshaders/worldvertextransition_dx6_helper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/materialsystem/stdshaders/worldvertextransition_dx6_helper.cpp')
-rw-r--r--mp/src/materialsystem/stdshaders/worldvertextransition_dx6_helper.cpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/mp/src/materialsystem/stdshaders/worldvertextransition_dx6_helper.cpp b/mp/src/materialsystem/stdshaders/worldvertextransition_dx6_helper.cpp
new file mode 100644
index 00000000..7539ff29
--- /dev/null
+++ b/mp/src/materialsystem/stdshaders/worldvertextransition_dx6_helper.cpp
@@ -0,0 +1,206 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "shaderlib/cshader.h"
+#include "worldvertextransition_dx6_helper.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+void InitParamsWorldVertexTransition_DX6( IMaterialVar** params, WorldVertexTransition_DX6_Vars_t &info )
+{
+ SET_FLAGS2( MATERIAL_VAR2_LIGHTING_LIGHTMAP );
+ // FLASHLIGHTFIXME
+ params[info.m_nFlashlightTextureVar]->SetStringValue( "effects/flashlight001" );
+}
+
+void InitWorldVertexTransition_DX6( CBaseShader *pShader, IMaterialVar** params, WorldVertexTransition_DX6_Vars_t &info )
+{
+ // FLASHLIGHTFIXME
+ if ( params[info.m_nFlashlightTextureVar]->IsDefined() )
+ {
+ pShader->LoadTexture( info.m_nFlashlightTextureVar );
+ }
+
+ if ( params[info.m_nBaseTextureVar]->IsDefined() )
+ {
+ pShader->LoadTexture( info.m_nBaseTextureVar );
+ }
+
+ if ( params[info.m_nBaseTexture2Var]->IsDefined() )
+ {
+ pShader->LoadTexture( info.m_nBaseTexture2Var );
+ }
+}
+
+static void DrawFlashlightPass( CBaseShader *pShader, IMaterialVar** params, IShaderDynamicAPI *pShaderAPI, IShaderShadow* pShaderShadow, int nPass, WorldVertexTransition_DX6_Vars_t &info )
+{
+ SHADOW_STATE
+ {
+ SET_FLAGS2( MATERIAL_VAR2_NEEDS_FIXED_FUNCTION_FLASHLIGHT );
+ pShaderShadow->EnableDepthWrites( false );
+ pShaderShadow->EnableAlphaWrites( false );
+
+ pShaderShadow->SetDiffuseMaterialSource( SHADER_MATERIALSOURCE_COLOR1 );
+ if( nPass == 0 )
+ {
+ pShader->EnableAlphaBlending( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE );
+ }
+ else
+ {
+ pShader->EnableAlphaBlending( SHADER_BLEND_ONE_MINUS_SRC_ALPHA, SHADER_BLEND_ONE );
+ }
+
+ int flags = SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD1 | SHADER_DRAW_COLOR | SHADER_DRAW_NORMAL;
+ pShaderShadow->DrawFlags( flags );
+ pShader->FogToBlack();
+
+ pShaderShadow->EnableLighting( true );
+
+ pShaderShadow->EnableCustomPixelPipe( true );
+ pShaderShadow->CustomTextureStages( 2 );
+
+ // color stage 0
+ // projected texture * vertex color (lighting)
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
+ SHADER_TEXCHANNEL_COLOR,
+ SHADER_TEXOP_MODULATE,
+ SHADER_TEXARG_TEXTURE,
+ SHADER_TEXARG_VERTEXCOLOR );
+
+ // color stage 1
+ // * base texture
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1,
+ SHADER_TEXCHANNEL_COLOR,
+ SHADER_TEXOP_MODULATE,
+ SHADER_TEXARG_TEXTURE, SHADER_TEXARG_PREVIOUSSTAGE );
+
+ // alpha stage 0
+ // get alpha from constant alpha * vertex color
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
+ SHADER_TEXCHANNEL_ALPHA,
+ SHADER_TEXOP_MODULATE,
+ SHADER_TEXARG_CONSTANTCOLOR, SHADER_TEXARG_VERTEXCOLOR );
+
+ // alpha stage 1
+ // get alpha from $basetexture
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1,
+ SHADER_TEXCHANNEL_ALPHA,
+ SHADER_TEXOP_MODULATE,
+ SHADER_TEXARG_TEXTURE, SHADER_TEXARG_PREVIOUSSTAGE );
+
+ pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
+ pShaderShadow->EnableTexture( SHADER_SAMPLER1, true );
+
+ // Shove the view position into texcoord 0 before the texture matrix.
+ pShaderShadow->TexGen( SHADER_TEXTURE_STAGE0, SHADER_TEXGENPARAM_EYE_LINEAR );
+ pShaderShadow->EnableTexGen( SHADER_TEXTURE_STAGE0, true );
+ }
+ DYNAMIC_STATE
+ {
+ pShader->SetFlashlightFixedFunctionTextureTransform( MATERIAL_TEXTURE0 );
+
+ // NOTE: This has to come after the loadmatrix since the loadmatrix screws with the
+ // transform flags!!!!!!
+ // Specify that we have XYZ texcoords that need to be divided by W before the pixel shader.
+ // NOTE Tried to divide XY by Z, but doesn't work.
+ pShaderAPI->SetTextureTransformDimension( SHADER_TEXTURE_STAGE0, 3, true );
+
+ pShader->BindTexture( SHADER_SAMPLER0, FLASHLIGHTTEXTURE, FLASHLIGHTTEXTUREFRAME );
+ if( nPass == 0 )
+ {
+ pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTexture2Var, -1 );
+ }
+ else
+ {
+ pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTextureVar, info.m_nBaseTextureFrameVar );
+ }
+ }
+ pShader->Draw();
+}
+
+
+void DrawWorldVertexTransition_DX6( CBaseShader *pShader, IMaterialVar** params, IShaderDynamicAPI *pShaderAPI, IShaderShadow* pShaderShadow, WorldVertexTransition_DX6_Vars_t &info )
+{
+ bool bHasFlashlight = pShader->UsingFlashlight( params );
+ if( bHasFlashlight )
+ {
+ DrawFlashlightPass( pShader, params, pShaderAPI, pShaderShadow, 0, info );
+ DrawFlashlightPass( pShader, params, pShaderAPI, pShaderShadow, 1, info );
+ return;
+ }
+
+ SHADOW_STATE
+ {
+ SET_FLAGS2( MATERIAL_VAR2_LIGHTING_LIGHTMAP );
+ pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
+ pShaderShadow->EnableTexture( SHADER_SAMPLER1, true );
+ pShaderShadow->OverbrightValue( SHADER_TEXTURE_STAGE1, OVERBRIGHT );
+
+ pShaderShadow->DrawFlags( SHADER_DRAW_COLOR | SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD1 | SHADER_DRAW_LIGHTMAP_TEXCOORD0 );
+ pShader->FogToFogColor();
+ }
+ DYNAMIC_STATE
+ {
+ //pShaderAPI->TexMinFilter( SHADER_TEXFILTERMODE_NEAREST );
+ //pShaderAPI->TexMagFilter( SHADER_TEXFILTERMODE_NEAREST );
+ pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTextureVar );
+ pShaderAPI->BindStandardTexture( SHADER_SAMPLER0, TEXTURE_LIGHTMAP );
+ }
+ pShader->Draw();
+
+ SHADOW_STATE
+ {
+ SET_FLAGS2( MATERIAL_VAR2_LIGHTING_LIGHTMAP );
+ pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
+ pShaderShadow->EnableTexture( SHADER_SAMPLER1, true );
+ pShaderShadow->EnableBlending( true );
+
+ pShaderShadow->EnableCustomPixelPipe( true );
+ pShaderShadow->CustomTextureStages( 2 );
+
+ // alpha and color stage 0
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
+ SHADER_TEXCHANNEL_ALPHA,
+ SHADER_TEXOP_SELECTARG1,
+ SHADER_TEXARG_TEXTURE,
+ SHADER_TEXARG_TEXTURE );
+
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0,
+ SHADER_TEXCHANNEL_COLOR,
+ SHADER_TEXOP_SELECTARG1,
+ SHADER_TEXARG_TEXTURE,
+ SHADER_TEXARG_TEXTURE );
+
+ // alpha and color stage 1
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1,
+ SHADER_TEXCHANNEL_ALPHA,
+ SHADER_TEXOP_MODULATE,
+ SHADER_TEXARG_TEXTURE,
+ SHADER_TEXARG_VERTEXCOLOR );
+
+ pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1,
+ SHADER_TEXCHANNEL_COLOR,
+ SHADER_TEXOP_MODULATE2X,
+ SHADER_TEXARG_PREVIOUSSTAGE,
+ SHADER_TEXARG_TEXTURE );
+
+ // Looks backwards, but this is done so that lightmap alpha = 1 when only
+ // using 1 texture (needed for translucent displacements).
+ pShaderShadow->BlendFunc( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE_MINUS_SRC_ALPHA );
+
+ pShaderShadow->DrawFlags( SHADER_DRAW_COLOR | SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD1 | SHADER_DRAW_LIGHTMAP_TEXCOORD0 );
+ pShader->FogToFogColor();
+ }
+ DYNAMIC_STATE
+ {
+ pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTexture2Var );
+ pShaderAPI->BindStandardTexture( SHADER_SAMPLER0, TEXTURE_LIGHTMAP );
+ }
+ pShader->Draw();
+}