Browse Source

Invert colors at lowest print height.

Instead of inverting them if below 0 (build-plate). Fixes #8735

CURA-7871
Remco Burema 4 years ago
parent
commit
2837640315

+ 25 - 4
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)

+ 5 - 2
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

+ 5 - 2
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