aboutsummaryrefslogtreecommitdiff
path: root/sp/src/materialsystem/stdshaders/ShadowModel.vsh
diff options
context:
space:
mode:
Diffstat (limited to 'sp/src/materialsystem/stdshaders/ShadowModel.vsh')
-rw-r--r--sp/src/materialsystem/stdshaders/ShadowModel.vsh85
1 files changed, 85 insertions, 0 deletions
diff --git a/sp/src/materialsystem/stdshaders/ShadowModel.vsh b/sp/src/materialsystem/stdshaders/ShadowModel.vsh
new file mode 100644
index 00000000..3e4b9eba
--- /dev/null
+++ b/sp/src/materialsystem/stdshaders/ShadowModel.vsh
@@ -0,0 +1,85 @@
+vs.1.1
+
+# DYNAMIC: "DOWATERFOG" "0..1"
+# DYNAMIC: "SKINNING" "0..1"
+
+;------------------------------------------------------------------------------
+; Constants specified by the app
+; $SHADER_SPECIFIC_CONST_0-$SHADER_SPECIFIC_CONST_2 = Shadow texture matrix
+; $SHADER_SPECIFIC_CONST_3 = Tex origin
+; $SHADER_SPECIFIC_CONST_4 = Tex Scale
+; $SHADER_SPECIFIC_CONST_5 = [Shadow falloff offset, 1/Shadow distance, Shadow scale, 0 ]
+;------------------------------------------------------------------------------
+
+#include "macros.vsh"
+
+;------------------------------------------------------------------------------
+; Vertex blending (whacks r1-r7, positions in r7, normals in r8)
+;------------------------------------------------------------------------------
+&AllocateRegister( \$worldPos );
+&AllocateRegister( \$worldNormal );
+&SkinPositionAndNormal( $worldPos, $worldNormal );
+
+; Transform the position from world to view space
+&AllocateRegister( \$projPos );
+
+dp4 $projPos.x, $worldPos, $cViewProj0
+dp4 $projPos.y, $worldPos, $cViewProj1
+dp4 $projPos.z, $worldPos, $cViewProj2
+dp4 $projPos.w, $worldPos, $cViewProj3
+mov oPos, $projPos
+
+;------------------------------------------------------------------------------
+; Fog
+;------------------------------------------------------------------------------
+&CalcFog( $worldPos, $projPos );
+&FreeRegister( \$projPos );
+
+;------------------------------------------------------------------------------
+; Transform position into texture space (from 0 to 1)
+;------------------------------------------------------------------------------
+&AllocateRegister( \$texturePos );
+dp4 $texturePos.x, $worldPos, $SHADER_SPECIFIC_CONST_0
+dp4 $texturePos.y, $worldPos, $SHADER_SPECIFIC_CONST_1
+dp4 $texturePos.z, $worldPos, $SHADER_SPECIFIC_CONST_2
+&FreeRegister( \$worldPos );
+
+;------------------------------------------------------------------------------
+; Figure out the shadow fade amount
+;------------------------------------------------------------------------------
+&AllocateRegister( \$shadowFade );
+sub $shadowFade, $texturePos.z, $SHADER_SPECIFIC_CONST_5.x
+mul $shadowFade, $shadowFade, $SHADER_SPECIFIC_CONST_5.y
+
+;------------------------------------------------------------------------------
+; Offset it into the texture
+;------------------------------------------------------------------------------
+&AllocateRegister( \$actualTextureCoord );
+mul $actualTextureCoord.xyz, $SHADER_SPECIFIC_CONST_4, $texturePos
+add oT0.xyz, $actualTextureCoord, $SHADER_SPECIFIC_CONST_3
+;mov oT0.xyz, $texturePos
+&FreeRegister( \$actualTextureCoord );
+
+;------------------------------------------------------------------------------
+; We're doing clipping by using texkill
+;------------------------------------------------------------------------------
+mov oT1.xyz, $texturePos ; also clips when shadow z < 0 !
+sub oT2.xyz, $cOne, $texturePos
+sub oT2.z, $cOne, $shadowFade.z ; clips when shadow z > shadow distance
+&FreeRegister( \$texturePos );
+
+;------------------------------------------------------------------------------
+; We're doing backface culling by using texkill also (wow yucky)
+;------------------------------------------------------------------------------
+; Transform z component of normal in texture space
+; If it's negative, then don't draw the pixel
+dp3 oT3, $worldNormal, -$SHADER_SPECIFIC_CONST_2
+&FreeRegister( \$worldNormal );
+
+;------------------------------------------------------------------------------
+; Shadow color, falloff
+;------------------------------------------------------------------------------
+mov oD0, $cModulationColor
+mul oD0.w, $shadowFade.x, $SHADER_SPECIFIC_CONST_5.z
+&FreeRegister( \$shadowFade );
+