From b2fc155c3be175e1d19f8c655b68a9e8cb2a179f Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 31 Mar 2020 11:26:21 +0200 Subject: [PATCH 1/5] Fix legacy glsl shaders By @smartavionics --- resources/shaders/xray.shader | 7 +++++++ resources/shaders/xray_composite.shader | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/resources/shaders/xray.shader b/resources/shaders/xray.shader index c375d4300c..278b5b1dd3 100644 --- a/resources/shaders/xray.shader +++ b/resources/shaders/xray.shader @@ -12,6 +12,13 @@ vertex = } fragment = + #ifdef GL_ES + #ifdef GL_FRAGMENT_PRECISION_HIGH + precision highp float; + #else + precision mediump float; + #endif // GL_FRAGMENT_PRECISION_HIGH + #endif // GL_ES uniform vec4 u_color; void main() diff --git a/resources/shaders/xray_composite.shader b/resources/shaders/xray_composite.shader index f71cdbf901..648611ecc3 100644 --- a/resources/shaders/xray_composite.shader +++ b/resources/shaders/xray_composite.shader @@ -52,11 +52,11 @@ fragment = result = layer0 * layer0.a + result * (1.0 - layer0.a); - float intersection_count = texture2D(u_layer2, v_uvs).r * 51; // (1 / .02) + 1 (+1 magically fixes issues with high intersection count models) + float intersection_count = texture2D(u_layer2, v_uvs).r * 51.0; // (1 / .02) + 1 (+1 magically fixes issues with high intersection count models) float rest = mod(intersection_count + .01, 2.0); - if (rest > 1.0 && rest < 1.5 && intersection_count < 49) + if (rest > 1.0 && rest < 1.5 && intersection_count < 49.0) { - result = result * (1.0 - u_xray_error_strength) + u_xray_error_strength * texture(u_xray_error, v_uvs * u_xray_error_scale); + result = result * (1.0 - u_xray_error_strength) + u_xray_error_strength * texture2D(u_xray_error, v_uvs * u_xray_error_scale); } vec4 sum = vec4(0.0); From 4638e2b72b1dcc7982e478682979262f3a1e6072 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 31 Mar 2020 11:27:25 +0200 Subject: [PATCH 2/5] Fix resetting show xray warning --- resources/qml/Preferences/GeneralPage.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 7b1263b061..57b6e5e91a 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -86,8 +86,8 @@ UM.PreferencesPage prefixJobNameCheckbox.checked = boolCheck(UM.Preferences.getValue("cura/jobname_prefix")) UM.Preferences.resetPreference("view/show_overhang"); showOverhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) - UM.Preferences.resetPreference("view/show_xray_error"); - showXrayErrorCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_xray_error")) + UM.Preferences.resetPreference("view/show_xray_warning"); + showXrayErrorCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_xray_warning")) UM.Preferences.resetPreference("view/center_on_select"); centerOnSelectCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) UM.Preferences.resetPreference("view/invert_zoom"); From a2f9eac23babaa630a4a8a78e406d9dbeda27aa4 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 31 Mar 2020 11:29:34 +0200 Subject: [PATCH 3/5] Remove unused import --- plugins/SolidView/SolidView.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 0604315f3b..0785ae91d6 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -25,8 +25,6 @@ from UM.View.GL.OpenGL import OpenGL from UM.i18n import i18nCatalog -from cura.CuraApplication import CuraApplication - from cura.Settings.ExtruderManager import ExtruderManager from cura import XRayPass @@ -74,9 +72,9 @@ class SolidView(View): , title = catalog.i18nc("@info:title", "Model errors"), option_text = catalog.i18nc("@info:option_text", "Do not show this message again"), option_state = False) self._xray_warning_message.optionToggled.connect(self._onDontAskMeAgain) - CuraApplication.getInstance().getPreferences().addPreference(self._show_xray_warning_preference, True) + application.getPreferences().addPreference(self._show_xray_warning_preference, True) - Application.getInstance().engineCreatedSignal.connect(self._onGlobalContainerChanged) + application.engineCreatedSignal.connect(self._onGlobalContainerChanged) def _onGlobalContainerChanged(self) -> None: if self._global_stack: @@ -135,7 +133,7 @@ class SolidView(View): self._support_mesh_shader.setUniformValue("u_vertical_stripes", True) self._support_mesh_shader.setUniformValue("u_width", 5.0) - if not CuraApplication.getInstance().getPreferences().getValue(self._show_xray_warning_preference): + if not Application.getInstance().getPreferences().getValue(self._show_xray_warning_preference): self._xray_error_image = None self._xray_shader = None self._xray_composite_shader = None @@ -270,7 +268,7 @@ class SolidView(View): def endRendering(self): # check whether the xray overlay is showing badness if time.time() > self._next_xray_checking_time\ - and CuraApplication.getInstance().getPreferences().getValue(self._show_xray_warning_preference): + and Application.getInstance().getPreferences().getValue(self._show_xray_warning_preference): self._next_xray_checking_time = time.time() + self._xray_checking_update_time xray_img = self._xray_pass.getOutput() @@ -305,7 +303,7 @@ class SolidView(View): Logger.log("i", "X-Ray overlay found non-manifold pixels.") def _onDontAskMeAgain(self, checked: bool) -> None: - CuraApplication.getInstance().getPreferences().setValue(self._show_xray_warning_preference, not checked) + Application.getInstance().getPreferences().setValue(self._show_xray_warning_preference, not checked) def event(self, event): if event.type == Event.ViewActivateEvent: @@ -323,7 +321,7 @@ class SolidView(View): if Platform.isOSX(): if QOpenGLContext.currentContext() is None: Logger.log("d", "current context of OpenGL is empty on Mac OS X, will try to create shaders later") - CuraApplication.getInstance().callLater(lambda e = event: self.event(e)) + Application.getInstance().callLater(lambda e = event: self.event(e)) return From b7898b5a97b674ccb4babd70975df26a1177d786 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 31 Mar 2020 11:39:05 +0200 Subject: [PATCH 4/5] Change preference to only hide the xray message, not the visualization --- plugins/SolidView/SolidView.py | 73 ++++++++++------------- resources/qml/Preferences/GeneralPage.qml | 4 +- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 0785ae91d6..a5739d19e7 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -133,55 +133,44 @@ class SolidView(View): self._support_mesh_shader.setUniformValue("u_vertical_stripes", True) self._support_mesh_shader.setUniformValue("u_width", 5.0) - if not Application.getInstance().getPreferences().getValue(self._show_xray_warning_preference): - self._xray_error_image = None - self._xray_shader = None - self._xray_composite_shader = None - if self._composite_pass and 'xray' in self._composite_pass.getLayerBindings(): - self._composite_pass.setLayerBindings(self._old_layer_bindings) - self._composite_pass.setCompositeShader(self._old_composite_shader) - self._old_layer_bindings = None - self._old_composite_shader = None - self._xray_warning_message.hide() - else: - if not self._xray_error_image: - self._xray_error_image = OpenGL.getInstance().createTexture() - texture_file = "xray_error.png" - try: - texture_image = QImage(Resources.getPath(Resources.Images, texture_file)).mirrored() - self._xray_error_image.setImage(texture_image) - self._xray_error_image_size = texture_image.size() - except FileNotFoundError: - Logger.log("w", "Unable to find xray error texture image [%s]", texture_file) + if not self._xray_error_image: + self._xray_error_image = OpenGL.getInstance().createTexture() + texture_file = "xray_error.png" + try: + texture_image = QImage(Resources.getPath(Resources.Images, texture_file)).mirrored() + self._xray_error_image.setImage(texture_image) + self._xray_error_image_size = texture_image.size() + except FileNotFoundError: + Logger.log("w", "Unable to find xray error texture image [%s]", texture_file) - if not self._xray_shader: - self._xray_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray.shader")) + if not self._xray_shader: + self._xray_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray.shader")) - if not self._xray_composite_shader: - self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray_composite.shader")) - theme = Application.getInstance().getTheme() - self._xray_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) - self._xray_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) - self._xray_composite_shader.setTexture(3, self._xray_error_image) + if not self._xray_composite_shader: + self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray_composite.shader")) + theme = Application.getInstance().getTheme() + self._xray_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) + self._xray_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) + self._xray_composite_shader.setTexture(3, self._xray_error_image) - renderer = self.getRenderer() - if not self._composite_pass or not 'xray' in self._composite_pass.getLayerBindings(): - # Currently the RenderPass constructor requires a size > 0 - # This should be fixed in RenderPass's constructor. - self._xray_pass = XRayPass.XRayPass(1, 1) + renderer = self.getRenderer() + if not self._composite_pass or not 'xray' in self._composite_pass.getLayerBindings(): + # Currently the RenderPass constructor requires a size > 0 + # This should be fixed in RenderPass's constructor. + self._xray_pass = XRayPass.XRayPass(1, 1) - renderer.addRenderPass(self._xray_pass) + renderer.addRenderPass(self._xray_pass) - if not self._composite_pass: - self._composite_pass = self.getRenderer().getRenderPass("composite") + if not self._composite_pass: + self._composite_pass = self.getRenderer().getRenderPass("composite") - self._old_layer_bindings = self._composite_pass.getLayerBindings() - self._composite_pass.setLayerBindings(["default", "selection", "xray"]) - self._old_composite_shader = self._composite_pass.getCompositeShader() - self._composite_pass.setCompositeShader(self._xray_composite_shader) + self._old_layer_bindings = self._composite_pass.getLayerBindings() + self._composite_pass.setLayerBindings(["default", "selection", "xray"]) + self._old_composite_shader = self._composite_pass.getCompositeShader() + self._composite_pass.setCompositeShader(self._xray_composite_shader) - error_image_scale = [renderer.getViewportWidth() / self._xray_error_image_size.width(), renderer.getViewportHeight() / self._xray_error_image_size.height()] - self._xray_composite_shader.setUniformValue("u_xray_error_scale", error_image_scale) + error_image_scale = [renderer.getViewportWidth() / self._xray_error_image_size.width(), renderer.getViewportHeight() / self._xray_error_image_size.height()] + self._xray_composite_shader.setUniformValue("u_xray_error_scale", error_image_scale) def beginRendering(self): scene = self.getController().getScene() diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 57b6e5e91a..eacf2f60e2 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -345,7 +345,7 @@ UM.PreferencesPage width: childrenRect.width; height: childrenRect.height; - text: catalog.i18nc("@info:tooltip", "Highlight missing or extraneous surfaces of the model using warning signs. The toolpaths will often be missing parts of the intended geometry.") + text: catalog.i18nc("@info:tooltip", "Show a message if missing or extraneous surfaces are detected. The toolpaths will often be missing parts of the intended geometry.") CheckBox { @@ -354,7 +354,7 @@ UM.PreferencesPage checked: boolCheck(UM.Preferences.getValue("view/show_xray_warning")) onClicked: UM.Preferences.setValue("view/show_xray_warning", checked) - text: catalog.i18nc("@option:check", "Display model errors"); + text: catalog.i18nc("@option:check", "Display message if model errors are detected"); } } From ccc05894955bf2ee8131a0c6a54e8c44037abd84 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 31 Mar 2020 11:50:16 +0200 Subject: [PATCH 5/5] Remove the checkbox option to set the preference to hide the messagebox --- plugins/SolidView/SolidView.py | 86 +++++++++++++---------- resources/qml/Preferences/GeneralPage.qml | 26 ++++++- 2 files changed, 70 insertions(+), 42 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index a5739d19e7..7d7f231388 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -67,11 +67,11 @@ class SolidView(View): self._next_xray_checking_time = time.time() self._xray_checking_update_time = 1.0 # seconds self._xray_warning_cooldown = 60 * 10 # reshow Model error message every 10 minutes - self._xray_warning_message = Message(catalog.i18nc("@info:status", "Your model is not manifold. The highlighted areas indicate either missing or extraneous surfaces.") - , lifetime = 60 * 5 # leave message for 5 minutes - , title = catalog.i18nc("@info:title", "Model errors"), - option_text = catalog.i18nc("@info:option_text", "Do not show this message again"), option_state = False) - self._xray_warning_message.optionToggled.connect(self._onDontAskMeAgain) + self._xray_warning_message = Message( + catalog.i18nc("@info:status", "Your model is not manifold. The highlighted areas indicate either missing or extraneous surfaces."), + lifetime = 60 * 5, # leave message for 5 minutes + title = catalog.i18nc("@info:title", "Model errors"), + ) application.getPreferences().addPreference(self._show_xray_warning_preference, True) application.engineCreatedSignal.connect(self._onGlobalContainerChanged) @@ -133,44 +133,55 @@ class SolidView(View): self._support_mesh_shader.setUniformValue("u_vertical_stripes", True) self._support_mesh_shader.setUniformValue("u_width", 5.0) - if not self._xray_error_image: - self._xray_error_image = OpenGL.getInstance().createTexture() - texture_file = "xray_error.png" - try: - texture_image = QImage(Resources.getPath(Resources.Images, texture_file)).mirrored() - self._xray_error_image.setImage(texture_image) - self._xray_error_image_size = texture_image.size() - except FileNotFoundError: - Logger.log("w", "Unable to find xray error texture image [%s]", texture_file) + if not Application.getInstance().getPreferences().getValue(self._show_xray_warning_preference): + self._xray_error_image = None + self._xray_shader = None + self._xray_composite_shader = None + if self._composite_pass and 'xray' in self._composite_pass.getLayerBindings(): + self._composite_pass.setLayerBindings(self._old_layer_bindings) + self._composite_pass.setCompositeShader(self._old_composite_shader) + self._old_layer_bindings = None + self._old_composite_shader = None + self._xray_warning_message.hide() + else: + if not self._xray_error_image: + self._xray_error_image = OpenGL.getInstance().createTexture() + texture_file = "xray_error.png" + try: + texture_image = QImage(Resources.getPath(Resources.Images, texture_file)).mirrored() + self._xray_error_image.setImage(texture_image) + self._xray_error_image_size = texture_image.size() + except FileNotFoundError: + Logger.log("w", "Unable to find xray error texture image [%s]", texture_file) - if not self._xray_shader: - self._xray_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray.shader")) + if not self._xray_shader: + self._xray_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray.shader")) - if not self._xray_composite_shader: - self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray_composite.shader")) - theme = Application.getInstance().getTheme() - self._xray_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) - self._xray_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) - self._xray_composite_shader.setTexture(3, self._xray_error_image) + if not self._xray_composite_shader: + self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray_composite.shader")) + theme = Application.getInstance().getTheme() + self._xray_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) + self._xray_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) + self._xray_composite_shader.setTexture(3, self._xray_error_image) - renderer = self.getRenderer() - if not self._composite_pass or not 'xray' in self._composite_pass.getLayerBindings(): - # Currently the RenderPass constructor requires a size > 0 - # This should be fixed in RenderPass's constructor. - self._xray_pass = XRayPass.XRayPass(1, 1) + renderer = self.getRenderer() + if not self._composite_pass or not 'xray' in self._composite_pass.getLayerBindings(): + # Currently the RenderPass constructor requires a size > 0 + # This should be fixed in RenderPass's constructor. + self._xray_pass = XRayPass.XRayPass(1, 1) - renderer.addRenderPass(self._xray_pass) + renderer.addRenderPass(self._xray_pass) - if not self._composite_pass: - self._composite_pass = self.getRenderer().getRenderPass("composite") + if not self._composite_pass: + self._composite_pass = self.getRenderer().getRenderPass("composite") - self._old_layer_bindings = self._composite_pass.getLayerBindings() - self._composite_pass.setLayerBindings(["default", "selection", "xray"]) - self._old_composite_shader = self._composite_pass.getCompositeShader() - self._composite_pass.setCompositeShader(self._xray_composite_shader) + self._old_layer_bindings = self._composite_pass.getLayerBindings() + self._composite_pass.setLayerBindings(["default", "selection", "xray"]) + self._old_composite_shader = self._composite_pass.getCompositeShader() + self._composite_pass.setCompositeShader(self._xray_composite_shader) - error_image_scale = [renderer.getViewportWidth() / self._xray_error_image_size.width(), renderer.getViewportHeight() / self._xray_error_image_size.height()] - self._xray_composite_shader.setUniformValue("u_xray_error_scale", error_image_scale) + error_image_scale = [renderer.getViewportWidth() / self._xray_error_image_size.width(), renderer.getViewportHeight() / self._xray_error_image_size.height()] + self._xray_composite_shader.setUniformValue("u_xray_error_scale", error_image_scale) def beginRendering(self): scene = self.getController().getScene() @@ -291,9 +302,6 @@ class SolidView(View): self._xray_warning_message.show() Logger.log("i", "X-Ray overlay found non-manifold pixels.") - def _onDontAskMeAgain(self, checked: bool) -> None: - Application.getInstance().getPreferences().setValue(self._show_xray_warning_preference, not checked) - def event(self, event): if event.type == Event.ViewActivateEvent: # FIX: on Max OS X, somehow QOpenGLContext.currentContext() can become None during View switching. diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index eacf2f60e2..375ad9e4c1 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -87,7 +87,9 @@ UM.PreferencesPage UM.Preferences.resetPreference("view/show_overhang"); showOverhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) UM.Preferences.resetPreference("view/show_xray_warning"); - showXrayErrorCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_xray_warning")) + showXrayErrorCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_warning")) + UM.Preferences.resetPreference("view/show_xray_warning_message"); + showXrayErrorMessageCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_warning_message")) UM.Preferences.resetPreference("view/center_on_select"); centerOnSelectCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) UM.Preferences.resetPreference("view/invert_zoom"); @@ -345,7 +347,7 @@ UM.PreferencesPage width: childrenRect.width; height: childrenRect.height; - text: catalog.i18nc("@info:tooltip", "Show a message if missing or extraneous surfaces are detected. The toolpaths will often be missing parts of the intended geometry.") + text: catalog.i18nc("@info:tooltip", "Highlight missing or extraneous surfaces of the model using warning signs. The toolpaths will often be missing parts of the intended geometry.") CheckBox { @@ -354,7 +356,25 @@ UM.PreferencesPage checked: boolCheck(UM.Preferences.getValue("view/show_xray_warning")) onClicked: UM.Preferences.setValue("view/show_xray_warning", checked) - text: catalog.i18nc("@option:check", "Display message if model errors are detected"); + text: catalog.i18nc("@option:check", "Display model errors"); + } + } + + UM.TooltipArea + { + width: childrenRect.width; + height: childrenRect.height; + + text: catalog.i18nc("@info:tooltip", "Highlight missing or extraneous surfaces of the model using warning signs. The toolpaths will often be missing parts of the intended geometry.") + + CheckBox + { + id: showXrayErrorMessageCheckbox + + checked: boolCheck(UM.Preferences.getValue("view/show_xray_warning_message")) + onClicked: UM.Preferences.setValue("view/show_xray_warning_message", checked) + + text: catalog.i18nc("@option:check", "Display model errors"); } }