⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 offwriter.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
字号:
/*===========================================================================*\ *                                                                           * *                               OpenMesh                                    * *      Copyright (C) 2001-2005 by Computer Graphics Group, RWTH Aachen      * *                           www.openmesh.org                                * *                                                                           * *---------------------------------------------------------------------------*  *                                                                           * *                                License                                    * *                                                                           * *  This library is free software; you can redistribute it and/or modify it  * *  under the terms of the GNU Library General Public License as published   * *  by the Free Software Foundation, version 2.                              * *                                                                           * *  This library 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        * *  Library General Public License for more details.                         * *                                                                           * *  You should have received a copy of the GNU Library General Public        * *  License along with this library; if not, write to the Free Software      * *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                * *                                                                           *\*===========================================================================*///== INCLUDES =================================================================#include <OpenMesh/Core/System/config.hh>#include <OpenMesh/Core/System/omstream.hh>#include <OpenMesh/Core/Utils/Endian.hh>#include <OpenMesh/Core/IO/IOManager.hh>#include <OpenMesh/Core/IO/BinaryHelper.hh>#include <OpenMesh/Core/IO/writer/OFFWriter.hh>//=== NAMESPACES ==============================================================namespace OpenMesh {namespace IO {//=== INSTANCIATE =============================================================// register the OFFLoader singleton with MeshLoader_OFFWriter_  __OFFWriterInstance;_OFFWriter_& OFFWriter() { return __OFFWriterInstance; }//=== IMPLEMENTATION ==========================================================_OFFWriter_::_OFFWriter_() { IOManager().register_module(this); }//-----------------------------------------------------------------------------bool_OFFWriter_::write(const std::string& _filename, BaseExporter& _be, Options _opt) const{  // check exporter features  if ( !check( _be, _opt ) )    return false;  // check writer features  if ( _opt.check(Options::VertexColor) || // not supported by module       _opt.check(Options::FaceNormal)  || // not supported by format       _opt.check(Options::FaceColor)  )   // not supported by module    return false;       // open file  FILE* out = fopen(_filename.c_str(), "w");  if (!out)  {    omerr() << "[OFFWriter] : cannot open file "	  << _filename	  << std::endl;    return false;  }  // write header line  if (_opt.check(Options::VertexTexCoord)) fprintf(out, "ST");  if (_opt.check(Options::VertexColor))    fprintf(out, "C");  if (_opt.check(Options::VertexNormal))   fprintf(out, "N");  fprintf(out, "OFF");  if (_opt.check(Options::Binary))         fprintf(out, " BINARY");  fprintf(out, "\n");  // write to file  bool result = (_opt.check(Options::Binary) ?		 write_binary(out, _be, _opt) :		 write_ascii(out, _be, _opt));  // return result  fclose(out);  return result;}//-----------------------------------------------------------------------------bool_OFFWriter_::write_ascii(FILE* _out, BaseExporter& _be, Options _opt) const{  omlog() << "[OFFWriter] : write ascii file\n";  unsigned int i, j, nV, nF;  Vec3f v, n;  Vec2f t;  VertexHandle vh;  std::vector<VertexHandle> vhandles;  // #vertices, #faces  fprintf(_out, "%d %d 0\n", (int)_be.n_vertices(), (int)_be.n_faces());  // vertex data (point, normals, texcoords)  if (_opt.check(Options::VertexTexCoord) &&       _opt.check(Options::VertexNormal))  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      n  = _be.normal(vh);      t  = _be.texcoord(vh);      fprintf(_out, "%.10f %.10f %.10f %.10f %.10f %.10f %f %f\n", 	      v[0], v[1], v[2], n[0], n[1], n[2], t[0], t[1]);    }  }  else if (_opt.check(Options::VertexTexCoord))  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      t  = _be.texcoord(vh);      fprintf(_out, "%.10f %.10f %.10f %f %f\n", 	      v[0], v[1], v[2], t[0], t[1]);    }  }  else if (_opt.check(Options::VertexNormal))  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      n  = _be.normal(vh);      fprintf(_out, "%.10f %.10f %.10f %.10f %.10f %.10f\n", 	      v[0], v[1], v[2], n[0], n[1], n[2]);    }  }  else  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      fprintf(_out, "%.10f %.10f %.10f\n", v[0], v[1], v[2]);    }  }  // faces (indices starting at 0)  if (_be.is_triangle_mesh())  {    for (i=0, nF=_be.n_faces(); i<nF; ++i)    {      _be.get_vhandles(FaceHandle(i), vhandles);      fprintf(_out, "3 %d %d %d\n", 	      vhandles[0].idx(),	      vhandles[1].idx(), 	      vhandles[2].idx());    }  }  else  {    for (i=0, nF=_be.n_faces(); i<nF; ++i)    {      nV = _be.get_vhandles(FaceHandle(i), vhandles);      fprintf(_out, "%d", nV);      for (j=0; j<vhandles.size(); ++j)	fprintf(_out, " %d", vhandles[j].idx());      fprintf(_out, "\n");    }  }  return true;}//-----------------------------------------------------------------------------bool _OFFWriter_::write_binary(FILE* _out, BaseExporter& _be, Options _opt) const{  omlog() << "[OFFWriter] : write bindary file\n";  unsigned int i, j, nV, nF;  Vec3f v, n;  Vec2f t;  VertexHandle vh;  std::vector<VertexHandle> vhandles;  bool swap =     ( (_opt.check(Options::MSB) && Endian::local()==Endian::LSB) ||      (_opt.check(Options::LSB) && Endian::local()==Endian::MSB) );       // header: #vertices, #faces, #edges  write_int(_be.n_vertices(), _out, swap);  write_int(_be.n_faces(),    _out, swap);  write_int(0,                _out, swap);  // vertex data (point, normals, texcoords)  if (_opt.check(Options::VertexTexCoord) &&       _opt.check(Options::VertexNormal))  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      n  = _be.normal(vh);      t  = _be.texcoord(vh);      write_float(v[0], _out, swap);      write_float(v[1], _out, swap);      write_float(v[2], _out, swap);      write_float(n[0], _out, swap);      write_float(n[1], _out, swap);      write_float(n[2], _out, swap);      write_float(t[0], _out, swap);      write_float(t[1], _out, swap);    }  }  else if (_opt.check(Options::VertexTexCoord))  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      t  = _be.texcoord(vh);      write_float(v[0], _out, swap);      write_float(v[1], _out, swap);      write_float(v[2], _out, swap);      write_float(t[0], _out, swap);      write_float(t[1], _out, swap);    }  }  else if (_opt.check(Options::VertexNormal))  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      n  = _be.normal(vh);      write_float(v[0], _out, swap);      write_float(v[1], _out, swap);      write_float(v[2], _out, swap);      write_float(n[0], _out, swap);      write_float(n[1], _out, swap);      write_float(n[2], _out, swap);    }  }  else  {    for (i=0, nV=_be.n_vertices(); i<nV; ++i)    {      vh = VertexHandle(i);      v  = _be.point(vh);      write_float(v[0], _out, swap);      write_float(v[1], _out, swap);      write_float(v[2], _out, swap);    }  }  // faces (indices starting at 0)  if (_be.is_triangle_mesh())  {    for (i=0, nF=_be.n_faces(); i<nF; ++i)    {      _be.get_vhandles(FaceHandle(i), vhandles);      write_int(3, _out, swap);      write_int(vhandles[0].idx(), _out, swap);      write_int(vhandles[1].idx(), _out, swap);      write_int(vhandles[2].idx(), _out, swap);    }  }  else  {    for (i=0, nF=_be.n_faces(); i<nF; ++i)    {      nV = _be.get_vhandles(FaceHandle(i), vhandles);      write_int(nV, _out, swap);      for (j=0; j<vhandles.size(); ++j)	write_int(vhandles[j].idx(), _out, swap);    }  }  return true;}// ----------------------------------------------------------------------------size_t_OFFWriter_::binary_size(BaseExporter& _be, Options _opt) const{  size_t header(0);  size_t data(0);  size_t _3longs(3*sizeof(long));  size_t _3floats(3*sizeof(float));    if ( !_opt.check(Options::Binary) )    return 0;  else  {    header += 11;                             // 'OFF BINARY\n'    header += _3longs;                        // #V #F #E    data   += _be.n_vertices() * _3floats;    // vertex data  }  if ( _opt.check(Options::VertexNormal) && _be.has_vertex_normals() )  {    header += 1; // N    data   += _be.n_vertices() * _3floats;  }  if ( _opt.check(Options::VertexTexCoord) && _be.has_vertex_texcoords() )  {    size_t _2floats(2*sizeof(float));    header += 2; // ST    data   += _be.n_vertices() * _2floats;  }     // topology  if (_be.is_triangle_mesh())  {    size_t _4ui(4*sizeof(unsigned int));                      data += _be.n_faces() * _4ui;  }  else  {    unsigned int i, nV, nF;    std::vector<VertexHandle> vhandles;    for (i=0, nF=_be.n_faces(); i<nF; ++i)    {      nV = _be.get_vhandles(FaceHandle(i), vhandles);      data += nV * sizeof(unsigned int);    }  }     return header+data;}//=============================================================================} // namespace IO} // namespace OpenMesh//=============================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -