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