From d554a90d4301f1086047ae348c69d4348e74c1ce Mon Sep 17 00:00:00 2001 From: Martin Heistermann Date: Mon, 29 Aug 2022 18:28:04 +0200 Subject: [PATCH] OBJWriter performance: Add map from color to material index, avoids quadratic performance --- src/OpenMesh/Core/IO/writer/OBJWriter.cc | 35 +++++++++++++++--------- src/OpenMesh/Core/IO/writer/OBJWriter.hh | 2 ++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/OpenMesh/Core/IO/writer/OBJWriter.cc b/src/OpenMesh/Core/IO/writer/OBJWriter.cc index 145df5dc..97c0a00f 100644 --- a/src/OpenMesh/Core/IO/writer/OBJWriter.cc +++ b/src/OpenMesh/Core/IO/writer/OBJWriter.cc @@ -130,26 +130,31 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt, std::stream size_t _OBJWriter_::getMaterial(OpenMesh::Vec3f _color) const { - for (size_t i=0; i < material_.size(); i++) - if(material_[i] == _color) - return i; + auto idx_it = material_idx_.find(_color); + if (idx_it != material_idx_.end()) { + return idx_it->second; + } else { + size_t idx = material_.size(); + material_.push_back(_color); + material_idx_[_color] = idx; - //not found add new material - material_.push_back( _color ); - return material_.size()-1; + return idx; + } } //----------------------------------------------------------------------------- size_t _OBJWriter_::getMaterial(OpenMesh::Vec4f _color) const { - for (size_t i=0; i < materialA_.size(); i++) - if(materialA_[i] == _color) - return i; - - //not found add new material - materialA_.push_back( _color ); - return materialA_.size()-1; + auto idx_it = materialA_idx_.find(_color); + if (idx_it != materialA_idx_.end()) { + return idx_it->second; + } else { + size_t idx = materialA_.size(); + materialA_.push_back(_color); + materialA_idx_[_color] = idx; + return idx; + } } //----------------------------------------------------------------------------- @@ -162,7 +167,9 @@ writeMaterial(std::ostream& _out, BaseExporter& _be, Options _opt) const OpenMesh::Vec4f cA; material_.clear(); + material_idx_.clear(); materialA_.clear(); + materialA_idx_.clear(); //iterate over faces for (size_t i=0, nF=_be.n_faces(); i material_; + mutable std::map< OpenMesh::Vec3f, size_t> material_idx_; mutable std::vector< OpenMesh::Vec4f > materialA_; + mutable std::map< OpenMesh::Vec4f, size_t> materialA_idx_; size_t getMaterial(OpenMesh::Vec3f _color) const;