diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 82a66cd66b..52e0cf936f 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -162,7 +162,7 @@ class SolidView(View): 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(os.path.join(PluginRegistry.getInstance().getPluginPath("SolidView"), "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())) diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py index d94835c65e..29fcfbca53 100644 --- a/plugins/XRayView/XRayView.py +++ b/plugins/XRayView/XRayView.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import os.path -from PyQt5.QtGui import QOpenGLContext +from PyQt5.QtGui import QOpenGLContext, QImage from UM.Application import Application from UM.Logger import Logger @@ -34,6 +34,7 @@ class XRayView(CuraView): self._composite_pass = None self._old_composite_shader = None self._old_layer_bindings = None + self._xray_error_image = None def beginRendering(self): scene = self.getController().getScene() @@ -88,12 +89,19 @@ class XRayView(CuraView): self.getRenderer().addRenderPass(self._xray_pass) - if not self._xray_composite_shader: - self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("XRayView"), "xray_composite.shader")) + if not self._xray_error_image: + self._xray_error_image = OpenGL.getInstance().createTexture() + img = QImage(1, 1, QImage.Format_RGB888) theme = Application.getInstance().getTheme() + img.setPixelColor(0, 0, theme.getColor("xray_error")) + self._xray_error_image.setImage(img) + + if not self._xray_composite_shader: + self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray_composite.shader")) self._xray_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) - self._xray_composite_shader.setUniformValue("u_error_color", Color(*theme.getColor("xray_error").getRgb())) self._xray_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) + self._xray_composite_shader.setUniformValue("u_xray_error_strength", 0.8) + self._xray_composite_shader.setTexture(3, self._xray_error_image) if not self._composite_pass: self._composite_pass = self.getRenderer().getRenderPass("composite") diff --git a/plugins/XRayView/xray_composite.shader b/plugins/XRayView/xray_composite.shader deleted file mode 100644 index d8c90a5259..0000000000 --- a/plugins/XRayView/xray_composite.shader +++ /dev/null @@ -1,164 +0,0 @@ -[shaders] -vertex = - uniform highp mat4 u_modelViewProjectionMatrix; - attribute highp vec4 a_vertex; - attribute highp vec2 a_uvs; - - varying highp vec2 v_uvs; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - v_uvs = a_uvs; - } - -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 sampler2D u_layer0; //Default pass. - uniform sampler2D u_layer1; //Selection pass. - uniform sampler2D u_layer2; //X-ray pass. - - uniform vec2 u_offset[9]; - - uniform float u_outline_strength; - uniform vec4 u_outline_color; - uniform vec4 u_error_color; - uniform vec4 u_background_color; - - const vec3 x_axis = vec3(1.0, 0.0, 0.0); - const vec3 y_axis = vec3(0.0, 1.0, 0.0); - const vec3 z_axis = vec3(0.0, 0.0, 1.0); - - varying vec2 v_uvs; - - float kernel[9]; - - void main() - { - kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0; - kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0; - kernel[6] = 0.0; kernel[7] = 1.0; kernel[8] = 0.0; - - vec4 result = u_background_color; - vec4 layer0 = texture2D(u_layer0, v_uvs); - - 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 rest = mod(intersection_count + .01, 2.0); - if (rest > 1.0 && rest < 1.5 && intersection_count < 49) - { - result = u_error_color; - } - - vec4 sum = vec4(0.0); - for (int i = 0; i < 9; i++) - { - vec4 color = vec4(texture2D(u_layer1, v_uvs.xy + u_offset[i]).a); - sum += color * (kernel[i] / u_outline_strength); - } - - vec4 layer1 = texture2D(u_layer1, v_uvs); - if((layer1.rgb == x_axis || layer1.rgb == y_axis || layer1.rgb == z_axis)) - { - gl_FragColor = result; - } - else - { - gl_FragColor = mix(result, vec4(abs(sum.a)) * u_outline_color, abs(sum.a)); - } - } - -vertex41core = - #version 410 - uniform highp mat4 u_modelViewProjectionMatrix; - in highp vec4 a_vertex; - in highp vec2 a_uvs; - - out highp vec2 v_uvs; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - v_uvs = a_uvs; - } - -fragment41core = - #version 410 - uniform sampler2D u_layer0; //Default pass. - uniform sampler2D u_layer1; //Selection pass. - uniform sampler2D u_layer2; //X-ray pass. - - uniform vec2 u_offset[9]; - - uniform float u_outline_strength; - uniform vec4 u_outline_color; - uniform vec4 u_error_color; - uniform vec4 u_background_color; - - const vec3 x_axis = vec3(1.0, 0.0, 0.0); - const vec3 y_axis = vec3(0.0, 1.0, 0.0); - const vec3 z_axis = vec3(0.0, 0.0, 1.0); - - in vec2 v_uvs; - out vec4 frag_color; - - float kernel[9]; - - void main() - { - kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0; - kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0; - kernel[6] = 0.0; kernel[7] = 1.0; kernel[8] = 0.0; - - vec4 result = u_background_color; - vec4 layer0 = texture(u_layer0, v_uvs); - - result = layer0 * layer0.a + result * (1.0 - layer0.a); - - float intersection_count = texture(u_layer2, v_uvs).r * 51; // (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) - { - result = u_error_color; - } - - vec4 sum = vec4(0.0); - for (int i = 0; i < 9; i++) - { - vec4 color = vec4(texture(u_layer1, v_uvs.xy + u_offset[i]).a); - sum += color * (kernel[i] / u_outline_strength); - } - - vec4 layer1 = texture(u_layer1, v_uvs); - if((layer1.rgb == x_axis || layer1.rgb == y_axis || layer1.rgb == z_axis)) - { - frag_color = result; - } - else - { - frag_color = mix(result, vec4(abs(sum.a)) * u_outline_color, abs(sum.a)); - } - } - -[defaults] -u_layer0 = 0 -u_layer1 = 1 -u_layer2 = 2 -u_background_color = [0.965, 0.965, 0.965, 1.0] -u_outline_strength = 1.0 -u_outline_color = [0.05, 0.66, 0.89, 1.0] -u_error_color = [1.0, 0.0, 0.0, 1.0] - -[bindings] - -[attributes] -a_vertex = vertex -a_uvs = uv - diff --git a/plugins/SolidView/xray_composite.shader b/resources/shaders/xray_composite.shader similarity index 100% rename from plugins/SolidView/xray_composite.shader rename to resources/shaders/xray_composite.shader