A few updates on Snap and Raycast to improve the snap feel.

This commit is contained in:
Bruno Perdigão
2024-08-28 16:51:12 -03:00
parent 23ec2fc48e
commit 56e9488d3e
2 changed files with 17 additions and 8 deletions
+12 -3
View File
@@ -98,8 +98,13 @@ class Raycast(bonsai.core.tool.Raycast):
return ray_origin_obj, ray_target_obj, ray_direction_obj
@classmethod
def obj_ray_cast(cls, context, event, obj):
ray_origin_obj, _, ray_direction_obj = cls.get_object_ray_data(context, event, obj.matrix_world.copy())
def obj_ray_cast(cls, context, event, obj, mouse_pos=None):
if mouse_pos:
ray_origin_obj, _, ray_direction_obj = cls.get_object_ray_data(
context, event, obj.matrix_world.copy(), mouse_pos
)
else:
ray_origin_obj, _, ray_direction_obj = cls.get_object_ray_data(context, event, obj.matrix_world.copy())
success, location, normal, face_index = obj.ray_cast(ray_origin_obj, ray_direction_obj)
if success:
return location, normal, face_index
@@ -114,6 +119,10 @@ class Raycast(bonsai.core.tool.Raycast):
ray_origin, ray_target, ray_direction = cls.get_viewport_ray_data(context, event)
points = []
# Makes the snapping point more or less sticky then others
# It changes the distance and affects how the snapping point is sorted
stick_factor = 0.02
try:
loc = view3d_utils.region_2d_to_location_3d(region, rv3d, mouse_pos, ray_direction)
except:
@@ -150,7 +159,7 @@ class Raycast(bonsai.core.tool.Raycast):
if tool.Cad.is_point_on_edge(intersection[1], (world_v1, world_v2)):
distance = (intersection[1] - intersection[0]).length
if distance < 0.8:
points.append((intersection[1], "Edge"))
points.append([distance + 4 * stick_factor, (intersection[1], "Edge")])
bm.free()
return points
+5 -5
View File
@@ -297,8 +297,8 @@ class Snap(bonsai.core.tool.Snap):
cls.mouse_pos = event.mouse_region_x, event.mouse_region_y
detected_snaps = []
offset = 15
snap_threshold = 0.3
offset = 10
mouse_offset = (
(-offset, offset),
(0, offset),
@@ -487,6 +487,10 @@ class Snap(bonsai.core.tool.Snap):
snapping_points.append(op)
break
if "Plane" in list(origin.keys()):
intersection = origin["Plane"]
snapping_points.append((intersection, "Plane"))
for origin in detected_snaps:
if "Axis" in list(origin.keys()):
intersection = origin["Axis"]
@@ -494,10 +498,6 @@ class Snap(bonsai.core.tool.Snap):
axis_end = intersection[2]
snapping_points.append((intersection[0], "Axis"))
if "Plane" in list(origin.keys()):
intersection = origin["Plane"]
snapping_points.append((intersection, "Plane"))
# Make Axis first priority
if event.shift or cls.snap_axis_method in {"X", "Y", "Z"}:
cls.update_snapping_ref(snapping_points[0][0], snapping_points[0][1])