From db0782e9460ef66a688ccb856484554da2e1e9a7 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 30 Jul 2019 11:17:01 +0200 Subject: [PATCH] Py node shader wrapper: Add clamping to official min/max values. Taking values from relevant node definition C file... Related to T67889. --- .../modules/bpy_extras/node_shader_utils.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/release/scripts/modules/bpy_extras/node_shader_utils.py b/release/scripts/modules/bpy_extras/node_shader_utils.py index 01ccd51aada..0eac9794930 100644 --- a/release/scripts/modules/bpy_extras/node_shader_utils.py +++ b/release/scripts/modules/bpy_extras/node_shader_utils.py @@ -42,6 +42,13 @@ def rgb_to_rgba(rgb): def rgba_to_rgb(rgba): return Color((rgba[0], rgba[1], rgba[2])) +# All clamping value shall follow Blender's defined min/max (check relevant node definition .c file). +def values_clamp(val, minv, maxv): + if hasattr(val, "__iter__"): + return tuple(max(minv, min(maxv, v)) for v in val) + else: + return max(minv, min(maxv, val)) + class ShaderWrapper(): """ @@ -267,6 +274,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def base_color_set(self, color): + color = values_clamp(color, 0.0, 1.0) color = rgb_to_rgba(color) self.material.diffuse_color = color if self.use_nodes and self.node_principled_bsdf is not None: @@ -297,6 +305,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def specular_set(self, value): + value = values_clamp(value, 0.0, 1.0) self.material.specular_intensity = value if self.use_nodes and self.node_principled_bsdf is not None: self.node_principled_bsdf.inputs["Specular"].default_value = value @@ -311,6 +320,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def specular_tint_set(self, value): + value = values_clamp(value, 0.0, 1.0) if self.use_nodes and self.node_principled_bsdf is not None: self.node_principled_bsdf.inputs["Specular Tint"].default_value = value @@ -341,6 +351,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def roughness_set(self, value): + value = values_clamp(value, 0.0, 1.0) self.material.roughness = value if self.use_nodes and self.node_principled_bsdf is not None: self.node_principled_bsdf.inputs["Roughness"].default_value = value @@ -371,6 +382,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def metallic_set(self, value): + value = values_clamp(value, 0.0, 1.0) self.material.metallic = value if self.use_nodes and self.node_principled_bsdf is not None: self.node_principled_bsdf.inputs["Metallic"].default_value = value @@ -401,6 +413,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def ior_set(self, value): + value = values_clamp(value, 0.0, 1000.0) if self.use_nodes and self.node_principled_bsdf is not None: self.node_principled_bsdf.inputs["IOR"].default_value = value @@ -427,6 +440,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def transmission_set(self, value): + value = values_clamp(value, 0.0, 1.0) if self.use_nodes and self.node_principled_bsdf is not None: self.node_principled_bsdf.inputs["Transmission"].default_value = value @@ -453,6 +467,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def alpha_set(self, value): + value = values_clamp(value, 0.0, 1.0) if self.use_nodes and self.node_principled_bsdf is not None: self.node_principled_bsdf.inputs["Alpha"].default_value = value @@ -483,6 +498,7 @@ class PrincipledBSDFWrapper(ShaderWrapper): @_set_check def normalmap_strength_set(self, value): + value = values_clamp(value, 0.0, 10.0) if self.use_nodes and self.node_normalmap is not None: self.node_normalmap.inputs["Strength"].default_value = value