Do boning and animation properly
[opengl.git] / pbrvert.glsl
index ec37a9cf0f282e934bd1fa75beb39104c64befb1..57633800ad4402dd2f4a5c6c55377f51a4c9a82c 100644 (file)
@@ -3,10 +3,15 @@ in vec3 pos;
 in vec3 unscaledNormal;
 in vec2 vTexCoord;
 
+in ivec4 boneIds;
+in vec4 boneWeights;
+
 uniform mat4 model;
 uniform mat4 view;
 uniform mat4 projection;
 
+uniform mat4 bones[16 + 1];
+
 out vec3 normal;
 out vec2 texCoords;
 
@@ -15,10 +20,17 @@ out vec3 lightPos, viewPos, worldPos;
 void main() {
        texCoords = vTexCoord;
 
-       worldPos = vec3(model * vec4(pos, 1.f));
+       mat4 boneTrans = bones[boneIds.x] * boneWeights.x;
+       boneTrans += bones[boneIds.y] * boneWeights.y;
+       boneTrans += bones[boneIds.z] * boneWeights.z;
+       boneTrans += bones[boneIds.w] * boneWeights.w;
+
+       mat4 bonedModel = model * boneTrans;
+
+       worldPos = vec3(bonedModel * vec4(pos, 1.f));
 
-       normal = mat3(transpose(inverse(model))) * unscaledNormal;
+       normal = mat3(transpose(inverse(bonedModel))) * unscaledNormal;
        
-       gl_Position = projection * view * model * vec4(pos, 1.f);
+       gl_Position = projection * view * bonedModel * vec4(pos, 1.f);
 }