Improved memory footprint of IFC loading by avoiding keeping in cache duplicated indices.
parent
fce4d0cee7
commit
6ca8423e24
|
@ -728,7 +728,7 @@ void ProcessSweptAreaSolid(const Schema_2x3::IfcSweptAreaSolid& swept, TempMesh&
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
bool ProcessGeometricItem(const Schema_2x3::IfcRepresentationItem& geo, unsigned int matid, std::vector<unsigned int>& mesh_indices,
|
bool ProcessGeometricItem(const Schema_2x3::IfcRepresentationItem& geo, unsigned int matid, std::set<unsigned int>& mesh_indices,
|
||||||
ConversionData& conv)
|
ConversionData& conv)
|
||||||
{
|
{
|
||||||
bool fix_orientation = false;
|
bool fix_orientation = false;
|
||||||
|
@ -810,7 +810,7 @@ bool ProcessGeometricItem(const Schema_2x3::IfcRepresentationItem& geo, unsigned
|
||||||
aiMesh* const mesh = meshtmp->ToMesh();
|
aiMesh* const mesh = meshtmp->ToMesh();
|
||||||
if(mesh) {
|
if(mesh) {
|
||||||
mesh->mMaterialIndex = matid;
|
mesh->mMaterialIndex = matid;
|
||||||
mesh_indices.push_back(static_cast<unsigned int>(conv.meshes.size()));
|
mesh_indices.insert(static_cast<unsigned int>(conv.meshes.size()));
|
||||||
conv.meshes.push_back(mesh);
|
conv.meshes.push_back(mesh);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -818,33 +818,31 @@ bool ProcessGeometricItem(const Schema_2x3::IfcRepresentationItem& geo, unsigned
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
void AssignAddedMeshes(std::vector<unsigned int>& mesh_indices,aiNode* nd,
|
void AssignAddedMeshes(std::set<unsigned int>& mesh_indices,aiNode* nd,
|
||||||
ConversionData& /*conv*/)
|
ConversionData& /*conv*/)
|
||||||
{
|
{
|
||||||
if (!mesh_indices.empty()) {
|
if (!mesh_indices.empty()) {
|
||||||
|
std::set<unsigned int>::const_iterator it = mesh_indices.cbegin();
|
||||||
|
std::set<unsigned int>::const_iterator end = mesh_indices.cend();
|
||||||
|
|
||||||
// make unique
|
nd->mNumMeshes = static_cast<unsigned int>(mesh_indices.size());
|
||||||
std::sort(mesh_indices.begin(),mesh_indices.end());
|
|
||||||
std::vector<unsigned int>::iterator it_end = std::unique(mesh_indices.begin(),mesh_indices.end());
|
|
||||||
|
|
||||||
nd->mNumMeshes = static_cast<unsigned int>(std::distance(mesh_indices.begin(),it_end));
|
|
||||||
|
|
||||||
nd->mMeshes = new unsigned int[nd->mNumMeshes];
|
nd->mMeshes = new unsigned int[nd->mNumMeshes];
|
||||||
for(unsigned int i = 0; i < nd->mNumMeshes; ++i) {
|
for(unsigned int i = 0; it != end && i < nd->mNumMeshes; ++i, ++it) {
|
||||||
nd->mMeshes[i] = mesh_indices[i];
|
nd->mMeshes[i] = *it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
bool TryQueryMeshCache(const Schema_2x3::IfcRepresentationItem& item,
|
bool TryQueryMeshCache(const Schema_2x3::IfcRepresentationItem& item,
|
||||||
std::vector<unsigned int>& mesh_indices, unsigned int mat_index,
|
std::set<unsigned int>& mesh_indices, unsigned int mat_index,
|
||||||
ConversionData& conv)
|
ConversionData& conv)
|
||||||
{
|
{
|
||||||
ConversionData::MeshCacheIndex idx(&item, mat_index);
|
ConversionData::MeshCacheIndex idx(&item, mat_index);
|
||||||
ConversionData::MeshCache::const_iterator it = conv.cached_meshes.find(idx);
|
ConversionData::MeshCache::const_iterator it = conv.cached_meshes.find(idx);
|
||||||
if (it != conv.cached_meshes.end()) {
|
if (it != conv.cached_meshes.end()) {
|
||||||
std::copy((*it).second.begin(),(*it).second.end(),std::back_inserter(mesh_indices));
|
std::copy((*it).second.begin(),(*it).second.end(),std::inserter(mesh_indices, mesh_indices.end()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -852,7 +850,7 @@ bool TryQueryMeshCache(const Schema_2x3::IfcRepresentationItem& item,
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
void PopulateMeshCache(const Schema_2x3::IfcRepresentationItem& item,
|
void PopulateMeshCache(const Schema_2x3::IfcRepresentationItem& item,
|
||||||
const std::vector<unsigned int>& mesh_indices, unsigned int mat_index,
|
const std::set<unsigned int>& mesh_indices, unsigned int mat_index,
|
||||||
ConversionData& conv)
|
ConversionData& conv)
|
||||||
{
|
{
|
||||||
ConversionData::MeshCacheIndex idx(&item, mat_index);
|
ConversionData::MeshCacheIndex idx(&item, mat_index);
|
||||||
|
@ -861,7 +859,7 @@ void PopulateMeshCache(const Schema_2x3::IfcRepresentationItem& item,
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
bool ProcessRepresentationItem(const Schema_2x3::IfcRepresentationItem& item, unsigned int matid,
|
bool ProcessRepresentationItem(const Schema_2x3::IfcRepresentationItem& item, unsigned int matid,
|
||||||
std::vector<unsigned int>& mesh_indices,
|
std::set<unsigned int>& mesh_indices,
|
||||||
ConversionData& conv)
|
ConversionData& conv)
|
||||||
{
|
{
|
||||||
// determine material
|
// determine material
|
||||||
|
|
|
@ -435,7 +435,7 @@ bool ProcessMappedItem(const Schema_2x3::IfcMappedItem& mapped, aiNode* nd_src,
|
||||||
|
|
||||||
msrc = m*msrc;
|
msrc = m*msrc;
|
||||||
|
|
||||||
std::vector<unsigned int> meshes;
|
std::set<unsigned int> meshes;
|
||||||
const size_t old_openings = conv.collect_openings ? conv.collect_openings->size() : 0;
|
const size_t old_openings = conv.collect_openings ? conv.collect_openings->size() : 0;
|
||||||
if (conv.apply_openings) {
|
if (conv.apply_openings) {
|
||||||
IfcMatrix4 minv = msrc;
|
IfcMatrix4 minv = msrc;
|
||||||
|
@ -550,7 +550,7 @@ void ProcessProductRepresentation(const Schema_2x3::IfcProduct& el, aiNode* nd,
|
||||||
|
|
||||||
// extract Color from metadata, if present
|
// extract Color from metadata, if present
|
||||||
unsigned int matid = ProcessMaterials( el.GetID(), std::numeric_limits<uint32_t>::max(), conv, false);
|
unsigned int matid = ProcessMaterials( el.GetID(), std::numeric_limits<uint32_t>::max(), conv, false);
|
||||||
std::vector<unsigned int> meshes;
|
std::set<unsigned int> meshes;
|
||||||
|
|
||||||
// we want only one representation type, so bring them in a suitable order (i.e try those
|
// we want only one representation type, so bring them in a suitable order (i.e try those
|
||||||
// that look as if we could read them quickly at first). This way of reading
|
// that look as if we could read them quickly at first). This way of reading
|
||||||
|
|
|
@ -205,7 +205,7 @@ struct ConversionData
|
||||||
bool operator == (const MeshCacheIndex& o) const { return item == o.item && matindex == o.matindex; }
|
bool operator == (const MeshCacheIndex& o) const { return item == o.item && matindex == o.matindex; }
|
||||||
bool operator < (const MeshCacheIndex& o) const { return item < o.item || (item == o.item && matindex < o.matindex); }
|
bool operator < (const MeshCacheIndex& o) const { return item < o.item || (item == o.item && matindex < o.matindex); }
|
||||||
};
|
};
|
||||||
typedef std::map<MeshCacheIndex, std::vector<unsigned int> > MeshCache;
|
typedef std::map<MeshCacheIndex, std::set<unsigned int> > MeshCache;
|
||||||
MeshCache cached_meshes;
|
MeshCache cached_meshes;
|
||||||
|
|
||||||
typedef std::map<const IFC::Schema_2x3::IfcSurfaceStyle*, unsigned int> MaterialCache;
|
typedef std::map<const IFC::Schema_2x3::IfcSurfaceStyle*, unsigned int> MaterialCache;
|
||||||
|
@ -281,8 +281,8 @@ unsigned int ProcessMaterials(uint64_t id, unsigned int prevMatId, ConversionDat
|
||||||
|
|
||||||
// IFCGeometry.cpp
|
// IFCGeometry.cpp
|
||||||
IfcMatrix3 DerivePlaneCoordinateSpace(const TempMesh& curmesh, bool& ok, IfcVector3& norOut);
|
IfcMatrix3 DerivePlaneCoordinateSpace(const TempMesh& curmesh, bool& ok, IfcVector3& norOut);
|
||||||
bool ProcessRepresentationItem(const Schema_2x3::IfcRepresentationItem& item, unsigned int matid, std::vector<unsigned int>& mesh_indices, ConversionData& conv);
|
bool ProcessRepresentationItem(const Schema_2x3::IfcRepresentationItem& item, unsigned int matid, std::set<unsigned int>& mesh_indices, ConversionData& conv);
|
||||||
void AssignAddedMeshes(std::vector<unsigned int>& mesh_indices,aiNode* nd,ConversionData& /*conv*/);
|
void AssignAddedMeshes(std::set<unsigned int>& mesh_indices,aiNode* nd,ConversionData& /*conv*/);
|
||||||
|
|
||||||
void ProcessSweptAreaSolid(const Schema_2x3::IfcSweptAreaSolid& swept, TempMesh& meshout,
|
void ProcessSweptAreaSolid(const Schema_2x3::IfcSweptAreaSolid& swept, TempMesh& meshout,
|
||||||
ConversionData& conv);
|
ConversionData& conv);
|
||||||
|
|
Loading…
Reference in New Issue