void CullSystem::Cull( Frustum& frus, TreeNode<VisCell>& node, std::vector<std::list<Ptr<Renderable>>>& outRenderables) { InterSectResult result = frus.InterSect(node.GetContent().GetAABB()); if ( !result==INTERSECTOUT ) { std::list<Ptr<Renderable>>::iterator iter = node.GetContent().GetRenderables().begin(); if (result== INTERSECTIN) { for (;iter!=node.GetContent().GetRenderables().end();iter++) { RenderType rType = (*iter)->GetRenderType(); outRenderables[rType].push_back((*iter)); } } else { for (;iter!=node.GetContent().GetRenderables().end();iter++) { if ( frus.InterSect((*iter)->GetSubMesh()->GetVertexBuffer()->GetBBox())!= INTERSECTOUT) { RenderType rType = (*iter)->GetRenderType(); outRenderables[rType].push_back((*iter)); } } } for (int i = 0 ;i<(int)node.GetChildren().size();i++) { Cull( frus,*node.GetChildren()[i],outRenderables ); } } }
void CullSystem::Cull( matrix44& vp, TreeNode<VisCell>& node, std::vector<std::list<Ptr<Renderable>>>& outRenderables ) { InterSectResult result = node.GetContent().GetAABB().InterSect(vp); if ( !result==INTERSECTOUT ) { std::list<Ptr<Renderable>>::iterator iter = node.GetContent().GetRenderables().begin(); if (result== INTERSECTIN) { for (;iter!=node.GetContent().GetRenderables().end();iter++) { RenderType rType = (*iter)->GetRenderType(); outRenderables[rType].push_back((*iter)); } } else { for (;iter!=node.GetContent().GetRenderables().end();iter++) { if ( (*iter)->GetWorldBBox().InterSect(vp)!= INTERSECTOUT) { RenderType rType = (*iter)->GetRenderType(); outRenderables[rType].push_back((*iter)); } } } for (int i = 0 ;i<(int)node.GetChildren().size();i++) { Cull( vp,*node.GetChildren()[i],outRenderables ); } } }
void CullSystem::DestoryOctTree( TreeNode<VisCell>& node ) { if (node.GetChildren().size()==8) { for( int i = 0 ;i<8; i++ ) { if ( node.GetChildren()[i] ) { DestoryOctTree(*node.GetChildren()[i]); o_delete(node.GetChildren()[i]); } } } }
void CullSystem::BuildOctTree( TreeNode<VisCell>& node ) { if (node.GetDepth() == m_Depth ) { return; } node.GetChildren().resize(8); for( int i = 0 ;i<8; i++ ) { node.GetChildren()[i] = o_new( TreeNode<VisCell> ); node.GetChildren()[i]->SetParent( &node ); node.GetChildren()[i]->SetDepth( node.GetDepth()+1 ); node.GetChildren()[i]->SetIndex(i); VisCell& parentCell = node.GetContent(); aabbox& box = parentCell.GetAABB(); aabbox baseBox; point middle = (box.GetMax()+box.GetMin())*0.5f; float xHalf = box.GetMax().X() - middle.X(); float yHalf = box.GetMax().Y() - middle.Y(); float zHalf = box.GetMax().Z() - middle.Z(); baseBox.SetMax( box.GetMax() ); baseBox.SetMin( middle ); point& pMax = baseBox.GetMax(); point& pMin = baseBox.GetMin(); if ( i%2==1 ) { pMax.X()-=xHalf; pMin.X()-=xHalf; } if ( i>=4 ) { pMax.Y()-=yHalf; pMin.Y()-=yHalf; if (i>=6) { pMax.Z()-=zHalf; pMin.Z()-=zHalf; } } else if( i>=2 ) { pMax.Z()-=zHalf; pMin.Z()-=zHalf; } VisCell& childCell = node.GetChildren()[i]->GetContent(); childCell.SetAABB(baseBox); BuildOctTree( *node.GetChildren()[i]); } }
// clear the tree void Tree::Clear(){ m_totalNum = 0; // clear active region list<ARTreeNode*> *tempARList = new list<ARTreeNode*>; tempARList->push_back( arHead ); while( !tempARList->empty() ){ ARTreeNode *arNode = tempARList->front(); tempARList->pop_front(); // save the children list<ARTreeNode*> *children = arNode->GetChildren(); tempARList->insert( tempARList->end(), children->begin(), children->end() ); delete children; delete arNode; } delete tempARList; // clear dangling edge list<TreeNode*> *tempDEList = new list<TreeNode*>; tempDEList->push_back( deHead ); while( !tempDEList->empty() ){ TreeNode *deNode = tempDEList->front(); tempDEList->pop_front(); // save the children list<TreeNode*> *children = deNode->GetChildren(); tempDEList->insert( tempDEList->end(), children->begin(), children->end() ); delete children; delete deNode; } delete tempDEList; // creat new heads arHead = new ARTreeNode( -1 ); deHead = new TreeNode( -1 ); }