int saveMeshAsObjWithTexture(Mesh& mgtext, const string& filename)
{
size_t nVerts = mgtext.pointnum;
size_t nfaces = mgtext.facenum;
ofstream outfile;
outfile.open(filename);
if (!outfile) {
std::cout << "file open failed.\n";
return -1;
}
string mtlname = filename;
mtlname.erase(mtlname.end() - 4, mtlname.end());
ofstream mtl;
mtl.open(mtlname + ".mtl");
if (!mtl) {
std::cout << "file mtl open failed.\n";
return -1;
}
//mtl
mtl << "#\n"
<< "# Wavefront material file\n"
<< "# Converted by Meshlab Group\n"
<< "#\n\n"
<< "newmtl material_0\n"
<< "Ka 0.200000 0.200000 0.200000\n"
<< "Kd 1.000000 1.000000 1.000000\n"
<< "Ks 1.000000 1.000000 1.000000\n"
<< "Tr 1.000000\n"
<< "illum 2\n"
<< "Ns 0.000000\n"
<< "map_Kd material0000.png\n\n";
mtl.close();
//obj header
outfile << "####\n"
<< "#\n"
<< "# OBJ File Generated by Meshlab\n"
<< "#\n"
<< "####\n"
<< "# Object out.obj\n"
<< "#\n"
<< "# Vertices: " << nVerts << "\n"
<< "# Faces : " << nfaces << "\n"
<< "#\n"
<< "####\n"
<< "mtllib ./out.mtl\n\n\n";
// Vertices
for (size_t i = 0; i < nVerts; i++)
{
outfile << setiosflags(ios::fixed) << setprecision(6)
<< "vn " << mgtext.normals[i].x << " " << mgtext.normals[i].y << " " << mgtext.normals[i].z << "\n"
<< "vt " << mgtext.point_uv_vect[i].x << " " << mgtext.point_uv_vect[i].y << "\n"
<< "v " << mgtext.point_vect[i].x << " " << mgtext.point_vect[i].y << " " << mgtext.point_vect[i].z << "\n";
}
outfile << "\n\n";
outfile << "usemtl material_0\n";
for (size_t i = 0; i < nfaces; i++)
{
outfile << "f "
<< mgtext.face[3 * i] + 1 << "/" << mgtext.face[3 * i] + 1 << "/" << mgtext.face[3 * i] + 1 << " "
<< mgtext.face[3 * i + 1] + 1 << "/" << mgtext.face[3 * i + 1] + 1 << "/" << mgtext.face[3 * i + 1] + 1 << " "
<< mgtext.face[3 * i + 2] + 1 << "/" << mgtext.face[3 * i + 2] + 1 << "/" << mgtext.face[3 * i + 2] + 1 << "\n";
}
outfile << "# End of File\n";
outfile.close();
return 0;
}