//-- void KDTree::VAddObjects(const std::vector<ISpatialObject*>& refObjects) { ISpatialObject* pObjectList = NULL; ISpatialObject* pObjectTemp; std::vector<ISpatialObject*>::const_iterator iter_object; for(iter_object = refObjects.begin(); iter_object != refObjects.end(); iter_object++) { pObjectTemp = (*iter_object); pObjectTemp->VSetNext(pObjectList); pObjectList = pObjectTemp; // [rad] Store objects locally for fast update / iteration m_vecObjects.push_back((*iter_object)); } // [rad] Pre-allocate the tree Preallocate(s_i32MaxDepth); Vector3 vec3Min(m_vec3Center.x - m_f32HalfWidth, m_vec3Center.y - m_f32HalfWidth, m_vec3Center.z - m_f32HalfWidth); Vector3 vec3Max(m_vec3Center.x + m_f32HalfWidth, m_vec3Center.y + m_f32HalfWidth, m_vec3Center.z + m_f32HalfWidth); // [rad] Based on this info, construct recursively, starting at root m_pRootNode->Construct(pObjectTemp, refObjects.size(), vec3Min, vec3Max); }
//-- void LooseOctree::VAddObjects(const std::vector<ISpatialObject*>& refObjects) { float f32MinDiameter = 1.0e38f; float f32CellSize = 2.0f * m_f32HalfWidth; float f32Diameter; int i32Depth = 0; int i32Divisions = 1; std::vector<ISpatialObject*>::const_iterator iter_object; for(iter_object = refObjects.begin(); iter_object != refObjects.end(); iter_object++) { f32Diameter = (*iter_object)->VGetRadius(); if(f32Diameter < f32MinDiameter) { // [rad] Found a smaller object, update f32MinDiameter = f32Diameter; } } // [rad] Make cell size 'x' times as big as the smallest diameter f32MinDiameter *= s_f32MaxObjectNodeRatio; // [rad] Calculate depth f32CellSize = 2.0f * m_f32HalfWidth; while(f32MinDiameter <= f32CellSize) { // [rad] Don't make more than max depth if(s_i32MaxDepth == i32Depth) { break; } i32Divisions *= 2; f32CellSize = 2.0f * m_f32HalfWidth / static_cast<float>(i32Divisions); i32Depth++; } // [rad] Delete everything but the root m_pRootNode->Free(); // [rad] Pre-allocate the tree Preallocate(i32Depth); // [rad] Insert elements into the tree for(iter_object = refObjects.begin(); iter_object != refObjects.end(); iter_object++) { m_pRootNode->AddObject((*iter_object)); // [rad] Store locally in a list, for fast iteration m_vecObjects.push_back((*iter_object)); } }