Esempio n. 1
0
void WriterNodeVisitor::apply( osg::Geode &node )
{
    pushStateSet(node.getStateSet());
    //_nameStack.push_back(node.getName());
    unsigned int count = node.getNumDrawables();
    ListTriangle listTriangles;
    bool texcoords = false;
    for ( unsigned int i = 0; i < count; i++ )
    {
        osg::Geometry *g = node.getDrawable( i )->asGeometry();
        if ( g != NULL )
        {
            pushStateSet(g->getStateSet());
            createListTriangle(g, listTriangles, texcoords, i);        // May set _succeded to false
            popStateSet(g->getStateSet());
            if (!succeeded()) break;
        }
    }
    if (succeeded() && count > 0)
    {
#if DISABLE_3DS_ANIMATION
        osg::Matrix mat( osg::computeLocalToWorld(getNodePath()) );
        buildFaces(node, mat, listTriangles, texcoords);        // May set _succeded to false
#else
        buildFaces(node, osg::Matrix(), listTriangles, texcoords);        // May set _succeded to false
#endif
    }
    popStateSet(node.getStateSet());
    //_nameStack.pop_back();
    if (succeeded())
        traverse(node);
}
Esempio n. 2
0
CubeHalf::CubeHalf(TopOrBottom p, GameObject* parent)
{
	pos = p;
	half = new GameObject();
	buildHalf(parent);
	buildFaces();
}
Esempio n. 3
0
void TetMeshUtility::split(TetMesh *tetmesh, TetHalfFace *halfface) {
	
	Point newPos;
	for (int i = 0; i < 3; ++i) {
		newPos += halfface->vertex(i)->point();
	}
	newPos /= 3.0;

	TetVertex *nver = new TetVertex(tetmesh->m_next_vid, newPos, "");
	tetmesh->id2Ver[nver->id()] = nver;
	++tetmesh->m_next_vid;
	std::vector<Tetra*> nTets;

	Tetra *tet = halfface->tetra();

	for (int i = 0; i < 4; ++i) {
		TetHalfFace *hf = tet->halfface(i);
		if (hf == halfface) {
			continue;
		}
	
		Tetra *ntet = new Tetra(tetmesh->m_next_tid, tetmesh->id2Tetra.size(), hf, nver);
		tetmesh->id2Tetra[ntet->id()] = ntet;
		++tetmesh->m_next_tid;
		nTets.push_back(ntet);
	}



	std::vector<TetHalfFace*> halffaces;
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int i = 0; i < 4; ++i) {
			halffaces.push_back(tet->halfface(i));	
		}
	}

	std::vector<TetFace*> faces;
	buildFaces(halffaces, faces);

	//remove the tet from the vertex 
	//the old edges are located in halfface(0)
	for (int i = 0; i < 4; ++i) {
		TetVertex *tv = tet->vertex(i);
		std::vector<Tetra*>& vec = tv->m_tetra; // use shorter name
		vec.erase(std::remove(vec.begin(), vec.end(), tet), vec.end());
	}

	//add the previous face
	for (int i = 0; i < 4; ++i) {
		faces.push_back(tet->halfface(i)->face());
	}

	std::vector<TetEdge*> edges;
	buildEdges(faces, edges);

	halfface->tetra()->isValid() = false;
		
} 
Esempio n. 4
0
void WriterNodeVisitor::apply( osg::Billboard &node )
{
    // TODO Does not handle Billboards' points yet

    pushStateSet(node.getStateSet());
    Lib3dsMeshInstanceNode * parent = _cur3dsNode;

    unsigned int count = node.getNumDrawables();
    ListTriangle listTriangles;
    bool texcoords = false;
    OSG_NOTICE << "Warning: 3DS writer is incomplete for Billboards (rotation not implemented)." << std::endl;
#if DISABLE_3DS_ANIMATION
    osg::Matrix m( osg::computeLocalToWorld(getNodePath()) );
#endif
    for ( unsigned int i = 0; i < count; i++ )
    {
        osg::Geometry *g = node.getDrawable( i )->asGeometry();
        if ( g != NULL )
        {
            listTriangles.clear();
            _cur3dsNode = parent;

            pushStateSet(g->getStateSet());
            createListTriangle(g, listTriangles, texcoords, i);
            popStateSet(g->getStateSet());        // May set _succeded to false
            if (!succeeded()) break;

            osg::Matrix pointLocalMat(osg::Matrix::translate(node.getPosition(i)));        // TODO handle rotation
#if DISABLE_3DS_ANIMATION
            osg::Matrix currentBillboardWorldMat(pointLocalMat * m);
            apply3DSMatrixNode(node, &pointLocalMat, "bil");                            // Add a 3DS matrix node (with local matrix)
            buildFaces(node, currentBillboardWorldMat, listTriangles, texcoords);        // May set _succeded to false
#else
            apply3DSMatrixNode(node, &pointLocalMat, "bil");                            // Add a 3DS matrix node (with local matrix)
            buildFaces(node, osg::Matrix(), listTriangles, texcoords);                    // May set _succeded to false
#endif
            if (!succeeded()) break;
        }
    }

    if (succeeded())
        traverse(node);
    _cur3dsNode = parent;
    popStateSet(node.getStateSet());
}
Esempio n. 5
0
void TetMeshUtility::split(TetMesh *tetmesh, TetEdge *tedge) {
	Point newPos = (tedge->vertex(0)->point() + tedge->vertex(1)->point()) / 2.0; 
	TetVertex *nver = new TetVertex(tetmesh->m_next_vid, newPos, "");
	nver->index() = tetmesh->id2Ver.size();
	tetmesh->id2Ver[nver->id()] = nver;
	++tetmesh->m_next_vid;
	std::vector<Tetra*> nTets;

	//find the one-ring tets;
	std::vector<TetFace *> prev_faces;
	for (TetEdgeTetraIterator iter(tedge); !iter.end(); ++iter) {
		Tetra *tet = *iter;
		for (int i = 0; i < 4; ++i) {
			TetHalfFace *hf = tet->halfface(i);
			if (hf->has(tedge->vertex(0)) && hf->has(tedge->vertex(1))) {
				continue;
			}
			

			Tetra *ntet = new Tetra(tetmesh->m_next_tid, tetmesh->id2Tetra.size(), hf, nver);
			prev_faces.push_back(hf->face());
			tetmesh->id2Tetra[ntet->id()] = ntet;
			++tetmesh->m_next_tid;
			nTets.push_back(ntet);

		}
	

	}	


	//delete the surrounding tetra;
	for (TetEdgeTetraIterator iter(tedge); !iter.end(); ++iter) {
		Tetra *tet = *iter;
		tet->isValid() = false;
		tetmesh->id2Tetra[tet->id()] = 0;
		delete tet;
	}

	std::vector<TetHalfFace*> halffaces;
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int i = 1; i < 4; ++i) {
			halffaces.push_back(tet->halfface(i));	
		}
	}

	std::vector<TetFace*> faces;
	buildFaces(halffaces, faces);
	
	faces.insert(faces.end(), prev_faces.begin(), prev_faces.end());

	std::vector<TetEdge*> edges;
	buildEdges(faces, edges);

	tedge->isValid() = false;
}
Esempio n. 6
0
void TetMeshUtility::split(TetMesh *tetmesh, Tetra *tetra) {
	//create the new vertex
	Point newPos;
	for (int i = 0; i < 4; ++i) {
		newPos += tetra->vertex(i)->point();
	}
	newPos /= 4.0;

	//create new Vertex;
	TetVertex *nver = new TetVertex(tetmesh->m_next_vid, newPos, "");
	nver->index() = tetmesh->id2Ver.size();
	tetmesh->id2Ver[nver->id()] = nver;
	++tetmesh->m_next_vid;
	std::vector<Tetra*> nTets;

	for (int i = 0; i < 4; ++i) {
		TetHalfFace *halfface = tetra->halfface(i);
		Tetra *ntet = new Tetra(tetmesh->m_next_tid, tetmesh->id2Tetra.size(), halfface, nver);
		tetmesh->id2Tetra[ntet->id()] = ntet;
		++tetmesh->m_next_tid;
		nTets.push_back(ntet);
	}

	std::vector<TetHalfFace*> halffaces;
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int i = 0; i < 4; ++i) {
			halffaces.push_back(tet->halfface(i));	
		}
	}


	std::vector<TetFace*> faces;
	buildFaces(halffaces, faces);
	
	//remove the tet from the vertex 
	//the old edges are located in halfface(0)
	for (int i = 0; i < 4; ++i) {
		TetVertex *tv = tetra->vertex(i);
		std::vector<Tetra*>& vec = tv->m_tetra; // use shorter name
		vec.erase(std::remove(vec.begin(), vec.end(), tetra), vec.end());
	}

	//add the previous face
	for (int i = 0; i < 4; ++i) {
		faces.push_back(tetra->halfface(i)->face());
	}


	std::vector<TetEdge*> edges;
	buildEdges(faces, edges);
	
	//link the tetra with the vertex
	for (size_t i = 0; i < nTets.size(); ++i) {
		Tetra *tet = nTets[i];	
		for (int j = 0; j < 4; ++j) {
			TetVertex *tv = tet->vertex(j);
			tv->add(tet);
		}
	}

	tetmesh->id2Tetra[tetra->id()] = 0;
	//delete tetra;
	
}