diff --git a/cura/PickingPass.py b/cura/PickingPass.py index 6d05c61555..b135b7ce63 100644 --- a/cura/PickingPass.py +++ b/cura/PickingPass.py @@ -4,6 +4,9 @@ import random from typing import Optional, TYPE_CHECKING +from PyQt5.QtCore import QBuffer + +from UM.Mesh.MeshBuilder import MeshBuilder from UM.Qt.QtApplication import QtApplication from UM.Math.Vector import Vector from UM.Math.Color import Color @@ -47,36 +50,45 @@ class PickingPass(RenderPass): # Fill up the batch with objects that can be sliced. ` for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax. if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): - tri_node = node.getMeshData().toTrimesh() - for index, face in enumerate(tri_node.faces): - normal_vertex = tri_node.face_normals[index] + faces = node.getMeshData().getIndices() + vertices = node.getMeshData().getVertices() + normals = node.getMeshData().getNormals() + print("Faces:", faces) + print("Vertices", vertices) + + for index, face in enumerate(faces): + normal_vertex = normals[index] + triangle_mesh = vertices[face] + print(face, normal_vertex, triangle_mesh) + batch.addItem(transformation = node.getWorldTransformation(), mesh = node.getMeshData(), uniforms = { "selection_color": self._getFaceColor(face, normal_vertex)}) self.bind() batch.render(self._scene.getActiveCamera()) self.release() - def _getFaceColor(self, face, normal_vertex): + def _getFaceColor(self, face: Vector, normal_vertex: Vector) -> Color: while True: r = random.randint(0, 255) g = random.randint(0, 255) b = random.randint(0, 255) - a = 0 + a = 255 color = Color(r, g, b, a) if color not in self._selection_map: break - self._selection_map[color] = normal_vertex - + print("Adding color: {color} - {normal}".format(color = color, normal = normal_vertex)) + self._selection_map[color] = {"face": id(face), "normal_vertex": normal_vertex} return color ## Get the normal vector at a certain pixel coordinate. - def getPickedNormalVertex(self, x: int, y: int) -> float: - - print(self._selection_map) + def getPickedNormalVertex(self, x: int, y: int) -> Optional[Vector]: output = self.getOutput() + print("Creating image") + output.save("thumbnail.png") + window_size = self._renderer.getWindowSize() px = (0.5 + x / 2.0) * window_size[0] @@ -87,7 +99,10 @@ class PickingPass(RenderPass): pixel = output.pixel(px, py) print("######### ", x, y, pixel, Color.fromARGB(pixel)) - return self._selection_map.get(Color.fromARGB(pixel), None) + face = self._selection_map.get(Color.fromARGB(pixel), None) + if not face: + return None + return face.get("normal_vertex", None) ## Get the distance in mm from the camera to at a certain pixel coordinate. def getPickedDepth(self, x: int, y: int) -> float: diff --git a/resources/shaders/camera_distance.shader b/resources/shaders/camera_distance.shader index 437aa39cc2..54d3a95e30 100644 --- a/resources/shaders/camera_distance.shader +++ b/resources/shaders/camera_distance.shader @@ -17,6 +17,7 @@ vertex = fragment = uniform highp vec3 u_viewPosition; + uniform lowp vec4 u_color; varying highp vec3 v_vertex; @@ -29,8 +30,9 @@ fragment = encoded.g = floor((distance_to_camera - encoded.r * 65536.0) / 256.0); encoded.b = floor(distance_to_camera - encoded.r * 65536.0 - encoded.g * 256.0); - gl_FragColor.rgb = encoded / 255.; - gl_FragColor.a = 1.0; + //gl_FragColor.rgb = encoded / 255.; + //gl_FragColor.a = 1.0; + gl_FragColor = u_color; } vertex41core = @@ -53,6 +55,7 @@ vertex41core = fragment41core = #version 410 uniform highp vec3 u_viewPosition; + uniform lowp vec4 u_color; in highp vec3 v_vertex; @@ -67,8 +70,9 @@ fragment41core = encoded.g = floor((distance_to_camera - encoded.r * 65536.0) / 256.0); encoded.b = floor(distance_to_camera - encoded.r * 65536.0 - encoded.g * 256.0); - frag_color.rgb = encoded / 255.; - frag_color.a = 1.0; + //frag_color.rgb = encoded / 255.; + //frag_color.a = 1.0; + frag_color = u_color; } [defaults] @@ -78,6 +82,7 @@ u_modelMatrix = model_matrix u_viewProjectionMatrix = view_projection_matrix u_normalMatrix = normal_matrix u_viewPosition = view_position +u_color = selection_color [attributes] a_vertex = vertex