@@ -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