aboutsummaryrefslogtreecommitdiff
path: root/mp/src/materialsystem/stdshaders/depthwrite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/materialsystem/stdshaders/depthwrite.cpp')
-rw-r--r--mp/src/materialsystem/stdshaders/depthwrite.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/mp/src/materialsystem/stdshaders/depthwrite.cpp b/mp/src/materialsystem/stdshaders/depthwrite.cpp
new file mode 100644
index 00000000..06d7690f
--- /dev/null
+++ b/mp/src/materialsystem/stdshaders/depthwrite.cpp
@@ -0,0 +1,207 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Header: $
+// $NoKeywords: $
+//=============================================================================//
+
+#include "BaseVSShader.h"
+
+#include "depthwrite_ps20.inc"
+#include "depthwrite_ps20b.inc"
+#include "depthwrite_vs20.inc"
+
+#if !defined( _X360 )
+#include "depthwrite_ps30.inc"
+#include "depthwrite_vs30.inc"
+#endif
+
+BEGIN_VS_SHADER_FLAGS( DepthWrite, "Help for Depth Write", SHADER_NOT_EDITABLE )
+
+ BEGIN_SHADER_PARAMS
+ SHADER_PARAM( ALPHATESTREFERENCE, SHADER_PARAM_TYPE_FLOAT, "", "Alpha reference value" )
+ SHADER_PARAM( COLOR_DEPTH, SHADER_PARAM_TYPE_BOOL, "0", "Write depth as color")
+ END_SHADER_PARAMS
+
+ SHADER_INIT_PARAMS()
+ {
+ SET_FLAGS2( MATERIAL_VAR2_SUPPORTS_HW_SKINNING );
+ }
+
+ SHADER_FALLBACK
+ {
+ if ( g_pHardwareConfig->GetDXSupportLevel() < 90 )
+ {
+ return "Wireframe";
+ }
+ return 0;
+ }
+
+ SHADER_INIT
+ {
+ }
+
+ SHADER_DRAW
+ {
+ bool bAlphaClip = IS_FLAG_SET( MATERIAL_VAR_ALPHATEST );
+ int nColorDepth = GetIntParam( COLOR_DEPTH, params, 0 );
+
+ SHADOW_STATE
+ {
+ // Set stream format (note that this shader supports compression)
+ unsigned int flags = VERTEX_POSITION | VERTEX_FORMAT_COMPRESSED;
+ int nTexCoordCount = 1;
+ int userDataSize = 0;
+ pShaderShadow->VertexShaderVertexFormat( flags, nTexCoordCount, NULL, userDataSize );
+
+ if ( nColorDepth == 0 )
+ {
+ // Bias primitives when rendering into shadow map so we get slope-scaled depth bias
+ // rather than having to apply a constant bias in the filtering shader later
+ pShaderShadow->EnablePolyOffset( SHADER_POLYOFFSET_SHADOW_BIAS );
+ }
+
+ // Turn off writes to color buffer since we always sample shadows from the DEPTH texture later
+ // This gives us double-speed fill when rendering INTO the shadow map
+ pShaderShadow->EnableColorWrites( ( nColorDepth == 1 ) );
+ pShaderShadow->EnableAlphaWrites( false );
+
+ // Don't backface cull unless alpha clipping, since this can cause artifacts when the
+ // geometry is clipped by the flashlight near plane
+ // If a material was already marked nocull, don't cull it
+ pShaderShadow->EnableCulling( IS_FLAG_SET(MATERIAL_VAR_ALPHATEST) && !IS_FLAG_SET(MATERIAL_VAR_NOCULL) );
+
+#ifndef _X360
+ if ( !g_pHardwareConfig->HasFastVertexTextures() )
+#endif
+ {
+ DECLARE_STATIC_VERTEX_SHADER( depthwrite_vs20 );
+ SET_STATIC_VERTEX_SHADER_COMBO( ONLY_PROJECT_POSITION, !bAlphaClip && IsX360() && !nColorDepth ); //360 needs to know if it *shouldn't* output texture coordinates to avoid shader patches
+ SET_STATIC_VERTEX_SHADER_COMBO( COLOR_DEPTH, nColorDepth );
+ SET_STATIC_VERTEX_SHADER( depthwrite_vs20 );
+
+ if ( bAlphaClip || g_pHardwareConfig->PlatformRequiresNonNullPixelShaders() || nColorDepth )
+ {
+ if( bAlphaClip )
+ {
+ pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
+ pShaderShadow->EnableSRGBRead( SHADER_SAMPLER0, true );
+ }
+
+ if( g_pHardwareConfig->SupportsPixelShaders_2_b() )
+ {
+ DECLARE_STATIC_PIXEL_SHADER( depthwrite_ps20b );
+ SET_STATIC_PIXEL_SHADER_COMBO( COLOR_DEPTH, nColorDepth );
+ SET_STATIC_PIXEL_SHADER( depthwrite_ps20b );
+ }
+ else
+ {
+ DECLARE_STATIC_PIXEL_SHADER( depthwrite_ps20 );
+ SET_STATIC_PIXEL_SHADER_COMBO( COLOR_DEPTH, nColorDepth );
+ SET_STATIC_PIXEL_SHADER( depthwrite_ps20 );
+ }
+ }
+ }
+#ifndef _X360
+ else
+ {
+ SET_FLAGS2( MATERIAL_VAR2_USES_VERTEXID );
+
+ DECLARE_STATIC_VERTEX_SHADER( depthwrite_vs30 );
+ SET_STATIC_VERTEX_SHADER_COMBO( ONLY_PROJECT_POSITION, 0 ); //360 only combo, and this is a PC path
+ SET_STATIC_VERTEX_SHADER_COMBO( COLOR_DEPTH, nColorDepth );
+ SET_STATIC_VERTEX_SHADER( depthwrite_vs30 );
+
+ pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
+ pShaderShadow->EnableSRGBRead( SHADER_SAMPLER0, true );
+
+ DECLARE_STATIC_PIXEL_SHADER( depthwrite_ps30 );
+ SET_STATIC_PIXEL_SHADER_COMBO( COLOR_DEPTH, nColorDepth );
+ SET_STATIC_PIXEL_SHADER( depthwrite_ps30 );
+ }
+#endif
+ }
+ DYNAMIC_STATE
+ {
+
+#ifndef _X360
+ if ( !g_pHardwareConfig->HasFastVertexTextures() )
+#endif
+ {
+ depthwrite_vs20_Dynamic_Index vshIndex;
+ vshIndex.SetSKINNING( pShaderAPI->GetCurrentNumBones() > 0 );
+ vshIndex.SetCOMPRESSED_VERTS( (int)vertexCompression );
+ pShaderAPI->SetVertexShaderIndex( vshIndex.GetIndex() );
+
+ if ( bAlphaClip )
+ {
+ BindTexture( SHADER_SAMPLER0, BASETEXTURE, FRAME );
+
+ float vAlphaThreshold[4] = {0.7f, 0.7f, 0.7f, 0.7f};
+ if ( ALPHATESTREFERENCE != -1 && ( params[ALPHATESTREFERENCE]->GetFloatValue() > 0.0f ) )
+ {
+ vAlphaThreshold[0] = vAlphaThreshold[1] = vAlphaThreshold[2] = vAlphaThreshold[3] = params[ALPHATESTREFERENCE]->GetFloatValue();
+ }
+
+ pShaderAPI->SetPixelShaderConstant( 0, vAlphaThreshold, 1 );
+ }
+
+ if( g_pHardwareConfig->SupportsPixelShaders_2_b() )
+ {
+ DECLARE_DYNAMIC_PIXEL_SHADER( depthwrite_ps20b );
+ SET_DYNAMIC_PIXEL_SHADER_COMBO( ALPHACLIP, bAlphaClip );
+ SET_DYNAMIC_PIXEL_SHADER( depthwrite_ps20b );
+ }
+ else
+ {
+ DECLARE_DYNAMIC_PIXEL_SHADER( depthwrite_ps20 );
+ SET_DYNAMIC_PIXEL_SHADER_COMBO( ALPHACLIP, bAlphaClip );
+ SET_DYNAMIC_PIXEL_SHADER( depthwrite_ps20 );
+ }
+ }
+#ifndef _X360
+ else // 3.0 shader case (PC only)
+ {
+ SetHWMorphVertexShaderState( VERTEX_SHADER_SHADER_SPECIFIC_CONST_6, VERTEX_SHADER_SHADER_SPECIFIC_CONST_7, SHADER_VERTEXTEXTURE_SAMPLER0 );
+
+ depthwrite_vs30_Dynamic_Index vshIndex;
+ vshIndex.SetSKINNING( pShaderAPI->GetCurrentNumBones() > 0 );
+ vshIndex.SetMORPHING( pShaderAPI->IsHWMorphingEnabled() );
+ vshIndex.SetCOMPRESSED_VERTS( (int)vertexCompression );
+ pShaderAPI->SetVertexShaderIndex( vshIndex.GetIndex() );
+
+ if ( bAlphaClip )
+ {
+ BindTexture( SHADER_SAMPLER0, BASETEXTURE, FRAME );
+
+ float vAlphaThreshold[4] = {0.7f, 0.7f, 0.7f, 0.7f};
+ if ( ALPHATESTREFERENCE != -1 && ( params[ALPHATESTREFERENCE]->GetFloatValue() > 0.0f ) )
+ {
+ vAlphaThreshold[0] = vAlphaThreshold[1] = vAlphaThreshold[2] = vAlphaThreshold[3] = params[ALPHATESTREFERENCE]->GetFloatValue();
+ }
+
+ pShaderAPI->SetPixelShaderConstant( 0, vAlphaThreshold, 1 );
+ }
+
+ DECLARE_DYNAMIC_PIXEL_SHADER( depthwrite_ps30 );
+ SET_DYNAMIC_PIXEL_SHADER_COMBO( ALPHACLIP, bAlphaClip );
+ SET_DYNAMIC_PIXEL_SHADER( depthwrite_ps30 );
+ }
+#endif
+
+ Vector4D vParms;
+
+ // set up arbitrary far planes, as the real ones are too far ( 30,000 )
+// pShaderAPI->SetPSNearAndFarZ( 1 );
+ vParms.x = 7.0f; // arbitrary near
+ vParms.y = 4000.0f; // arbitrary far
+ vParms.z = 0.0f;
+ vParms.w = 0.0f;
+ pShaderAPI->SetPixelShaderConstant( 1, vParms.Base(), 2 );
+
+ } // DYNAMIC_STATE
+
+ Draw( );
+ }
+END_SHADER