From 74132eff65fa36a51651ed67f6be450aeaf1aa4f Mon Sep 17 00:00:00 2001 From: Alexandra Heuschling Date: Wed, 13 Jan 2021 14:15:08 +0100 Subject: [PATCH] support now face coords for OM reader/writer --- src/OpenMesh/Core/IO/importer/BaseImporter.hh | 3 +++ src/OpenMesh/Core/IO/importer/ImporterT.hh | 7 +++++- src/OpenMesh/Core/IO/reader/OMReader.cc | 23 ++++++++++++++++- src/OpenMesh/Core/IO/writer/OMWriter.cc | 25 ++++++++++++++++++- src/Unittests/unittests_read_write_OM.cc | 7 ++++++ 5 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/OpenMesh/Core/IO/importer/BaseImporter.hh b/src/OpenMesh/Core/IO/importer/BaseImporter.hh index 53da0ed0..947c108d 100644 --- a/src/OpenMesh/Core/IO/importer/BaseImporter.hh +++ b/src/OpenMesh/Core/IO/importer/BaseImporter.hh @@ -152,6 +152,9 @@ public: // set incident face handle for given halfedge virtual void set_face(HalfedgeHandle _heh, FaceHandle _fh) = 0; + // request texture coordinate property + virtual void request_face_texcoords2D() = 0; + // set vertex texture coordinate virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) = 0; diff --git a/src/OpenMesh/Core/IO/importer/ImporterT.hh b/src/OpenMesh/Core/IO/importer/ImporterT.hh index 93de5e1b..b8e56724 100644 --- a/src/OpenMesh/Core/IO/importer/ImporterT.hh +++ b/src/OpenMesh/Core/IO/importer/ImporterT.hh @@ -285,9 +285,14 @@ public: mesh_.set_face_handle(_heh, _fh); } + virtual void request_face_texcoords2D() override + { + if(!mesh_.has_halfedge_texcoords2D()) + mesh_.request_halfedge_texcoords2D(); + } virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) override - { + { if (mesh_.has_halfedge_texcoords2D()) mesh_.set_texcoord2D(_heh, vector_cast(_texcoord)); } diff --git a/src/OpenMesh/Core/IO/reader/OMReader.cc b/src/OpenMesh/Core/IO/reader/OMReader.cc index be1a4004..d68aafd4 100644 --- a/src/OpenMesh/Core/IO/reader/OMReader.cc +++ b/src/OpenMesh/Core/IO/reader/OMReader.cc @@ -182,7 +182,6 @@ bool _OMReader_::read_binary(std::istream& _is, BaseImporter& _bi, Options& _opt return false; } - while (!_is.eof()) { bytes_ += restore(_is, chunk_header_, swap); @@ -661,6 +660,28 @@ bool _OMReader_::read_binary_halfedge_chunk(std::istream &_is, BaseImporter &_bi bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_hprop(property_name_), 2 * header_.n_edges_, _swap); break; } + + //---------------------------------------------------------------------------------------- + case Chunk::Type_Texcoord: + { + assert( OMFormat::dimensions(chunk_header_) == size_t(OpenMesh::Vec2f::dim())); + + //fileOptions_ += OpenMesh::IO::Options::FaceTexCoord; + + if (_opt.face_has_texcoord()) + { + _bi.request_face_texcoords2D(); + } + OpenMesh::Vec2f v2f; + for (size_t e_idx = 0; e_idx < header_.n_edges_*2; ++e_idx) + { + bytes_ += vector_restore(_is, v2f, _swap); + if (_opt.face_has_texcoord()) + _bi.set_texcoord(HalfedgeHandle(int(e_idx)), v2f); + } + break; + } + //---------------------------------------------------------------------------------------- case Chunk::Type_Topology: { std::vector next_halfedges; diff --git a/src/OpenMesh/Core/IO/writer/OMWriter.cc b/src/OpenMesh/Core/IO/writer/OMWriter.cc index c77a7e23..a59e739d 100644 --- a/src/OpenMesh/Core/IO/writer/OMWriter.cc +++ b/src/OpenMesh/Core/IO/writer/OMWriter.cc @@ -303,7 +303,6 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be, chunk_header.dim_ = OMFormat::dim(t); chunk_header.bits_ = OMFormat::bits(t[0]); - // std::clog << chunk_header << std::endl; bytes += store(_os, chunk_header, swap); for (i = 0, nV = header.n_vertices_; i < nV; ++i) @@ -337,6 +336,30 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be, } } + + // ---------- write face texture coords + if (_OMWriter_::version_ > OMFormat::mk_version(2,1) && _be.n_edges() && _opt.check(Options::FaceTexCoord)) + { + + t = _be.texcoord(HalfedgeHandle(0)); + + chunk_header.name_ = false; + chunk_header.entity_ = OMFormat::Chunk::Entity_Halfedge; + chunk_header.type_ = OMFormat::Chunk::Type_Texcoord; + chunk_header.signed_ = OMFormat::is_signed(t[0]); + chunk_header.float_ = OMFormat::is_float(t[0]); + chunk_header.dim_ = OMFormat::dim(t); + chunk_header.bits_ = OMFormat::bits(t[0]); + + bytes += store(_os, chunk_header, swap); + + int nHE; + for (i = 0, nHE = header.n_edges_*2; i < nHE; ++i) + bytes += vector_store(_os, _be.texcoord(HalfedgeHandle(i)), swap); + + } + //--------------------------------------------------------------- + // ---------- write vertex topology (outgoing halfedge) if (_be.n_vertices()) { diff --git a/src/Unittests/unittests_read_write_OM.cc b/src/Unittests/unittests_read_write_OM.cc index 97535789..fd89b874 100644 --- a/src/Unittests/unittests_read_write_OM.cc +++ b/src/Unittests/unittests_read_write_OM.cc @@ -1711,8 +1711,14 @@ TEST_F(OpenMeshReadWriteOM, LoadTriangleMeshWithPropertiesCurrentVersion) { add_all_properties(mesh_); + mesh_.request_halfedge_texcoords2D(); + std::string file_name_2_2 = "cube_tri_with_properties_2_2.om"; OpenMesh::IO::Options ops(OpenMesh::IO::Options::Custom); + ops += OpenMesh::IO::Options::FaceTexCoord; + + std::cout << "ops has facetexcoords: " << ops.face_has_texcoord() << std::endl; + OpenMesh::IO::write_mesh(mesh_, file_name_2_2, ops); Mesh new_mesh; @@ -1720,6 +1726,7 @@ TEST_F(OpenMeshReadWriteOM, LoadTriangleMeshWithPropertiesCurrentVersion) { OpenMesh::IO::read_mesh(new_mesh, file_name_2_2, ops); check_all_properties(new_mesh); + EXPECT_TRUE(new_mesh.has_halfedge_texcoords2D()); } /*