* 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-0572b91ccdca3.0
parent
8c1e5c9cf9
commit
c21b60fbe7
@ -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 |
Loading…
Reference in new issue