Move ray picking to DepthPass

This commit is contained in:
fieldOfView 2018-03-13 20:05:49 +01:00
parent 73558c9e36
commit d88724aff5
2 changed files with 12 additions and 7 deletions

View file

@ -1,7 +1,7 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from UM.Application import Application from UM.Application import Application
from UM.Math.Color import Color from UM.Math.Vector import Vector
from UM.Resources import Resources from UM.Resources import Resources
from UM.View.RenderPass import RenderPass from UM.View.RenderPass import RenderPass
@ -11,8 +11,8 @@ from UM.View.RenderBatch import RenderBatch
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
## A RenderPass subclass that renders a depthmap of selectable objects to a texture. ## A RenderPass subclass that renders a the distance of selectable objects from the active camera to a texture.
# It uses the active camera by default, but it can be overridden to use a different camera. # The texture is used to map a 2d location (eg the mouse location) to a world space position
# #
# Note that in order to increase precision, the 24 bit depth value is encoded into all three of the R,G & B channels # Note that in order to increase precision, the 24 bit depth value is encoded into all three of the R,G & B channels
class DepthPass(RenderPass): class DepthPass(RenderPass):
@ -47,7 +47,7 @@ class DepthPass(RenderPass):
self.release() self.release()
## Get the distance in mm from the camera to at a certain pixel coordinate. ## Get the distance in mm from the camera to at a certain pixel coordinate.
def getDepthAtPosition(self, x, y): def getPickedDepth(self, x, y) -> float:
output = self.getOutput() output = self.getOutput()
window_size = self._renderer.getWindowSize() window_size = self._renderer.getWindowSize()
@ -61,3 +61,10 @@ class DepthPass(RenderPass):
distance = output.pixel(px, py) # distance in micron, from in r, g & b channels distance = output.pixel(px, py) # distance in micron, from in r, g & b channels
distance = (distance & 0x00ffffff) / 1000. # drop the alpha channel and covert to mm distance = (distance & 0x00ffffff) / 1000. # drop the alpha channel and covert to mm
return distance return distance
## Get the world coordinates of a picked point
def getPickedPosition(self, x, y) -> Vector:
distance = self.getPickedDepth(x, y)
ray = self._scene.getActiveCamera().getRay(x, y)
return ray.getPointAlongRay(distance)

View file

@ -34,9 +34,7 @@ class SupportEraser(Tool):
depth_pass = DepthPass(active_camera.getViewportWidth(), active_camera.getViewportHeight()) depth_pass = DepthPass(active_camera.getViewportWidth(), active_camera.getViewportHeight())
depth_pass.render() depth_pass.render()
distance = depth_pass.getDepthAtPosition(event.x, event.y) picked_position = depth_pass.getPickedPosition(event.x, event.y)
ray = active_camera.getRay(event.x, event.y)
picked_position = ray.getPointAlongRay(distance)
# Add the anto_overhang_mesh cube: # Add the anto_overhang_mesh cube:
self._createEraserMesh(picked_position) self._createEraserMesh(picked_position)