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

This commit is contained in:
Martin Heistermann
2022-08-29 18:28:04 +02:00
parent 7c29f1e39e
commit d554a90d43
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 {
//not found add new material size_t idx = material_.size();
material_.push_back(_color); material_.push_back(_color);
return material_.size()-1; material_idx_[_color] = idx;
return idx;
}
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
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;