#ifdef USE_HWSKINNING | |
#ifndef NUM_BONES | |
#error A required pre-processor define "NUM_BONES" is not set! | |
#endif | |
attribute vec4 inBoneWeight; | |
attribute vec4 inBoneIndices; | |
uniform mat4 m_BoneMatrices[NUM_BONES]; | |
void Skinning_Compute(inout vec4 position, inout vec4 normal){ | |
vec4 index = inBoneIndices; | |
vec4 weight = inBoneWeight; | |
vec4 newPos = vec4(0.0); | |
vec4 newNormal = vec4(0.0); | |
for (float i = 0.0; i < 4.0; i += 1.0){ | |
mat4 skinMat = m_BoneMatrices[int(index.x)]; | |
newPos += weight.x * (skinMat * position); | |
newNormal += weight.x * (skinMat * normal); | |
index = index.yzwx; | |
weight = weight.yzwx; | |
} | |
position = newPos; | |
normal = newNormal; | |
} | |
#else | |
void Skinning_Compute(inout vec4 position, inout vec4 normal){ | |
// skinning disabled, leave position and normal unaltered | |
} | |
#endif |