// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com> // // 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 "readWRL.h" #include <iostream> template <typename Scalar, typename Index> IGL_INLINE bool igl::readWRL( const std::string wrl_file_name, std::vector<std::vector<Scalar > > & V, std::vector<std::vector<Index > > & F) { using namespace std; FILE * wrl_file = fopen(wrl_file_name.c_str(),"r"); if(NULL==wrl_file) { printf("IOError: %s could not be opened...",wrl_file_name.c_str()); return false; } return readWRL(wrl_file,V,F); } template <typename Scalar, typename Index> IGL_INLINE bool igl::readWRL( FILE * wrl_file, std::vector<std::vector<Scalar > > & V, std::vector<std::vector<Index > > & F) { using namespace std; char line[1000]; // Read lines until seeing "point [" // treat other lines in file as "comments" bool still_comments = true; string needle("point ["); string haystack; while(still_comments) { if(fgets(line,1000,wrl_file) == NULL) { std::cerr<<"readWRL, reached EOF without finding \"point [\""<<std::endl; fclose(wrl_file); return false; } haystack = string(line); still_comments = string::npos == haystack.find(needle); } // read points in sets of 3 int floats_read = 3; double x,y,z; while(floats_read == 3) { floats_read = fscanf(wrl_file," %lf %lf %lf,",&x,&y,&z); if(floats_read == 3) { vector<Scalar > point; point.resize(3); point[0] = x; point[1] = y; point[2] = z; V.push_back(point); //printf("(%g, %g, %g)\n",x,y,z); }else if(floats_read != 0) { printf("ERROR: unrecognized format...\n"); return false; } } // Read lines until seeing "coordIndex [" // treat other lines in file as "comments" still_comments = true; needle = string("coordIndex ["); while(still_comments) { fgets(line,1000,wrl_file); haystack = string(line); still_comments = string::npos == haystack.find(needle); } // read F int ints_read = 1; while(ints_read > 0) { // read new face indices (until hit -1) vector<Index > face; while(true) { // indices are 0-indexed int i; ints_read = fscanf(wrl_file," %d,",&i); if(ints_read > 0) { if(i>=0) { face.push_back(i); }else { F.push_back(face); break; } }else { break; } } } fclose(wrl_file); return true; } #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation template bool igl::readWRL<double, int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&); #endif