62 lines
1.8 KiB
C++
62 lines
1.8 KiB
C++
#ifndef Transform_h__
|
|
#define Transform_h__
|
|
|
|
#include "../GLM.h"
|
|
#include "World.h"
|
|
|
|
static class Transform
|
|
{
|
|
public:
|
|
static glm::vec3 AbsolutePosition(World* world, EntityID entity)
|
|
{
|
|
glm::vec3 position;
|
|
|
|
while (entity != EntityID_Invalid) {
|
|
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
|
EntityID parent = world->GetParent(entity);
|
|
position += AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"];
|
|
entity = parent;
|
|
}
|
|
|
|
return position;
|
|
};
|
|
|
|
static glm::quat AbsoluteOrientation(World* world, EntityID entity)
|
|
{
|
|
glm::quat orientation;
|
|
|
|
while (entity != EntityID_Invalid) {
|
|
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
|
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
|
|
entity = world->GetParent(entity);
|
|
}
|
|
|
|
return orientation;
|
|
};
|
|
|
|
static glm::vec3 AbsoluteScale(World* world, EntityID entity)
|
|
{
|
|
glm::vec3 scale(1.f);
|
|
|
|
while (entity != EntityID_Invalid) {
|
|
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
|
scale *= (glm::vec3)transform["Scale"];
|
|
entity = world->GetParent(entity);
|
|
}
|
|
|
|
return scale;
|
|
};
|
|
|
|
static glm::mat4 ModelMatrix(EntityID entity, World* world)
|
|
{
|
|
glm::vec3 position = Transform::AbsolutePosition(world, entity);
|
|
glm::quat orientation = Transform::AbsoluteOrientation(world, entity);
|
|
glm::vec3 scale = Transform::AbsoluteScale(world, entity);
|
|
|
|
glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
|
|
return modelMatrix;
|
|
}
|
|
|
|
};
|
|
|
|
#endif |