//-- void Octree::VUpdate() { ISpatialObject* pElement; // [rad] We are rebuilding octree every frame if(m_i32Rebuild) { ISpatialObject* pObjectList = NULL; // [rad] We are going to rebuild octree (without dealocating space) m_pRootNode->Rebuild(); // [rad] Populate the octree std::vector<ISpatialObject*>::iterator iter_object; for(iter_object = m_vecObjects.begin(); iter_object != m_vecObjects.end(); iter_object++) { pElement = (*iter_object); //m_pRootNode->AddObject((*iter_object)); pElement->VSetNext(pObjectList); pObjectList = pElement; } m_pRootNode->AddObjects(pObjectList, m_vecObjects.size()); } else { // [rad] Instead of rebuilding octree every frame we will remove objects // bottom-up OctreeNode* pNode; ISpatialObject* pObject; ISpatialObject* pPrev; std::vector<ISpatialObject*>::iterator iter_object; for(iter_object = m_vecObjects.begin(); iter_object != m_vecObjects.end(); iter_object++) { pElement = (*iter_object); pNode = static_cast<OctreeNode*>(pElement->VGetCell()); // [rad] Remove element if(pNode->m_pObjects == pElement) { // [rad] Remove object from the list (first position) pNode->m_pObjects = pNode->m_pObjects->VGetNext(); } else { // [rad] traverse list and remove pObject = pNode->m_pObjects; while(pObject) { pPrev = pObject; pObject = pObject->VGetNext(); if(pObject == pElement) { // [rad] Remove object from the list pPrev->VSetNext(pObject->VGetNext()); break; } } } // [rad] Decrement node's object count pNode->m_i32ObjectCount--; // [rad] Attempt to re-insert element if(pNode->CheckContains(pElement)) { pNode->AddObject(pElement); } else { // [rad] Go up one node pNode = pNode->m_pParent; // [rad] Check if this node still contains this object while(pNode) { // [rad] Check if contains if(pNode->CheckContains(pElement)) { pNode->AddObject(pElement); break; } else { pNode = pNode->m_pParent; } } } } } // [rad] Check collisionsgdb1 std::vector<OctreeNode*> vecAncestors; m_pRootNode->CheckCollisions(vecAncestors); }