vec3 rotate_vec3( vec4 quat, vec3 vec )
{
return vec + 2.0 * cross( quat.xyz, cross( quat.xyz, vec ) + quat.w * vec);
}
vec4 rotate_by_quat(vec4 q, vec4 v) {
return vec4(rotate_vec3(q, v.xyz), v.w);
}
struct Bone {
vec4 scale;
vec4 rotation;
vec4 offset;
mat4 inverse_bind_matrix;
};
vec4 transform_by_mat4(mat4 m, vec4 v) {
vec4 h = m * v;
return h;
}
vec4 transform_by_bone(vec4 x, Bone bone) {
return rotate_by_quat(bone.rotation, bone.scale * transform_by_mat4(bone.inverse_bind_matrix, x)) + bone.offset;
}
vec4 transform_normal_by_bone(vec4 x, Bone bone) {
return rotate_by_quat(bone.rotation, transform_by_mat4(bone.inverse_bind_matrix, x));
}