Skip to content

Commit cef5d41

Browse files
committed
Snap - Improves logic from previous commit.
Previous commit: Snap - Refactor x-ray mode handling to prevent double raycasting
1 parent d7b2358 commit cef5d41

1 file changed

Lines changed: 21 additions & 19 deletions

File tree

src/bonsai/bonsai/tool/snap.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -360,15 +360,6 @@ def select_plane_method():
360360
plane_normal = tool.Polyline.use_transform_orientations(plane_normal)
361361
return plane_origin, plane_normal
362362

363-
def handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray):
364-
for snap in closest_snaps:
365-
if snap_obj.obj == snap["object"]:
366-
if "face_index" in snap and snap["face_index"]:
367-
points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
368-
for point in points:
369-
point["group"] = "Object"
370-
detected_snaps.append(point)
371-
return detected_snaps
372363

373364
# Polyline
374365
polyline_props = tool.Model.get_polyline_props()
@@ -401,17 +392,28 @@ def handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_
401392
closest_snaps = tool.Raycast.ray_cast_and_get_closest_to_camera_snaps(context, event, objs_to_raycast)
402393
detected_snaps.extend(closest_snaps)
403394

404-
xray_conditions = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe)
395+
xray_mode = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe)
405396

406-
if xray_conditions:
407-
for snap_obj in objs_to_raycast:
408-
detected_snaps = handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray=True)
409-
else:
410-
for snap_obj in objs_to_raycast:
411-
for snap in closest_snaps:
412-
if "is_closest_to_camera" in snap and snap["is_closest_to_camera"]:
413-
detected_snaps = handle_snap_points_in_xray_mode([snap], detected_snaps, snap_obj, is_xray=False)
414-
397+
for snap_obj in objs_to_raycast:
398+
for snap in closest_snaps:
399+
if snap_obj.obj == snap["object"]:
400+
if xray_mode:
401+
if "face_index" in snap and snap["face_index"]:
402+
snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
403+
for point in snap_points:
404+
point["group"] = "Object"
405+
detected_snaps.append(point)
406+
else:
407+
# If it is a solid object that is closest to camera it ignores all the rest
408+
if "is_closest_to_camera" in snap and snap["is_closest_to_camera"] and snap["group"] == "Object":
409+
closest_snap = [snap] # discards objects that aren't the closest
410+
if "face_index" in snap and snap["face_index"]:
411+
snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
412+
for point in snap_points:
413+
point["group"] = "Object"
414+
closest_snap.append(point)
415+
detected_snaps = closest_snap
416+
415417
# snap to cut geometry (e.g. in plan view)
416418
if CutDecorator.installed:
417419
cut_snaps = []

0 commit comments

Comments
 (0)