mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 02:45:55 +08:00
Modify the shader to show the right color
Use the common MeshData instead of trimesh.
This commit is contained in:
parent
9be7ddde2f
commit
102bef9a4f
@ -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:
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user