diff --git a/engine/src/core-data/Common/ShaderLib/Skinning.glsllib b/engine/src/core-data/Common/ShaderLib/Skinning.glsllib index 4aa87e726..6452b34b0 100644 --- a/engine/src/core-data/Common/ShaderLib/Skinning.glsllib +++ b/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 \ No newline at end of file