Files
lace/3-mid/opengl/assets/shader/lit_textured_skinned.vert
2022-07-31 17:34:54 +10:00

117 lines
3.2 KiB
GLSL

#version 140
uniform mat4 mvp_Transform;
uniform vec3 Scale;
uniform mat4 bone_Matrices[120];
in vec3 Site;
in vec3 Normal;
in vec2 Coords;
in float Shine;
in vec4 bone_Ids;
in vec4 bone_Weights;
out vec3 frag_Site;
out vec3 frag_Normal;
out vec2 frag_Coords;
out float frag_Shine;
const float c_zero = 0.0;
const float c_one = 1.0;
void main()
{
vec4 transformedPosition = vec4 (0.0);
vec3 transformedNormal = vec3 (0.0);
if (int (bone_Ids.x) == 0) // No bones affect this vertex.
{
transformedPosition = vec4 (Site, c_one);
transformedNormal = Normal;
}
else
{
// Bone 1.
//
mat4 m44 = bone_Matrices [int (bone_Ids.x) - 1];
// Transform the offset by bone 1.
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.x;
mat3 m33 = mat3 (m44[0].xyz,
m44[1].xyz,
m44[2].xyz);
// Transform the normal by bone 1.
transformedNormal += m33 * Normal * bone_Weights.x;
if (int(bone_Ids.y) != 0)
{
// Bone 2.
//
m44 = bone_Matrices [int (bone_Ids.y) - 1];
// Transform the offset by bone 2.
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.y;
m33 = mat3 (m44[0].xyz,
m44[1].xyz,
m44[2].xyz);
// Transform the normal by bone 2.
transformedNormal += m33 * Normal * bone_Weights.y;
if (int (bone_Ids.z) != 0)
{
// Bone 3.
//
m44 = bone_Matrices [int (bone_Ids.z) - 1];
// Transform the offset by bone 3.
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.z;
m33 = mat3 (m44[0].xyz,
m44[1].xyz,
m44[2].xyz);
// Transform the normal by bone 3.
transformedNormal += m33 * Normal * bone_Weights.z;
if (int (bone_Ids.w) != 0)
{
// Bone 4.
//
m44 = bone_Matrices [int (bone_Ids.w) - 1];
// Transform the offset by bone 4.
transformedPosition += m44 * vec4 (Site, c_one) * bone_Weights.w;
m33 = mat3 (m44[0].xyz,
m44[1].xyz,
m44[2].xyz);
// Transform the normal by bone 4.
transformedNormal += m33 * Normal * bone_Weights.w;
}
}
}
}
// Pass some variables to the fragment shader.
//
frag_Site = transformedPosition.xyz * Scale;
frag_Normal = normalize (transformedNormal);
frag_Coords = Coords;
frag_Shine = Shine;
// Apply all matrix transformations to 'Site'.
//
gl_Position = mvp_Transform * transformedPosition;
gl_Position = mvp_Transform * (transformedPosition * vec4 (Scale, 1));
}