Adding --surface-color in conversion settings to force the use of surface color instead of diffuse color. Issue #5075

This commit is contained in:
Cristian Ritter
2024-08-15 13:56:31 -03:00
parent 4348b9bff9
commit b5a61753a5
4 changed files with 25 additions and 5 deletions
+7
View File
@@ -331,6 +331,13 @@ namespace ifcopenshell {
static constexpr bool defaultvalue = false;
};
struct SurfaceColour : public SettingBase<SurfaceColour, bool> {
static constexpr const char* const name = "surface-colour";
static constexpr const char* const description =
"Prioritizes the surface color instead of using diffuse.";
static constexpr bool defaultvalue = false;
};
enum PiecewiseStepMethod {
MAXSTEPSIZE,
MINSTEPS };
+5 -1
View File
@@ -565,10 +565,14 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcStyledItem* inst) {
return surface_style;
}
surface_style->use_surface_color = settings_.get<settings::SurfaceColour>().get();
static taxonomy::colour white = taxonomy::colour(1., 1., 1.);
double rgb[3];
if (process_colour(shading->SurfaceColour(), rgb)) {
surface_style->diffuse.components() << rgb[0], rgb[1], rgb[2];
surface_style->surface.components() << rgb[0], rgb[1], rgb[2];
} else {
surface_style->surface = white;
}
if (auto rendering_style = shading->as<IfcSchema::IfcSurfaceStyleRendering>()) {
+11 -2
View File
@@ -305,8 +305,10 @@ typedef item const* ptr;
std::string name;
colour diffuse;
colour surface;
colour specular;
double specularity, transparency;
bool use_surface_color;
void print(std::ostream& o, int indent = 0) const;
@@ -321,8 +323,15 @@ typedef item const* ptr;
// @todo equality implementation based on values?
bool operator==(const style& other) const { return instance == other.instance; }
style() : specularity(std::numeric_limits<double>::quiet_NaN()), transparency(std::numeric_limits<double>::quiet_NaN()) {}
style(const std::string& name) : name(name), specularity(std::numeric_limits<double>::quiet_NaN()), transparency(std::numeric_limits<double>::quiet_NaN()) {}
style() : specularity(std::numeric_limits<double>::quiet_NaN()), transparency(std::numeric_limits<double>::quiet_NaN()), use_surface_color(false) {}
style(const std::string& name) : name(name), specularity(std::numeric_limits<double>::quiet_NaN()), transparency(std::numeric_limits<double>::quiet_NaN()), use_surface_color(false) {}
colour get_color() const {
if (use_surface_color && surface) {
return surface;
}
return diffuse;
}
bool has_specularity() const {
return !std::isnan(specularity);
+2 -2
View File
@@ -97,9 +97,9 @@ int GltfSerializer::writeMaterial(const ifcopenshell::geometry::taxonomy::style:
std::array<double, 4> base;
base.fill(1.0);
if (style->diffuse) {
if (style->get_color()) {
for (int i = 0; i < 3; ++i) {
base[i] = style->diffuse.ccomponents()(i);
base[i] = style->get_color().ccomponents()(i);
}
}
if (style->transparency == style->transparency) {