vec4 _skinnedPosition; void skinPosition(float blendWeight, int matrixIndex) { vec4 tmp; tmp.x = dot(a_position, u_matrixPalette[matrixIndex]); tmp.y = dot(a_position, u_matrixPalette[matrixIndex + 1]); tmp.z = dot(a_position, u_matrixPalette[matrixIndex + 2]); tmp.w = a_position.w; _skinnedPosition += blendWeight * tmp; } vec4 getPosition() { _skinnedPosition = vec4(0.0); float blendWeight = a_blendWeights[0]; int matrixIndex = int (a_blendIndices[0]) * 3; skinPosition(blendWeight, matrixIndex); blendWeight = a_blendWeights[1]; matrixIndex = int(a_blendIndices[1]) * 3; skinPosition(blendWeight, matrixIndex); blendWeight = a_blendWeights[2]; matrixIndex = int(a_blendIndices[2]) * 3; skinPosition(blendWeight, matrixIndex); blendWeight = a_blendWeights[3]; matrixIndex = int(a_blendIndices[3]) * 3; skinPosition(blendWeight, matrixIndex); return _skinnedPosition; } #if defined(LIGHTING) vec3 _skinnedNormal; void skinTangentSpaceVector(vec3 vector, float blendWeight, int matrixIndex) { vec3 tmp; tmp.x = dot(vector, u_matrixPalette[matrixIndex].xyz); tmp.y = dot(vector, u_matrixPalette[matrixIndex + 1].xyz); tmp.z = dot(vector, u_matrixPalette[matrixIndex + 2].xyz); _skinnedNormal += blendWeight * tmp; } vec3 getTangentSpaceVector(vec3 vector) { _skinnedNormal = vec3(0.0); // Transform normal to view space using matrix palette with four matrices used to transform a vertex. float blendWeight = a_blendWeights[0]; int matrixIndex = int (a_blendIndices[0]) * 3; skinTangentSpaceVector(vector, blendWeight, matrixIndex); blendWeight = a_blendWeights[1]; matrixIndex = int(a_blendIndices[1]) * 3; skinTangentSpaceVector(vector, blendWeight, matrixIndex); blendWeight = a_blendWeights[2]; matrixIndex = int(a_blendIndices[2]) * 3; skinTangentSpaceVector(vector, blendWeight, matrixIndex); blendWeight = a_blendWeights[3]; matrixIndex = int(a_blendIndices[3]) * 3; skinTangentSpaceVector(vector, blendWeight, matrixIndex); return _skinnedNormal; } vec3 getNormal() { return getTangentSpaceVector(a_normal); } #if defined(BUMPED) vec3 getTangent() { return getTangentSpaceVector(a_tangent); } vec3 getBinormal() { return getTangentSpaceVector(a_binormal); } #endif #endif