diff --git a/include/Engine/Rendering/RenderQueueFactory.h b/include/Engine/Rendering/RenderQueueFactory.h index b273b672..be2c55ca 100644 --- a/include/Engine/Rendering/RenderQueueFactory.h +++ b/include/Engine/Rendering/RenderQueueFactory.h @@ -13,8 +13,12 @@ public: RenderQueueFactory(); void Update(World* world); - RenderQueueCollection RenderQueues() const { return m_RenderQueues; } + + static glm::vec3 AbsolutePosition(World* world, EntityID entity); + static glm::quat AbsoluteOrientation(World* world, EntityID entity); + static glm::vec3 AbsoluteScale(World* world, EntityID entity); + private: RenderQueueCollection m_RenderQueues; @@ -22,10 +26,6 @@ private: void FillLights(World* world, RenderQueue* renderQueue); glm::mat4 ModelMatrix(World* world, EntityID entity); - - glm::vec3 AbsolutePosition(World* world, EntityID entity); - glm::quat AbsoluteOrientation(World* world, EntityID entity); - glm::vec3 AbsoluteScale(World* world, EntityID entity); }; #endif \ No newline at end of file diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 163a1f86..7ec57ba4 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -23,15 +23,19 @@ glm::mat4 RenderQueueFactory::ModelMatrix(World* world, EntityID entity) return modelMatrix; } - glm::vec3 RenderQueueFactory::AbsolutePosition(World* world, EntityID entity) { glm::vec3 position; do { ComponentWrapper transform = world->GetComponent(entity, "Transform"); - position += (glm::vec3)transform["Position"]; - entity = world->GetParent(entity); + EntityID parent = world->GetParent(entity); + if (parent != 0) { + position += AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"]; + } else { + position += (glm::vec3)transform["Position"]; + } + entity = parent; } while (entity != 0); return position; @@ -52,15 +56,15 @@ glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity) glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity) { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - glm::vec3 scale = (glm::vec3)transform["Scale"]; + glm::vec3 scale(1.f); - EntityID parent = world->GetParent(entity); - if (parent != 0) { - return AbsoluteScale(world, parent) * scale; - } else { - return scale; - } + do { + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + scale *= (glm::vec3)transform["Scale"]; + entity = world->GetParent(entity); + } while (entity != 0); + + return scale; } void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue)