diff --git a/include/Engine/Core/Transform.h b/include/Engine/Core/Transform.h index bd381e8b..7951a78f 100644 --- a/include/Engine/Core/Transform.h +++ b/include/Engine/Core/Transform.h @@ -4,11 +4,11 @@ #include "../GLM.h" #include "World.h" #include "EntityWrapper.h" +#include "System.h" namespace Transform { -glm::mat4 AbsoluteTransformation(EntityWrapper entity); glm::vec3 AbsolutePosition(EntityWrapper entity); glm::vec3 AbsolutePosition(World* world, EntityID entity); glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity); @@ -20,6 +20,16 @@ glm::mat4 ModelMatrix(EntityWrapper entity); glm::mat4 ModelMatrix(EntityID entity, World* world); glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix); +class ClearCache : public ImpureSystem +{ +public: + ClearCache(SystemParams params) + : System(params) + { } + + virtual void Update(double dt) override; +}; + } #endif \ No newline at end of file diff --git a/src/Engine/Collision/Collision.cpp b/src/Engine/Collision/Collision.cpp index 68d99d92..7e533ed1 100644 --- a/src/Engine/Collision/Collision.cpp +++ b/src/Engine/Collision/Collision.cpp @@ -621,7 +621,7 @@ boost::optional EntityAbsoluteAABB(EntityWrapper& entity, bool takeM ComponentWrapper& cAABB = entity["AABB"]; modelSpaceBox = EntityAABB::FromOriginSize((glm::vec3)cAABB["Origin"], (glm::vec3)cAABB["Size"]); } else if (entity.HasComponent("Model")) { - std::string res = entity["Model"]["Resource"]; + const std::string& res = entity["Model"]["Resource"]; if (res.empty()) { return boost::none; } @@ -638,7 +638,7 @@ boost::optional EntityAbsoluteAABB(EntityWrapper& entity, bool takeM return boost::none; } - glm::mat4 modelMat = Transform::AbsoluteTransformation(entity); + glm::mat4 modelMat = Transform::ModelMatrix(entity); glm::vec3 mini(INFINITY); glm::vec3 maxi(-INFINITY); glm::vec3 maxCorner = modelSpaceBox.MaxCorner(); diff --git a/src/Engine/Core/Transform.cpp b/src/Engine/Core/Transform.cpp index e5cff11c..50b6c7ba 100644 --- a/src/Engine/Core/Transform.cpp +++ b/src/Engine/Core/Transform.cpp @@ -1,16 +1,6 @@ #include "Core/Transform.h" -glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity) -{ - glm::mat4 t = glm::mat4(1.f); - - while (entity.Valid()) { - t = glm::translate((glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((glm::vec3&)entity["Transform"]["Scale"]) * t; - entity = entity.Parent(); - } - - return t; -} +static std::unordered_map MatrixCache; glm::vec3 Transform::AbsolutePosition(EntityWrapper entity) { @@ -80,24 +70,36 @@ glm::vec3 Transform::AbsoluteScale(World* world, EntityID entity) return scale; } -glm::mat4 Transform::ModelMatrix(EntityWrapper entity) -{ - return ModelMatrix(entity.ID, entity.World); -} - glm::mat4 Transform::ModelMatrix(EntityID entity, World* world) { - return AbsoluteTransformation(EntityWrapper(world, entity)); - - //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; + return ModelMatrix(EntityWrapper(world, entity)); } glm::vec3 Transform::TransformPoint(const glm::vec3& point, const glm::mat4& matrix) { return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1)); -} \ No newline at end of file +} + +glm::mat4 Transform::ModelMatrix(EntityWrapper entity) +{ + auto cacheIt = MatrixCache.find(entity); + if (cacheIt != MatrixCache.end()) { + return cacheIt->second; + } + + ComponentWrapper cTransform = entity["Transform"]; + glm::mat4 t = glm::translate((const glm::vec3&)cTransform["Position"]) * glm::toMat4(glm::quat((const glm::vec3&)cTransform["Orientation"])) * glm::scale((const glm::vec3&)cTransform["Scale"]); + + EntityWrapper parent = entity.Parent(); + if (parent.Valid()) { + t = ModelMatrix(parent) * t; + } + + MatrixCache[entity] = t; + return t; +} + +void Transform::ClearCache::Update(double dt) +{ + MatrixCache.clear(); +} diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index fee539d4..9c3027ab 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -184,7 +184,7 @@ bool RenderSystem::isEntityVisible(EntityWrapper& entity) } // Hide things parented to local player if they have the HiddenFromLocalPlayer component - bool outOfBodyExperience = ResourceManager::Load("Config.ini")->Get("Debug.OutOfBodyExperience", false); + bool outOfBodyExperience = false; // ResourceManager::Load("Config.ini")->Get("Debug.OutOfBodyExperience", false); // APPARENTLY THIS IS REALLY SLOW if ( (entity.HasComponent("HiddenForLocalPlayer") || entity.FirstParentWithComponent("HiddenForLocalPlayer").Valid()) && (entity == m_LocalPlayer || entity.IsChildOf(m_LocalPlayer)) diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 7b80727e..60b6638c 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -42,7 +42,6 @@ #include "Game/Systems/StartSystem.h" #include "Rendering/TextureSprite.h" - Game::Game(int argc, char* argv[]) { parseArgs(argc, argv); @@ -159,6 +158,8 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(updateOrderLevel); // Populate Octree with collidables ++updateOrderLevel; + m_SystemPipeline->AddSystem(updateOrderLevel); + ++updateOrderLevel; m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeCollision, "Collidable"); m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeTrigger, "Player"); m_SystemPipeline->AddSystem(updateOrderLevel); @@ -174,6 +175,8 @@ Game::Game(int argc, char* argv[]) ++updateOrderLevel; m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeFrustrumCulling); ++updateOrderLevel; + m_SystemPipeline->AddSystem(updateOrderLevel); + ++updateOrderLevel; m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer, m_RenderFrame, m_OctreeFrustrumCulling); ++updateOrderLevel; m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer, m_RenderFrame);