1# Copyright (c) 2018 Ultimaker B.V. 2# Cura is released under the terms of the LGPLv3 or higher. 3 4import os.path 5 6from UM.Resources import Resources 7from UM.Application import Application 8from UM.PluginRegistry import PluginRegistry 9 10from UM.View.RenderPass import RenderPass 11from UM.View.RenderBatch import RenderBatch 12from UM.View.GL.OpenGL import OpenGL 13 14from cura.Scene.CuraSceneNode import CuraSceneNode 15from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator 16 17class XRayPass(RenderPass): 18 def __init__(self, width, height): 19 super().__init__("xray", width, height) 20 21 self._shader = None 22 self._gl = OpenGL.getInstance().getBindingsObject() 23 self._scene = Application.getInstance().getController().getScene() 24 25 def render(self): 26 if not self._shader: 27 self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "xray.shader")) 28 29 batch = RenderBatch(self._shader, type = RenderBatch.RenderType.NoType, backface_cull = False, blend_mode = RenderBatch.BlendMode.Additive) 30 for node in DepthFirstIterator(self._scene.getRoot()): 31 if isinstance(node, CuraSceneNode) and node.getMeshData() and node.isVisible(): 32 batch.addItem(node.getWorldTransformation(copy = False), node.getMeshData(), normal_transformation=node.getCachedNormalMatrix()) 33 34 self.bind() 35 36 self._gl.glDisable(self._gl.GL_DEPTH_TEST) 37 batch.render(self._scene.getActiveCamera()) 38 self._gl.glEnable(self._gl.GL_DEPTH_TEST) 39 40 self.release() 41