123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // 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 <cstdio>
- 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;
- }
- V.clear();
- F.clear();
- 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)
- {
- fgets(line,1000,wrl_file);
- 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 specialization
- 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
|