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.

115 lines
3.0 KiB

  1. vs.1.1
  2. # DYNAMIC: "DOWATERFOG" "0..1"
  3. # DYNAMIC: "SKINNING" "0..1"
  4. #include "macros.vsh"
  5. local( $worldPos, $worldNormal, $projPos );
  6. alloc $worldPos
  7. alloc $projPos
  8. &SkinPosition( $worldPos );
  9. ;------------------------------------------------------------------------------
  10. ; Transform the position from world to view space
  11. ;------------------------------------------------------------------------------
  12. dp4 $projPos.x, $worldPos, $cViewProj0
  13. dp4 $projPos.y, $worldPos, $cViewProj1
  14. dp4 $projPos.z, $worldPos, $cViewProj2
  15. dp4 $projPos.w, $worldPos, $cViewProj3
  16. ;------------------------------------------------------------------------------
  17. ; Normal is based on vertex position
  18. ;------------------------------------------------------------------------------
  19. &AllocateRegister( \$worldNormal );
  20. &AllocateRegister( \$normalDotUp );
  21. sub $worldNormal, $worldPos, $SHADER_SPECIFIC_CONST_6 ; Normal = (Pos - Eye origin)
  22. dp3 $normalDotUp, $worldNormal, $SHADER_SPECIFIC_CONST_7 ; Normal -= 0.5f * (Normal dot Eye Up) * Eye Up
  23. mul $normalDotUp, $normalDotUp, $cHalf
  24. mad $worldNormal, -$normalDotUp, $SHADER_SPECIFIC_CONST_7, $worldNormal
  25. &FreeRegister( \$normalDotUp );
  26. ; normalize the normal
  27. &Normalize( $worldNormal );
  28. mov oPos, $projPos
  29. ;------------------------------------------------------------------------------
  30. ; Fog
  31. ;------------------------------------------------------------------------------
  32. &CalcFog( $worldPos, $projPos );
  33. ; base tex coords
  34. mov oT1.xy, $vTexCoord0
  35. ; spotlight texcoords
  36. dp4 oT0.x, $worldPos, $SHADER_SPECIFIC_CONST_1
  37. dp4 oT0.y, $worldPos, $SHADER_SPECIFIC_CONST_2
  38. dp4 oT0.z, $worldPos, $SHADER_SPECIFIC_CONST_3
  39. dp4 oT0.w, $worldPos, $SHADER_SPECIFIC_CONST_4
  40. local( $worldPosToLightVector, $distFactors );
  41. alloc $worldPosToLightVector
  42. sub $worldPosToLightVector, $SHADER_SPECIFIC_CONST_0.xyz, $worldPos
  43. local( $distatten );
  44. alloc $distatten
  45. ; $distatten = [ 1, 1/dist, 1/distsquared ]
  46. ; dist squared
  47. dp3 $distatten.z, $worldPosToLightVector, $worldPosToLightVector
  48. ; oodist
  49. rsq $distatten.y, $distatten.z
  50. mov $distatten.x, $cOne
  51. local( $dist );
  52. alloc $dist
  53. mul $dist.x, $distatten.z, $distatten.y
  54. rcp $distatten.z, $distatten.z ; 1/distsquared
  55. local( $endFalloffFactor );
  56. alloc $endFalloffFactor
  57. ; ( dist - farZ )
  58. sub $endFalloffFactor.x, $dist.x, $SHADER_SPECIFIC_CONST_5.w
  59. ; 1 / ( (0.6f * farZ) - farZ)
  60. mul $endFalloffFactor, $endFalloffFactor.x, $SHADER_SPECIFIC_CONST_0.w
  61. max $endFalloffFactor, $endFalloffFactor, $cZero
  62. min $endFalloffFactor, $endFalloffFactor, $cOne
  63. local( $vertAtten );
  64. alloc $vertAtten
  65. dp3 $vertAtten, $distatten, $SHADER_SPECIFIC_CONST_5
  66. mul $vertAtten, $vertAtten, $endFalloffFactor
  67. ; Normalize L
  68. &Normalize( $worldPosToLightVector );
  69. ; N.L
  70. dp3 $worldNormal, $worldNormal, $worldPosToLightVector
  71. ; Modulate distance attenuation with N.L
  72. mul oD0, $vertAtten, $worldNormal
  73. ; iris
  74. dp4 oT3.x, $SHADER_SPECIFIC_CONST_8, $worldPos
  75. dp4 oT3.y, $SHADER_SPECIFIC_CONST_9, $worldPos
  76. free $dist
  77. free $endFalloffFactor
  78. free $worldPos
  79. free $worldNormal
  80. free $projPos
  81. free $worldPosToLightVector
  82. free $distatten
  83. free $vertAtten