Explorar o código

Cleanup cameraPos function parameter from GLSL directional billboard code. Fix directional billboard face camera rotation calculation when billboards are in model space (relative to node). Related to #1471.

Lasse Öörni %!s(int64=9) %!d(string=hai) anos
pai
achega
ccf1abec81

+ 8 - 7
bin/CoreData/Shaders/GLSL/Transform.glsl

@@ -88,9 +88,9 @@ vec3 GetBillboardNormal()
 #endif
 
 #ifdef DIRBILLBOARD
-mat3 GetFaceCameraRotation(vec3 cameraPos, vec3 position, vec3 direction)
+mat3 GetFaceCameraRotation(vec3 position, vec3 direction)
 {
-    vec3 cameraDir = normalize(position - cameraPos);
+    vec3 cameraDir = normalize(position - cCameraPos);
     vec3 front = normalize(direction);
     vec3 right = normalize(cross(front, cameraDir));
     vec3 up = normalize(cross(front, right));
@@ -104,13 +104,14 @@ mat3 GetFaceCameraRotation(vec3 cameraPos, vec3 position, vec3 direction)
 
 vec3 GetBillboardPos(vec4 iPos, vec3 iDirection, mat4 modelMatrix)
 {
-    return (iPos * modelMatrix).xyz + 
-        vec3(iTexCoord1.x, 0.0, iTexCoord1.y) * GetFaceCameraRotation(cCameraPos, iPos.xyz, iDirection);
+    vec3 worldPos = (iPos * modelMatrix).xyz;
+    return worldPos + vec3(iTexCoord1.x, 0.0, iTexCoord1.y) * GetFaceCameraRotation(worldPos, iDirection);
 }
 
-vec3 GetBillboardNormal(vec4 iPos, vec3 iDirection)
+vec3 GetBillboardNormal(vec4 iPos, vec3 iDirection, mat4 modelMatrix)
 {
-    return vec3(0.0, 1.0, 0.0) * GetFaceCameraRotation(cCameraPos, iPos.xyz, iDirection);
+    vec3 worldPos = (iPos * modelMatrix).xyz;
+    return vec3(0.0, 1.0, 0.0) * GetFaceCameraRotation(worldPos, iDirection);
 }
 #endif
 
@@ -171,7 +172,7 @@ vec3 GetWorldNormal(mat4 modelMatrix)
     #if defined(BILLBOARD)
         return GetBillboardNormal();
     #elif defined(DIRBILLBOARD)
-        return GetBillboardNormal(iPos, iNormal);
+        return GetBillboardNormal(iPos, iNormal, modelMatrix);
     #elif defined(TRAILFACECAM)
         return GetTrailNormal(iPos);
     #elif defined(TRAILBONE)

+ 6 - 5
bin/CoreData/Shaders/HLSL/Transform.hlsl

@@ -65,13 +65,14 @@ float3x3 GetFaceCameraRotation(float3 position, float3 direction)
 
 float3 GetBillboardPos(float4 iPos, float2 iSize, float3 iDirection, float4x3 modelMatrix)
 {
-    return mul(iPos, modelMatrix) + 
-        mul(float3(iSize.x, 0.0, iSize.y), GetFaceCameraRotation(iPos.xyz, iDirection));
+    float3 worldPos = mul(iPos, modelMatrix);
+    return worldPos + mul(float3(iSize.x, 0.0, iSize.y), GetFaceCameraRotation(worldPos, iDirection));
 }
 
-float3 GetBillboardNormal(float4 iPos, float3 iDirection)
+float3 GetBillboardNormal(float4 iPos, float3 iDirection, float4x3 modelMatrix)
 {
-    return mul(float3(0.0, 1.0, 0.0), GetFaceCameraRotation(iPos.xyz, iDirection));
+    float3 worldPos = mul(iPos, modelMatrix);
+    return mul(float3(0.0, 1.0, 0.0), GetFaceCameraRotation(worldPos, iDirection));
 }
 #endif
 
@@ -127,7 +128,7 @@ float3 GetTrailNormal(float4 iPos, float3 iParentPos, float3 iForward)
 #if defined(BILLBOARD)
     #define GetWorldNormal(modelMatrix) GetBillboardNormal()
 #elif defined(DIRBILLBOARD)
-    #define GetWorldNormal(modelMatrix) GetBillboardNormal(iPos, iNormal)
+    #define GetWorldNormal(modelMatrix) GetBillboardNormal(iPos, iNormal, modelMatrix)
 #elif defined(TRAILFACECAM)
     #define GetWorldNormal(modelMatrix) GetTrailNormal(iPos)
 #elif defined(TRAILBONE)