From 21a59080b5a7d1eaf53d49497690d88da859eebd Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Tue, 30 Apr 2013 01:18:36 -0700 Subject: [PATCH] Corrected bug in ray cast function which caused it return inaccurate results Exposed the KRViewport from the KRCamera object Fixed crash that occurred if you deleted a KRNode KRNode children are now in an un-ordered std::set instead of an ordered std::vector --- KREngine/kraken/KRCamera.cpp | 6 ++++++ KREngine/kraken/KRCamera.h | 2 ++ KREngine/kraken/KRLODGroup.cpp | 2 +- KREngine/kraken/KRNode.cpp | 36 ++++++++++++++++++++++------------ KREngine/kraken/KRNode.h | 9 +++++---- KREngine/kraken/KROctree.cpp | 2 +- 6 files changed, 39 insertions(+), 18 deletions(-) diff --git a/KREngine/kraken/KRCamera.cpp b/KREngine/kraken/KRCamera.cpp index da9b7b8..95cca4c 100644 --- a/KREngine/kraken/KRCamera.cpp +++ b/KREngine/kraken/KRCamera.cpp @@ -1045,3 +1045,9 @@ std::string KRCamera::getDebugText() } return stream.str(); } + + +const KRViewport &KRCamera::getViewport() +{ + return m_viewport; +} diff --git a/KREngine/kraken/KRCamera.h b/KREngine/kraken/KRCamera.h index f3eb755..69cda2d 100644 --- a/KREngine/kraken/KRCamera.h +++ b/KREngine/kraken/KRCamera.h @@ -58,6 +58,8 @@ public: void renderFrame(float deltaTime, GLint renderBufferWidth, GLint renderBufferHeight); KRRenderSettings settings; + + const KRViewport &getViewport(); private: void createBuffers(GLint renderBufferWidth, GLint renderBufferHeight); diff --git a/KREngine/kraken/KRLODGroup.cpp b/KREngine/kraken/KRLODGroup.cpp index c388f5c..e8b5866 100644 --- a/KREngine/kraken/KRLODGroup.cpp +++ b/KREngine/kraken/KRLODGroup.cpp @@ -139,7 +139,7 @@ void KRLODGroup::updateLODVisibility(const KRViewport &viewport) getScene().notify_sceneGraphCreate(this); m_lod_visible = true; } - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { (*itr)->updateLODVisibility(viewport); } } diff --git a/KREngine/kraken/KRNode.cpp b/KREngine/kraken/KRNode.cpp index cc572d0..a2d53ec 100644 --- a/KREngine/kraken/KRNode.cpp +++ b/KREngine/kraken/KRNode.cpp @@ -42,17 +42,28 @@ KRNode::KRNode(KRScene &scene, std::string name) : KRContextObject(scene.getCont } KRNode::~KRNode() { - getScene().notify_sceneGraphDelete(this); - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { - delete *itr; + while(m_childNodes.size() > 0) { + delete *m_childNodes.begin(); } - m_childNodes.clear(); + + if(m_parentNode) { + m_parentNode->childDeleted(this); + } + getScene().notify_sceneGraphDelete(this); + +} + +void KRNode::childDeleted(KRNode *child_node) +{ + m_childNodes.erase(child_node); + // InvalidateBounds(); + getScene().notify_sceneGraphModify(this); } void KRNode::addChild(KRNode *child) { assert(child->m_parentNode == NULL); child->m_parentNode = this; - m_childNodes.push_back(child); + m_childNodes.insert(child); if(m_lod_visible) { // Child node inherits LOD visibility status from parent child->showLOD(); @@ -73,7 +84,7 @@ tinyxml2::XMLElement *KRNode::saveXML(tinyxml2::XMLNode *parent) { e->SetAttribute("rotate_x", m_localRotation.x * 180 / M_PI); e->SetAttribute("rotate_y", m_localRotation.y * 180 / M_PI); e->SetAttribute("rotate_z", m_localRotation.z * 180 / M_PI); - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { KRNode *child = (*itr); child->saveXML(n); } @@ -265,7 +276,7 @@ void KRNode::render(KRCamera *pCamera, std::vector &point_lights { } -const std::vector &KRNode::getChildren() { +const std::set &KRNode::getChildren() { return m_childNodes; } @@ -281,7 +292,7 @@ KRAABB KRNode::getBounds() { KRAABB bounds = KRAABB::Zero(); bool first_child = true; - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { KRNode *child = (*itr); if(child->getBounds() != KRAABB::Zero()) { if(first_child) { @@ -300,11 +311,12 @@ void KRNode::invalidateModelMatrix() { m_modelMatrixValid = false; m_inverseModelMatrixValid = false; - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { KRNode *child = (*itr); child->invalidateModelMatrix(); } + // InvalidateBounds getScene().notify_sceneGraphModify(this); } @@ -312,7 +324,7 @@ void KRNode::invalidateBindPoseMatrix() { m_bindPoseMatrixValid = false; m_inverseBindPoseMatrixValid = false; - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { KRNode *child = (*itr); child->invalidateBindPoseMatrix(); } @@ -470,7 +482,7 @@ void KRNode::hideLOD() if(m_lod_visible) { m_lod_visible = false; getScene().notify_sceneGraphDelete(this); - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { (*itr)->hideLOD(); } } @@ -481,7 +493,7 @@ void KRNode::showLOD() if(!m_lod_visible) { getScene().notify_sceneGraphCreate(this); m_lod_visible = true; - for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { (*itr)->showLOD(); } } diff --git a/KREngine/kraken/KRNode.h b/KREngine/kraken/KRNode.h index b167b10..3176699 100644 --- a/KREngine/kraken/KRNode.h +++ b/KREngine/kraken/KRNode.h @@ -56,7 +56,7 @@ public: const std::string &getName() const; void addChild(KRNode *child); - const std::vector &getChildren(); + const std::set &getChildren(); void setLocalTranslation(const KRVector3 &v, bool set_original = false); void setLocalScale(const KRVector3 &v, bool set_original = false); @@ -130,7 +130,7 @@ protected: float m_lod_max_coverage; KRNode *m_parentNode; - std::vector m_childNodes; + std::set m_childNodes; private: void invalidateModelMatrix(); @@ -156,6 +156,7 @@ public: void removeFromOctreeNodes(); void addToOctreeNode(KROctreeNode *octree_node); + void childDeleted(KRNode *child_node); template T *find() { @@ -164,7 +165,7 @@ public: return match; } - for(std::vector::const_iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::const_iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { match = (*itr)->find(); if(match) { return match; @@ -183,7 +184,7 @@ public: } } - for(std::vector::const_iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { + for(std::set::const_iterator itr=m_childNodes.begin(); itr != m_childNodes.end(); ++itr) { match = (*itr)->find(name); if(match) { return match; diff --git a/KREngine/kraken/KROctree.cpp b/KREngine/kraken/KROctree.cpp index bb866b6..df006e5 100644 --- a/KREngine/kraken/KROctree.cpp +++ b/KREngine/kraken/KROctree.cpp @@ -128,7 +128,7 @@ bool KROctree::rayCast(const KRVector3 &v0, const KRVector3 &dir, KRHitInfo &hit } } if(m_pRootNode) { - if(m_pRootNode->lineCast(v0, dir, hitinfo, layer_mask)) hit_found = true; + if(m_pRootNode->rayCast(v0, dir, hitinfo, layer_mask)) hit_found = true; } return hit_found; }