Skip to content
Snippets Groups Projects
Commit 2f8a106c authored by sdegrande's avatar sdegrande
Browse files

Finish implementation of SkeletonProgramExtension

The extension stores an array of bone matrices connected to a uniform
in the shaders used to rig the rendered mesh.
parent 19429326
No related branches found
No related tags found
No related merge requests found
......@@ -49,8 +49,21 @@ vs_out;
/////////////////////////////////////////////
void main()
{
vec4 modelVertexPosition = ModelMat * vec4(in_Position, 1.0);
#ifdef WITH_SKELETON
mat4 BoneMat = BoneMats[in_BoneIds[0]] * in_BoneWeights[0];
BoneMat += BoneMats[in_BoneIds[1]] * in_BoneWeights[1];
BoneMat += BoneMats[in_BoneIds[2]] * in_BoneWeights[2];
BoneMat += BoneMats[in_BoneIds[3]] * in_BoneWeights[3];
vec4 modelVertexPosition = ModelMat * BoneMat * vec4(in_Position, 1);
#else
vec4 modelVertexPosition = ModelMat * vec4(in_Position, 1);
#endif
#ifdef WITH_SKELETON
mat3 normalMat = mat3(transpose(inverse(ModelMat * BoneMat)));
#else
mat3 normalMat = mat3(transpose(inverse(ModelMat)));
#endif
gl_Position = ViewProjMat * modelVertexPosition;
......
......@@ -67,11 +67,22 @@ vs_out;
void main()
{
#ifdef WITH_SKELETON
mat4 BoneMat = BoneMats[in_BoneIds[0]] * in_BoneWeights[0];
BoneMat += BoneMats[in_BoneIds[1]] * in_BoneWeights[1];
BoneMat += BoneMats[in_BoneIds[2]] * in_BoneWeights[2];
BoneMat += BoneMats[in_BoneIds[3]] * in_BoneWeights[3];
vec4 modelVertexPosition = ModelMat * BoneMat * vec4(in_Position, 1);
#else
vec4 modelVertexPosition = ModelMat * vec4(in_Position, 1);
#endif
gl_Position = ViewProjMat * modelVertexPosition;
vs_out.Position = vec3(modelVertexPosition);
#ifdef WITH_SKELETON
vs_out.Normal = vec3(ModelMat * BoneMat * vec4(in_Normal, 0));
#else
vs_out.Normal = vec3(ModelMat * vec4(in_Normal, 0));
#endif
vs_out.TexCoord = in_TexCoord;
}
......@@ -4,6 +4,7 @@
#include "ProgramExtension.hpp"
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <fmt/format.h>
#include "Utils/json_utils.hpp"
ProgramExtension::ProgramExtension(const std::string& config)
......@@ -57,7 +58,10 @@ Json::Value ProgramExtension::getProgramConf() const
SkeletonProgramExtension::SkeletonProgramExtension()
{
programConf = jsonFromString(R"({ "vertex" : { "defines" : { "WITH_SKELETON" : 1, "MAX_BONES" : 4 } } })");
std::string config =
fmt::format(R"({{ "vertex" : {{ "defines" : {{ "WITH_SKELETON" : 1, "MAX_BONES" : {} }} }} }})", MAX_BONES);
programConf = jsonFromString(config);
for (uint32_t i = 0; i < 32; ++i) boneMats[i] = glm::mat4(1.0f);
}
void SkeletonProgramExtension::extensionGetUniformsID(GLuint programID)
......@@ -68,5 +72,5 @@ void SkeletonProgramExtension::extensionGetUniformsID(GLuint programID)
void SkeletonProgramExtension::extensionSetUniforms(GLuint programID, Renderer* renderer,
const glm::mat4& modelMat) const
{
return;
glProgramUniformMatrix4fv(programID, boneMatsID, 32, GL_FALSE, glm::value_ptr(boneMats[0]));
}
......@@ -51,15 +51,23 @@ protected:
class SkeletonProgramExtension : public ProgramExtension
{
public:
static constexpr uint32_t MAX_BONES { 32 };
public:
SkeletonProgramExtension();
~SkeletonProgramExtension() override = default;
glm::mat4* getBoneMat(const uint32_t index)
{
return &boneMats[index];
}
protected:
void extensionGetUniformsID(GLuint programID) override;
void extensionSetUniforms(GLuint programID, Renderer* renderer, const glm::mat4& modelMat) const override;
private:
glm::mat4 boneMats[MAX_BONES];
GLint boneMatsID {};
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment