Bläddra i källkod

HW Skinning
* Added check in shader for number of bones
* Fix crash when Skinning.glsllib is imported by shader
* Fix incorrect transform of tangent vector in shader

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10552 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

sha..RD 12 år sedan
förälder
incheckning
c21b60fbe7
1 ändrade filer med 25 tillägg och 14 borttagningar
  1. 25 14
      engine/src/core-data/Common/ShaderLib/Skinning.glsllib

+ 25 - 14
engine/src/core-data/Common/ShaderLib/Skinning.glsllib

@@ -1,55 +1,66 @@
- #ifdef NUM_BONES
+#ifdef NUM_BONES
+
+#if NUM_BONES < 1 || NUM_BONES > 255
+#error NUM_BONES must be between 1 and 255.
+#endif
+
+#define NUM_WEIGHTS_PER_VERT 4
  
 attribute vec4 inBoneWeight;
 attribute vec4 inBoneIndex;
 uniform mat4 m_BoneMatrices[NUM_BONES];
  
 void Skinning_Compute(inout vec4 position){
-    #if NUM_WEIGHTS_PER_VERT == 1
+#if NUM_WEIGHTS_PER_VERT == 1
     position = m_BoneMatrices[int(inBoneIndex.x)] * position;
-    #else
+#else
     mat4 mat = mat4(0.0);
     mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x;
     mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y;
     mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z;
     mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w;
     position = mat * position;
-    #endif
+#endif
 }
  
 void Skinning_Compute(inout vec4 position, inout vec3 normal){
-    #if NUM_WEIGHTS_PER_VERT == 1
+#if NUM_WEIGHTS_PER_VERT == 1
     position = m_BoneMatrices[int(inBoneIndex.x)] * position;
     normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz,
                    m_BoneMatrices[int(inBoneIndex.x)][1].xyz,
                    m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal);
-    #else
+#else
     mat4 mat = mat4(0.0);
     mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x;
     mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y;
     mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z;
     mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w;
     position = mat * position;
-    normal = (mat3(mat[0].xyz,mat[1].xyz,mat[2].xyz) * normal);
-    #endif
+
+    mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz);
+    normal = rotMat * normal;
+#endif
 }
  
-void Skinning_Compute(inout vec4 position, inout vec4 tangent, inout vec3 normal){
-    #if NUM_WEIGHTS_PER_VERT == 1
+void Skinning_Compute(inout vec4 position, inout vec3 tangent, inout vec3 normal){
+#if NUM_WEIGHTS_PER_VERT == 1
     position = m_BoneMatrices[int(inBoneIndex.x)] * position;
     tangent = m_BoneMatrices[int(inBoneIndex.x)] * tangent;
     normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz,
                    m_BoneMatrices[int(inBoneIndex.x)][1].xyz,
                    m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal);
-    #else
+#else
     mat4 mat = mat4(0.0);
     mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x;
     mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y;
     mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z;
     mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w;
     position = mat * position;
-    tangent = mat * tangent;
-    normal = (mat3(mat[0].xyz,mat[1].xyz,mat[2].xyz) * normal);
-    #endif
+
+    mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz);
+    tangent = rotMat * tangent;
+    normal = rotMat * normal;
+#endif
 }
+
 #endif