@@ -360,6 +360,16 @@ 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
372+
363373 # Polyline
364374 polyline_props = tool .Model .get_polyline_props ()
365375 try :
@@ -388,58 +398,20 @@ def select_plane_method():
388398
389399 # Objects
390400 objs_to_raycast = tool .Raycast .filter_objects_to_raycast (context , event , objs_2d_bbox )
391- # Wireframes
392- # For wireframe we have to get all the objects so we can further calculate edge intersection
393- for snap_obj in objs_to_raycast :
394- if snap_obj .obj .type in {"EMPTY" , "CURVE" } or (snap_obj .obj .type == "MESH" and len (snap_obj .obj .data .polygons ) == 0 ):
395- snap_points = tool .Raycast .ray_cast_by_proximity_2d (context , event , snap_obj )
396- if snap_points :
397- for point in snap_points :
398- point ["group" ] = "Wireframe"
399- detected_snaps .append (point )
400-
401- if (space .shading .type == "SOLID" and space .shading .show_xray ) or (
402- space .shading .type == "WIREFRAME" and space .shading .show_xray_wireframe
403- ):
404- results = []
405- for obj in objs_to_raycast :
406- results .append (tool .Raycast .cast_rays_to_single_object (context , event , snap_obj .obj ))
407- else :
408- results = []
409- results .append (tool .Raycast .cast_rays_and_get_best_object (context , event , objs_to_raycast ))
410-
411- for result in results :
412- snap_obj = result [0 ]
413- hit = result [1 ]
414- face_index = result [2 ]
415- if hit is not None :
416- # Wireframes
417- if snap_obj .type in {"EMPTY" , "CURVE" } or (
418- snap_obj .type == "MESH" and len (snap_obj .data .polygons ) == 0
419- ):
420- continue
421- # Meshes
422- else :
423- # Add face snap
424- snap_point = {
425- "point" : hit ,
426- "type" : "Face" ,
427- "group" : "Object" ,
428- "object" : snap_obj ,
429- "face_index" : face_index ,
430- "distance" : 9 , # High value so it has low priority
431- }
432- detected_snaps .append (snap_point )
433-
434- # Add vertex and edge snap
435- snap_points = tool .Raycast .ray_cast_by_proximity (
436- context , event , snap_obj , snap_obj .data .polygons [face_index ]
437- )
438- if snap_points :
439- for point in snap_points :
440- point ["group" ] = "Object"
441- detected_snaps .append (point )
401+ closest_snaps = tool .Raycast .ray_cast_and_get_closest_to_camera_snaps (context , event , objs_to_raycast )
402+ detected_snaps .extend (closest_snaps )
403+
404+ xray_conditions = (space .shading .type == "SOLID" and space .shading .show_xray ) or (space .shading .type == "WIREFRAME" and space .shading .show_xray_wireframe )
442405
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+
443415 # snap to cut geometry (e.g. in plan view)
444416 if CutDecorator .installed :
445417 cut_snaps = []
0 commit comments