From 7ed79b6afd768328cfcb18b653393c50bd7a5f85 Mon Sep 17 00:00:00 2001 From: cnr-isti-vclab Date: Wed, 17 Nov 2004 10:13:48 +0000 Subject: [PATCH] Initial commit --- wrap/io_trimesh/import_off.h | 460 +++++++++++++++++++++++++++++++++++ 1 file changed, 460 insertions(+) create mode 100644 wrap/io_trimesh/import_off.h diff --git a/wrap/io_trimesh/import_off.h b/wrap/io_trimesh/import_off.h new file mode 100644 index 00000000..27939c9d --- /dev/null +++ b/wrap/io_trimesh/import_off.h @@ -0,0 +1,460 @@ +/**************************************************************************** +* 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. * +* * +****************************************************************************/ + +#ifndef __VCGLIB_IMPORT_OFF +#define __VCGLIB_IMPORT_OFF + +#include +#include +#include +#include +#include + +namespace vcg +{ + namespace tri + { + namespace io + { + // /** \addtogroup */ + // /* @{ */ + 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 OFFCodes::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++; + 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 \ No newline at end of file