81 lines
1.8 KiB
GLSL
81 lines
1.8 KiB
GLSL
|
#version 330 core
|
|||
|
|
|||
|
in vec3 vPosition;
|
|||
|
in vec3 vNormal;
|
|||
|
in vec3 vTangent;
|
|||
|
in vec3 vBitangent;
|
|||
|
in vec2 vUV0;
|
|||
|
in vec4 vColor;
|
|||
|
in vec4 vBone;
|
|||
|
in vec4 vWeight;
|
|||
|
in vec2 vUV1;
|
|||
|
in vec2 vUV2;
|
|||
|
in vec3 vPosition2;
|
|||
|
in vec3 vPosition3;
|
|||
|
|
|||
|
out VS_OUT {
|
|||
|
vec3 normal;
|
|||
|
} vs_out;
|
|||
|
|
|||
|
uniform mat4 mtxProj;
|
|||
|
uniform mat4 mtxCam;
|
|||
|
uniform mat4 mtxMdl;
|
|||
|
uniform mat4 mtxCamTest;
|
|||
|
|
|||
|
// Skinning uniforms
|
|||
|
uniform mat4 bones[200];
|
|||
|
|
|||
|
uniform int NoSkinning;
|
|||
|
uniform int RigidSkinning;
|
|||
|
|
|||
|
vec4 skin(vec3 pos, ivec4 index)
|
|||
|
{
|
|||
|
vec4 newPosition = vec4(pos.xyz, 1.0);
|
|||
|
|
|||
|
newPosition = bones[index.x] * vec4(pos, 1.0) * vWeight.x;
|
|||
|
newPosition += bones[index.y] * vec4(pos, 1.0) * vWeight.y;
|
|||
|
newPosition += bones[index.z] * vec4(pos, 1.0) * vWeight.z;
|
|||
|
if (vWeight.w < 1) //Necessary. Bones may scale weirdly without
|
|||
|
newPosition += bones[index.w] * vec4(pos, 1.0) * vWeight.w;
|
|||
|
|
|||
|
return newPosition;
|
|||
|
}
|
|||
|
|
|||
|
vec3 skinNRM(vec3 nr, ivec4 index)
|
|||
|
{
|
|||
|
vec3 newNormal = vec3(0);
|
|||
|
|
|||
|
newNormal = mat3(bones[index.x]) * nr * vWeight.x;
|
|||
|
newNormal += mat3(bones[index.y]) * nr * vWeight.y;
|
|||
|
newNormal += mat3(bones[index.z]) * nr * vWeight.z;
|
|||
|
newNormal += mat3(bones[index.w]) * nr * vWeight.w;
|
|||
|
|
|||
|
return newNormal;
|
|||
|
}
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
ivec4 index = ivec4(vBone);
|
|||
|
|
|||
|
vec3 normal = vNormal;
|
|||
|
|
|||
|
vec4 objPos = vec4(vPosition.xyz, 1.0);
|
|||
|
if (vBone.x != -1.0)
|
|||
|
objPos = skin(vPosition, index);
|
|||
|
|
|||
|
if(vBone.x != -1.0)
|
|||
|
normal = normalize((skinNRM(vNormal.xyz, index)).xyz);
|
|||
|
|
|||
|
|
|||
|
if (RigidSkinning == 1)
|
|||
|
{
|
|||
|
objPos = (bones[index.x] * vec4(vPosition, 1.0));
|
|||
|
normal = vNormal;
|
|||
|
normal = mat3(bones[index.x]) * vNormal.xyz * 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
gl_Position = mtxCam * mtxMdl * vec4(objPos.xyz, 1.0);
|
|||
|
mat3 normalMatrix = mat3(transpose(inverse(mtxCamTest * mtxMdl)));
|
|||
|
vs_out.normal = normalize(vec3(mtxProj * vec4(normalMatrix * normal, 0.0)));
|
|||
|
}
|