From c92d01b2c9ff8fe629a6150a1cf4f02acb48bd0d Mon Sep 17 00:00:00 2001 From: floralrainfall Date: Sun, 16 Jul 2023 01:08:37 -0400 Subject: [PATCH] make geom less slow --- .../Header/App/V8/DataModel/Workspace.hpp | 2 + .../Source/App/V8/DataModel/Workspace.cpp | 54 +++++++++++++------ 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/Projects/Engine/Header/App/V8/DataModel/Workspace.hpp b/Projects/Engine/Header/App/V8/DataModel/Workspace.hpp index 6beecc7..ab8a404 100644 --- a/Projects/Engine/Header/App/V8/DataModel/Workspace.hpp +++ b/Projects/Engine/Header/App/V8/DataModel/Workspace.hpp @@ -25,6 +25,8 @@ namespace RNR Camera* getCurrentCamera() const; void setCurrentCamera(Camera *value); private: + void buildGeomInstance(Instance* instance); + bool m_instancingEnabled; bool m_legacyDirty; std::vector m_objects; diff --git a/Projects/Engine/Source/App/V8/DataModel/Workspace.cpp b/Projects/Engine/Source/App/V8/DataModel/Workspace.cpp index 35c3781..4a13d31 100644 --- a/Projects/Engine/Source/App/V8/DataModel/Workspace.cpp +++ b/Projects/Engine/Source/App/V8/DataModel/Workspace.cpp @@ -46,40 +46,60 @@ namespace RNR } else { - m_legacyGeom->addEntity(m_partEntity, - child_part->getCFrame().getPosition(), - Ogre::Quaternion(child_part->getCFrame().getRotation()), - child_part->getSize()); m_legacyDirty = true; } } } + void Workspace::buildGeomInstance(Instance* instance) + { + PartInstance* child_part = dynamic_cast(instance); + if(child_part) + m_legacyGeom->addEntity(m_partEntity, + child_part->getCFrame().getPosition(), + Ogre::Quaternion(child_part->getCFrame().getRotation()), + child_part->getSize()); + for(auto& child : *instance->getChildren()) + buildGeomInstance(child); + } + void Workspace::buildLegacyGeom() { + if(!m_legacyDirty) + return; + m_legacyGeom->reset(); + for(auto& child : *getChildren()) + buildGeomInstance(child); m_legacyGeom->build(); m_legacyDirty = false; } void Workspace::onChildRemoved(Instance* childRemoved) { - Ogre::InstancedEntity* child_ent = (Ogre::InstancedEntity*)childRemoved->getObject(); - if(child_ent) + PartInstance* child_part = dynamic_cast(childRemoved); + if(m_instancingEnabled) { - PartInstance* child_part = dynamic_cast(childRemoved); - if(child_part) + Ogre::InstancedEntity* child_ent = (Ogre::InstancedEntity*)childRemoved->getObject(); + if(child_ent) { - child_ent->_getOwner()->removeInstancedEntity(child_ent); - child_part->setObject(NULL); - - auto child_it = std::find(m_objects.begin(), m_objects.end(), child_ent); - if (child_it != m_objects.end()) + if(child_part) { - m_objects.erase(child_it); - } - } + child_ent->_getOwner()->removeInstancedEntity(child_ent); + child_part->setObject(NULL); - delete child_ent; + auto child_it = std::find(m_objects.begin(), m_objects.end(), child_ent); + if (child_it != m_objects.end()) + { + m_objects.erase(child_it); + } + } + + delete child_ent; + } + } + else + { + } }