From 827ad1eb7be46c503c76f620bdba93a52bdb8ee5 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Tue, 25 Mar 2014 22:40:31 -0700 Subject: [PATCH] KRNode::getBounds() now caches the calculated bounds and invalidates the cache as needed. This improves speed of Octree generation. --HG-- branch : nfb --- KREngine/kraken/KRModel.cpp | 2 ++ KREngine/kraken/KRNode.cpp | 41 ++++++++++++++++++++++++------------- KREngine/kraken/KRNode.h | 4 ++++ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/KREngine/kraken/KRModel.cpp b/KREngine/kraken/KRModel.cpp index aa931b1..eb01799 100644 --- a/KREngine/kraken/KRModel.cpp +++ b/KREngine/kraken/KRModel.cpp @@ -141,6 +141,8 @@ void KRModel::loadModel() { m_bones = bones; getScene().notify_sceneGraphModify(this); } + + invalidateBounds(); } } } diff --git a/KREngine/kraken/KRNode.cpp b/KREngine/kraken/KRNode.cpp index 1cd4eda..868cc87 100644 --- a/KREngine/kraken/KRNode.cpp +++ b/KREngine/kraken/KRNode.cpp @@ -65,6 +65,7 @@ KRNode::KRNode(KRScene &scene, std::string name) : KRContextObject(scene.getCont m_activePoseMatrix = KRMat4(); m_lod_visible = false; m_scale_compensation = false; + m_boundsValid = false; m_lastRenderFrame = -1000; for(int i=0; i < KRENGINE_NODE_ATTRIBUTE_COUNT; i++) { @@ -108,7 +109,7 @@ bool KRNode::getScaleCompensation() void KRNode::childDeleted(KRNode *child_node) { m_childNodes.erase(child_node); - // InvalidateBounds(); + invalidateBounds(); getScene().notify_sceneGraphModify(this); } @@ -475,22 +476,26 @@ KRScene &KRNode::getScene() { } KRAABB KRNode::getBounds() { - KRAABB bounds = KRAABB::Zero(); + if(!m_boundsValid) { + KRAABB bounds = KRAABB::Zero(); - bool first_child = true; - for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { - KRNode *child = (*itr); - if(child->getBounds() != KRAABB::Zero()) { - if(first_child) { - first_child = false; - bounds = child->getBounds(); - } else { - bounds.encapsulate(child->getBounds()); + bool first_child = true; + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { + KRNode *child = (*itr); + if(child->getBounds() != KRAABB::Zero()) { + if(first_child) { + first_child = false; + bounds = child->getBounds(); + } else { + bounds.encapsulate(child->getBounds()); + } } } + + m_bounds = bounds; + m_boundsValid = true; } - - return bounds; + return m_bounds; } void KRNode::invalidateModelMatrix() @@ -503,7 +508,7 @@ void KRNode::invalidateModelMatrix() child->invalidateModelMatrix(); } - // InvalidateBounds + invalidateBounds(); getScene().notify_sceneGraphModify(this); } @@ -949,3 +954,11 @@ kraken_stream_level KRNode::getStreamLevel(bool prime) return stream_level; } + +void KRNode::invalidateBounds() const +{ + m_boundsValid = false; + if(m_parentNode) { + m_parentNode->invalidateBounds(); + } +} diff --git a/KREngine/kraken/KRNode.h b/KREngine/kraken/KRNode.h index e4bb849..f9503b6 100644 --- a/KREngine/kraken/KRNode.h +++ b/KREngine/kraken/KRNode.h @@ -110,6 +110,7 @@ public: void setWorldRotation(const KRVector3 &v); virtual KRAABB getBounds(); + void invalidateBounds() const; const KRMat4 &getModelMatrix(); const KRMat4 &getInverseModelMatrix(); const KRMat4 &getBindPoseMatrix(); @@ -216,6 +217,9 @@ private: bool m_activePoseMatrixValid; bool m_inverseBindPoseMatrixValid; + mutable KRAABB m_bounds; + mutable bool m_boundsValid; + std::string m_name;