70 lines
2.4 KiB
Plaintext
70 lines
2.4 KiB
Plaintext
attribute vec3 vPosition;
|
|
attribute vec2 vTexCoord;
|
|
attribute vec3 vNormal;
|
|
attribute vec4 aBoneIndices0;
|
|
attribute vec2 aBoneIndices1;
|
|
attribute vec4 aBoneWeights0;
|
|
attribute vec2 aBoneWeights1;
|
|
|
|
varying vec2 texCoord;
|
|
varying vec4 fragPosLightSpace;
|
|
varying vec3 fragNormal;
|
|
varying float fogDistance;
|
|
|
|
uniform mat4 ProjectionModelViewMatrix;
|
|
uniform mat4 ModelViewMatrix;
|
|
uniform mat4 uLightFromCamera;
|
|
uniform mat4 uBoneMatrices[64];
|
|
uniform vec3 uPlayerEyePos;
|
|
|
|
void main()
|
|
{
|
|
vec4 skinnedPos = vec4(0.0, 0.0, 0.0, 0.0);
|
|
vec3 skinnedNormal = vec3(0.0, 0.0, 0.0);
|
|
vec4 originalPos = vec4(vPosition, 1.0);
|
|
float totalWeight = 0.0;
|
|
|
|
if (aBoneWeights0.x > 0.0) {
|
|
skinnedPos += uBoneMatrices[int(aBoneIndices0.x)] * originalPos * aBoneWeights0.x;
|
|
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.x)]) * vNormal * aBoneWeights0.x;
|
|
totalWeight += aBoneWeights0.x;
|
|
}
|
|
if (aBoneWeights0.y > 0.0) {
|
|
skinnedPos += uBoneMatrices[int(aBoneIndices0.y)] * originalPos * aBoneWeights0.y;
|
|
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.y)]) * vNormal * aBoneWeights0.y;
|
|
totalWeight += aBoneWeights0.y;
|
|
}
|
|
if (aBoneWeights0.z > 0.0) {
|
|
skinnedPos += uBoneMatrices[int(aBoneIndices0.z)] * originalPos * aBoneWeights0.z;
|
|
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.z)]) * vNormal * aBoneWeights0.z;
|
|
totalWeight += aBoneWeights0.z;
|
|
}
|
|
if (aBoneWeights0.w > 0.0) {
|
|
skinnedPos += uBoneMatrices[int(aBoneIndices0.w)] * originalPos * aBoneWeights0.w;
|
|
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.w)]) * vNormal * aBoneWeights0.w;
|
|
totalWeight += aBoneWeights0.w;
|
|
}
|
|
if (aBoneWeights1.x > 0.0) {
|
|
skinnedPos += uBoneMatrices[int(aBoneIndices1.x)] * originalPos * aBoneWeights1.x;
|
|
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices1.x)]) * vNormal * aBoneWeights1.x;
|
|
totalWeight += aBoneWeights1.x;
|
|
}
|
|
if (aBoneWeights1.y > 0.0) {
|
|
skinnedPos += uBoneMatrices[int(aBoneIndices1.y)] * originalPos * aBoneWeights1.y;
|
|
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices1.y)]) * vNormal * aBoneWeights1.y;
|
|
totalWeight += aBoneWeights1.y;
|
|
}
|
|
|
|
if (totalWeight < 0.001) {
|
|
skinnedPos = originalPos;
|
|
skinnedNormal = vNormal;
|
|
}
|
|
|
|
vec4 eyePos = ModelViewMatrix * skinnedPos;
|
|
fogDistance = length(eyePos.xyz - uPlayerEyePos);
|
|
gl_Position = ProjectionModelViewMatrix * skinnedPos;
|
|
texCoord = vTexCoord;
|
|
fragPosLightSpace = uLightFromCamera * eyePos;
|
|
fragNormal = mat3(ModelViewMatrix) * skinnedNormal;
|
|
}
|