OBJWriter performance: Add map from color to material index, avoids quadratic performance
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user