bool read_objfile(NonDestructiveTriMesh &mesh, std::vector<Vec3d> &x, const char *filename_format, ...) { #ifdef _MSC_VER va_list ap; va_start(ap, filename_format); int len=_vscprintf(filename_format, ap) // _vscprintf doesn't count +1; // terminating '\0' char *filename=new char[len]; vsprintf(filename, filename_format, ap); std::ifstream input(filename, std::ifstream::binary); delete[] filename; va_end(ap); #else va_list ap; va_start(ap, filename_format); char *filename; vasprintf(&filename, filename_format, ap); std::ifstream input(filename, std::ifstream::binary); std::free(filename); va_end(ap); #endif if(!input.good()) return false; x.clear(); mesh.clear(); char line[LINESIZE]; std::vector<int> vertex_list; while(input.good()){ input.getline(line, LINESIZE); switch(line[0]){ case 'v': // vertex data if(line[1]==' '){ Vec3d new_vertex; std::sscanf(line+2, "%lf %lf %lf", &new_vertex[0], &new_vertex[1], &new_vertex[2]); x.push_back(new_vertex); } break; case 'f': // face data if(line[1]==' '){ read_face_list(line+2, vertex_list); for(int j=0; j<(int)vertex_list.size()-2; ++j) mesh.add_triangle( Vec3st(vertex_list[0], vertex_list[j+1], vertex_list[j+2]) ); } break; } } return true; }
bool read_objfile(std::vector<Vector>& verts, std::vector< std::vector<int> >& tris, const char* filename) { std::ifstream input(filename, std::ifstream::binary); if(!input.good()) return false; verts.clear(); tris.clear(); char line[LINESIZE]; std::vector<int> vertex_list; while(input.good()){ input.getline(line, LINESIZE); switch(line[0]){ case 'v': // vertex data if(line[1]==' '){ Vector new_vertex; std::sscanf(line+2, "%f %f %f", &new_vertex[0], &new_vertex[1], &new_vertex[2]); verts.push_back(new_vertex); } break; case 'f': // face data if(line[1]==' '){ read_face_list(line+2, vertex_list); for(int j=0; j<(int)vertex_list.size()-2; ++j){ std::vector<int> face; face.push_back(vertex_list[j]); face.push_back(vertex_list[j+1]); face.push_back(vertex_list[j+2]); tris.push_back(face); } } break; } } return true; }