* Fixed bug where verts uninfluenced by bones would not work correctly in hardware skinning

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10633 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..RD 12 years ago
parent 04196e40ea
commit 725fb33983
  1. 72
      engine/src/core-data/Common/ShaderLib/Skinning.glsllib

@ -11,56 +11,62 @@ attribute vec4 inBoneIndex;
uniform mat4 m_BoneMatrices[NUM_BONES]; uniform mat4 m_BoneMatrices[NUM_BONES];
void Skinning_Compute(inout vec4 position){ void Skinning_Compute(inout vec4 position){
if (inBoneWeight.x != 0.0) {
#if NUM_WEIGHTS_PER_VERT == 1 #if NUM_WEIGHTS_PER_VERT == 1
position = m_BoneMatrices[int(inBoneIndex.x)] * position; position = m_BoneMatrices[int(inBoneIndex.x)] * position;
#else #else
mat4 mat = mat4(0.0); mat4 mat = mat4(0.0);
mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x; mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x;
mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y; mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y;
mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z; mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z;
mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w; mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w;
position = mat * position; position = mat * position;
#endif #endif
}
} }
void Skinning_Compute(inout vec4 position, inout vec3 normal){ void Skinning_Compute(inout vec4 position, inout vec3 normal){
if (inBoneWeight.x != 0.0) {
#if NUM_WEIGHTS_PER_VERT == 1 #if NUM_WEIGHTS_PER_VERT == 1
position = m_BoneMatrices[int(inBoneIndex.x)] * position; position = m_BoneMatrices[int(inBoneIndex.x)] * position;
normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz, normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz,
m_BoneMatrices[int(inBoneIndex.x)][1].xyz, m_BoneMatrices[int(inBoneIndex.x)][1].xyz,
m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal); m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal);
#else #else
mat4 mat = mat4(0.0); mat4 mat = mat4(0.0);
mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x; mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x;
mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y; mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y;
mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z; mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z;
mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w; mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w;
position = mat * position; position = mat * position;
mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz); mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz);
normal = rotMat * normal; normal = rotMat * normal;
#endif #endif
}
} }
void Skinning_Compute(inout vec4 position, inout vec3 tangent, inout vec3 normal){ void Skinning_Compute(inout vec4 position, inout vec3 tangent, inout vec3 normal){
if (inBoneWeight.x != 0.0) {
#if NUM_WEIGHTS_PER_VERT == 1 #if NUM_WEIGHTS_PER_VERT == 1
position = m_BoneMatrices[int(inBoneIndex.x)] * position; position = m_BoneMatrices[int(inBoneIndex.x)] * position;
tangent = m_BoneMatrices[int(inBoneIndex.x)] * tangent; tangent = m_BoneMatrices[int(inBoneIndex.x)] * tangent;
normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz, normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz,
m_BoneMatrices[int(inBoneIndex.x)][1].xyz, m_BoneMatrices[int(inBoneIndex.x)][1].xyz,
m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal); m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal);
#else #else
mat4 mat = mat4(0.0); mat4 mat = mat4(0.0);
mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x; mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x;
mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y; mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y;
mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z; mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z;
mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w; mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w;
position = mat * position; position = mat * position;
mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz); mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz);
tangent = rotMat * tangent; tangent = rotMat * tangent;
normal = rotMat * normal; normal = rotMat * normal;
#endif #endif
}
} }
#endif #endif
Loading…
Cancel
Save