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); }
CubeHalf::CubeHalf(TopOrBottom p, GameObject* parent) { pos = p; half = new GameObject(); buildHalf(parent); buildFaces(); }
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; }
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()); }
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; }
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; }