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));
}
Example #2
0
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;
}