// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "readMESH.h" #include template IGL_INLINE bool igl::readMESH( const std::string mesh_file_name, Eigen::PlainObjectBase& V, Eigen::PlainObjectBase& T, Eigen::PlainObjectBase& F) { using namespace std; FILE * mesh_file = fopen(mesh_file_name.c_str(),"r"); if(NULL==mesh_file) { fprintf(stderr,"IOError: %s could not be opened...",mesh_file_name.c_str()); return false; } return readMESH(mesh_file,V,T,F); } template IGL_INLINE bool igl::readMESH( FILE * mesh_file, Eigen::PlainObjectBase& V, Eigen::PlainObjectBase& T, Eigen::PlainObjectBase& F) { using namespace std; #ifndef LINE_MAX # define LINE_MAX 2048 #endif char line[LINE_MAX]; bool still_comments; // eat comments at beginning of file const auto eat_comments = [&]()->bool { bool still_comments= true; bool has_line = false; while(still_comments) { has_line = fgets(line,LINE_MAX,mesh_file) != NULL; still_comments = (line[0] == '#' || line[0] == '\n' || line[0] == '\r'); } return has_line; }; eat_comments(); char str[LINE_MAX]; sscanf(line," %s",str); // check that first word is MeshVersionFormatted if(0!=strcmp(str,"MeshVersionFormatted")) { fprintf(stderr, "Error: first word should be MeshVersionFormatted not %s\n",str); fclose(mesh_file); return false; } int version = -1; if(2 != sscanf(line,"%s %d",str,&version)) { fscanf(mesh_file," %d",&version); } if(version != 1 && version != 2) { fprintf(stderr,"Error: second word should be 1 or 2 not %d\n",version); fclose(mesh_file); return false; } while(eat_comments()) { sscanf(line," %s",str); int extra; // check that third word is Dimension if(0==strcmp(str,"Dimension")) { int three = -1; if(2 != sscanf(line,"%s %d",str,&three)) { // 1 appears on next line? fscanf(mesh_file," %d",&three); } if(three != 3) { fprintf(stderr,"Error: only Dimension 3 supported not %d\n",three); fclose(mesh_file); return false; } }else if(0==strcmp(str,"Vertices")) { int number_of_vertices; if(1 != fscanf(mesh_file," %d",&number_of_vertices) || number_of_vertices > 1000000000) { fprintf(stderr,"Error: expecting number of vertices less than 10^9...\n"); fclose(mesh_file); return false; } // allocate space for vertices V.resize(number_of_vertices,3); for(int i = 0;i, Eigen::Matrix, Eigen::Matrix >(FILE*, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(FILE*, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(FILE*, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(FILE*, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(FILE*, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); #endif