diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 08085871c0..ac9586eeb5 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -56,7 +56,8 @@ class SolidView(View): self._extruders_model = None self._theme = None - self._support_angle = 90 + self._support_angle = self._retrieveSupportAngle() + self._lowest_printable_height = self._retrieveLowestPrintHeight() self._global_stack = None @@ -95,12 +96,20 @@ class SolidView(View): self._global_stack.propertyChanged.connect(self._onPropertyChanged) for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): extruder_stack.propertyChanged.connect(self._onPropertyChanged) - self._onPropertyChanged("support_angle", "value") # Force an re-evaluation + # Force re-evaluation: + self._support_angle = self._retrieveSupportAngle() + self._lowest_printable_height = self._retrieveLowestPrintHeight() def _onPropertyChanged(self, key: str, property_name: str) -> None: - if key != "support_angle" or property_name != "value": + if property_name != "value": return # As the rendering is called a *lot* we really, dont want to re-evaluate the property every time. So we store em! + if key == "support_angle": + self._support_angle = self._retrieveSupportAngle() + elif key == "layer_height_0" or key == "slicing_tolerance": + self._lowest_printable_height = self._retrieveLowestPrintHeight() + + def _retrieveSupportAngle(self) -> float: global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: support_extruder_nr = int(global_container_stack.getExtruderPositionValueWithDefault("support_extruder_nr")) @@ -111,7 +120,18 @@ class SolidView(View): else: angle = support_angle_stack.getProperty("support_angle", "value") if angle is not None: - self._support_angle = angle + return angle + return 90.0 + + def _retrieveLowestPrintHeight(self) -> float: + min_height = 0.0 + for extruder in Application.getInstance().getExtruderManager().getActiveExtruderStacks(): + init_layer_height = extruder.getProperty("layer_height_0", "value") + tolerance_setting = extruder.getProperty("slicing_tolerance", "value") + if tolerance_setting == "middle": + init_layer_height /= 2.0 + min_height = max(min_height, init_layer_height / 2.0) + return min_height def _checkSetup(self): if not self._extruders_model: @@ -194,6 +214,7 @@ class SolidView(View): self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang. else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) + self._enabled_shader.setUniformValue("u_lowestPrintableHeight", self._lowest_printable_height) disabled_batch = renderer.createRenderBatch(shader = self._disabled_shader) normal_object_batch = renderer.createRenderBatch(shader = self._enabled_shader) renderer.addRenderBatch(disabled_batch) diff --git a/resources/shaders/overhang.shader b/resources/shaders/overhang.shader index 3438c1b3ca..e16eb3e224 100644 --- a/resources/shaders/overhang.shader +++ b/resources/shaders/overhang.shader @@ -32,6 +32,7 @@ fragment = uniform lowp float u_overhangAngle; uniform lowp vec4 u_overhangColor; + uniform lowp float u_lowestPrintableHeight; uniform lowp vec4 u_faceColor; uniform highp int u_faceId; @@ -65,7 +66,7 @@ fragment = highp vec3 grid = vec3(f_vertex.x - floor(f_vertex.x - 0.5), f_vertex.y - floor(f_vertex.y - 0.5), f_vertex.z - floor(f_vertex.z - 0.5)); finalColor.a = (u_renderError > 0.5) && dot(grid, grid) < 0.245 ? 0.667 : 1.0; - if (f_vertex.y <= 0.0) + if (f_vertex.y <= u_lowestPrintableHeight) { finalColor.rgb = vec3(1.0, 1.0, 1.0) - finalColor.rgb; } @@ -109,6 +110,7 @@ fragment41core = uniform lowp float u_overhangAngle; uniform lowp vec4 u_overhangColor; + uniform lowp float u_lowestPrintableHeight; uniform lowp vec4 u_faceColor; uniform highp int u_faceId; @@ -141,7 +143,7 @@ fragment41core = finalColor = (u_faceId != gl_PrimitiveID) ? ((f_vertex.y > 0.0001 && -normal.y > u_overhangAngle) ? u_overhangColor : finalColor) : u_faceColor; frag_color = finalColor; - if (f_vertex.y <= 0.0) + if (f_vertex.y <= u_lowestPrintableHeight) { frag_color.rgb = vec3(1.0, 1.0, 1.0) - frag_color.rgb; } @@ -157,6 +159,7 @@ u_overhangColor = [1.0, 0.0, 0.0, 1.0] u_faceColor = [0.0, 0.0, 1.0, 1.0] u_shininess = 20.0 u_renderError = 1.0 +u_lowestPrintableHeight = 0.0 [bindings] u_modelMatrix = model_matrix diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index 31ae2d5047..e83074473d 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -36,6 +36,7 @@ fragment = uniform mediump float u_width; uniform bool u_vertical_stripes; + uniform lowp u_lowestPrintableHeight; varying highp vec3 v_position; varying highp vec3 v_vertex; @@ -64,7 +65,7 @@ fragment = highp vec3 viewVector = normalize(u_viewPosition - v_vertex); highp float NdotR = clamp(dot(viewVector, reflectedLight), 0.0, 1.0); finalColor += pow(NdotR, u_shininess) * u_specularColor; - if (v_vertex.y <= 0.0) + if (v_vertex.y <= u_lowestPrintableHeight) { finalColor.rgb = vec3(1.0, 1.0, 1.0) - finalColor.rgb; } @@ -112,6 +113,7 @@ fragment41core = uniform mediump float u_width; uniform mediump bool u_vertical_stripes; + uniform lowp float u_lowestPrintableHeight; in highp vec3 v_position; in highp vec3 v_vertex; @@ -144,7 +146,7 @@ fragment41core = finalColor += pow(NdotR, u_shininess) * u_specularColor; frag_color = finalColor; - if (v_vertex.y <= 0.0) + if (v_vertex.y <= u_lowestPrintableHeight) { frag_color.rgb = vec3(1.0, 1.0, 1.0) - frag_color.rgb; } @@ -160,6 +162,7 @@ u_opacity = 1.0 u_shininess = 20.0 u_width = 5.0 u_vertical_stripes = 0 +u_lowestPrintableHeight = 0.0 [bindings] u_modelMatrix = model_matrix