// Generates the octree. // Divides the node into 8 children while the contained object is superior to the maxElementPerNode parameter. void OctreeNode::GenerateOctree(vector<SceneObject*>& sceneObjectsList, unsigned int maxElementPerNode) { stack<OctreeNode*> recursivityStack; recursivityStack.push(this); while(!recursivityStack.empty()) { OctreeNode* currentNode = recursivityStack.top(); recursivityStack.pop(); // Add the sceneObjects which are inside the node to the contained list. for(vector<SceneObject*>::iterator it = sceneObjectsList.begin(); it != sceneObjectsList.end(); ++it) { if(currentNode->ObjectIsInside((**it))) { currentNode->m_containedObjects.push_back(&(**it)); } } if(currentNode->m_containedObjects.size() > maxElementPerNode) { //Sons creation. float newSize = abs((currentNode->GetAABBMax().X() - currentNode->GetAABBMin().X()) / 2); currentNode->m_children[0] = new OctreeNode(Vector3(currentNode->GetAABBMin().X(), currentNode->GetAABBMin().Y(), currentNode->GetAABBMin().Z()), Vector3(currentNode->GetAABBMax().X() - newSize, currentNode->GetAABBMax().Y() - newSize, currentNode->GetAABBMax().Z() - newSize), ColorRGB::PureBlue); currentNode->m_children[1] = new OctreeNode(Vector3(currentNode->GetAABBMin().X() + newSize, currentNode->GetAABBMin().Y(), currentNode->GetAABBMin().Z()), Vector3(currentNode->GetAABBMax().X(), currentNode->GetAABBMax().Y() - newSize, currentNode->GetAABBMax().Z() - newSize), ColorRGB::PureBlue); currentNode->m_children[2] = new OctreeNode(Vector3(currentNode->GetAABBMin().X(), currentNode->GetAABBMin().Y() + newSize, currentNode->GetAABBMin().Z()), Vector3(currentNode->GetAABBMax().X() - newSize, currentNode->GetAABBMax().Y(), currentNode->GetAABBMax().Z() - newSize), ColorRGB::PureBlue); currentNode->m_children[3] = new OctreeNode(Vector3(currentNode->GetAABBMin().X() + newSize, currentNode->GetAABBMin().Y() + newSize, currentNode->GetAABBMin().Z()), Vector3(currentNode->GetAABBMax().X(), currentNode->GetAABBMax().Y(), currentNode->GetAABBMax().Z() - newSize), ColorRGB::PureBlue); currentNode->m_children[4] = new OctreeNode(Vector3(currentNode->GetAABBMin().X(), currentNode->GetAABBMin().Y(), currentNode->GetAABBMin().Z() + newSize), Vector3(currentNode->GetAABBMax().X() - newSize, currentNode->GetAABBMax().Y() - newSize, currentNode->GetAABBMax().Z()), ColorRGB::PureBlue); currentNode->m_children[5] = new OctreeNode(Vector3(currentNode->GetAABBMin().X() + newSize, currentNode->GetAABBMin().Y(), currentNode->GetAABBMin().Z() + newSize), Vector3(currentNode->GetAABBMax().X(), currentNode->GetAABBMax().Y() - newSize, currentNode->GetAABBMax().Z()), ColorRGB::PureBlue); currentNode->m_children[6] = new OctreeNode(Vector3(currentNode->GetAABBMin().X(), currentNode->GetAABBMin().Y() + newSize, currentNode->GetAABBMin().Z() + newSize), Vector3(currentNode->GetAABBMax().X() - newSize, currentNode->GetAABBMax().Y(), currentNode->GetAABBMax().Z()), ColorRGB::PureBlue); currentNode->m_children[7] = new OctreeNode(Vector3(currentNode->GetAABBMin().X() + newSize, currentNode->GetAABBMin().Y() + newSize, currentNode->GetAABBMin().Z() + newSize), currentNode->GetAABBMax(), ColorRGB::PureBlue); } for(unsigned int i = 0; i < 8; i++) { if(currentNode->GetChild(i) != NULL) recursivityStack.push(currentNode->GetChild(i)); } } }