/**************************************************************************** * 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 $ Revision 1.6 2005/01/26 22:44:51 cignoni Resolved scoping of constant of OFF codes Revision 1.5 2005/01/18 12:35:18 rita_borgo Added #include it was giving problems with Allocator:: Revision 1.4 2005/01/03 11:18:24 cignoni changed a .. rfind('OFF') .. in rfind("OFF") and added some casts Revision 1.3 2004/11/23 11:56:50 cignoni Corrected small bug in the tokenizer (it would add a fake token for lines ending with a space before /n) ****************************************************************************/ #ifndef __VCGLIB_IMPORT_OFF #define __VCGLIB_IMPORT_OFF #include #include #include #include #include #include namespace vcg { namespace tri { namespace io { // /** \addtogroup */ // /* @{ */ /** This class encapsulate a filter for importing OFF meshes. A basic description of the OFF file format can be found at http://www.geomview.org/docs/html/geomview_41.html */ template class ImporterOFF { public: typedef typename MESH_TYPE::VertexType VertexType; typedef typename MESH_TYPE::VertexIterator VertexIterator; typedef typename MESH_TYPE::VertexPointer VertexPointer; typedef typename MESH_TYPE::FaceType FaceType; typedef typename MESH_TYPE::FaceIterator FaceIterator; typedef typename MESH_TYPE::FacePointer FacePointer; typedef typename MESH_TYPE::CoordType CoordType; typedef typename MESH_TYPE::ScalarType ScalarType; /*! * Standard call for knowing the meaning of an error code * \param message_code The code returned by Open * \return The string describing the error code */ static const char* ErrorMsg(int message_code) { static const char* error_msg[3] = { "No errors", "Can't open file", "Premature End of file", }; if(message_code>2 || message_code<0) return "Unknown error"; else return error_msg[message_code]; }; /*! * Standard call for reading a mesh * \param mesh the destination mesh * \param filename the name of the file to read from * \return the operation result */ static int Open(MESH_TYPE &mesh, const char *filename) { mesh.Clear(); bool isNormalDefined = false; bool isColorDefined = false; bool isTexCoordDefined = false; int dimension = 3; std::ifstream stream(filename); if (stream.fail()) return CantOpen; std::vector< std::string > tokens; TokenizeNextLine(stream, tokens); if (tokens[tokens.size()-1].rfind("OFF")!= std::basic_string::npos) { for (int u=tokens.size()-2; u>=0; u--) { std::string header = tokens[u]; if (header.compare("C")==0) { isColorDefined = true; continue; } if (header.compare("N")==0) { isNormalDefined = true; continue; } if (header.compare("ST")==0) { isTexCoordDefined = true; continue; } } if (tokens[tokens.size()-1].compare("4OFF")==0) dimension = 4; else if (tokens[tokens.size()-1].compare("nOFF")==0) { TokenizeNextLine(stream, tokens); dimension = atoi(tokens[0].c_str()); } else dimension = 3; TokenizeNextLine(stream, tokens); } unsigned int nVertices, nFaces, nEdges; nVertices = atoi(tokens[0].c_str()); nFaces = atoi(tokens[1].c_str()); nEdges = atoi(tokens[2].c_str()); assert(dimension = 3); VertexIterator v_iter = Allocator::AddVertices(mesh, nVertices); for (unsigned int i=0; i::AddFaces(mesh, nFaces); unsigned int f0=0; for (unsigned int f=0; f::AddFaces(mesh, trigs); int *vertIndices = new int[vert_per_face]; for (int k=0; k &tokens) { std::string line; do std::getline(stream, line, '\n'); while (line[0] == '#' || line.length()==0); size_t from = 0; size_t to = 0; size_t length = line.size(); tokens.clear(); do { while (line[from]==' ' && from!=length) from++; if(from!=length) { to = from+1; while (line[to]!=' ' && to!=length) to++; tokens.push_back(line.substr(from, to-from).c_str()); from = to; } } while (fromcolor mapping, according to the Geomview's `cmap.fmap' file. * \param i the color index * \return the corresponding vcg::Color4f color */ static const vcg::Color4f ColorMap(int i) { static const float colorMap[148][4] = { { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.2f, 0.2f, 0.2f, 0.2f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.1f, 0.1f, 0.1f, 0.1f }, { 0.1f, 0.1f, 0.1f, 0.1f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.2f, 0.2f, 0.2f, 0.2f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 0.05f, 0.05f, 0.05f, 0.05f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.2f, 0.2f, 0.2f, 0.2f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.1f, 0.1f, 0.1f, 0.1f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.7f, 0.7f, 0.7f, 0.7f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.9f, 0.9f, 0.9f, 0.9f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.75f, 0.75f, 0.75f, 0.75f }, { 0.8f, 0.8f, 0.8f, 0.8f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f, 0.0f }, { 0.4f, 0.4f, 0.4f, 0.4f }, { 0.8f, 0.8f, 0.8f, 0.8f } }; return Color4f(colorMap[i][0], colorMap[i][1], colorMap[i][2], colorMap[i][3]); } }; // /*! @} */ }; //namespace io };//namespace tri }; // namespace vcg #endif //__VCGLIB_IMPORT_OFF