Skip to content

Commit f9b76ce

Browse files
committed
Don't write materials without diffuse color in geom server
1 parent fa3431f commit f9b76ce

1 file changed

Lines changed: 44 additions & 22 deletions

File tree

src/ifcgeomserver/IfcGeomServer.cpp

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -344,31 +344,53 @@ class Entity : public Command {
344344
swrite_array<int32_t>(s, lines);
345345
}
346346
}
347-
{ std::vector<float> diffuse_color_array;
348-
for (std::vector<IfcGeom::Material>::const_iterator it = geom->geometry().materials().begin(); it != geom->geometry().materials().end(); ++it) {
349-
const IfcGeom::Material& mat = *it;
350-
if (mat.hasDiffuse()) {
351-
const double* color = mat.diffuse();
352-
diffuse_color_array.push_back(static_cast<float>(color[0]));
353-
diffuse_color_array.push_back(static_cast<float>(color[1]));
354-
diffuse_color_array.push_back(static_cast<float>(color[2]));
355-
} else {
356-
diffuse_color_array.push_back(0.f);
357-
diffuse_color_array.push_back(0.f);
358-
diffuse_color_array.push_back(0.f);
347+
{
348+
// We remove the blanks here from the material array. I.e. materials without a diffuse color
349+
std::vector<boost::optional<std::array<float, 4> > > diffuse_color_array;
350+
for (std::vector<IfcGeom::Material>::const_iterator it = geom->geometry().materials().begin(); it != geom->geometry().materials().end(); ++it) {
351+
const IfcGeom::Material& mat = *it;
352+
if (mat.hasDiffuse()) {
353+
const double* color = mat.diffuse();
354+
diffuse_color_array.push_back(std::array<float, 4>{
355+
static_cast<float>(color[0]),
356+
static_cast<float>(color[1]),
357+
static_cast<float>(color[2]),
358+
mat.hasTransparency() ? static_cast<float>(1. - mat.transparency()) : 1.f
359+
});
360+
} else {
361+
diffuse_color_array.emplace_back();
362+
}
359363
}
360-
if (mat.hasTransparency()) {
361-
diffuse_color_array.push_back(static_cast<float>(1. - mat.transparency()));
362-
} else {
363-
diffuse_color_array.push_back(1.f);
364+
365+
std::map<int, int> orig_to_condensed_index_map;
366+
std::vector<float> diffuse_color_array_condensed;
367+
368+
int new_index = 0;
369+
for (int orig = 0; orig < diffuse_color_array.size(); ++orig) {
370+
auto& m = diffuse_color_array[orig];
371+
if (m) {
372+
for (int i = 0; i < 4; ++i) {
373+
diffuse_color_array_condensed.push_back((*m)[i]);
374+
orig_to_condensed_index_map[orig] = new_index++;
375+
}
376+
}
364377
}
378+
379+
swrite(s, std::string((char*) diffuse_color_array_condensed.data(), diffuse_color_array_condensed.size() * sizeof(float)));
380+
381+
std::vector<int32_t> material_indices;
382+
for (std::vector<int>::const_iterator it = geom->geometry().material_ids().begin(); it != geom->geometry().material_ids().end(); ++it) {
383+
// @todo use something like std::equal_range() ?
384+
auto jt = orig_to_condensed_index_map.find(*it);
385+
if (jt == orig_to_condensed_index_map.end()) {
386+
material_indices.push_back(-1);
387+
} else {
388+
material_indices.push_back(jt->second);
389+
}
390+
}
391+
392+
swrite(s, std::string((char*) material_indices.data(), material_indices.size() * sizeof(int32_t)));
365393
}
366-
swrite(s, std::string((char*) diffuse_color_array.data(), diffuse_color_array.size() * sizeof(float))); }
367-
{ std::vector<int32_t> material_indices;
368-
for (std::vector<int>::const_iterator it = geom->geometry().material_ids().begin(); it != geom->geometry().material_ids().end(); ++it) {
369-
material_indices.push_back(*it);
370-
}
371-
swrite(s, std::string((char*) material_indices.data(), material_indices.size() * sizeof(int32_t))); }
372394
if (eext_) {
373395
eext_->write_contents(s);
374396
}

0 commit comments

Comments
 (0)