From f9b76ce022047d3e68bb5c5dc1c5019f239221ff Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Tue, 15 Oct 2019 10:38:49 +0200 Subject: [PATCH] Don't write materials without diffuse color in geom server --- src/ifcgeomserver/IfcGeomServer.cpp | 66 +++++++++++++++++++---------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/src/ifcgeomserver/IfcGeomServer.cpp b/src/ifcgeomserver/IfcGeomServer.cpp index 1f0c210b0b..07af4bc089 100644 --- a/src/ifcgeomserver/IfcGeomServer.cpp +++ b/src/ifcgeomserver/IfcGeomServer.cpp @@ -344,31 +344,53 @@ protected: swrite_array(s, lines); } } - { std::vector diffuse_color_array; - for (std::vector::const_iterator it = geom->geometry().materials().begin(); it != geom->geometry().materials().end(); ++it) { - const IfcGeom::Material& mat = *it; - if (mat.hasDiffuse()) { - const double* color = mat.diffuse(); - diffuse_color_array.push_back(static_cast(color[0])); - diffuse_color_array.push_back(static_cast(color[1])); - diffuse_color_array.push_back(static_cast(color[2])); - } else { - diffuse_color_array.push_back(0.f); - diffuse_color_array.push_back(0.f); - diffuse_color_array.push_back(0.f); + { + // We remove the blanks here from the material array. I.e. materials without a diffuse color + std::vector > > diffuse_color_array; + for (std::vector::const_iterator it = geom->geometry().materials().begin(); it != geom->geometry().materials().end(); ++it) { + const IfcGeom::Material& mat = *it; + if (mat.hasDiffuse()) { + const double* color = mat.diffuse(); + diffuse_color_array.push_back(std::array{ + static_cast(color[0]), + static_cast(color[1]), + static_cast(color[2]), + mat.hasTransparency() ? static_cast(1. - mat.transparency()) : 1.f + }); + } else { + diffuse_color_array.emplace_back(); + } } - if (mat.hasTransparency()) { - diffuse_color_array.push_back(static_cast(1. - mat.transparency())); - } else { - diffuse_color_array.push_back(1.f); + + std::map orig_to_condensed_index_map; + std::vector diffuse_color_array_condensed; + + int new_index = 0; + for (int orig = 0; orig < diffuse_color_array.size(); ++orig) { + auto& m = diffuse_color_array[orig]; + if (m) { + for (int i = 0; i < 4; ++i) { + diffuse_color_array_condensed.push_back((*m)[i]); + orig_to_condensed_index_map[orig] = new_index++; + } + } } + + swrite(s, std::string((char*) diffuse_color_array_condensed.data(), diffuse_color_array_condensed.size() * sizeof(float))); + + std::vector material_indices; + for (std::vector::const_iterator it = geom->geometry().material_ids().begin(); it != geom->geometry().material_ids().end(); ++it) { + // @todo use something like std::equal_range() ? + auto jt = orig_to_condensed_index_map.find(*it); + if (jt == orig_to_condensed_index_map.end()) { + material_indices.push_back(-1); + } else { + material_indices.push_back(jt->second); + } + } + + swrite(s, std::string((char*) material_indices.data(), material_indices.size() * sizeof(int32_t))); } - swrite(s, std::string((char*) diffuse_color_array.data(), diffuse_color_array.size() * sizeof(float))); } - { std::vector material_indices; - for (std::vector::const_iterator it = geom->geometry().material_ids().begin(); it != geom->geometry().material_ids().end(); ++it) { - material_indices.push_back(*it); - } - swrite(s, std::string((char*) material_indices.data(), material_indices.size() * sizeof(int32_t))); } if (eext_) { eext_->write_contents(s); }