Merge branch 'speed-up-objwriter-materials' into 'master'

OBJWriter performance: Add map from color to material index, avoids quadratic performance

See merge request OpenMesh/OpenMesh!323
This commit is contained in:
Jan Möbius
2022-08-30 05:08:38 +00:00
2 changed files with 24 additions and 13 deletions

View File

@@ -130,26 +130,31 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt, std::stream
size_t _OBJWriter_::getMaterial(OpenMesh::Vec3f _color) const size_t _OBJWriter_::getMaterial(OpenMesh::Vec3f _color) const
{ {
for (size_t i=0; i < material_.size(); i++) auto idx_it = material_idx_.find(_color);
if(material_[i] == _color) if (idx_it != material_idx_.end()) {
return i; return idx_it->second;
} else {
size_t idx = material_.size();
material_.push_back(_color);
material_idx_[_color] = idx;
//not found add new material return idx;
material_.push_back( _color ); }
return material_.size()-1;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
size_t _OBJWriter_::getMaterial(OpenMesh::Vec4f _color) const size_t _OBJWriter_::getMaterial(OpenMesh::Vec4f _color) const
{ {
for (size_t i=0; i < materialA_.size(); i++) auto idx_it = materialA_idx_.find(_color);
if(materialA_[i] == _color) if (idx_it != materialA_idx_.end()) {
return i; return idx_it->second;
} else {
//not found add new material size_t idx = materialA_.size();
materialA_.push_back( _color ); materialA_.push_back(_color);
return materialA_.size()-1; materialA_idx_[_color] = idx;
return idx;
}
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -162,7 +167,9 @@ writeMaterial(std::ostream& _out, BaseExporter& _be, Options _opt) const
OpenMesh::Vec4f cA; OpenMesh::Vec4f cA;
material_.clear(); material_.clear();
material_idx_.clear();
materialA_.clear(); materialA_.clear();
materialA_idx_.clear();
//iterate over faces //iterate over faces
for (size_t i=0, nF=_be.n_faces(); i<nF; ++i) for (size_t i=0, nF=_be.n_faces(); i<nF; ++i)
@@ -392,7 +399,9 @@ write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _prec
} }
material_.clear(); material_.clear();
material_idx_.clear();
materialA_.clear(); materialA_.clear();
materialA_idx_.clear();
return true; return true;
} }

View File

@@ -103,7 +103,9 @@ private:
mutable std::string objName_; mutable std::string objName_;
mutable std::vector< OpenMesh::Vec3f > material_; mutable std::vector< OpenMesh::Vec3f > material_;
mutable std::map< OpenMesh::Vec3f, size_t> material_idx_;
mutable std::vector< OpenMesh::Vec4f > materialA_; mutable std::vector< OpenMesh::Vec4f > materialA_;
mutable std::map< OpenMesh::Vec4f, size_t> materialA_idx_;
size_t getMaterial(OpenMesh::Vec3f _color) const; size_t getMaterial(OpenMesh::Vec3f _color) const;