From 5e1355f3fe4c0aeb099c51cd1cf2883c398e6473 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 28 Apr 2014 04:00:53 +0200 Subject: [PATCH] Optimizations (cherry picked from commit 7e32946173f0151eb912a69cc7d234754e3f7ae8) --- src/Systems/RenderSystem.cpp | 7 ++++--- src/Systems/TransformSystem.cpp | 31 +++++++++++++++++++++++++++++++ src/Systems/TransformSystem.h | 3 ++- src/World.cpp | 9 +++------ 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/Systems/RenderSystem.cpp b/src/Systems/RenderSystem.cpp index d8c3c19..9e2b426 100755 --- a/src/Systems/RenderSystem.cpp +++ b/src/Systems/RenderSystem.cpp @@ -23,10 +23,11 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa auto model = m_World->GetResourceManager()->Load("Model", modelComponent->ModelFile); if (model != nullptr) { - glm::vec3 position = m_TransformSystem->AbsolutePosition(entity); + /*glm::vec3 position = m_TransformSystem->AbsolutePosition(entity); glm::quat orientation = m_TransformSystem->AbsoluteOrientation(entity); - glm::vec3 scale = m_TransformSystem->AbsoluteScale(entity); - m_Renderer->AddModelToDraw(model, position, orientation, scale, modelComponent->Visible, modelComponent->ShadowCaster); + glm::vec3 scale = m_TransformSystem->AbsoluteScale(entity);*/ + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + m_Renderer->AddModelToDraw(model, absoluteTransform.Position, absoluteTransform.Orientation, absoluteTransform.Scale, modelComponent->Visible, modelComponent->ShadowCaster); } } diff --git a/src/Systems/TransformSystem.cpp b/src/Systems/TransformSystem.cpp index a23d92b..0d1767d 100755 --- a/src/Systems/TransformSystem.cpp +++ b/src/Systems/TransformSystem.cpp @@ -60,3 +60,34 @@ glm::vec3 Systems::TransformSystem::AbsoluteScale(EntityID entity) return absScale; } + +Components::Transform Systems::TransformSystem::AbsoluteTransform(EntityID entity) +{ + glm::vec3 absPosition; + glm::quat absOrientation; + glm::vec3 absScale(1); + + do + { + auto transform = m_World->GetComponent(entity, "Transform"); + entity = m_World->GetEntityParent(entity); + auto transform2 = m_World->GetComponent(entity, "Transform"); + + // Position + if (entity != 0) + absPosition += transform2->Orientation * transform->Position; + else + absPosition += transform->Position; + // Orientation + absOrientation = transform->Orientation * absOrientation; + // Scale + absScale *= transform->Scale; + } while (entity != 0); + + Components::Transform transform; + transform.Position = absPosition; + transform.Orientation = absOrientation; + transform.Scale = absScale; + + return transform; +} diff --git a/src/Systems/TransformSystem.h b/src/Systems/TransformSystem.h index 542000d..754a567 100755 --- a/src/Systems/TransformSystem.h +++ b/src/Systems/TransformSystem.h @@ -15,7 +15,8 @@ public: //void Update(double dt) override; //void UpdateEntity(double dt, EntityID entity, EntityID parent) override; - + + Components::Transform AbsoluteTransform(EntityID entity); glm::vec3 AbsolutePosition(EntityID entity); glm::quat AbsoluteOrientation(EntityID entity); glm::vec3 AbsoluteScale(EntityID entity); diff --git a/src/World.cpp b/src/World.cpp index ef9d236..e6a10b8 100755 --- a/src/World.cpp +++ b/src/World.cpp @@ -22,16 +22,13 @@ EntityID World::GenerateEntityID() void World::RecursiveUpdate(std::shared_ptr system, double dt, EntityID parentEntity) { - for (auto pair : m_EntityParents) + for (auto &pair : m_EntityParents) { EntityID child = pair.first; EntityID parent = pair.second; - if (parent == parentEntity) - { - system->UpdateEntity(dt, child, parent); - RecursiveUpdate(system, dt, child); - } + system->UpdateEntity(dt, child, parent); + //RecursiveUpdate(system, dt, child); } }