int main( int argc, char** argv ) { if ( argc < 3 ) { std::cout << "Usage: " << argv[0] << " [volumetric mesh file] [output obj file] [-t]" << std::endl; std::cout << "Generates the surface mesh of the given volumetric mesh." << std::endl; std::cout << "-t: (this option only applies with cubic meshes) Triangulates each quad face. Default: faces are left as quads." << std::endl; return 1; } char * meshFile = argv[1]; char * outputFile = argv[2]; bool outputTriangleMesh = false; opt_t opttable[] = { { (char*)"t", OPTBOOL, &outputTriangleMesh }, { NULL, 0, NULL } }; argv += 1; argc -= 1; getopts(argc,argv,opttable); if (outputTriangleMesh) printf("Triangle mesh will be triangulated (if needed).\n"); VolumetricMesh * mesh = VolumetricMeshLoader::load(meshFile); GenerateSurfaceMesh generateSurfaceMesh; ObjMesh * objMesh = generateSurfaceMesh.ComputeMesh(mesh, outputTriangleMesh); objMesh->save(outputFile); return 0; }
int main( int argc, char** argv ) { const int numFixedArguments = 3; if( argc < numFixedArguments ) { std::cout << "Merges several obj meshes into one. This routine uses the \"objMesh\" class to load the meshes. It can also merge materials." << std::endl; std::cout << "Usage: " << argv[0] << " [list of obj files] [output file] [-m]" << std::endl; std::cout << " -m : also output materials" << std::endl; std::cout << " -d : (if -m) also remove duplicate materials" << std::endl; return 1; } bool outputMaterials = false; bool removeDuplicatedMaterials = false; char * objListFilename = argv[1]; char * objMeshname = argv[2]; opt_t opttable[] = { { (char*)"m", OPTBOOL, &outputMaterials }, { (char*)"d", OPTBOOL, &removeDuplicatedMaterials }, { NULL, 0, NULL } }; argv += numFixedArguments-1; argc -= numFixedArguments-1; int optup = getopts(argc,argv,opttable); if (optup != argc) { printf("Error parsing options. Error at option %s.\n",argv[optup]); return 1; } ObjMesh outputObjMesh; char s[4096]; FILE * fin; char fileMode[96] = "r"; OpenFile_(objListFilename, &fin, fileMode); while(fgets(s,4096,fin) != 0) { if(s[strlen(s)-1] == '\n') s[strlen(s)-1] = '\0'; printf("%s\n",s); ObjMesh * objMesh = new ObjMesh(s); // add vertices int numVerticesCurrent = outputObjMesh.getNumVertices(); for(unsigned int i=0; i<objMesh->getNumVertices(); i++) outputObjMesh.addVertexPosition(objMesh->getPosition(i)); // add normals int numNormalsCurrent = outputObjMesh.getNumNormals(); for(unsigned int i=0; i<objMesh->getNumNormals(); i++) outputObjMesh.addVertexNormal(objMesh->getNormal(i)); // add texture coordinates int numTextureCoordinatesCurrent = outputObjMesh.getNumTextureCoordinates(); for(unsigned int i=0; i<objMesh->getNumTextureCoordinates(); i++) outputObjMesh.addTextureCoordinate(objMesh->getTextureCoordinate(i)); // add materials int numMaterialsCurrent = outputObjMesh.getNumMaterials(); for(unsigned int i=0; i<objMesh->getNumMaterials(); i++) outputObjMesh.addMaterial(objMesh->getMaterial(i)); for(unsigned int i=0; i<objMesh->getNumGroups(); i++) { const ObjMesh::Group * group = objMesh->getGroupHandle(i); outputObjMesh.addGroup(group->getName()); unsigned int newGroupID = outputObjMesh.getNumGroups() - 1; ObjMesh::Group * newGroup = (ObjMesh::Group*) outputObjMesh.getGroupHandle(newGroupID); newGroup->setMaterialIndex(numMaterialsCurrent + group->getMaterialIndex()); // over all faces in the group of the current obj file for(unsigned int j=0; j<group->getNumFaces(); j++) { const ObjMesh::Face * face = group->getFaceHandle(j); for(unsigned int k=0; k<face->getNumVertices(); k++) { ObjMesh::Vertex * vertex = (ObjMesh::Vertex*) face->getVertexHandle(k); vertex->setPositionIndex(vertex->getPositionIndex() + numVerticesCurrent); if (vertex->hasNormalIndex()) vertex->setNormalIndex(vertex->getNormalIndex() + numNormalsCurrent); if (vertex->hasTextureCoordinateIndex()) vertex->setTextureCoordinateIndex(vertex->getTextureCoordinateIndex() + numTextureCoordinatesCurrent); } outputObjMesh.addFaceToGroup(*face,newGroupID); } } delete(objMesh); } fclose(fin); if (outputMaterials) { if (removeDuplicatedMaterials) { printf("Removing duplicated materials..."); fflush(NULL); int numNewMaterials = outputObjMesh.removeDuplicatedMaterials(); printf(" retained %d materials.\n", numNewMaterials); } outputObjMesh.save(objMeshname, 1); } else { outputObjMesh.save(objMeshname); } return(0); }