diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index dc45b4e9bb..327ebe6322 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -377,6 +377,7 @@ class Raycast(bonsai.core.tool.Raycast): view3d_utils.location_3d_to_region_2d(region, rv3d, v) for v in snap_obj.verts_3d ] # Numpy version is worst in performance + snap_obj._ensure_bvh() intersected = snap_obj.raycast_boxes( context, event, snap_obj.root, intersected=[], rays=(ray_origin, ray_direction) ) @@ -936,12 +937,19 @@ class SnapObj: def __init__(self, obj: bpy.types.Object): self.__class__.all.append(self) self.obj = obj - self.root = self._create_root_node() - self.root.edges = [e.index for e in obj.data.edges] - self.split_box(self.root, 0) + self.root = None + self._bvh_built = False self.verts_3d = [obj.matrix_world @ v.co for v in obj.data.vertices] self.snap_points = [] + def _ensure_bvh(self): + if self._bvh_built: + return + self.root = self._create_root_node() + self.root.edges = [e.index for e in self.obj.data.edges] + self.split_box(self.root, 0) + self._bvh_built = True + def __clear_all__(): for instance in SnapObj.all: del instance