/**************************************************************************** * VCGLib o o * * Visual and Computer Graphics Library o o * * _ O _ * * Copyright(C) 2004 \/)\/ * * Visual Computing Lab /\/| * * ISTI - Italian National Research Council | * * \ * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * * for more details. * * * ****************************************************************************/ /**************************************************************************** History $Log: not supported by cvs2svn $ ****************************************************************************/ #ifndef __VCGLIB_IMPORT_RAW #define __VCGLIB_IMPORT_RAW #include namespace vcg { namespace tri { namespace io { /** This class encapsulate a filter for importing raw format pointcloud. there exists many raw formats. each one with a particular sintax even if they only contains */ template class ImporterRAW { public: typedef typename MESH_TYPE::VertexPointer VertexPointer; typedef typename MESH_TYPE::ScalarType ScalarType; typedef typename MESH_TYPE::VertexType VertexType; typedef typename MESH_TYPE::FaceType FaceType; typedef typename MESH_TYPE::VertexIterator VertexIterator; typedef typename MESH_TYPE::FaceIterator FaceIterator; // max token number #define RAW_MAX_TOKEN_LINE_DESCRIPTOR 32 enum RAWError { E_NOERROR, // 0 // Errori di open E_CANTOPEN, // 1 E_UNESPECTEDEOF, // 2 // errore line descriptor E_INVALIDLINEDESC // 3 }; static const char *ErrorMsg(int error) { static const char * raw_error_msg[] = { "No errors", "Can't open file", "Premature End of file", "Invalid line Descriptor", }; if(error>2 || error<0) return "Unknown error"; else return stl_error_msg[error]; }; // line format is a string describing which data is stored for every data line // PX PY PZ posizione // NX NY NZ normale // CR CG CB colore // RF riflettanza (qualita') // // the string is parsed to know how many value are contained in each line // and which is the order. the result is a number (how many) and a vector // describing the order // // // during reading a data structure is used to store intermediate values // it is basically an array of float // // float linebuffer[] //[0][1][2][3][4][5][6][7][8][9] // p p p n n n c c c r // x y z x y z r g b f // // given the number of tokens and the order vector it is possible to scan a line using the command // // for(...n 0->tokennumber...) // fscanf(fp,"%f", &linebuffer[tokenorder[n]]) static int Parselinedescription(const char * linedesc, int &tokennumber, int *order) { int ii; char tok[3]; int index; // controllo lunghezza // se non e' multiplo di 3 allora e' errato int len = strlen(linedesc) + 1; if(len%3 != 0) return E_INVALIDLINEDESC; index=0; tok[2] = '\0'; tokennumber = 0; for(ii=0; ii::AddFaces(m,facenum); // VertexIterator vi=Allocator::AddVertices(m,facenum*3); while(!feof(fp)) { for(ii=0; ii