OverlayNode.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # Copyright (c) 2016 Ultimaker B.V.
  2. # Cura is released under the terms of the AGPLv3 or higher.
  3. from UM.Scene.SceneNode import SceneNode
  4. from UM.View.GL.OpenGL import OpenGL
  5. from UM.Mesh.MeshBuilder import MeshBuilder # To create the overlay quad
  6. from UM.Resources import Resources # To find shader locations
  7. from UM.Math.Matrix import Matrix
  8. from UM.Application import Application
  9. try:
  10. from PyQt6.QtGui import QImage
  11. except:
  12. from PyQt5.QtGui import QImage
  13. class OverlayNode(SceneNode):
  14. def __init__(self, node, image_path, size, parent=None):
  15. super().__init__(parent)
  16. self._target_node = node
  17. self.setCalculateBoundingBox(False)
  18. self._overlay_mesh = self._createOverlayQuad(size)
  19. self._drawed_mesh = self._overlay_mesh
  20. self._shader = None
  21. self._scene = Application.getInstance().getController().getScene()
  22. self._scale = 1.
  23. self._image_path = image_path
  24. def scale(self, factor):
  25. scale_matrix = Matrix()
  26. scale_matrix.setByScaleFactor(factor)
  27. self._drawed_mesh = self._overlay_mesh.getTransformed(scale_matrix)
  28. def _createOverlayQuad(self, size):
  29. mb = MeshBuilder()
  30. mb.addFaceByPoints(-size / 2, -size / 2, 0, -size / 2, size / 2, 0, size / 2, -size / 2, 0)
  31. mb.addFaceByPoints(size / 2, size / 2, 0, -size / 2, size / 2, 0, size / 2, -size / 2, 0)
  32. # Set UV coordinates so a texture can be created
  33. mb.setVertexUVCoordinates(0, 0, 1)
  34. mb.setVertexUVCoordinates(1, 0, 0)
  35. mb.setVertexUVCoordinates(4, 0, 0)
  36. mb.setVertexUVCoordinates(2, 1, 1)
  37. mb.setVertexUVCoordinates(5, 1, 1)
  38. mb.setVertexUVCoordinates(3, 1, 0)
  39. return mb.build()
  40. def render(self, renderer):
  41. if not self._shader:
  42. # We now misuse the platform shader, as it actually supports textures
  43. self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "platform.shader"))
  44. # Set the opacity to 0, so that the template is in full control.
  45. self._shader.setUniformValue("u_opacity", 0)
  46. self._texture = OpenGL.getInstance().createTexture()
  47. texture_image = QImage(self._image_path)
  48. self._texture.setImage(texture_image)
  49. self._shader.setTexture(0, self._texture)
  50. node_position = self._target_node.getWorldPosition()
  51. position_matrix = Matrix()
  52. position_matrix.setByTranslation(node_position)
  53. camera_orientation = self._scene.getActiveCamera().getOrientation().toMatrix()
  54. renderer.queueNode(self._scene.getRoot(), shader=self._shader, mesh=self._drawed_mesh.getTransformed(position_matrix.multiply(camera_orientation)), overlay=True)
  55. return True # This node does it's own rendering.