From 042c575b183e9f3f7575b6504d67689f38119cbb Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 9 Dec 2015 15:31:40 +0100 Subject: [PATCH] Update XRayView to render properly --- plugins/XRayView/XRayPass.py | 4 +--- plugins/XRayView/XRayView.py | 27 +++++++++++++++++++------- plugins/XRayView/xray_composite.shader | 7 ++----- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/plugins/XRayView/XRayPass.py b/plugins/XRayView/XRayPass.py index e49fcef22c..6700ee51a5 100644 --- a/plugins/XRayView/XRayPass.py +++ b/plugins/XRayView/XRayPass.py @@ -25,7 +25,7 @@ class XRayPass(RenderPass): if not self._shader: self._shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("XRayView"), "xray.shader")) - batch = RenderBatch(self._shader, type = RenderBatch.RenderType.NoType, backface_cull = False) + batch = RenderBatch(self._shader, type = RenderBatch.RenderType.NoType, backface_cull = False, blend_mode = RenderBatch.BlendMode.Additive) for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData() and node.isVisible(): batch.addItem(node.getWorldTransformation(), node.getMeshData()) @@ -33,8 +33,6 @@ class XRayPass(RenderPass): self.bind() self._gl.glDisable(self._gl.GL_DEPTH_TEST) - self._gl.glEnable(self._gl.GL_BLEND) - self._gl.glBlendFunc(self._gl.GL_SRC_ALPHA, self._gl.GL_ONE) batch.render(self._scene.getActiveCamera()) self._gl.glEnable(self._gl.GL_DEPTH_TEST) diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py index ec3174d1f5..d2cfa0f676 100644 --- a/plugins/XRayView/XRayView.py +++ b/plugins/XRayView/XRayView.py @@ -6,8 +6,9 @@ import os.path from UM.PluginRegistry import PluginRegistry from UM.Event import Event from UM.View.View import View -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator +from UM.View.RenderBatch import RenderBatch from UM.View.GL.OpenGL import OpenGL from . import XRayPass @@ -16,8 +17,8 @@ from . import XRayPass class XRayView(View): def __init__(self): super().__init__() - self._shader = None + self._xray_shader = None self._xray_pass = None self._xray_composite_shader = None self._composite_pass = None @@ -28,24 +29,36 @@ class XRayView(View): scene = self.getController().getScene() renderer = self.getRenderer() - for node in DepthFirstIterator(scene.getRoot()): - node.render(renderer) + if not self._xray_shader: + self._xray_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("XRayView"), "xray.shader")) + self._xray_shader.setUniformValue("u_color", [0.1, 0.1, 0.2, 1.0]) + + for node in BreadthFirstIterator(scene.getRoot()): + if not node.render(renderer): + if node.getMeshData() and node.isVisible(): + renderer.queueNode(node, + shader = self._xray_shader, + type = RenderBatch.RenderType.Solid, + blend_mode = RenderBatch.BlendMode.Additive, + sort = -10, + state_setup_callback = lambda gl: gl.glDepthFunc(gl.GL_ALWAYS), + state_teardown_callback = lambda gl: gl.glDepthFunc(gl.GL_LESS) + ) def endRendering(self): pass def event(self, event): - renderer = self.getRenderer() if event.type == Event.ViewActivateEvent: if not self._xray_pass: self._xray_pass = XRayPass.XRayPass(1280, 720) - renderer.addRenderPass(self._xray_pass) + 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._composite_pass: - self._composite_pass = renderer.getRenderPass("composite") + self._composite_pass = self.getRenderer().getRenderPass("composite") self._old_layer_bindings = self._composite_pass.getLayerBindings() self._composite_pass.setLayerBindings(["default", "selection", "xray"]) diff --git a/plugins/XRayView/xray_composite.shader b/plugins/XRayView/xray_composite.shader index 118f106d7d..40febb730c 100644 --- a/plugins/XRayView/xray_composite.shader +++ b/plugins/XRayView/xray_composite.shader @@ -42,14 +42,11 @@ fragment = result = layer0 * layer0.a + result * (1.0 - layer0.a); - vec4 layer2 = texture2D(u_layer2, v_uvs); - - float intersection_count = (layer2.r * 255.0) / 5.0; + float intersection_count = (texture2D(u_layer2, v_uvs).r * 255.0) / 5.0; if(mod(intersection_count, 2.0) == 1.0) { - layer2 = u_error_color; + result = u_error_color; } - result = layer2 * layer2.a + result * (1.0 - layer2.a); vec4 sum = vec4(0.0); for (int i = 0; i < 9; i++)