Transform.hlsl 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #ifdef COMPILEVS
  2. #ifdef D3D11
  3. #define OUTPOSITION SV_POSITION
  4. #else
  5. #define OUTPOSITION POSITION
  6. #endif
  7. #ifdef SKINNED
  8. float4x3 GetSkinMatrix(float4 blendWeights, int4 blendIndices)
  9. {
  10. return cSkinMatrices[blendIndices.x] * blendWeights.x +
  11. cSkinMatrices[blendIndices.y] * blendWeights.y +
  12. cSkinMatrices[blendIndices.z] * blendWeights.z +
  13. cSkinMatrices[blendIndices.w] * blendWeights.w;
  14. }
  15. #endif
  16. float2 GetTexCoord(float2 iTexCoord)
  17. {
  18. return float2(dot(iTexCoord, cUOffset.xy) + cUOffset.w, dot(iTexCoord, cVOffset.xy) + cVOffset.w);
  19. };
  20. float4 GetClipPos(float3 worldPos)
  21. {
  22. return mul(float4(worldPos, 1.0), cViewProj);
  23. }
  24. float GetZonePos(float3 worldPos)
  25. {
  26. return saturate(mul(float4(worldPos, 1.0), cZone).z);
  27. }
  28. float GetDepth(float4 clipPos)
  29. {
  30. return dot(clipPos.zw, cDepthMode.zw);
  31. }
  32. #ifdef BILLBOARD
  33. float3 GetBillboardPos(float4 iPos, float2 iSize, float4x3 modelMatrix)
  34. {
  35. return mul(iPos, modelMatrix) + mul(float3(iSize.x, iSize.y, 0.0), cBillboardRot);
  36. }
  37. float3 GetBillboardNormal()
  38. {
  39. return float3(-cBillboardRot[2][0], -cBillboardRot[2][1], -cBillboardRot[2][2]);
  40. }
  41. #endif
  42. #ifdef DIRBILLBOARD
  43. float3x3 GetFaceCameraRotation(float3 position, float3 direction)
  44. {
  45. float3 cameraDir = normalize(position - cCameraPos);
  46. float3 front = normalize(direction);
  47. float3 right = normalize(cross(front, cameraDir));
  48. float3 up = normalize(cross(front, right));
  49. return float3x3(
  50. right.x, right.y, right.z,
  51. up.x, up.y, up.z,
  52. front.x, front.y, front.z
  53. );
  54. }
  55. float3 GetBillboardPos(float4 iPos, float2 iSize, float3 iDirection, float4x3 modelMatrix)
  56. {
  57. float3 worldPos = mul(iPos, modelMatrix);
  58. return worldPos + mul(float3(iSize.x, 0.0, iSize.y), GetFaceCameraRotation(worldPos, iDirection));
  59. }
  60. float3 GetBillboardNormal(float4 iPos, float3 iDirection, float4x3 modelMatrix)
  61. {
  62. float3 worldPos = mul(iPos, modelMatrix);
  63. return mul(float3(0.0, 1.0, 0.0), GetFaceCameraRotation(worldPos, iDirection));
  64. }
  65. #endif
  66. #ifdef TRAILFACECAM
  67. float3 GetTrailPos(float4 iPos, float3 iFront, float iScale, float4x3 modelMatrix)
  68. {
  69. float3 up = normalize(cCameraPos - iPos.xyz);
  70. float3 left = normalize(cross(iFront, up));
  71. return (mul(float4((iPos.xyz + left * iScale), 1.0), modelMatrix)).xyz;
  72. }
  73. float3 GetTrailNormal(float4 iPos)
  74. {
  75. return normalize(cCameraPos - iPos.xyz);
  76. }
  77. #endif
  78. #ifdef TRAILBONE
  79. float3 GetTrailPos(float4 iPos, float3 iParentPos, float iScale, float4x3 modelMatrix)
  80. {
  81. float3 right = iParentPos - iPos.xyz;
  82. return (mul(float4((iPos.xyz + right * iScale), 1.0), modelMatrix)).xyz;
  83. }
  84. float3 GetTrailNormal(float4 iPos, float3 iParentPos, float3 iForward)
  85. {
  86. float3 left = normalize(iPos.xyz - iParentPos);
  87. float3 up = -normalize(cross(normalize(iForward), left));
  88. return up;
  89. }
  90. #endif
  91. #if defined(SKINNED)
  92. #define iModelMatrix GetSkinMatrix(iBlendWeights, iBlendIndices)
  93. #elif defined(INSTANCED)
  94. #define iModelMatrix iModelInstance
  95. #else
  96. #define iModelMatrix cModel
  97. #endif
  98. #if defined(BILLBOARD)
  99. #define GetWorldPos(modelMatrix) GetBillboardPos(iPos, iSize, modelMatrix)
  100. #elif defined(DIRBILLBOARD)
  101. #define GetWorldPos(modelMatrix) GetBillboardPos(iPos, iSize, iNormal, modelMatrix)
  102. #elif defined(TRAILFACECAM)
  103. #define GetWorldPos(modelMatrix) GetTrailPos(iPos, iTangent.xyz, iTangent.w, modelMatrix)
  104. #elif defined(TRAILBONE)
  105. #define GetWorldPos(modelMatrix) GetTrailPos(iPos, iTangent.xyz, iTangent.w, modelMatrix)
  106. #else
  107. #define GetWorldPos(modelMatrix) mul(iPos, modelMatrix)
  108. #endif
  109. #if defined(BILLBOARD)
  110. #define GetWorldNormal(modelMatrix) GetBillboardNormal()
  111. #elif defined(DIRBILLBOARD)
  112. #define GetWorldNormal(modelMatrix) GetBillboardNormal(iPos, iNormal, modelMatrix)
  113. #elif defined(TRAILFACECAM)
  114. #define GetWorldNormal(modelMatrix) GetTrailNormal(iPos)
  115. #elif defined(TRAILBONE)
  116. #define GetWorldNormal(modelMatrix) GetTrailNormal(iPos, iTangent.xyz, iNormal)
  117. #else
  118. #define GetWorldNormal(modelMatrix) normalize(mul(iNormal, (float3x3)modelMatrix))
  119. #endif
  120. #if defined(BILLBOARD)
  121. #define GetWorldTangent(modelMatrix) float4(normalize(mul(float3(1.0, 0.0, 0.0), cBillboardRot)), 1.0)
  122. #elif defined(DIRBILLBOARD)
  123. #define GetWorldTangent(modelMatrix) float4(normalize(mul(float3(1.0, 0.0, 0.0), (float3x3)modelMatrix)), 1.0)
  124. #else
  125. #define GetWorldTangent(modelMatrix) float4(normalize(mul(iTangent.xyz, (float3x3)modelMatrix)), iTangent.w)
  126. #endif
  127. #endif
  128. #ifdef COMPILEPS
  129. #ifdef D3D11
  130. #define OUTCOLOR0 SV_TARGET
  131. #define OUTCOLOR1 SV_TARGET1
  132. #define OUTCOLOR2 SV_TARGET2
  133. #define OUTCOLOR3 SV_TARGET3
  134. #else
  135. #define OUTCOLOR0 COLOR0
  136. #define OUTCOLOR1 COLOR1
  137. #define OUTCOLOR2 COLOR2
  138. #define OUTCOLOR3 COLOR3
  139. #endif
  140. #endif