I put some code for reference:
- This is how I calculate the transforms and pass the vectors/quaternions to the vertex shader
namespace RendererUtils {
Transform CumulateTransforms(const Transform& firstTransform, const Transform& otherTransform) {
const auto position{firstTransform.Rotation * (otherTransform.Position * firstTransform.Scale) + firstTransform.Position};
const auto rotation{firstTransform.Rotation * otherTransform.Rotation};
const auto scale{firstTransform.Scale * otherTransform.Scale};
return Transform{position, rotation, scale};
}
Transform InvertTransform(const Transform& transform) {
const auto scale{1.f / transform.Scale};
const auto rotation{glm::inverse(transform.Rotation)};
const auto position{rotation * (-transform.Position * scale)};
return Transform{position, rotation, scale};
}
}
RendererUtils::Transform RendererSystem::_calculateViewTransform(const RendererUtils::Transform& transform, const RendererUtils::Transform& cameraTransform) {
const auto inverseCameraTransform{RendererUtils::InvertTransform(cameraTransform)};
return RendererUtils::CumulateTransforms(transform, inverseCameraTransform);
}
void RendererSystem::_drawMesh(const Mesh& mesh, const RendererUtils::Transform& meshTransform, const RendererUtils::Transform& cameraTransform) {
const auto viewTransform{_calculateViewTransform(meshTransform, cameraTransform)};
assert(_shader);
_shader->SetUniformVec3("ViewPosition", viewTransform.Position);
_shader->SetUniformQuat("ViewRotation", viewTransform.Rotation);
_shader->SetUniformFloat("Scale", viewTransform.Scale);
_shader->SetBool("HasTextureDiffuse", mesh.GetHasTextureDiffuse());
_shader->SetBool("HasTextureSpecular", mesh.GetHasTextureSpecular());
...
}