ExtremalQuery3BSP<Real>::ExtremalQuery3BSP ( const ConvexPolyhedron3<Real>* polytope) : ExtremalQuery3<Real>(polytope) { // Create the adjacency information for the polytope. int numVertices = mPolytope->GetNumVertices(); const Vector3<Real>* vertices = mPolytope->GetVertices(); int numTriangles = mPolytope->GetNumTriangles(); const int* indices = mPolytope->GetIndices(); BasicMesh mesh(numVertices, vertices, numTriangles, indices); // Create the set of unique arcs which are used to create the BSP tree. std::multiset<SphericalArc> arcs; CreateSphericalArcs(mesh, arcs); // Create the BSP tree to be used in the extremal query. std::vector<SphericalArc> nodes; CreateBSPTree(arcs, nodes); // Copy the nodes into a single, nonresizeable array. mNumNodes = (int)nodes.size(); mNodes = new1<SphericalArc>(mNumNodes); memcpy(mNodes, &nodes.front(), mNumNodes*sizeof(SphericalArc)); }
tree_node *CreateTreeFromWindowIDList(screen_info *Screen, std::vector<window_info*> *WindowsPtr) { if(IsSpaceFloating(Screen->ActiveSpace)) return NULL; tree_node *RootNode = CreateRootNode(); SetRootNodeContainer(Screen, RootNode); bool Result = false; space_info *Space = &Screen->Space[Screen->ActiveSpace]; if(Space->Mode == SpaceModeBSP) Result = CreateBSPTree(RootNode, Screen, WindowsPtr); else if(Space->Mode == SpaceModeMonocle) Result = CreateMonocleTree(RootNode, Screen, WindowsPtr); if(!Result) { free(RootNode); RootNode = NULL; } return RootNode; }
void BinarySeachTree::Init() { smgr->getVideoDriver()->setClearColor(glitch::video::SColor(255, 0, 0, 0)); environment = collada::CColladaDatabase::constructScene(smgr->getVideoDriver(), "data/Streaming/miami.bdae"); smgr->getRootSceneNode()->addChild(environment); environment->getSceneNodesFromType(ESNT_COLLADA_MESH, outNodes); glitch::f32 MinEdgeX = environment->getBoundingBox().MinEdge.getX(); glitch::f32 MaxEdgeX = environment->getBoundingBox().MaxEdge.getX(); glitch::f32 MinEdgeY = environment->getBoundingBox().MinEdge.getY(); glitch::f32 MaxEdgeY = environment->getBoundingBox().MaxEdge.getY(); glitch::f32 MinEdgeZ = environment->getBoundingBox().MinEdge.getZ(); glitch::f32 MaxEdgeZ = environment->getBoundingBox().MaxEdge.getZ(); rootnode = new BSPTreeNode(); rootnode->nodes = outNodes; for(scene::SSceneNodeArray::iterator iter = outNodes.begin(); iter != outNodes.end(); ++iter) { (*iter)->setVisible(false); } rootnode->min = vector3df(MinEdgeX, MinEdgeY, MinEdgeZ); rootnode->max = vector3df(MaxEdgeX, MaxEdgeY, MaxEdgeZ); rootnode->treeheight = 0; CreateBSPTree(rootnode); //---------appCamera-------------- appCamera = irrnew CameraSceneNode(-1); appCamera->setNearValue(1.f); appCamera->setFarValue(5000000.f); appCamera->setPosition(position); appCamera->setTarget(core::vector3df(0.0f, 0.0f, 0.0f)); //---------cube-------------- video::CMaterialPtr cubeMat = smgr->getVideoDriver()->getMaterialRendererManager().createMaterialInstance(smgr->getVideoDriver(), video::EMT_UNLIT_TEXTURED_SOLID); glitch::scene::IMeshPtr cube = glitch::scene::createCubeMesh(1000, cubeMat); glitch::scene::ISceneNodePtr node = irrnew glitch::scene::CMeshSceneNode(cube);; appCamera->addChild(node); //--------------------------- smgr->getRootSceneNode()->addChild(appCamera); smgr->setActiveCamera(appCamera); RenderBSPTree(rootnode, appCamera); renderflag = true; //---------mainCamera-------------- mainCamera = irrnew CameraSceneNode(0); mainCamera->setNearValue(1.f); mainCamera->setFarValue(5000000.f); mainCamera->setPosition(core::vector3df(0.0f, 0.0f, 110000.0f)); mainCamera->setTarget(core::vector3df(0.0f, 0.0f, 0.0f)); smgr->getRootSceneNode()->addChild(mainCamera); smgr->setActiveCamera(mainCamera); }
void BinarySeachTree::CreateBSPTree(BSPTreeNode* root) { if((root->treeheight <= THeight)&&(root->nodes.size()!=0)&&(root->nodes.size()!=1)) { root->lchild = new BSPTreeNode(); root->lchild->treeheight = root->treeheight + 1; root->rchild = new BSPTreeNode(); root->rchild->treeheight = root->treeheight + 1; if(root->treeheight%2 == 0) scale = 0; else if (root->treeheight%2 == 1) scale = 1; if (scale == 0) // plane is parallel to X axis { root->lchild->min.set(root->min); root->lchild->max.set((root->min[0] + root->max[0])/2, root->max[1], root->max[2]); root->rchild->min.set((root->min[0] + root->max[0])/2, root->min[1], root->min[2]); root->rchild->max.set(root->max); for( scene::SSceneNodeArray::iterator iter = root->nodes.begin(); iter != root->nodes.end(); ++iter) { /* std::cout<<"object_minX:"<<((*iter)->getBoundingBox().MinEdge.getX())<<std::endl; std::cout<<"object_maxX:"<<((*iter)->getBoundingBox().MaxEdge.getX())<<std::endl; std::cout<<"object_centerX:"<<((*iter)->getBoundingBox().getCenter().getX())<<std::endl; std::cout<<"object_absoluteMaxX:"<<((*iter)->getPosition().getX() + (*iter)->getBoundingBox().MaxEdge.getX())<<std::endl; std::cout<<"object_absoluteMinX:"<<((*iter)->getPosition().getX() + (*iter)->getBoundingBox().MinEdge.getX())<<std::endl; std::cout<<"middleX:"<<((root->min[0] + root->max[0])/2)<<std::endl;*/ f32 absoluteMaxX = (*iter)->getAbsolutePosition().getX() + (*iter)->getBoundingBox().MaxEdge.getX(); f32 absoluteMinX = (*iter)->getAbsolutePosition().getX() + (*iter)->getBoundingBox().MinEdge.getX(); if( absoluteMaxX < (root->min[0] + root->max[0])/2 ) //lefttree { /* std::cout<<"Xleft"<<std::endl;*/ root->lchild->nodes.push_back(*iter); } else if( absoluteMinX > (root->min[0] + root->max[0])/2) //righttree { /*std::cout<<"Xright"<<std::endl;*/ root->rchild->nodes.push_back(*iter); } else //both { /*std::cout<<"Xboth"<<std::endl;*/ root->lchild->nodes.push_back(*iter); root->rchild->nodes.push_back(*iter); } } CreateBSPTree(root->lchild); CreateBSPTree(root->rchild); } else if (scale == 1) // plane is parallel to Y axis { root->lchild->min.set(root->min); root->lchild->max.set(root->max[0], (root->min[1] + root->max[1])/2, root->max[2]); root->rchild->min.set(root->min[0], (root->min[1] + root->max[1])/2, root->min[2]); root->rchild->max.set(root->max); for( scene::SSceneNodeArray::iterator iter = root->nodes.begin(); iter != root->nodes.end(); ++iter) { /* std::cout<<"object_minY:"<<((*iter)->getBoundingBox().MinEdge.getY())<<std::endl; std::cout<<"object_maxY:"<<((*iter)->getBoundingBox().MaxEdge.getY())<<std::endl; std::cout<<"object_absoluteMaxY:"<<((*iter)->getPosition().getY() + (*iter)->getBoundingBox().MaxEdge.getY())<<std::endl; std::cout<<"object_absoluteMinY:"<<((*iter)->getPosition().getY() + (*iter)->getBoundingBox().MinEdge.getY())<<std::endl; std::cout<<"middleY:"<<((root->min[1] + root->max[1])/2)<<std::endl;*/ f32 absoluteMaxY = (*iter)->getAbsolutePosition().getY() + (*iter)->getBoundingBox().MaxEdge.getY(); f32 absoluteMinY = (*iter)->getAbsolutePosition().getY() + (*iter)->getBoundingBox().MinEdge.getY(); if( absoluteMaxY < (root->min[1] + root->max[1])/2 ) //lefttree { /*std::cout<<"Yleft"<<std::endl;*/ root->lchild->nodes.push_back(*iter); } else if( absoluteMinY > (root->min[1] + root->max[1])/2) //righttree { /*std::cout<<"Yright"<<std::endl;*/ root->rchild->nodes.push_back(*iter); } else //both { /*std::cout<<"Yboth"<<std::endl;*/ root->lchild->nodes.push_back(*iter); root->rchild->nodes.push_back(*iter); } } CreateBSPTree(root->lchild); CreateBSPTree(root->rchild); } } return; }