117 lines
3.2 KiB
GLSL
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));
|
|
}
|