📄 omreader.cc
字号:
case Chunk::Type_Color: assert( OMFormat::dimensions(chunk_header_) == 3 ); _opt += Options::VertexColor; for (; vidx < header_.n_vertices_ && !_is.eof(); ++vidx) { bytes_ += vector_restore( _is, v3uc, _swap ); _bi.set_color( VertexHandle(vidx), v3uc ); } break; case Chunk::Type_Custom: bytes_ += restore_binary_custom_data( _is, _bi.kernel()->_get_vprop( property_name_ ), header_.n_vertices_, _swap ); vidx = header_.n_vertices_; break; default: // skip unknown chunks { omerr() << "Unknown chunk type ignored!\n"; size_t size_of = header_.n_vertices_ * OMFormat::vector_size(chunk_header_); _is.ignore( size_of ); bytes_ += size_of; } } // all chunk data has been read..?! return vidx == header_.n_vertices_;}//-----------------------------------------------------------------------------bool_OMReader_::read_binary_face_chunk( std::istream &_is, BaseImporter &_bi, Options &_opt, bool _swap ){ using OMFormat::Chunk; assert( chunk_header_.entity_ == Chunk::Entity_Face ); size_t fidx=0; OpenMesh::Vec3f v3f; // normal OpenMesh::Vec3uc v3uc; // rgb switch( chunk_header_.type_ ) { case Chunk::Type_Topology: { BaseImporter::VHandles face_vhandles; size_t nV = 0; size_t vidx = 0; switch( header_.mesh_ ) { case 'T': nV = 3; break; case 'Q': nV = 4; break; } for (; fidx < header_.n_faces_; ++fidx) { if ( header_.mesh_ == 'P' ) bytes_ += restore( _is, nV, Chunk::Integer_16, _swap ); face_vhandles.clear(); for (size_t j=0; j<nV; ++j) { bytes_ += restore( _is, vidx, Chunk::Integer_Size(chunk_header_.bits_), _swap ); face_vhandles.push_back( vhandles_[ vidx ] ); } _bi.add_face(face_vhandles); } } break; case Chunk::Type_Normal: assert( OMFormat::dimensions(chunk_header_) == size_t(OpenMesh::Vec3f::dim()) ); _opt += Options::FaceNormal; for (; fidx < header_.n_faces_ && !_is.eof(); ++fidx) { bytes_ += vector_restore( _is, v3f, _swap ); _bi.set_normal(FaceHandle(fidx), v3f); } break; case Chunk::Type_Color: assert( OMFormat::dimensions(chunk_header_) == 3 ); _opt += Options::FaceColor; for (; fidx < header_.n_faces_ && !_is.eof(); ++fidx) { bytes_ += vector_restore( _is, v3uc, _swap ); _bi.set_color( FaceHandle(fidx), v3uc ); } break; case Chunk::Type_Custom: bytes_ += restore_binary_custom_data( _is, _bi.kernel()->_get_fprop( property_name_ ), header_.n_faces_, _swap ); fidx = header_.n_faces_; break; default: // skip unknown chunks { omerr() << "Unknown chunk type ignore!\n"; size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_); _is.ignore( size_of ); bytes_ += size_of; } } return fidx == header_.n_faces_;}//-----------------------------------------------------------------------------bool_OMReader_::read_binary_edge_chunk( std::istream &_is, BaseImporter &_bi, Options &_opt, bool _swap ){ using OMFormat::Chunk; assert( chunk_header_.entity_ == Chunk::Entity_Edge ); size_t b=bytes_; switch( chunk_header_.type_ ) { case Chunk::Type_Custom: bytes_ += restore_binary_custom_data( _is, _bi.kernel()->_get_eprop( property_name_ ), header_.n_edges_, _swap ); break; default: // skip unknown type size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_); _is.ignore( size_of ); bytes_ += size_of; } return b < bytes_;}//-----------------------------------------------------------------------------bool_OMReader_::read_binary_halfedge_chunk( std::istream &_is, BaseImporter &_bi, Options &_opt, bool _swap ){ using OMFormat::Chunk; assert( chunk_header_.entity_ == Chunk::Entity_Halfedge ); size_t b = bytes_; switch( chunk_header_.type_ ) { case Chunk::Type_Custom: bytes_ += restore_binary_custom_data( _is, _bi.kernel()->_get_hprop( property_name_ ), 2*header_.n_edges_, _swap ); break; default: // skip unknown chunk omerr() << "Unknown chunk type ignored!\n"; size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_); _is.ignore( size_of ); bytes_ += size_of; } return b < bytes_;}//-----------------------------------------------------------------------------bool_OMReader_::read_binary_mesh_chunk( std::istream &_is, BaseImporter &_bi, Options &_opt, bool _swap ){ using OMFormat::Chunk; assert( chunk_header_.entity_ == Chunk::Entity_Mesh ); size_t b = bytes_; switch( chunk_header_.type_ ) { case Chunk::Type_Custom: bytes_ += restore_binary_custom_data( _is, _bi.kernel()->_get_mprop( property_name_ ), 1, _swap ); break; default: // skip unknown chunk size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_); _is.ignore( size_of ); bytes_ += size_of; } return b < bytes_;}//-----------------------------------------------------------------------------size_t _OMReader_::restore_binary_custom_data( std::istream& _is, BaseProperty* _bp, size_t _n_elem, bool _swap){ assert( !_bp || (_bp->name() == property_name_) ); using OMFormat::Chunk; size_t bytes = 0; Chunk::esize_t block_size; Chunk::PropertyName custom_prop; bytes += binary<Chunk::esize_t>::restore( _is, block_size, _swap ); if ( _bp ) {#if defined(OM_DEBUG) size_t b;#endif size_t n_bytes = _bp->size_of( _n_elem ); if ( ((n_bytes == BaseProperty::UnknownSize) || (n_bytes == block_size)) && (_bp->element_size() == BaseProperty::UnknownSize || (_n_elem * _bp->element_size() == block_size) ) ) {#if defined(OM_DEBUG) bytes += (b=_bp->restore( _is, _swap ));#else bytes += _bp->restore( _is, _swap );#endif assert( block_size == b ); assert( block_size == _bp->size_of() ); block_size = 0; } else { omerr() << "Warning! Property " << _bp->name() << " not loaded: " << "Mismatching data sizes!n"; } } if (block_size) { _is.ignore( block_size ); bytes += block_size; } return bytes;}//-----------------------------------------------------------------------------//=============================================================================} // namespace IO} // namespace OpenMesh//=============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -