From 0d7c378db541b760748999c246ef9336f2f76c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Mon, 1 Jun 2026 09:53:54 -0300 Subject: [PATCH] Lazy BVH tree construction in SnapObj --- src/bonsai/bonsai/tool/raycast.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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