Snap - Improves logic from previous commit.

Previous commit: Snap - Refactor x-ray mode handling
to prevent double raycasting
This commit is contained in:
Bruno Perdigão
2026-02-27 23:14:39 -03:00
parent d7b2358d58
commit cef5d41b54
+21 -19
View File
@@ -360,15 +360,6 @@ class Snap(bonsai.core.tool.Snap):
plane_normal = tool.Polyline.use_transform_orientations(plane_normal)
return plane_origin, plane_normal
def handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray):
for snap in closest_snaps:
if snap_obj.obj == snap["object"]:
if "face_index" in snap and snap["face_index"]:
points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
for point in points:
point["group"] = "Object"
detected_snaps.append(point)
return detected_snaps
# Polyline
polyline_props = tool.Model.get_polyline_props()
@@ -401,17 +392,28 @@ class Snap(bonsai.core.tool.Snap):
closest_snaps = tool.Raycast.ray_cast_and_get_closest_to_camera_snaps(context, event, objs_to_raycast)
detected_snaps.extend(closest_snaps)
xray_conditions = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe)
xray_mode = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe)
if xray_conditions:
for snap_obj in objs_to_raycast:
detected_snaps = handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray=True)
else:
for snap_obj in objs_to_raycast:
for snap in closest_snaps:
if "is_closest_to_camera" in snap and snap["is_closest_to_camera"]:
detected_snaps = handle_snap_points_in_xray_mode([snap], detected_snaps, snap_obj, is_xray=False)
for snap_obj in objs_to_raycast:
for snap in closest_snaps:
if snap_obj.obj == snap["object"]:
if xray_mode:
if "face_index" in snap and snap["face_index"]:
snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
for point in snap_points:
point["group"] = "Object"
detected_snaps.append(point)
else:
# If it is a solid object that is closest to camera it ignores all the rest
if "is_closest_to_camera" in snap and snap["is_closest_to_camera"] and snap["group"] == "Object":
closest_snap = [snap] # discards objects that aren't the closest
if "face_index" in snap and snap["face_index"]:
snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
for point in snap_points:
point["group"] = "Object"
closest_snap.append(point)
detected_snaps = closest_snap
# snap to cut geometry (e.g. in plan view)
if CutDecorator.installed:
cut_snaps = []