diff --git a/src/OpenMesh/Core/IO/reader/OMReader.cc b/src/OpenMesh/Core/IO/reader/OMReader.cc index c3fa8d8c..efec49f9 100644 --- a/src/OpenMesh/Core/IO/reader/OMReader.cc +++ b/src/OpenMesh/Core/IO/reader/OMReader.cc @@ -400,10 +400,15 @@ bool _OMReader_::read_binary_vertex_chunk(std::istream &_is, BaseImporter &_bi, } case Chunk::Type_Custom: + { + Chunk::PropertyName property_type; + bytes_ += restore(_is, property_type, _swap); + add_generic_property(property_type, _bi); bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_vprop(property_name_), header_.n_vertices_, _swap); vidx = header_.n_vertices_; + } break; @@ -550,12 +555,17 @@ bool _OMReader_::read_binary_face_chunk(std::istream &_is, BaseImporter &_bi, Op } case Chunk::Type_Custom: + { + Chunk::PropertyName property_type; + bytes_ += restore(_is, property_type, _swap); + add_generic_property(property_type, _bi); 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 { @@ -583,11 +593,15 @@ bool _OMReader_::read_binary_edge_chunk(std::istream &_is, BaseImporter &_bi, Op switch (chunk_header_.type_) { case Chunk::Type_Custom: + { + Chunk::PropertyName property_type; + bytes_ += restore(_is, property_type, _swap); + add_generic_property(property_type, _bi); bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_eprop(property_name_), header_.n_edges_, _swap); break; - + } case Chunk::Type_Status: { assert( OMFormat::dimensions(chunk_header_) == 1); @@ -626,10 +640,15 @@ bool _OMReader_::read_binary_halfedge_chunk(std::istream &_is, BaseImporter &_bi switch (chunk_header_.type_) { case Chunk::Type_Custom: + { + Chunk::PropertyName property_type; + bytes_ += restore(_is, property_type, _swap); + + add_generic_property(property_type, _bi); bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_hprop(property_name_), 2 * header_.n_edges_, _swap); break; - + } case Chunk::Type_Topology: { std::vector next_halfedges; @@ -703,11 +722,15 @@ bool _OMReader_::read_binary_mesh_chunk(std::istream &_is, BaseImporter &_bi, Op switch (chunk_header_.type_) { case Chunk::Type_Custom: + { + Chunk::PropertyName property_type; + bytes_ += restore(_is, property_type, _swap); + add_generic_property(property_type, _bi); bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_mprop(property_name_), 1, _swap); break; - + } default: // skip unknown chunk size_t chunk_size = OMFormat::chunk_data_size(header_, chunk_header_); @@ -731,9 +754,7 @@ size_t _OMReader_::restore_binary_custom_data(std::istream& _is, BaseProperty* _ size_t bytes = 0; Chunk::esize_t block_size; Chunk::PropertyName custom_prop; - Chunk::PropertyType property_type; - bytes += restore(_is, property_type, _swap); bytes += restore(_is, block_size, OMFormat::Chunk::Integer_32, _swap); if (_bp) { @@ -769,6 +790,100 @@ size_t _OMReader_::restore_binary_custom_data(std::istream& _is, BaseProperty* _ } +//--------------------------------helper +void _OMReader_:: add_generic_property(OMFormat::Chunk::PropertyName& _property_type, BaseImporter& _bi) const +{ + if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string())) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string())) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string())) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string())) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string())) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string()) ) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string()) ) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string()) ) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string()) ) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string()) ) + { + add_generic_property_aux(_bi); + } + else if(_property_type == OMFormat::Chunk::PropertyName(OMFormat::get_type_string>()) ) + { + add_generic_property_aux>(_bi); + } +} + +template +void _OMReader_::add_generic_property_aux(BaseImporter& _bi) const +{ + + switch (chunk_header_.entity_) + { + case OMFormat::Chunk::Entity_Vertex: + { + VPropHandleT prop; + _bi.kernel()->add_property(prop, property_name_); + break; + } + case OMFormat::Chunk::Entity_Face: + { + FPropHandleT prop; + _bi.kernel()->add_property(prop, property_name_); + break; + } + case OMFormat::Chunk::Entity_Edge: + { + EPropHandleT prop; + _bi.kernel()->add_property(prop, property_name_); + break; + } + case OMFormat::Chunk::Entity_Halfedge: + { + HPropHandleT prop; + _bi.kernel()->add_property(prop, property_name_); + break; + } + case OMFormat::Chunk::Entity_Mesh: + { + MPropHandleT prop; + _bi.kernel()->add_property(prop, property_name_); + break; + } + case OMFormat::Chunk::Entity_Sentinel: + ; + break; + default: + ; + } +} + + //----------------------------------------------------------------------------- //============================================================================= diff --git a/src/OpenMesh/Core/IO/reader/OMReader.hh b/src/OpenMesh/Core/IO/reader/OMReader.hh index 5e04e378..af043484 100644 --- a/src/OpenMesh/Core/IO/reader/OMReader.hh +++ b/src/OpenMesh/Core/IO/reader/OMReader.hh @@ -149,10 +149,14 @@ private: Options &_opt, bool _swap) const; - size_t restore_binary_custom_data( std::istream& _is, - BaseProperty* _bp, - size_t _n_elem, - bool _swap) const; + size_t restore_binary_custom_data(std::istream& _is, + BaseProperty* _bp, + size_t _n_elem, + bool _swap) const; + + //------------------helper + void add_generic_property(OMFormat::Chunk::PropertyName& _property_type, BaseImporter& _bi) const; + template void add_generic_property_aux(BaseImporter& _bi) const; };