@react-three-dom/core 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +3 -4180
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -11
- package/dist/index.d.ts +1 -11
- package/dist/index.js +3 -4115
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/debug.ts","../src/store/ObjectStore.ts","../src/mirror/CustomElements.ts","../src/mirror/attributes.ts","../src/mirror/DomMirror.ts","../src/bridge/patchObject3D.ts","../src/snapshot/snapshot.ts","../src/interactions/projection.ts","../src/interactions/dispatch.ts","../src/interactions/raycastVerify.ts","../src/interactions/resolve.ts","../src/interactions/click.ts","../src/interactions/hover.ts","../src/interactions/drag.ts","../src/interactions/wheel.ts","../src/interactions/pointerMiss.ts","../src/interactions/drawPath.ts","../src/interactions/worldInteraction.ts","../src/highlight/SelectionManager.ts","../src/highlight/Highlighter.ts","../src/highlight/selectionDisplayTarget.ts","../src/highlight/InspectController.ts","../src/highlight/RaycastAccelerator.ts","../src/bridge/ThreeDom.tsx","../src/hooks/useR3FRegister.ts"],"names":["Object3D","_box3","Box3","_store","Vector3","sleep","Mesh","_camera","BufferGeometry","_raycaster","Raycaster","Vector2","getStore","useRef","useEffect","useFrame"],"mappings":"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","file":"index.js","sourcesContent":["export const version = '0.5.0';\n","// ---------------------------------------------------------------------------\n// Debug logging for react-three-dom\n//\n// Three-layer system:\n// Layer 1 (this file): r3fLog() writes to browser console.log\n// Layer 2 (Playwright): r3f.enableDebug() forwards browser logs to test terminal\n// Layer 3 (Cypress): cy.r3fEnableDebug() mirrors to Cypress command log\n//\n// Enable via:\n// - <ThreeDom debug /> prop\n// - enableDebug(true) programmatically\n// - window.__R3F_DOM_DEBUG__ = true (from test code or DevTools console)\n// ---------------------------------------------------------------------------\n\nlet _enabled = false;\n\n/**\n * Enable or disable debug logging globally.\n * When enabled, all r3fLog calls will output to console.log.\n */\nexport function enableDebug(on = true): void {\n _enabled = on;\n}\n\n/**\n * Check if debug logging is currently enabled.\n */\nexport function isDebugEnabled(): boolean {\n return (\n _enabled ||\n (typeof window !== 'undefined' && !!window.__R3F_DOM_DEBUG__)\n );\n}\n\n/**\n * Log a debug message. Only outputs when debug is enabled via:\n * - enableDebug(true)\n * - window.__R3F_DOM_DEBUG__ = true\n * - <ThreeDom debug /> prop\n *\n * @param area - Module area (e.g. 'setup', 'store', 'patch', 'click', 'drag')\n * @param msg - Human-readable message\n * @param data - Optional data payload (object, error, etc.)\n */\nexport function r3fLog(area: string, msg: string, data?: unknown): void {\n if (\n !_enabled &&\n !(typeof window !== 'undefined' && window.__R3F_DOM_DEBUG__)\n ) {\n return;\n }\n if (data !== undefined) {\n console.log(`[r3f-dom:${area}]`, msg, data);\n } else {\n console.log(`[r3f-dom:${area}]`, msg);\n }\n}\n","/**\n * @module ObjectStore\n *\n * Central registry for all tracked Three.js objects in a react-three-dom session.\n * Provides two-tier data access: Tier 1 (lightweight metadata cached per-frame)\n * and Tier 2 (on-demand deep inspection of geometry, materials, and bounds).\n * Designed for BIM-scale scenes (100k+ objects) with O(1) lookups by uuid,\n * testId, and name, plus amortized flat-list iteration and async registration.\n */\nimport {\n Object3D,\n Mesh,\n InstancedMesh,\n BufferGeometry,\n Material,\n Box3,\n Color,\n PerspectiveCamera,\n OrthographicCamera,\n} from 'three';\nimport type {\n ObjectMetadata,\n ObjectInspection,\n GeometryInspection,\n MaterialInspection,\n InspectOptions,\n StoreEvent,\n StoreListener,\n} from '../types';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// Helper: extract Tier 1 metadata from a live Three.js object\n//\n// Split into two paths for performance at BIM scale:\n// - extractMetadata(): full extraction, called once on register\n// - updateDynamicFields(): only reads fields that change per-frame\n// (position, rotation, scale, visible, children count, parent),\n// skipping geometry/material/instanceCount which are static.\n// Reuses the existing metadata object to avoid allocation.\n// ---------------------------------------------------------------------------\n\nfunction extractMetadata(obj: Object3D): ObjectMetadata {\n const meta: ObjectMetadata = {\n uuid: obj.uuid,\n name: obj.name,\n type: obj.type,\n visible: obj.visible,\n testId: obj.userData?.testId as string | undefined,\n position: [obj.position.x, obj.position.y, obj.position.z],\n rotation: [obj.rotation.x, obj.rotation.y, obj.rotation.z],\n scale: [obj.scale.x, obj.scale.y, obj.scale.z],\n parentUuid: obj.parent?.uuid ?? null,\n childrenUuids: obj.children.map((c) => c.uuid),\n boundsDirty: true,\n };\n\n extractStaticFields(obj, meta);\n return meta;\n}\n\nfunction extractStaticFields(obj: Object3D, meta: ObjectMetadata): void {\n try {\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry) {\n meta.geometryType = geom.type;\n const posAttr = geom.getAttribute('position');\n if (posAttr) {\n meta.vertexCount = posAttr.count;\n if (geom.index) {\n meta.triangleCount = Math.floor(geom.index.count / 3);\n } else {\n meta.triangleCount = Math.floor(posAttr.count / 3);\n }\n }\n }\n }\n } catch {\n r3fLog('store', `extractMetadata: geometry access failed for \"${obj.name || obj.uuid}\"`);\n }\n\n try {\n if ('material' in obj) {\n const mat = (obj as Mesh).material;\n if (mat instanceof Material) {\n meta.materialType = mat.type;\n } else if (Array.isArray(mat) && mat.length > 0) {\n meta.materialType = mat[0].type + (mat.length > 1 ? ` (+${mat.length - 1})` : '');\n }\n }\n } catch {\n r3fLog('store', `extractMetadata: material access failed for \"${obj.name || obj.uuid}\"`);\n }\n\n try {\n if (obj instanceof InstancedMesh) {\n meta.instanceCount = obj.count;\n }\n } catch {\n // Skip instance count if access fails\n }\n\n try {\n if (obj instanceof PerspectiveCamera) {\n meta.fov = obj.fov;\n meta.near = obj.near;\n meta.far = obj.far;\n meta.zoom = obj.zoom;\n } else if (obj instanceof OrthographicCamera) {\n meta.near = obj.near;\n meta.far = obj.far;\n meta.zoom = obj.zoom;\n }\n } catch {\n // Skip camera fields if access fails\n }\n}\n\n/**\n * Fast per-frame update: only reads dynamic fields that actually change\n * between frames (transform, visibility, children, parent).\n * Mutates `meta` in-place and returns true if anything changed.\n * Avoids allocating a new metadata object or reading static geometry/material.\n */\nfunction updateDynamicFields(obj: Object3D, meta: ObjectMetadata): boolean {\n let changed = false;\n\n if (meta.visible !== obj.visible) { meta.visible = obj.visible; changed = true; }\n if (meta.name !== obj.name) { meta.name = obj.name; changed = true; }\n\n const testId = obj.userData?.testId as string | undefined;\n if (meta.testId !== testId) { meta.testId = testId; changed = true; }\n\n const p = obj.position;\n if (meta.position[0] !== p.x || meta.position[1] !== p.y || meta.position[2] !== p.z) {\n meta.position[0] = p.x; meta.position[1] = p.y; meta.position[2] = p.z;\n changed = true;\n }\n\n const r = obj.rotation;\n if (meta.rotation[0] !== r.x || meta.rotation[1] !== r.y || meta.rotation[2] !== r.z) {\n meta.rotation[0] = r.x; meta.rotation[1] = r.y; meta.rotation[2] = r.z;\n changed = true;\n }\n\n const s = obj.scale;\n if (meta.scale[0] !== s.x || meta.scale[1] !== s.y || meta.scale[2] !== s.z) {\n meta.scale[0] = s.x; meta.scale[1] = s.y; meta.scale[2] = s.z;\n changed = true;\n }\n\n const parentUuid = obj.parent?.uuid ?? null;\n if (meta.parentUuid !== parentUuid) { meta.parentUuid = parentUuid; changed = true; }\n\n const children = obj.children;\n const cached = meta.childrenUuids;\n if (cached.length !== children.length) {\n meta.childrenUuids = children.map((c) => c.uuid);\n changed = true;\n } else {\n for (let i = 0; i < cached.length; i++) {\n if (cached[i] !== children[i].uuid) {\n meta.childrenUuids = children.map((c) => c.uuid);\n changed = true;\n break;\n }\n }\n }\n\n return changed;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Tier 2 on-demand inspection\n// ---------------------------------------------------------------------------\n\nconst _box3 = new Box3();\n\nfunction inspectObject(obj: Object3D, metadata: ObjectMetadata, options?: InspectOptions): ObjectInspection {\n // Start with a minimal valid inspection — each section fills in details\n // and is wrapped in try/catch so a failure in one area (e.g. disposed\n // geometry) doesn't prevent the rest from being returned.\n let worldMatrix: number[] = Array(16).fill(0);\n let boundsMin: [number, number, number] = [0, 0, 0];\n let boundsMax: [number, number, number] = [0, 0, 0];\n\n // World matrix + bounds\n try {\n obj.updateWorldMatrix(true, false);\n worldMatrix = Array.from(obj.matrixWorld.elements);\n _box3.setFromObject(obj);\n boundsMin = [_box3.min.x, _box3.min.y, _box3.min.z];\n boundsMax = [_box3.max.x, _box3.max.y, _box3.max.z];\n } catch {\n r3fLog('store', `inspectObject: world matrix / bounds failed for \"${obj.name || obj.uuid}\"`);\n }\n\n const inspection: ObjectInspection = {\n metadata,\n worldMatrix,\n bounds: { min: boundsMin, max: boundsMax },\n userData: {},\n };\n\n // userData (shallow copy, may contain non-serializable values)\n try {\n inspection.userData = { ...obj.userData };\n } catch {\n r3fLog('store', `inspectObject: userData copy failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // Geometry details\n try {\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry && geom.attributes) {\n const geoInspection: GeometryInspection = {\n type: geom.type,\n attributes: {},\n };\n\n for (const [name, attr] of Object.entries(geom.attributes)) {\n if (!attr) continue;\n geoInspection.attributes[name] = {\n itemSize: attr.itemSize,\n count: attr.count,\n };\n }\n\n if (geom.index) {\n geoInspection.index = { count: geom.index.count };\n }\n\n if (options?.includeGeometryData) {\n const posAttr = geom.getAttribute('position');\n if (posAttr?.array) {\n geoInspection.positionData = Array.from(posAttr.array);\n }\n if (geom.index?.array) {\n geoInspection.indexData = Array.from(geom.index.array);\n }\n }\n\n geom.computeBoundingSphere();\n const sphere = geom.boundingSphere;\n if (sphere) {\n geoInspection.boundingSphere = {\n center: [sphere.center.x, sphere.center.y, sphere.center.z],\n radius: sphere.radius,\n };\n }\n\n inspection.geometry = geoInspection;\n }\n }\n } catch {\n r3fLog('store', `inspectObject: geometry inspection failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // Material details\n try {\n if ('material' in obj) {\n const rawMat = (obj as Mesh).material;\n if (!rawMat) throw new Error('disposed');\n const mat = Array.isArray(rawMat) ? rawMat[0] : rawMat;\n if (mat instanceof Material) {\n const matInspection: MaterialInspection = {\n type: mat.type,\n transparent: mat.transparent,\n opacity: mat.opacity,\n side: mat.side,\n };\n\n // Color (most materials have it)\n if ('color' in mat && (mat as unknown as { color: Color }).color instanceof Color) {\n matInspection.color = '#' + (mat as unknown as { color: Color }).color.getHexString();\n }\n\n // Map texture\n if ('map' in mat) {\n const map = (mat as unknown as { map: { name?: string; uuid?: string } | null }).map;\n if (map) {\n matInspection.map = map.name || map.uuid || 'unnamed';\n }\n }\n\n // ShaderMaterial uniforms\n if ('uniforms' in mat) {\n const uniforms = (mat as unknown as { uniforms: Record<string, { value: unknown }> })\n .uniforms;\n matInspection.uniforms = {};\n for (const [key, uniform] of Object.entries(uniforms)) {\n const val = uniform.value;\n if (val === null || val === undefined) {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'number' || typeof val === 'boolean' || typeof val === 'string') {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'object' && 'toArray' in val) {\n matInspection.uniforms[key] = (val as { toArray(): number[] }).toArray();\n } else {\n matInspection.uniforms[key] = `[${typeof val}]`;\n }\n }\n }\n\n inspection.material = matInspection;\n }\n }\n } catch {\n r3fLog('store', `inspectObject: material inspection failed for \"${obj.name || obj.uuid}\"`);\n }\n\n return inspection;\n}\n\n// ---------------------------------------------------------------------------\n// ObjectStore — the source of truth for all tracked Three.js objects\n// ---------------------------------------------------------------------------\n\n/**\n * Source of truth for all tracked Three.js objects.\n * Maintains O(1) indexes by uuid, testId, and name, a dirty queue for\n * priority per-frame sync, and an event system for add/remove/update\n * notifications consumed by DomMirror and the devtools panel.\n */\nexport class ObjectStore {\n // Tier 1: metadata for every tracked object\n private _metaByObject = new WeakMap<Object3D, ObjectMetadata>();\n private _objectByUuid = new Map<string, Object3D>();\n private _objectsByTestId = new Map<string, Object3D>();\n private _objectsByName = new Map<string, Set<Object3D>>();\n\n // Flat list for amortized iteration\n private _flatList: Object3D[] = [];\n private _flatListDirty = true;\n\n // Priority dirty queue: objects that changed and need immediate sync\n private _dirtyQueue = new Set<Object3D>();\n\n // Event listeners\n private _listeners: StoreListener[] = [];\n\n // Track the root scene(s) for scoping\n private _trackedRoots = new WeakSet<Object3D>();\n\n // -------------------------------------------------------------------------\n // Registration\n // -------------------------------------------------------------------------\n\n /**\n * Register a single object into the store.\n * Populates Tier 1 metadata and all indexes.\n * Tags the object with `__r3fdom_tracked = true` for O(1) scene membership checks.\n */\n register(obj: Object3D): ObjectMetadata {\n // Skip internal highlight/label helpers created by Highlighter\n if (obj.userData?.__r3fdom_internal) {\n return extractMetadata(obj);\n }\n\n // Skip if already registered\n const existing = this._metaByObject.get(obj);\n if (existing) return existing;\n\n const meta = extractMetadata(obj);\n this._metaByObject.set(obj, meta);\n this._objectByUuid.set(meta.uuid, obj);\n this._flatListDirty = true;\n\n // O(1) tracking flag for patchObject3D.findTrackingPair\n obj.userData.__r3fdom_tracked = true;\n\n if (meta.testId) {\n this._objectsByTestId.set(meta.testId, obj);\n }\n\n if (meta.name) {\n let nameSet = this._objectsByName.get(meta.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(meta.name, nameSet);\n }\n nameSet.add(obj);\n }\n\n this._emit({ type: 'add', object: obj, metadata: meta });\n if (meta.testId) {\n r3fLog('store', `Registered \"${meta.testId}\" (${meta.type})`);\n }\n return meta;\n }\n\n /**\n * Register an entire subtree (object + all descendants) synchronously.\n * Prefer `registerTreeAsync` for large scenes (100k+) to avoid blocking.\n */\n registerTree(root: Object3D): void {\n this._trackedRoots.add(root);\n root.traverse((obj) => {\n try {\n this.register(obj);\n } catch (err) {\n r3fLog('store', `registerTree: failed to register \"${obj.name || obj.uuid}\"`, err);\n }\n });\n }\n\n // ---- Async registration state ----\n private _asyncRegQueue: Object3D[] = [];\n private _asyncRegHandle: number | null = null;\n private _asyncRegBatchSize = 1000;\n\n /**\n * Register an entire subtree asynchronously using requestIdleCallback.\n * Processes ~1000 objects per idle slice to avoid blocking the main thread.\n *\n * IMPORTANT: install patchObject3D BEFORE calling this so that objects\n * added to the scene during async registration are caught by the patch.\n *\n * Returns a cancel function. Also cancelled automatically by dispose().\n */\n registerTreeAsync(root: Object3D): () => void {\n this._trackedRoots.add(root);\n\n // Collect all objects upfront (traverse is fast — no DOM/GPU work)\n const queue: Object3D[] = [];\n root.traverse((obj) => queue.push(obj));\n\n this._asyncRegQueue = queue;\n r3fLog('store', `registerTreeAsync: ${queue.length} objects queued`);\n\n this._scheduleRegChunk();\n\n return () => this._cancelAsyncRegistration();\n }\n\n private _scheduleRegChunk(): void {\n if (this._asyncRegQueue.length === 0) {\n this._asyncRegHandle = null;\n r3fLog('store', `registerTreeAsync complete: ${this.getCount()} objects registered`);\n return;\n }\n\n const callback = (deadline?: IdleDeadline) => {\n const hasTime = deadline\n ? () => deadline.timeRemaining() > 1\n : () => true;\n\n let processed = 0;\n while (\n this._asyncRegQueue.length > 0 &&\n processed < this._asyncRegBatchSize &&\n hasTime()\n ) {\n const obj = this._asyncRegQueue.shift()!;\n try {\n this.register(obj);\n } catch (err) {\n r3fLog('store', `registerTreeAsync: failed to register \"${obj.name || obj.uuid}\"`, err);\n }\n processed++;\n }\n\n this._scheduleRegChunk();\n };\n\n if (typeof requestIdleCallback === 'function') {\n this._asyncRegHandle = requestIdleCallback(callback, { timeout: 50 }) as unknown as number;\n } else {\n this._asyncRegHandle = setTimeout(callback, 4) as unknown as number;\n }\n }\n\n private _cancelAsyncRegistration(): void {\n if (this._asyncRegHandle !== null) {\n if (typeof cancelIdleCallback === 'function') {\n cancelIdleCallback(this._asyncRegHandle);\n } else {\n clearTimeout(this._asyncRegHandle);\n }\n this._asyncRegHandle = null;\n }\n this._asyncRegQueue = [];\n }\n\n /**\n * Unregister a single object from the store.\n * Clears the `__r3fdom_tracked` flag.\n */\n unregister(obj: Object3D): void {\n const meta = this._metaByObject.get(obj);\n if (!meta) return;\n\n this._metaByObject.delete(obj);\n this._objectByUuid.delete(meta.uuid);\n this._dirtyQueue.delete(obj);\n this._flatListDirty = true;\n\n delete obj.userData.__r3fdom_tracked;\n delete obj.userData.__r3fdom_manual;\n\n if (meta.testId) {\n this._objectsByTestId.delete(meta.testId);\n }\n\n if (meta.name) {\n const nameSet = this._objectsByName.get(meta.name);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) {\n this._objectsByName.delete(meta.name);\n }\n }\n }\n\n if (meta.testId) {\n r3fLog('store', `Unregistered \"${meta.testId}\" (${meta.type})`);\n }\n this._emit({ type: 'remove', object: obj, metadata: meta });\n }\n\n /**\n * Unregister an entire subtree (object + all descendants).\n */\n /** Mark a root as tracked without traversing/registering its children. */\n addTrackedRoot(root: Object3D): void {\n this._trackedRoots.add(root);\n }\n\n unregisterTree(root: Object3D): void {\n root.traverse((obj) => {\n this.unregister(obj);\n });\n this._trackedRoots.delete(root);\n }\n\n // -------------------------------------------------------------------------\n // Tier 1: Update (compare-and-set, returns true if changed)\n // -------------------------------------------------------------------------\n\n /**\n * Refresh dynamic Tier 1 fields from the live Three.js object.\n * Only reads transform, visibility, children count, and parent —\n * skips static fields (geometry, material) that don't change per-frame.\n * Mutates metadata in-place to avoid allocation.\n * Returns true if any values changed.\n */\n update(obj: Object3D): boolean {\n const meta = this._metaByObject.get(obj);\n if (!meta) return false;\n\n let changed: boolean;\n try {\n const prevTestId = meta.testId;\n const prevName = meta.name;\n\n changed = updateDynamicFields(obj, meta);\n\n if (changed) {\n if (prevTestId !== meta.testId) {\n r3fLog('store', `testId changed: \"${prevTestId}\" → \"${meta.testId}\" (${meta.type})`);\n if (prevTestId) this._objectsByTestId.delete(prevTestId);\n if (meta.testId) this._objectsByTestId.set(meta.testId, obj);\n }\n if (prevName !== meta.name) {\n if (prevName) {\n const nameSet = this._objectsByName.get(prevName);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) this._objectsByName.delete(prevName);\n }\n }\n if (meta.name) {\n let nameSet = this._objectsByName.get(meta.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(meta.name, nameSet);\n }\n nameSet.add(obj);\n }\n }\n\n this._emit({ type: 'update', object: obj, metadata: meta });\n }\n } catch (err) {\n r3fLog('store', `update: updateDynamicFields failed for \"${obj.name || obj.uuid}\"`, err);\n return false;\n }\n\n return changed;\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand inspection (never cached)\n // -------------------------------------------------------------------------\n\n /**\n * Compute full inspection data from a live Three.js object.\n * This reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n * Pass { includeGeometryData: true } to include vertex positions and triangle indices (higher cost for large meshes).\n */\n inspect(idOrUuid: string, options?: InspectOptions): ObjectInspection | null {\n const obj = this.getObject3D(idOrUuid);\n if (!obj) return null;\n\n const meta = this._metaByObject.get(obj);\n if (!meta) return null;\n\n return inspectObject(obj, meta, options);\n }\n\n // -------------------------------------------------------------------------\n // Lookups (O(1))\n // -------------------------------------------------------------------------\n\n /** Get metadata by testId. O(1). */\n getByTestId(testId: string): ObjectMetadata | null {\n const obj = this._objectsByTestId.get(testId);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by uuid. O(1). */\n getByUuid(uuid: string): ObjectMetadata | null {\n const obj = this._objectByUuid.get(uuid);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by name (returns array since names aren't unique). O(1). */\n getByName(name: string): ObjectMetadata[] {\n const objs = this._objectsByName.get(name);\n if (!objs) return [];\n const results: ObjectMetadata[] = [];\n for (const obj of objs) {\n const meta = this._metaByObject.get(obj);\n if (meta) results.push(meta);\n }\n return results;\n }\n\n /** Get direct children of an object by testId or uuid. Returns empty array if not found. */\n getChildren(idOrUuid: string): ObjectMetadata[] {\n const meta = this.getByTestId(idOrUuid) ?? this.getByUuid(idOrUuid);\n if (!meta) return [];\n const results: ObjectMetadata[] = [];\n for (const childUuid of meta.childrenUuids) {\n const childMeta = this.getByUuid(childUuid);\n if (childMeta) results.push(childMeta);\n }\n return results;\n }\n\n /** Get parent of an object by testId or uuid. Returns null if not found or if root. */\n getParent(idOrUuid: string): ObjectMetadata | null {\n const meta = this.getByTestId(idOrUuid) ?? this.getByUuid(idOrUuid);\n if (!meta || meta.parentUuid === null) return null;\n return this.getByUuid(meta.parentUuid);\n }\n\n /**\n * Batch lookup: get metadata for multiple objects by testId or uuid.\n * Returns a Map from the requested id to its metadata (or null if not found).\n * Single round-trip — much more efficient than calling getByTestId/getByUuid\n * in a loop for BIM/CAD scenes with many objects.\n * O(k) where k is the number of requested ids.\n */\n getObjects(ids: string[]): Map<string, ObjectMetadata | null> {\n const results = new Map<string, ObjectMetadata | null>();\n for (const id of ids) {\n const meta = this.getByTestId(id) ?? this.getByUuid(id);\n results.set(id, meta);\n }\n return results;\n }\n\n /**\n * Get all objects of a given Three.js type (e.g. \"Mesh\", \"Group\", \"Line\").\n * Linear scan — O(n) where n is total tracked objects.\n */\n getByType(type: string): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.type === type) results.push(meta);\n }\n return results;\n }\n\n /**\n * Get all objects with a given geometry type (e.g. \"BoxGeometry\", \"BufferGeometry\").\n * Linear scan — O(n). Only meshes/points/lines have geometryType.\n */\n getByGeometryType(type: string): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.geometryType === type) results.push(meta);\n }\n return results;\n }\n\n /**\n * Get all objects with a given material type (e.g. \"MeshStandardMaterial\").\n * Linear scan — O(n). Only meshes/points/lines have materialType.\n */\n getByMaterialType(type: string): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.materialType === type) results.push(meta);\n }\n return results;\n }\n\n /**\n * Get all objects that have a specific userData key.\n * If `value` is provided, only returns objects where `userData[key]` matches.\n * Uses JSON.stringify for deep equality on complex values.\n * Linear scan — O(n).\n */\n getByUserData(key: string, value?: unknown): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n const checkValue = value !== undefined;\n const valueJson = checkValue ? JSON.stringify(value) : '';\n for (const obj of this.getFlatList()) {\n if (!(key in obj.userData)) continue;\n if (checkValue && JSON.stringify(obj.userData[key]) !== valueJson) continue;\n const meta = this._metaByObject.get(obj);\n if (meta) results.push(meta);\n }\n return results;\n }\n\n /**\n * Count objects of a given Three.js type.\n * More efficient than getByType().length — no array allocation.\n * Linear scan — O(n).\n */\n getCountByType(type: string): number {\n let count = 0;\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.type === type) count++;\n }\n return count;\n }\n\n /** Get the raw Three.js Object3D by testId or uuid. */\n getObject3D(idOrUuid: string): Object3D | null {\n // Try testId first, then uuid\n return this._objectsByTestId.get(idOrUuid)\n ?? this._objectByUuid.get(idOrUuid)\n ?? null;\n }\n\n /** Get metadata for a known Object3D reference. */\n getMetadata(obj: Object3D): ObjectMetadata | null {\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Check if an object is registered. */\n has(obj: Object3D): boolean {\n return this._metaByObject.has(obj);\n }\n\n /** Total number of tracked objects. */\n getCount(): number {\n return this._objectByUuid.size;\n }\n\n /** Check if a root scene is tracked. */\n isTrackedRoot(obj: Object3D): boolean {\n return this._trackedRoots.has(obj);\n }\n\n /**\n * Check if an object belongs to a tracked scene.\n * Fast path: checks the `__r3fdom_tracked` flag set during register (O(1)).\n * Fallback: walks up the parent chain to find a tracked root.\n * The fallback is needed for newly added objects that aren't registered yet.\n */\n isInTrackedScene(obj: Object3D): boolean {\n if (obj.userData?.__r3fdom_tracked) return true;\n let current: Object3D | null = obj.parent;\n while (current) {\n if (current.userData?.__r3fdom_tracked) return true;\n if (this._trackedRoots.has(current)) return true;\n current = current.parent;\n }\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Flat list for amortized iteration\n // -------------------------------------------------------------------------\n\n /**\n * Get a flat array of all tracked objects for amortized batch processing.\n * Rebuilds lazily when the list is dirty (objects added/removed).\n */\n getFlatList(): Object3D[] {\n if (this._flatListDirty) {\n this._flatList = Array.from(this._objectByUuid.values());\n this._flatListDirty = false;\n }\n return this._flatList;\n }\n\n // -------------------------------------------------------------------------\n // Priority dirty queue\n // -------------------------------------------------------------------------\n\n /** Mark an object as dirty (needs priority sync next frame). */\n markDirty(obj: Object3D): void {\n if (this._metaByObject.has(obj)) {\n this._dirtyQueue.add(obj);\n }\n }\n\n /**\n * Drain the dirty queue, returning all objects that need priority sync.\n * Clears the queue after draining.\n */\n drainDirtyQueue(): Object3D[] {\n if (this._dirtyQueue.size === 0) return [];\n const objects = Array.from(this._dirtyQueue);\n this._dirtyQueue.clear();\n return objects;\n }\n\n /** Number of objects currently in the dirty queue. */\n getDirtyCount(): number {\n return this._dirtyQueue.size;\n }\n\n // -------------------------------------------------------------------------\n // Event system\n // -------------------------------------------------------------------------\n\n /** Subscribe to store events (add, remove, update). */\n subscribe(listener: StoreListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _emit(event: StoreEvent): void {\n for (const listener of this._listeners) {\n listener(event);\n }\n }\n\n // -------------------------------------------------------------------------\n // GC: sweep orphaned objects\n // -------------------------------------------------------------------------\n\n /**\n * Sweep objects in `_objectByUuid` that are no longer in any tracked scene.\n * This catches objects that were removed from the scene graph without\n * triggering the patched Object3D.remove (e.g. direct `.children` splice,\n * or the remove hook failing silently).\n *\n * At BIM scale, call this periodically (e.g. every 30s or after a floor\n * load/unload) to prevent memory leaks from retained Object3D references.\n *\n * Returns the number of orphans cleaned up.\n */\n sweepOrphans(): number {\n let swept = 0;\n for (const [uuid, obj] of this._objectByUuid) {\n if (!obj.parent && !this._trackedRoots.has(obj)) {\n this.unregister(obj);\n swept++;\n r3fLog('store', `sweepOrphans: removed orphan \"${obj.name || uuid}\"`);\n }\n }\n return swept;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /** Remove all tracked objects and reset state. */\n dispose(): void {\n this._cancelAsyncRegistration();\n for (const obj of this._objectByUuid.values()) {\n if (obj.userData) delete obj.userData.__r3fdom_tracked;\n }\n this._objectByUuid.clear();\n this._objectsByTestId.clear();\n this._objectsByName.clear();\n this._flatList = [];\n this._flatListDirty = true;\n this._dirtyQueue.clear();\n this._listeners = [];\n }\n}\n","/**\n * @module CustomElements\n *\n * Defines and registers the custom HTML elements (<three-scene>, <three-mesh>,\n * <three-light>, etc.) used by DomMirror to represent Three.js objects in the\n * DOM. The ThreeElement base class exposes interactive properties (metadata,\n * inspect, object3D) accessible from the DevTools console via `$0.metadata`.\n */\nimport type { Object3D } from 'three';\nimport type { ObjectMetadata, ObjectInspection } from '../types';\nimport type { ObjectStore } from '../store/ObjectStore';\n\n// ---------------------------------------------------------------------------\n// Tag mapping: Three.js type → custom element tag name\n// ---------------------------------------------------------------------------\n\n/**\n * Maps Three.js object types to custom element tag names.\n * Multiple Three.js types can map to the same tag.\n */\nexport const TAG_MAP: Record<string, string> = {\n // Scenes\n Scene: 'three-scene',\n\n // Groups / containers\n Group: 'three-group',\n LOD: 'three-group',\n Bone: 'three-group',\n\n // Meshes\n Mesh: 'three-mesh',\n SkinnedMesh: 'three-mesh',\n InstancedMesh: 'three-mesh',\n LineSegments: 'three-mesh',\n Line: 'three-mesh',\n LineLoop: 'three-mesh',\n Points: 'three-mesh',\n Sprite: 'three-mesh',\n\n // Lights\n AmbientLight: 'three-light',\n DirectionalLight: 'three-light',\n HemisphereLight: 'three-light',\n PointLight: 'three-light',\n RectAreaLight: 'three-light',\n SpotLight: 'three-light',\n LightProbe: 'three-light',\n\n // Cameras\n PerspectiveCamera: 'three-camera',\n OrthographicCamera: 'three-camera',\n ArrayCamera: 'three-camera',\n CubeCamera: 'three-camera',\n\n // Helpers (map to object as fallback)\n BoxHelper: 'three-object',\n ArrowHelper: 'three-object',\n AxesHelper: 'three-object',\n GridHelper: 'three-object',\n SkeletonHelper: 'three-object',\n};\n\n/** All unique tag names that need to be registered. */\nconst ALL_TAGS = [\n 'three-scene',\n 'three-group',\n 'three-mesh',\n 'three-light',\n 'three-camera',\n 'three-object',\n] as const;\n\nexport type ThreeTagName = (typeof ALL_TAGS)[number];\n\n/** Default fallback tag for any Object3D type not in TAG_MAP. */\nconst DEFAULT_TAG: ThreeTagName = 'three-object';\n\n/**\n * Get the custom element tag name for a Three.js object type.\n */\nexport function getTagForType(type: string): ThreeTagName {\n return (TAG_MAP[type] as ThreeTagName) ?? DEFAULT_TAG;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: reference to the store (set once during ensureCustomElements)\n// ---------------------------------------------------------------------------\n\nlet _store: ObjectStore | null = null;\n\n/**\n * Set the ObjectStore reference that custom elements use for lookups.\n * Must be called before any custom element properties/methods are used.\n */\nexport function setElementStore(store: ObjectStore): void {\n _store = store;\n}\n\n// ---------------------------------------------------------------------------\n// ThreeElement: base class for all custom elements\n// ---------------------------------------------------------------------------\n\n/**\n * Base custom element class for the DOM mirror.\n * Provides interactive properties and methods accessible via DevTools console.\n *\n * Usage in DevTools after selecting a <three-mesh> in the Elements panel:\n * $0.metadata → Tier 1 cached metadata (instant)\n * $0.inspect() → Tier 2 heavy inspection (reads live Three.js object)\n * $0.object3D → raw THREE.Object3D reference\n * $0.position → [x, y, z] shortcut\n * $0.bounds → { min, max } shortcut\n * $0.click() → trigger deterministic click\n * $0.hover() → trigger deterministic hover\n */\nexport class ThreeElement extends HTMLElement {\n // -------------------------------------------------------------------------\n // Tier 1: Lightweight cached metadata (always available)\n // -------------------------------------------------------------------------\n\n /**\n * Returns the Tier 1 cached metadata for this object.\n * Instant, no computation. Returns null if the element is not linked.\n */\n get metadata(): ObjectMetadata | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getByUuid(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand heavy inspection (reads live Three.js object)\n // -------------------------------------------------------------------------\n\n /**\n * Performs a full inspection of the linked Three.js object.\n * Reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n */\n inspect(): ObjectInspection | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.inspect(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Raw Three.js object reference\n // -------------------------------------------------------------------------\n\n /**\n * Returns the raw Three.js Object3D linked to this DOM element.\n * Allows direct access to any Three.js property or method.\n */\n get object3D(): Object3D | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getObject3D(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Convenience shortcuts (read from Tier 1 metadata)\n // -------------------------------------------------------------------------\n\n /**\n * Local position as [x, y, z].\n */\n get position(): [number, number, number] | null {\n return this.metadata?.position ?? null;\n }\n\n /**\n * Local euler rotation as [x, y, z] in radians.\n */\n get rotation(): [number, number, number] | null {\n return this.metadata?.rotation ?? null;\n }\n\n /**\n * Local scale as [x, y, z].\n */\n get scale(): [number, number, number] | null {\n return this.metadata?.scale ?? null;\n }\n\n /**\n * Whether the object is visible (does not check parent chain).\n */\n get visible(): boolean {\n return this.metadata?.visible ?? false;\n }\n\n /**\n * The testId from userData.testId, if set.\n */\n get testId(): string | undefined {\n return this.metadata?.testId;\n }\n\n /**\n * World-space bounding box. Computed on-demand (Tier 2).\n */\n get bounds(): { min: [number, number, number]; max: [number, number, number] } | null {\n const inspection = this.inspect();\n return inspection?.bounds ?? null;\n }\n\n // -------------------------------------------------------------------------\n // Interaction methods\n // -------------------------------------------------------------------------\n\n /**\n * Trigger a deterministic click on the linked 3D object.\n * Projects the object center to screen coordinates and dispatches pointer events.\n */\n click(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot click: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.click === 'function') {\n window.__R3F_DOM__.click(uuid);\n } else {\n console.warn('[react-three-dom] Cannot click: bridge API not initialized');\n }\n }\n\n /**\n * Trigger a deterministic hover on the linked 3D object.\n */\n hover(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot hover: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.hover === 'function') {\n window.__R3F_DOM__.hover(uuid);\n } else {\n console.warn('[react-three-dom] Cannot hover: bridge API not initialized');\n }\n }\n\n // -------------------------------------------------------------------------\n // Console-friendly output\n // -------------------------------------------------------------------------\n\n /**\n * Returns a readable string representation for console output.\n */\n override toString(): string {\n const tag = this.tagName.toLowerCase();\n const name = this.dataset.name ? ` name=\"${this.dataset.name}\"` : '';\n const testId = this.dataset.testId ? ` testId=\"${this.dataset.testId}\"` : '';\n const type = this.dataset.type ? ` type=\"${this.dataset.type}\"` : '';\n return `<${tag}${name}${testId}${type}>`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nlet _registered = false;\n\n/**\n * Register all custom elements (<three-scene>, <three-mesh>, etc.).\n * Safe to call multiple times — only registers once.\n *\n * @param store - The ObjectStore instance for element property lookups\n */\nexport function ensureCustomElements(store: ObjectStore): void {\n if (_registered) return;\n\n // Check if we're in a browser environment\n if (typeof customElements === 'undefined') return;\n\n _store = store;\n\n for (const tag of ALL_TAGS) {\n if (!customElements.get(tag)) {\n // Each tag gets its own class so instanceof checks work\n // and DevTools shows distinct element types\n const elementClass = class extends ThreeElement {};\n // Set displayName for debugging\n Object.defineProperty(elementClass, 'name', { value: `ThreeElement_${tag}` });\n customElements.define(tag, elementClass);\n }\n }\n\n _registered = true;\n}\n\n/**\n * Check if custom elements have been registered.\n */\nexport function isRegistered(): boolean {\n return _registered;\n}\n","/**\n * @module attributes\n *\n * Serializes ObjectStore Tier 1 metadata into DOM data-attributes and applies\n * them to mirror elements with minimal DOM writes. Only attributes whose values\n * actually changed are written, keeping per-frame cost near zero for static objects.\n */\nimport type { ObjectMetadata } from '../types';\n\n// ---------------------------------------------------------------------------\n// Attribute serialization: converts Tier 1 metadata to DOM attribute strings\n// ---------------------------------------------------------------------------\n\n/**\n * Attribute definitions: maps data-attribute names to extractor functions.\n * Each extractor takes metadata and returns a string value, or undefined\n * to skip setting the attribute (avoids empty attributes in DOM).\n */\nconst ATTRIBUTE_MAP: Record<string, (meta: ObjectMetadata) => string | undefined> = {\n 'data-uuid': (m) => m.uuid,\n 'data-name': (m) => m.name || undefined,\n 'data-type': (m) => m.type,\n 'data-visible': (m) => String(m.visible),\n 'data-test-id': (m) => m.testId,\n 'data-geometry': (m) => m.geometryType,\n 'data-material': (m) => m.materialType,\n 'data-position': (m) => serializeTuple(m.position),\n 'data-rotation': (m) => serializeTuple(m.rotation),\n 'data-scale': (m) => serializeTuple(m.scale),\n 'data-vertex-count': (m) => m.vertexCount !== undefined ? String(m.vertexCount) : undefined,\n 'data-triangle-count': (m) => m.triangleCount !== undefined ? String(m.triangleCount) : undefined,\n 'data-instance-count': (m) => m.instanceCount !== undefined ? String(m.instanceCount) : undefined,\n 'data-fov': (m) => m.fov !== undefined ? String(m.fov) : undefined,\n 'data-near': (m) => m.near !== undefined ? String(m.near) : undefined,\n 'data-far': (m) => m.far !== undefined ? String(m.far) : undefined,\n 'data-zoom': (m) => m.zoom !== undefined ? String(m.zoom) : undefined,\n};\n\n/** All attribute names we manage (for diffing). */\nexport const MANAGED_ATTRIBUTES = Object.keys(ATTRIBUTE_MAP);\n\n// ---------------------------------------------------------------------------\n// Serialization helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Serialize a 3-element tuple to a compact string: \"1.23,4.56,7.89\"\n * Uses 2 decimal places for readability without excessive precision.\n */\nfunction serializeTuple(tuple: [number, number, number]): string {\n return `${round(tuple[0])},${round(tuple[1])},${round(tuple[2])}`;\n}\n\n/**\n * Round to 4 decimal places to avoid floating point noise\n * while preserving meaningful precision.\n */\nfunction round(n: number): string {\n // Avoid -0 display\n const rounded = Math.round(n * 10000) / 10000;\n return String(rounded === 0 ? 0 : rounded);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute all attribute key-value pairs for a metadata object.\n * Returns a map of attribute name → value.\n * Attributes with undefined values are excluded.\n */\nexport function computeAttributes(meta: ObjectMetadata): Map<string, string> {\n const attrs = new Map<string, string>();\n for (const [key, extractor] of Object.entries(ATTRIBUTE_MAP)) {\n const value = extractor(meta);\n if (value !== undefined) {\n attrs.set(key, value);\n }\n }\n return attrs;\n}\n\n/**\n * Apply attributes to a DOM element, only writing those that changed.\n * Returns the number of attributes that were actually written (for perf tracking).\n *\n * @param element - The custom element to update\n * @param meta - Current Tier 1 metadata\n * @param prevAttrs - Previous attribute values (mutated in-place to reflect new state)\n * @returns Number of DOM setAttribute calls made\n */\nexport function applyAttributes(\n element: HTMLElement,\n meta: ObjectMetadata,\n prevAttrs: Map<string, string>,\n): number {\n let writeCount = 0;\n const newAttrs = computeAttributes(meta);\n\n // Set or update attributes that changed\n for (const [key, value] of newAttrs) {\n const prev = prevAttrs.get(key);\n if (prev !== value) {\n element.setAttribute(key, value);\n prevAttrs.set(key, value);\n writeCount++;\n }\n }\n\n // Remove attributes that no longer exist\n for (const key of prevAttrs.keys()) {\n if (!newAttrs.has(key)) {\n element.removeAttribute(key);\n prevAttrs.delete(key);\n writeCount++;\n }\n }\n\n return writeCount;\n}\n","/**\n * @module DomMirror\n *\n * Maintains a parallel DOM tree that mirrors the Three.js scene graph using\n * custom elements (<three-mesh>, <three-group>, etc.). This enables standard\n * DOM tooling — CSS selectors, DevTools Elements panel, Accessibility tree —\n * to work with 3D objects. Only a subset of objects are materialized as DOM\n * nodes at any time (capped via LRU eviction) to stay performant at BIM scale.\n */\nimport type { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport { getTagForType } from './CustomElements';\nimport { applyAttributes } from './attributes';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// LRU tracking node (doubly-linked list for O(1) eviction)\n// ---------------------------------------------------------------------------\n\ninterface LRUNode {\n uuid: string;\n prev: LRUNode | null;\n next: LRUNode | null;\n}\n\n// ---------------------------------------------------------------------------\n// Materialized node record — tracks a DOM element and its cached attributes\n// ---------------------------------------------------------------------------\n\ninterface MaterializedNode {\n element: HTMLElement;\n /** Previously applied attribute values for diffing */\n prevAttrs: Map<string, string>;\n /** LRU tracking node */\n lruNode: LRUNode;\n}\n\n// ---------------------------------------------------------------------------\n// DomMirror — lazy DOM tree builder with LRU eviction\n// ---------------------------------------------------------------------------\n\n/**\n * Manages the parallel DOM tree that mirrors the Three.js scene graph.\n *\n * Key design for 100k-scale:\n * - ObjectStore holds Tier 1 metadata for ALL objects (cheap, ~120 bytes each)\n * - DomMirror only materializes DOM nodes for actively viewed/queried objects\n * - Max materialized DOM nodes capped (default 2,000) with LRU eviction\n * - DOM writes only happen for materialized nodes where values actually differ\n */\nexport class DomMirror {\n private _store: ObjectStore;\n private _rootElement: HTMLElement | null = null;\n\n // Materialized nodes indexed by uuid\n private _nodes = new Map<string, MaterializedNode>();\n\n // LRU doubly-linked list for eviction (head = most recently used, tail = least)\n private _lruHead: LRUNode | null = null;\n private _lruTail: LRUNode | null = null;\n private _lruSize = 0;\n\n // Max materialized DOM nodes\n private _maxNodes: number;\n\n // UUID → parent UUID mapping for DOM tree structure\n private _parentMap = new Map<string, string | null>();\n\n /** When true, mirror elements use pointer-events: auto so DevTools element picker can select them. */\n private _inspectMode = false;\n\n /** Async materialization state for inspect mode */\n private _asyncQueue: string[] = [];\n private _asyncIdleHandle: number | null = null;\n private _asyncBatchSize = 200;\n\n constructor(store: ObjectStore, maxNodes = 2000) {\n this._store = store;\n this._maxNodes = maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Initialization\n // -------------------------------------------------------------------------\n\n /**\n * Set the root DOM element where the mirror tree will be appended.\n * Typically a hidden div: <div id=\"three-dom-root\" style=\"display:none\">\n */\n setRoot(rootElement: HTMLElement): void {\n this._rootElement = rootElement;\n }\n\n /**\n * Enable or disable \"inspect mode\". When turning on, kicks off async\n * chunked materialization so the full tree becomes browsable in the\n * Elements tab without blocking the main thread.\n *\n * At BIM scale (100k-200k objects) the old synchronous loop would freeze\n * the page for 2-10s. The new approach uses requestIdleCallback to\n * spread work across idle frames (~200 nodes per idle slice, ~5ms each).\n */\n setInspectMode(on: boolean): void {\n if (this._inspectMode === on) return;\n this._inspectMode = on;\n\n if (on) {\n this._startAsyncMaterialization();\n } else {\n this._cancelAsyncMaterialization();\n }\n\n r3fLog('inspect', 'setInspectMode', { on, nodeCount: this._nodes.size });\n }\n\n /** Whether inspect mode is currently enabled. */\n getInspectMode(): boolean {\n return this._inspectMode;\n }\n\n /**\n * Build the initial DOM tree from the scene.\n * Materializes the top 2 levels of the scene hierarchy.\n */\n buildInitialTree(scene: Object3D): void {\n if (!this._rootElement) return;\n this.materializeSubtree(scene.uuid, 2);\n }\n\n // -------------------------------------------------------------------------\n // Materialization\n // -------------------------------------------------------------------------\n\n /**\n * Create a DOM node for a single object.\n * If already materialized, touches the LRU and returns the existing element.\n */\n materialize(uuid: string): HTMLElement | null {\n // Already materialized — touch LRU and return\n const existing = this._nodes.get(uuid);\n if (existing) {\n this._lruTouch(existing.lruNode);\n return existing.element;\n }\n\n // Get metadata from the store\n const meta = this._store.getByUuid(uuid);\n if (!meta) return null;\n\n // Evict if at capacity\n if (this._lruSize >= this._maxNodes) {\n this._evictLRU();\n }\n\n // Create the custom element\n const tag = getTagForType(meta.type);\n const element = document.createElement(tag);\n\n element.style.cssText = 'display:contents;';\n\n // Apply all Tier 1 attributes\n const prevAttrs = new Map<string, string>();\n applyAttributes(element, meta, prevAttrs);\n\n // Create LRU node\n const lruNode: LRUNode = { uuid, prev: null, next: null };\n this._lruPush(lruNode);\n\n // Store the materialized node\n const node: MaterializedNode = { element, prevAttrs, lruNode };\n this._nodes.set(uuid, node);\n\n // Track parent for DOM structure\n this._parentMap.set(uuid, meta.parentUuid);\n\n // Insert into DOM tree\n this._insertIntoDom(uuid, meta.parentUuid, element);\n\n return element;\n }\n\n /**\n * Materialize a subtree starting from the given uuid, up to the specified depth.\n * depth=0 materializes just the node, depth=1 includes direct children, etc.\n */\n materializeSubtree(uuid: string, depth: number): void {\n this.materialize(uuid);\n\n if (depth <= 0) return;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return;\n\n for (const childUuid of meta.childrenUuids) {\n this.materializeSubtree(childUuid, depth - 1);\n }\n }\n\n /**\n * Remove a DOM node but keep JS metadata in the ObjectStore.\n * Called by LRU eviction or when an object is removed from the scene.\n * Also dematerializes any materialized descendants so they don't become\n * orphaned entries in the LRU / _nodes maps.\n */\n dematerialize(uuid: string): void {\n const node = this._nodes.get(uuid);\n if (!node) return;\n\n // Collect materialized descendants before removing the parent.\n // Walk _parentMap to find children whose parent is this uuid.\n const descendants = this._collectMaterializedDescendants(uuid);\n\n // Dematerialize descendants bottom-up (deepest first doesn't matter\n // since we're removing from maps, but process children before parent\n // avoids redundant DOM detach since parent.remove() already detaches them).\n for (const descUuid of descendants) {\n const descNode = this._nodes.get(descUuid);\n if (descNode) {\n this._lruRemove(descNode.lruNode);\n this._nodes.delete(descUuid);\n this._parentMap.delete(descUuid);\n }\n }\n\n // Remove the node itself\n node.element.remove();\n this._lruRemove(node.lruNode);\n this._nodes.delete(uuid);\n this._parentMap.delete(uuid);\n }\n\n /**\n * Collect all materialized descendants of a uuid by walking _parentMap.\n */\n private _collectMaterializedDescendants(parentUuid: string): string[] {\n const result: string[] = [];\n for (const [childUuid, pUuid] of this._parentMap) {\n if (pUuid === parentUuid) {\n result.push(childUuid);\n result.push(...this._collectMaterializedDescendants(childUuid));\n }\n }\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Structural updates (called by Object3D.add/remove patch)\n // -------------------------------------------------------------------------\n\n /**\n * Called when a new object is added to the tracked scene.\n * Only materializes if the parent is already materialized (lazy expansion).\n */\n onObjectAdded(obj: Object3D): void {\n const parentUuid = obj.parent?.uuid;\n if (!parentUuid) return;\n\n // Only materialize if parent is already visible in the DOM tree\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n this.materialize(obj.uuid);\n }\n\n // Update parent's children in DOM (add the new child)\n if (parentNode) {\n const parentMeta = this._store.getByUuid(parentUuid);\n if (parentMeta) {\n applyAttributes(parentNode.element, parentMeta, parentNode.prevAttrs);\n }\n }\n }\n\n /**\n * Called when an object is removed from the tracked scene.\n * Dematerializes the object and all its descendants.\n */\n onObjectRemoved(obj: Object3D): void {\n // Dematerialize entire subtree\n obj.traverse((child) => {\n this.dematerialize(child.uuid);\n });\n }\n\n // -------------------------------------------------------------------------\n // Attribute sync (called per-frame by ThreeDom)\n // -------------------------------------------------------------------------\n\n /**\n * Sync Tier 1 attributes for an object if it's materialized.\n * No-op if the object has no materialized DOM node.\n * Returns the number of DOM writes performed.\n */\n syncAttributes(obj: Object3D): number {\n const node = this._nodes.get(obj.uuid);\n if (!node) return 0;\n\n const meta = this._store.getMetadata(obj);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n /**\n * Sync attributes by uuid (when you don't have the Object3D ref).\n */\n syncAttributesByUuid(uuid: string): number {\n const node = this._nodes.get(uuid);\n if (!node) return 0;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n // -------------------------------------------------------------------------\n // Querying\n // -------------------------------------------------------------------------\n\n /**\n * Get the root DOM element.\n */\n getRootElement(): HTMLElement | null {\n return this._rootElement;\n }\n\n /**\n * Get the materialized DOM element for an object, if it exists.\n */\n getElement(uuid: string): HTMLElement | null {\n const node = this._nodes.get(uuid);\n if (node) {\n this._lruTouch(node.lruNode);\n return node.element;\n }\n return null;\n }\n\n /**\n * Get or lazily materialize a DOM element for an object.\n * Also materializes the ancestor chain so the element is correctly\n * nested in the DOM tree. Used by InspectController so that\n * hover/click always produces a valid mirror element regardless\n * of whether async materialization has reached it yet.\n */\n getOrMaterialize(uuid: string): HTMLElement | null {\n const existing = this._nodes.get(uuid);\n if (existing) {\n this._lruTouch(existing.lruNode);\n return existing.element;\n }\n\n this._materializeAncestorChain(uuid);\n return this.materialize(uuid);\n }\n\n /**\n * Check if an object has a materialized DOM node.\n */\n isMaterialized(uuid: string): boolean {\n return this._nodes.has(uuid);\n }\n\n /**\n * Query the mirror DOM using a CSS selector.\n * Falls back to searching the ObjectStore if no materialized nodes match,\n * then materializes the matching objects.\n */\n querySelector(selector: string): HTMLElement | null {\n if (!this._rootElement) return null;\n\n // First try the already-materialized DOM\n const existing = this._rootElement.querySelector<HTMLElement>(selector);\n if (existing) return existing;\n\n // If not found, search by common patterns against the store\n const uuid = this._findUuidBySelector(selector);\n if (uuid) {\n return this.materialize(uuid);\n }\n\n return null;\n }\n\n /**\n * Query all matching elements in the mirror DOM.\n */\n querySelectorAll(selector: string): HTMLElement[] {\n if (!this._rootElement) return [];\n\n // Find all matching UUIDs from the store\n const uuids = this._findAllUuidsBySelector(selector);\n\n // Materialize each and collect elements\n const elements: HTMLElement[] = [];\n for (const uuid of uuids) {\n const el = this.materialize(uuid);\n if (el) elements.push(el);\n }\n\n return elements;\n }\n\n // -------------------------------------------------------------------------\n // Configuration\n // -------------------------------------------------------------------------\n\n /**\n * Set the maximum number of materialized DOM nodes.\n * If current count exceeds the new max, excess nodes are evicted immediately.\n */\n setMaxNodes(max: number): void {\n this._maxNodes = max;\n while (this._lruSize > this._maxNodes) {\n this._evictLRU();\n }\n }\n\n /** Current number of materialized DOM nodes. */\n getMaterializedCount(): number {\n return this._nodes.size;\n }\n\n /** Maximum allowed materialized DOM nodes. */\n getMaxNodes(): number {\n return this._maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /**\n * Remove all materialized DOM nodes and reset state.\n */\n dispose(): void {\n this._cancelAsyncMaterialization();\n for (const [, node] of this._nodes) {\n node.element.remove();\n }\n this._nodes.clear();\n this._parentMap.clear();\n this._lruHead = null;\n this._lruTail = null;\n this._lruSize = 0;\n if (this._rootElement) {\n this._rootElement.innerHTML = '';\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: DOM insertion\n // -------------------------------------------------------------------------\n\n /**\n * Insert a newly created element into the correct position in the DOM tree.\n */\n private _insertIntoDom(\n _uuid: string,\n parentUuid: string | null,\n element: HTMLElement,\n ): void {\n if (!this._rootElement) return;\n\n if (!parentUuid) {\n // Root-level object (scene) — append to mirror root\n this._rootElement.appendChild(element);\n return;\n }\n\n // Try to find materialized parent\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n parentNode.element.appendChild(element);\n } else {\n // Parent not materialized — append to mirror root as orphan\n // (will be reparented when parent is materialized)\n this._rootElement.appendChild(element);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Ancestor chain materialization\n // -------------------------------------------------------------------------\n\n /**\n * Materialize all ancestors of a uuid from root down, so the target\n * element will be correctly nested when materialized.\n */\n private _materializeAncestorChain(uuid: string): void {\n const chain: string[] = [];\n let currentUuid: string | null = uuid;\n\n while (currentUuid) {\n if (this._nodes.has(currentUuid)) break;\n const meta = this._store.getByUuid(currentUuid);\n if (!meta) break;\n chain.push(currentUuid);\n currentUuid = meta.parentUuid;\n }\n\n // Materialize from root-most ancestor down (skip the target itself)\n for (let i = chain.length - 1; i > 0; i--) {\n this.materialize(chain[i]);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Async chunked materialization for inspect mode\n // -------------------------------------------------------------------------\n\n private _startAsyncMaterialization(): void {\n this._cancelAsyncMaterialization();\n\n const flatList = this._store.getFlatList();\n this._asyncQueue = [];\n for (const obj of flatList) {\n if (obj.userData?.__r3fdom_internal) continue;\n if (this._nodes.has(obj.uuid)) continue;\n this._asyncQueue.push(obj.uuid);\n }\n\n if (this._asyncQueue.length === 0) return;\n\n r3fLog('inspect', `Async materialization started: ${this._asyncQueue.length} objects queued`);\n this._scheduleAsyncChunk();\n }\n\n private _cancelAsyncMaterialization(): void {\n if (this._asyncIdleHandle !== null) {\n if (typeof cancelIdleCallback === 'function') {\n cancelIdleCallback(this._asyncIdleHandle);\n } else {\n clearTimeout(this._asyncIdleHandle);\n }\n this._asyncIdleHandle = null;\n }\n this._asyncQueue = [];\n }\n\n private _scheduleAsyncChunk(): void {\n if (this._asyncQueue.length === 0) {\n this._asyncIdleHandle = null;\n r3fLog('inspect', `Async materialization complete: ${this._nodes.size} nodes materialized`);\n return;\n }\n\n const callback = (deadline?: IdleDeadline) => {\n const hasTimeRemaining = deadline\n ? () => deadline.timeRemaining() > 2\n : () => true;\n\n let processed = 0;\n while (\n this._asyncQueue.length > 0 &&\n processed < this._asyncBatchSize &&\n hasTimeRemaining()\n ) {\n const uuid = this._asyncQueue.shift()!;\n if (!this._nodes.has(uuid)) {\n this.materialize(uuid);\n }\n processed++;\n }\n\n this._scheduleAsyncChunk();\n };\n\n if (typeof requestIdleCallback === 'function') {\n this._asyncIdleHandle = requestIdleCallback(callback, { timeout: 100 }) as unknown as number;\n } else {\n this._asyncIdleHandle = setTimeout(callback, 16) as unknown as number;\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Selector → UUID resolution\n // -------------------------------------------------------------------------\n\n /**\n * Parse common CSS selector patterns and resolve to a uuid from the store.\n * Supports:\n * [data-test-id=\"value\"]\n * [data-name=\"value\"]\n * [data-uuid=\"value\"]\n * three-mesh, three-light, etc. (by tag/type)\n */\n private _findUuidBySelector(selector: string): string | null {\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-uuid=\"value\"]\n const uuidMatch = selector.match(/\\[data-uuid=[\"']([^\"']+)[\"']\\]/);\n if (uuidMatch) {\n const meta = this._store.getByUuid(uuidMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n return metas.length > 0 ? metas[0].uuid : null;\n }\n\n return null;\n }\n\n /**\n * Find all UUIDs matching a selector pattern.\n */\n private _findAllUuidsBySelector(selector: string): string[] {\n const uuids: string[] = [];\n\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n if (meta) uuids.push(meta.uuid);\n return uuids;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n for (const m of metas) uuids.push(m.uuid);\n return uuids;\n }\n\n // Tag-based: three-mesh, three-light, etc.\n // Resolve by iterating all objects and filtering by type\n const tagMatch = selector.match(/^(three-(?:scene|group|mesh|light|camera|object))$/);\n if (tagMatch) {\n const targetTag = tagMatch[1];\n const allObjects = this._store.getFlatList();\n for (const obj of allObjects) {\n const meta = this._store.getMetadata(obj);\n if (meta && getTagForType(meta.type) === targetTag) {\n uuids.push(meta.uuid);\n }\n }\n return uuids;\n }\n\n return uuids;\n }\n\n // -------------------------------------------------------------------------\n // Private: LRU doubly-linked list operations\n // -------------------------------------------------------------------------\n\n /** Add a node to the front (most recently used). */\n private _lruPush(node: LRUNode): void {\n node.prev = null;\n node.next = this._lruHead;\n if (this._lruHead) {\n this._lruHead.prev = node;\n }\n this._lruHead = node;\n if (!this._lruTail) {\n this._lruTail = node;\n }\n this._lruSize++;\n }\n\n /** Remove a node from the list. */\n private _lruRemove(node: LRUNode): void {\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n this._lruHead = node.next;\n }\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n this._lruTail = node.prev;\n }\n node.prev = null;\n node.next = null;\n this._lruSize--;\n }\n\n /** Move a node to the front (most recently used). */\n private _lruTouch(node: LRUNode): void {\n if (this._lruHead === node) return; // already at front\n this._lruRemove(node);\n this._lruPush(node);\n }\n\n /** Evict the least recently used node. */\n private _evictLRU(): void {\n if (!this._lruTail) return;\n const uuid = this._lruTail.uuid;\n this.dematerialize(uuid);\n }\n}\n","import { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { DomMirror } from '../mirror/DomMirror';\nimport { r3fLog } from '../debug';\nimport { shouldRegister, ensureAncestorChain } from './ThreeDom';\n\n// ---------------------------------------------------------------------------\n// Object3D.add / Object3D.remove monkey-patch\n//\n// Intercepts structural changes (add/remove children) on Object3D so the\n// ObjectStore and DomMirror are updated instantly (event-driven, O(1) per\n// change) without requiring per-frame traversal.\n//\n// Scoping: only fires for objects that belong to a tracked scene.\n// This avoids interfering with other Three.js scenes on the same page.\n// ---------------------------------------------------------------------------\n\n/** Tracks whether the patch has been applied. */\nlet _patched = false;\n\n/** Original methods saved for restoration. */\nlet _originalAdd: typeof Object3D.prototype.add | null = null;\nlet _originalRemove: typeof Object3D.prototype.remove | null = null;\n\n/** Active store/mirror pairs (supports multiple tracked scenes). */\nconst _activePairs: Array<{ store: ObjectStore; mirror: DomMirror; instanceKey: string }> = [];\n\n/**\n * Find the store/mirror pair that tracks the scene containing this object.\n * Walks up the parent chain to check each ancestor against tracked roots.\n */\nfunction findTrackingPair(\n obj: Object3D,\n): { store: ObjectStore; mirror: DomMirror; instanceKey: string } | null {\n for (const pair of _activePairs) {\n if (pair.store.isInTrackedScene(obj)) {\n return pair;\n }\n }\n return null;\n}\n\n/**\n * Register an object and all its descendants into the store and mirror.\n * Respects the mode/filter settings for the instance.\n */\nfunction registerSubtree(\n obj: Object3D,\n store: ObjectStore,\n mirror: DomMirror,\n instanceKey: string,\n): void {\n obj.traverse((child) => {\n if (!store.has(child) && shouldRegister(instanceKey, child)) {\n ensureAncestorChain(child, store, mirror);\n store.register(child);\n mirror.onObjectAdded(child);\n }\n });\n}\n\n/**\n * Patch Object3D.prototype.add and Object3D.prototype.remove to intercept\n * structural changes for tracked scenes.\n *\n * @param store - The ObjectStore managing scene metadata\n * @param mirror - The DomMirror managing the parallel DOM tree\n * @returns A cleanup function that unregisters this store/mirror pair\n */\nexport function patchObject3D(\n store: ObjectStore,\n mirror: DomMirror,\n instanceKey = '',\n): () => void {\n // Register this store/mirror pair\n _activePairs.push({ store, mirror, instanceKey });\n\n // Only patch the prototype once (supports multiple store/mirror pairs)\n if (!_patched) {\n r3fLog('patch', 'Patching Object3D.prototype.add and .remove');\n _originalAdd = Object3D.prototype.add;\n _originalRemove = Object3D.prototype.remove;\n\n Object3D.prototype.add = function patchedAdd(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Call the original add first\n _originalAdd!.call(this, ...objects);\n\n // Check if this parent belongs to a tracked scene\n const pair = findTrackingPair(this);\n if (pair) {\n for (const obj of objects) {\n // Skip if it's the object adding itself (Three.js guard)\n if (obj === this) continue;\n try {\n r3fLog('patch', `patchedAdd: \"${obj.name || obj.type}\" added to \"${this.name || this.type}\"`);\n registerSubtree(obj, pair.store, pair.mirror, pair.instanceKey);\n } catch (err) {\n r3fLog('patch', `patchedAdd: failed to register \"${obj.name || obj.type}\"`, err);\n }\n }\n // Immediately update the parent's metadata (so childrenUuids is\n // current for any snapshot() call in the same frame) and also mark\n // it dirty for the DOM position sync on the next useFrame.\n pair.store.update(this);\n pair.store.markDirty(this);\n }\n\n return this;\n };\n\n Object3D.prototype.remove = function patchedRemove(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Check tracking BEFORE removal (parent is still set)\n const pair = findTrackingPair(this);\n\n // Notify store/mirror before actual removal\n if (pair) {\n for (const obj of objects) {\n if (obj === this) continue;\n try {\n r3fLog('patch', `patchedRemove: \"${obj.name || obj.type}\" removed from \"${this.name || this.type}\"`);\n\n // Notify mirror first (it needs to traverse for DOM cleanup)\n pair.mirror.onObjectRemoved(obj);\n\n // Then unregister from store (traverses descendants)\n obj.traverse((child) => {\n pair.store.unregister(child);\n });\n } catch (err) {\n r3fLog('patch', `patchedRemove: failed to unregister \"${obj.name || obj.type}\"`, err);\n }\n }\n // Immediately update the parent's metadata (so childrenUuids is\n // current for any snapshot() call in the same frame) and also mark\n // it dirty for the DOM position sync on the next useFrame.\n pair.store.update(this);\n pair.store.markDirty(this);\n }\n\n // Call the original remove\n _originalRemove!.call(this, ...objects);\n\n return this;\n };\n\n _patched = true;\n }\n\n // Return cleanup function\n return () => {\n const idx = _activePairs.findIndex(\n (p) => p.store === store && p.mirror === mirror,\n );\n if (idx !== -1) {\n _activePairs.splice(idx, 1);\n }\n\n // If no more active pairs, restore original methods\n if (_activePairs.length === 0 && _patched) {\n restoreObject3D();\n }\n };\n}\n\n/**\n * Restore the original Object3D.prototype.add and remove methods.\n * Called automatically when the last store/mirror pair is removed.\n * Can also be called manually for testing.\n */\nexport function restoreObject3D(): void {\n if (!_patched) return;\n r3fLog('patch', 'Restoring original Object3D.prototype.add and .remove');\n\n if (_originalAdd) {\n Object3D.prototype.add = _originalAdd;\n _originalAdd = null;\n }\n if (_originalRemove) {\n Object3D.prototype.remove = _originalRemove;\n _originalRemove = null;\n }\n\n _patched = false;\n}\n\n/**\n * Check if Object3D prototype is currently patched.\n */\nexport function isPatched(): boolean {\n return _patched;\n}\n","import type { ObjectStore } from '../store/ObjectStore';\nimport type { ObjectMetadata, SceneSnapshot, SnapshotNode } from '../types';\n\n// ---------------------------------------------------------------------------\n// Snapshot: builds a structured JSON tree from the ObjectStore\n//\n// Reads exclusively from Tier 1 metadata — no Three.js object access,\n// no DOM reads. Cost scales linearly with object count but is cheap\n// since it's just Map lookups and object construction.\n// ---------------------------------------------------------------------------\n\n/**\n * Build a recursive SnapshotNode tree from a metadata entry.\n */\nfunction buildNodeTree(store: ObjectStore, meta: ObjectMetadata): SnapshotNode {\n const children: SnapshotNode[] = [];\n\n for (const childUuid of meta.childrenUuids) {\n const childMeta = store.getByUuid(childUuid);\n if (childMeta) {\n children.push(buildNodeTree(store, childMeta));\n }\n }\n\n const node: SnapshotNode = {\n uuid: meta.uuid,\n name: meta.name,\n type: meta.type,\n testId: meta.testId,\n visible: meta.visible,\n position: [...meta.position],\n rotation: [...meta.rotation],\n scale: [...meta.scale],\n children,\n };\n\n if (meta.geometryType) node.geometryType = meta.geometryType;\n if (meta.materialType) node.materialType = meta.materialType;\n if (meta.vertexCount != null) node.vertexCount = meta.vertexCount;\n if (meta.triangleCount != null) node.triangleCount = meta.triangleCount;\n if (meta.instanceCount != null) node.instanceCount = meta.instanceCount;\n\n return node;\n}\n\n/**\n * Find the root node (scene) in the store.\n * The root is the object whose parentUuid is null.\n */\nfunction findRoot(store: ObjectStore): ObjectMetadata | null {\n const allObjects = store.getFlatList();\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta && meta.parentUuid === null) {\n return meta;\n }\n }\n return null;\n}\n\n/**\n * Create a full scene snapshot from the ObjectStore.\n *\n * Returns a structured JSON tree built entirely from Tier 1 cached metadata.\n * No Three.js objects or DOM nodes are accessed.\n *\n * @example\n * ```ts\n * const snap = createSnapshot(store);\n * console.log(snap.objectCount); // 1234\n * console.log(snap.tree.children[0].name); // \"Furniture\"\n * ```\n */\nexport function createSnapshot(store: ObjectStore): SceneSnapshot {\n const rootMeta = findRoot(store);\n\n const tree: SnapshotNode = rootMeta\n ? buildNodeTree(store, rootMeta)\n : {\n uuid: '',\n name: 'empty',\n type: 'Scene',\n visible: true,\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n children: [],\n };\n\n return {\n timestamp: Date.now(),\n objectCount: store.getCount(),\n tree,\n };\n}\n\n/**\n * Create a flat snapshot — an array of all object metadata without tree structure.\n * Useful for searching/filtering without recursion.\n *\n * @example\n * ```ts\n * const flat = createFlatSnapshot(store);\n * const meshes = flat.objects.filter(m => m.type === 'Mesh');\n * ```\n */\nexport function createFlatSnapshot(store: ObjectStore): {\n timestamp: number;\n objectCount: number;\n objects: ObjectMetadata[];\n} {\n const objects: ObjectMetadata[] = [];\n const allObjects = store.getFlatList();\n\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta) {\n objects.push({ ...meta });\n }\n }\n\n return {\n timestamp: Date.now(),\n objectCount: objects.length,\n objects,\n };\n}\n","/**\n * @module projection\n *\n * Projects Three.js objects from world space to screen-space CSS pixel\n * coordinates using a multi-strategy approach (bbox center → face centers →\n * corners → origin fallback). Also provides frustum visibility checks and\n * screen-to-world conversion for drag deltas. Core utility used by all\n * interaction modules to determine where to dispatch synthetic events.\n */\nimport {\n Object3D,\n Camera,\n Vector3,\n Box3,\n Frustum,\n Matrix4,\n} from 'three';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Screen-space coordinates in CSS pixels relative to the canvas. */\nexport interface ScreenPoint {\n /** X coordinate in CSS pixels, left = 0. */\n x: number;\n /** Y coordinate in CSS pixels, top = 0. */\n y: number;\n}\n\n/** Canvas dimensions in CSS pixels. */\nexport interface CanvasSize {\n width: number;\n height: number;\n}\n\n/** Result of a projection attempt. */\nexport interface ProjectionResult {\n /** The screen-space point (CSS pixels relative to the canvas element). */\n point: ScreenPoint;\n /** Which strategy produced the result. */\n strategy: 'center' | 'corner' | 'face-center' | 'fallback-origin';\n /** NDC coordinates (-1..+1 range) for the projected point. */\n ndc: { x: number; y: number };\n}\n\n// ---------------------------------------------------------------------------\n// Reusable temporaries (avoids GC pressure in hot paths)\n// ---------------------------------------------------------------------------\n\nconst _vec3 = /* @__PURE__ */ new Vector3();\nconst _vec3B = /* @__PURE__ */ new Vector3();\nconst _box3 = /* @__PURE__ */ new Box3();\nconst _frustum = /* @__PURE__ */ new Frustum();\nconst _projMatrix = /* @__PURE__ */ new Matrix4();\n\n// ---------------------------------------------------------------------------\n// NDC → screen helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a Vector3 in NDC (after `vector.project(camera)`) to CSS-pixel\n * coordinates relative to the canvas.\n *\n * NDC convention: x ∈ [-1, +1], y ∈ [-1, +1], z ∈ [-1, +1]\n * Screen convention: x ∈ [0, width], y ∈ [0, height] (top-left origin)\n */\nfunction ndcToScreen(ndc: Vector3, size: CanvasSize): ScreenPoint {\n return {\n x: ((ndc.x + 1) / 2) * size.width,\n y: ((-ndc.y + 1) / 2) * size.height,\n };\n}\n\n/**\n * Returns true if the NDC coordinate is within the visible viewport.\n * Z check: z ∈ (-1, 1) means in front of camera and within far plane.\n */\nfunction isNdcOnScreen(ndc: Vector3): boolean {\n return (\n ndc.x >= -1 && ndc.x <= 1 &&\n ndc.y >= -1 && ndc.y <= 1 &&\n ndc.z >= -1 && ndc.z <= 1\n );\n}\n\n/**\n * Returns true if the NDC coordinate is in front of the camera.\n * After `vector.project(camera)`, z < 1 means in front of the camera.\n * A point behind the camera gets z > 1.\n */\nfunction isInFrontOfCamera(ndc: Vector3): boolean {\n return ndc.z >= -1 && ndc.z <= 1;\n}\n\n// ---------------------------------------------------------------------------\n// Candidate point generators\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the world-space bounding box center of an Object3D.\n * Falls back to the object's world position if the bbox is empty.\n */\nfunction getWorldCenter(obj: Object3D): Vector3 {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _vec3;\n }\n _box3.getCenter(_vec3);\n return _vec3;\n}\n\n/**\n * Get the 8 corners of the world-space bounding box.\n * Returns an empty array if the bbox is degenerate.\n */\nfunction getBboxCorners(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const { min, max } = _box3;\n return [\n new Vector3(min.x, min.y, min.z),\n new Vector3(min.x, min.y, max.z),\n new Vector3(min.x, max.y, min.z),\n new Vector3(min.x, max.y, max.z),\n new Vector3(max.x, min.y, min.z),\n new Vector3(max.x, min.y, max.z),\n new Vector3(max.x, max.y, min.z),\n new Vector3(max.x, max.y, max.z),\n ];\n}\n\n/**\n * Get the 6 face centers of the world-space bounding box.\n * These are better click targets than corners for many geometries.\n */\nfunction getBboxFaceCenters(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const center = _box3.getCenter(new Vector3());\n const { min, max } = _box3;\n\n return [\n new Vector3(min.x, center.y, center.z), // -X face\n new Vector3(max.x, center.y, center.z), // +X face\n new Vector3(center.x, min.y, center.z), // -Y face\n new Vector3(center.x, max.y, center.z), // +Y face\n new Vector3(center.x, center.y, min.z), // -Z face\n new Vector3(center.x, center.y, max.z), // +Z face\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Core projection\n// ---------------------------------------------------------------------------\n\n/**\n * Try to project a single world-space point to screen coordinates.\n * Returns null if the point is behind the camera.\n */\nfunction tryProjectPoint(\n worldPoint: Vector3,\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number }; ndcZ: number; onScreen: boolean } | null {\n // Clone to avoid mutating the input\n _vec3B.copy(worldPoint).project(camera);\n\n if (!isInFrontOfCamera(_vec3B)) return null;\n\n const screen = ndcToScreen(_vec3B, size);\n return {\n screen,\n ndc: { x: _vec3B.x, y: _vec3B.y },\n ndcZ: _vec3B.z,\n onScreen: isNdcOnScreen(_vec3B),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Project a 3D object to screen coordinates using a multi-strategy approach:\n *\n * 1. **Center**: Try the bounding box center (most natural click target).\n * 2. **Face centers**: Try the 6 face centers (better for large/flat objects).\n * 3. **Corners**: Try the 8 bbox corners (catches partially visible objects).\n * 4. **Fallback origin**: Try the object's world position (lights, empty groups).\n *\n * For each strategy, we prefer points that are both on-screen AND closest to\n * the viewport center (most reliable for event dispatch).\n *\n * Returns `null` if no part of the object is visible on screen.\n */\nexport function projectToScreen(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ProjectionResult | null {\n // Ensure world matrices are up to date\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n // Strategy 1: Bounding box center\n const center = getWorldCenter(obj);\n const centerResult = tryProjectPoint(center, camera, size);\n\n if (centerResult && centerResult.onScreen) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Strategy 2: Face centers — better fallback for large objects\n const faceCenters = getBboxFaceCenters(obj);\n const faceResult = findBestOnScreenPoint(faceCenters, camera, size);\n if (faceResult) {\n return {\n point: faceResult.screen,\n strategy: 'face-center',\n ndc: faceResult.ndc,\n };\n }\n\n // Strategy 3: Bbox corners — catches partially visible objects\n const corners = getBboxCorners(obj);\n const cornerResult = findBestOnScreenPoint(corners, camera, size);\n if (cornerResult) {\n return {\n point: cornerResult.screen,\n strategy: 'corner',\n ndc: cornerResult.ndc,\n };\n }\n\n // Strategy 4: Fallback to world position (lights, helpers, empty groups)\n obj.getWorldPosition(_vec3);\n const originResult = tryProjectPoint(_vec3.clone(), camera, size);\n if (originResult && originResult.onScreen) {\n return {\n point: originResult.screen,\n strategy: 'fallback-origin',\n ndc: originResult.ndc,\n };\n }\n\n // If center projected but was off-screen, still return it as a best-effort\n // (useful for drag targets that are partially off-screen)\n if (centerResult) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Object is entirely behind the camera or degenerate\n return null;\n}\n\n/**\n * From a list of candidate world-space points, find the one that projects\n * on-screen and is closest to the viewport center (most reliable dispatch).\n */\nfunction findBestOnScreenPoint(\n candidates: Vector3[],\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number } } | null {\n let bestResult: { screen: ScreenPoint; ndc: { x: number; y: number } } | null = null;\n let bestDistSq = Infinity;\n const halfW = size.width / 2;\n const halfH = size.height / 2;\n\n for (const point of candidates) {\n const result = tryProjectPoint(point, camera, size);\n if (!result || !result.onScreen) continue;\n\n // Distance from viewport center — prefer more central points\n const dx = result.screen.x - halfW;\n const dy = result.screen.y - halfH;\n const distSq = dx * dx + dy * dy;\n\n if (distSq < bestDistSq) {\n bestDistSq = distSq;\n bestResult = { screen: result.screen, ndc: result.ndc };\n }\n }\n\n return bestResult;\n}\n\n// ---------------------------------------------------------------------------\n// Frustum visibility check\n// ---------------------------------------------------------------------------\n\n/**\n * Check whether any part of an Object3D is within the camera frustum.\n * Uses the bounding box intersection test (fast, conservative).\n */\nexport function isInFrustum(obj: Object3D, camera: Camera): boolean {\n camera.updateWorldMatrix(true, false);\n obj.updateWorldMatrix(true, false);\n\n _projMatrix.multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n _frustum.setFromProjectionMatrix(_projMatrix);\n\n _box3.setFromObject(obj);\n\n // Empty bbox (lights, empties) — fall back to position check\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _frustum.containsPoint(_vec3);\n }\n\n return _frustum.intersectsBox(_box3);\n}\n\n// ---------------------------------------------------------------------------\n// Screen-to-world projection (for drag deltas)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a screen-space delta (CSS pixels) to a world-space displacement\n * vector on the plane perpendicular to the camera at the given depth.\n *\n * Used by drag3D to convert pixel movements to 3D movements that feel\n * natural regardless of camera position/zoom.\n */\nexport function screenDeltaToWorld(\n dx: number,\n dy: number,\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): Vector3 {\n // Get the object's depth in NDC\n obj.getWorldPosition(_vec3);\n _vec3.project(camera);\n const depth = _vec3.z;\n\n // Unproject two points at the same depth to get world-space scale\n const start = new Vector3(0, 0, depth).unproject(camera);\n const right = new Vector3(2 / size.width, 0, depth).unproject(camera);\n const up = new Vector3(0, -2 / size.height, depth).unproject(camera);\n\n // World-space pixels per CSS pixel\n const rightDir = right.sub(start);\n const upDir = up.sub(start);\n\n return new Vector3()\n .addScaledVector(rightDir, dx)\n .addScaledVector(upDir, dy);\n}\n\n// ---------------------------------------------------------------------------\n// Multi-point projection (for assertions / testing)\n// ---------------------------------------------------------------------------\n\n/**\n * Project multiple sample points of an object to screen space.\n * Returns all on-screen points, useful for assertions like\n * \"object covers at least 50px² of screen area\".\n */\nexport function projectAllSamplePoints(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ScreenPoint[] {\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n const points: ScreenPoint[] = [];\n\n // Collect all candidate world-space points\n const candidates: Vector3[] = [];\n\n // Center\n candidates.push(getWorldCenter(obj).clone());\n\n // Face centers\n candidates.push(...getBboxFaceCenters(obj));\n\n // Corners\n candidates.push(...getBboxCorners(obj));\n\n // Project each\n for (const wsPt of candidates) {\n const result = tryProjectPoint(wsPt, camera, size);\n if (result && result.onScreen) {\n points.push(result.screen);\n }\n }\n\n return points;\n}\n","/**\n * @module dispatch\n *\n * Low-level synthetic PointerEvent/MouseEvent/WheelEvent dispatch on the\n * canvas element. Produces the exact DOM event sequences that R3F's internal\n * event system expects (e.g. pointerdown → pointerup → click). All higher-level\n * interaction modules (click3D, hover3D, drag3D, etc.) delegate here.\n */\nimport type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// Synthetic PointerEvent dispatch\n//\n// Dispatches DOM events on the canvas element at the projected screen\n// coordinates, matching the exact sequence that a real browser interaction\n// would produce. R3F's event system listens on the canvas, so these\n// synthetic events flow through the full pointer → raycaster pipeline.\n// ---------------------------------------------------------------------------\n\n/** Monotonically increasing pointer ID for synthetic events. */\nlet _nextPointerId = 1000;\n\n/** Get a fresh pointerId for each interaction sequence. */\nfunction allocPointerId(): number {\n return _nextPointerId++;\n}\n\n/**\n * Compute clientX/clientY from a canvas-relative ScreenPoint.\n * Events need clientX/clientY (relative to viewport), not the canvas.\n */\nfunction toClientCoords(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): { clientX: number; clientY: number } {\n const rect = canvas.getBoundingClientRect();\n return {\n clientX: rect.left + point.x,\n clientY: rect.top + point.y,\n };\n}\n\n/**\n * Build a PointerEvent init object with correct coordinates and metadata.\n */\nfunction makePointerInit(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n pointerId: number,\n overrides?: Partial<PointerEventInit>,\n): PointerEventInit {\n const { clientX, clientY } = toClientCoords(canvas, point);\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX,\n clientY,\n screenX: clientX,\n screenY: clientY,\n pointerId,\n pointerType: 'mouse',\n isPrimary: true,\n button: 0,\n buttons: 1,\n width: 1,\n height: 1,\n pressure: 0.5,\n ...overrides,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click\n *\n * This matches what R3F's event system expects. The canvas is the event\n * target because R3F attaches its listeners to the canvas element.\n */\nexport function dispatchClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 0,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Hover sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a hover sequence on the canvas at the given screen point.\n *\n * Sequence: pointermove → pointerover → pointerenter\n *\n * R3F translates pointermove into onPointerMove/onPointerOver/onPointerEnter\n * via its internal raycaster. We dispatch the raw DOM events and let R3F\n * do the rest.\n */\nexport function dispatchHover(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n const pointerId = allocPointerId();\n const init = makePointerInit(canvas, point, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerover', init));\n canvas.dispatchEvent(new PointerEvent('pointerenter', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Drag sequence\n// ---------------------------------------------------------------------------\n\n/** Options for a drag interaction. */\nexport interface DragOptions {\n /** Number of intermediate pointermove steps. Default: 10 */\n steps?: number;\n /** Delay between steps in ms (for requestAnimationFrame pacing). Default: 0 */\n stepDelayMs?: number;\n}\n\n/**\n * Dispatch a full drag sequence from `start` to `end` on the canvas.\n *\n * Sequence: pointerdown → N × pointermove (interpolated) → pointerup\n *\n * Returns a Promise that resolves when the drag is complete.\n * The async nature allows optional frame-pacing via stepDelayMs.\n */\nexport async function dispatchDrag(\n canvas: HTMLCanvasElement,\n start: ScreenPoint,\n end: ScreenPoint,\n options: DragOptions = {},\n): Promise<void> {\n const { steps = 10, stepDelayMs = 0 } = options;\n const pointerId = allocPointerId();\n\n // Pointer down at start\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, start, pointerId)),\n );\n });\n\n // Interpolate intermediate moves\n for (let i = 1; i <= steps; i++) {\n const t = i / steps;\n const intermediate: ScreenPoint = {\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n };\n\n if (stepDelayMs > 0) {\n await sleep(stepDelayMs);\n }\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointermove',\n makePointerInit(canvas, intermediate, pointerId),\n ),\n );\n }\n\n // Pointer up at end\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, end, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Double-click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full double-click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * R3F translates the `dblclick` DOM event into `onDoubleClick` on the hit object.\n */\nexport function dispatchDoubleClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n const coords = toClientCoords(canvas, point);\n\n // First click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 1,\n }),\n );\n\n // Second click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n\n // dblclick\n canvas.dispatchEvent(\n new MouseEvent('dblclick', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Context menu (right-click) sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a right-click / context menu sequence on the canvas.\n *\n * Sequence: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * R3F translates the `contextmenu` DOM event into `onContextMenu`.\n */\nexport function dispatchContextMenu(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerdown',\n makePointerInit(canvas, point, pointerId, { button: 2, buttons: 2 }),\n ),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, {\n button: 2,\n buttons: 0,\n pressure: 0,\n }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('contextmenu', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Wheel event\n// ---------------------------------------------------------------------------\n\n/** Options for a wheel dispatch. */\nexport interface WheelOptions {\n /** Vertical scroll delta (positive = scroll down). Default: 100 */\n deltaY?: number;\n /** Horizontal scroll delta. Default: 0 */\n deltaX?: number;\n /** DOM_DELTA_PIXEL (0), DOM_DELTA_LINE (1), or DOM_DELTA_PAGE (2). Default: 0 */\n deltaMode?: number;\n}\n\n/**\n * Dispatch a wheel event on the canvas at the given screen point.\n *\n * R3F translates the `wheel` DOM event into `onWheel` on the hit object.\n */\nexport function dispatchWheel(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n options: WheelOptions = {},\n): void {\n const { deltaY = 100, deltaX = 0, deltaMode = 0 } = options;\n const coords = toClientCoords(canvas, point);\n\n canvas.dispatchEvent(\n new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n ...coords,\n deltaX,\n deltaY,\n deltaZ: 0,\n deltaMode,\n }),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pointer miss (click on empty space)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a click on the canvas at a point where no meshes are present.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler when\n * a click lands on empty space. This dispatches a click at a configurable\n * point (default: top-left corner, which is very unlikely to hit a mesh).\n *\n * @param canvas The canvas element\n * @param point Optional specific screen point. Default: { x: 1, y: 1 }\n */\nexport function dispatchPointerMiss(\n canvas: HTMLCanvasElement,\n point: ScreenPoint = { x: 1, y: 1 },\n): void {\n dispatchClick(canvas, point);\n}\n\n// ---------------------------------------------------------------------------\n// Unhover (pointer leave)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch an unhover sequence — moves the pointer off-canvas.\n * Useful for cleaning up hover state between interactions.\n */\nexport function dispatchUnhover(canvas: HTMLCanvasElement): void {\n const pointerId = allocPointerId();\n const offScreen: ScreenPoint = { x: -9999, y: -9999 };\n const init = makePointerInit(canvas, offScreen, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerout', init));\n canvas.dispatchEvent(new PointerEvent('pointerleave', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Guard against `releasePointerCapture` throwing when no pointer capture\n * is active. Libraries like @react-three/drei register global pointerup\n * handlers that call `releasePointerCapture`, which throws a `NotFoundError`\n * when the pointer was never captured (as with our synthetic events).\n *\n * This wrapper patches `Element.prototype.releasePointerCapture` for the\n * duration of `fn()` so that the `NotFoundError` is silently swallowed.\n */\nfunction withSafePointerCapture<T>(fn: () => T): T {\n const original = Element.prototype.releasePointerCapture;\n Element.prototype.releasePointerCapture = function safeRelease(\n this: Element,\n pointerId: number,\n ) {\n try {\n original.call(this, pointerId);\n } catch {\n // Swallow NotFoundError — no active pointer with the given id\n }\n };\n try {\n return fn();\n } finally {\n Element.prototype.releasePointerCapture = original;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * @module raycastVerify\n *\n * Post-dispatch raycast verification for interaction modules. After a synthetic\n * event is dispatched at projected screen coordinates, casts a ray to confirm\n * the intended object is actually the frontmost hit. Reports occlusion with\n * the identity of the occluding object for clear error messages.\n */\nimport {\n Raycaster,\n Vector2,\n Object3D,\n Camera,\n Scene,\n} from 'three';\nimport type { ScreenPoint, CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Raycast hit verification\n//\n// After dispatching a synthetic event at projected screen coordinates,\n// cast a ray to verify the intended object is actually the first hit.\n// This catches occlusion and provides clear error messages.\n// ---------------------------------------------------------------------------\n\nconst _raycaster = /* @__PURE__ */ new Raycaster();\nconst _ndc = /* @__PURE__ */ new Vector2();\n\n/** Result of a raycast verification. */\nexport interface RaycastResult {\n /** Whether the intended object was hit. */\n hit: boolean;\n /** If not hit, the object that was hit instead (occluder). */\n occluder?: Object3D;\n /** Name or testId of the occluder, for error messages. */\n occluderLabel?: string;\n}\n\n/**\n * Convert a screen-space point to NDC coordinates for raycasting.\n */\nfunction screenToNdc(point: ScreenPoint, size: CanvasSize): Vector2 {\n _ndc.set(\n (point.x / size.width) * 2 - 1,\n -(point.y / size.height) * 2 + 1,\n );\n return _ndc;\n}\n\n/**\n * Get a human-readable label for an Object3D (for error messages).\n */\nfunction getObjectLabel(obj: Object3D): string {\n const testId = obj.userData?.testId;\n if (testId) return `testId=\"${testId}\"`;\n if (obj.name) return `name=\"${obj.name}\"`;\n return `uuid=\"${obj.uuid.slice(0, 8)}…\"`;\n}\n\n/**\n * Walk up the parent chain to check if `candidate` is the target or\n * a descendant of the target. This is needed because raycaster returns\n * the specific sub-mesh (e.g. a merged geometry child) rather than\n * the logical parent group.\n */\nfunction isTargetOrDescendant(candidate: Object3D, target: Object3D): boolean {\n let current: Object3D | null = candidate;\n while (current) {\n if (current === target) return true;\n current = current.parent;\n }\n return false;\n}\n\n/**\n * Find the scene root by walking up the parent chain.\n */\nfunction findScene(obj: Object3D): Scene | null {\n let current: Object3D | null = obj;\n while (current) {\n if ((current as Scene).isScene) return current as Scene;\n current = current.parent;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Verify that a raycast from the given screen point hits the intended object.\n *\n * Returns a RaycastResult indicating success or failure with details about\n * what was hit instead (for useful error messages).\n *\n * @param point Screen-space coordinates (CSS pixels relative to canvas)\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHit(\n point: ScreenPoint,\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n const scene = findScene(target);\n if (!scene) {\n return { hit: false, occluderLabel: 'object not in scene' };\n }\n\n const ndc = screenToNdc(point, size);\n _raycaster.setFromCamera(ndc, camera);\n\n // Raycast against the entire scene\n const intersections = _raycaster.intersectObjects(scene.children, true);\n\n if (intersections.length === 0) {\n // No hits at all — object might be transparent, or a light/helper\n // For non-mesh objects (lights, cameras), this is expected\n return { hit: true };\n }\n\n // Check if the first hit is our target (or a child of our target)\n const firstHit = intersections[0].object;\n if (isTargetOrDescendant(firstHit, target)) {\n return { hit: true };\n }\n\n // Check if our target appears anywhere in the intersections\n // (it might be behind something but still hit)\n const targetHit = intersections.find((i) =>\n isTargetOrDescendant(i.object, target),\n );\n\n if (targetHit) {\n // Target was hit but is behind another object\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n }\n\n // Target was not hit at all at this point\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n}\n\n/**\n * Verify a hit, trying multiple sample points if the first fails.\n * This is more robust than single-point verification for objects\n * that are partially occluded.\n *\n * @param points Array of screen-space points to try\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHitMultiPoint(\n points: ScreenPoint[],\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n let lastResult: RaycastResult = { hit: false };\n\n for (const point of points) {\n const result = verifyRaycastHit(point, target, camera, size);\n if (result.hit) return result;\n lastResult = result;\n }\n\n return lastResult;\n}\n","/**\n * @module resolve\n *\n * Shared resolution helpers for all interaction modules. Caches references\n * to the current ObjectStore, Camera, WebGLRenderer, and canvas size (set\n * by ThreeDom each frame) so interaction functions can resolve objects and\n * access rendering state without prop-drilling.\n */\nimport type { Object3D, Camera, WebGLRenderer } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Shared resolution helpers for interaction modules\n// ---------------------------------------------------------------------------\n\n/** Cached references to the current R3F state (set by ThreeDom). */\nlet _store: ObjectStore | null = null;\nlet _camera: Camera | null = null;\nlet _gl: WebGLRenderer | null = null;\nlet _size: CanvasSize | null = null;\n\n/**\n * Set the current R3F state references. Called by ThreeDom during setup\n * and on every frame to keep camera/size current.\n */\nexport function setInteractionState(\n store: ObjectStore,\n camera: Camera,\n gl: WebGLRenderer,\n size: CanvasSize,\n): void {\n _store = store;\n _camera = camera;\n _gl = gl;\n _size = size;\n}\n\n/** Clear all interaction state (called on cleanup). */\nexport function clearInteractionState(): void {\n _store = null;\n _camera = null;\n _gl = null;\n _size = null;\n}\n\n/** Get the current store, or throw if not initialized. */\nexport function getStore(): ObjectStore {\n if (!_store) {\n throw new Error(\n '[react-three-dom] Interaction state not initialized. Is <ThreeDom> mounted?',\n );\n }\n return _store;\n}\n\n/** Get the current camera, or throw. */\nexport function getCamera(): Camera {\n if (!_camera) {\n throw new Error(\n '[react-three-dom] Camera not available. Is <ThreeDom> mounted?',\n );\n }\n return _camera;\n}\n\n/** Get the current WebGL renderer, or throw. */\nexport function getRenderer(): WebGLRenderer {\n if (!_gl) {\n throw new Error(\n '[react-three-dom] Renderer not available. Is <ThreeDom> mounted?',\n );\n }\n return _gl;\n}\n\n/** Get the current canvas size, or throw. */\nexport function getCanvasSize(): CanvasSize {\n if (!_size) {\n throw new Error(\n '[react-three-dom] Canvas size not available. Is <ThreeDom> mounted?',\n );\n }\n return _size;\n}\n\n/**\n * Resolve a testId or uuid to a live Object3D reference.\n * Throws a descriptive error if the object is not found.\n */\nexport function resolveObject(idOrUuid: string): Object3D {\n const store = getStore();\n const obj = store.getObject3D(idOrUuid);\n if (!obj) {\n throw new Error(\n `[react-three-dom] Object \"${idOrUuid}\" not found. ` +\n `Check that the object has userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\".`,\n );\n }\n return obj;\n}\n","/**\n * @module click\n *\n * Deterministic click, double-click, and context-menu interactions on 3D objects.\n * Resolves an object by testId/uuid, projects it to screen space, dispatches\n * synthetic pointer events on the canvas, and optionally verifies the hit via\n * raycasting to detect occlusion.\n */\nimport { projectToScreen } from './projection';\nimport { dispatchClick, dispatchDoubleClick, dispatchContextMenu } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// click3D — deterministic click on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointerdown → pointerup → click on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for click3D. */\nexport interface Click3DOptions {\n /**\n * Whether to verify the click hit via raycast.\n * Set to false for non-mesh objects (lights, cameras, groups).\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a click3D operation. */\nexport interface Click3DResult {\n /** Whether the click was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the click was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically click a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic click event\n * on the canvas at the projected coordinates, and optionally verifies\n * the click hit the intended object via raycasting.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Click options\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // From the global API\n * window.__R3F_DOM__.click('chair-primary');\n *\n * // With verification disabled (for lights, cameras)\n * click3D('sun-light', { verify: false });\n * ```\n */\nexport function click3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('click', `click3D(\"${idOrUuid}\") — resolving projection`);\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] click3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch click on canvas\n const canvas = gl.domElement;\n dispatchClick(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] click3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead. ` +\n `The object may be occluded.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// doubleClick3D — deterministic double-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically double-click a 3D object by its testId or uuid.\n *\n * Dispatches the full double-click sequence:\n * pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * Triggers R3F's `onDoubleClick` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function doubleClick3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchDoubleClick(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// contextMenu3D — deterministic right-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically right-click a 3D object by its testId or uuid.\n *\n * Dispatches: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * Triggers R3F's `onContextMenu` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function contextMenu3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchContextMenu(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","/**\n * @module hover\n *\n * Deterministic hover and unhover interactions on 3D objects. Projects the\n * target object to screen space and dispatches synthetic pointermove/pointerover\n * events on the canvas, triggering R3F's onPointerOver/onPointerEnter handlers.\n */\nimport { projectToScreen } from './projection';\nimport { dispatchHover, dispatchUnhover } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// hover3D — deterministic hover on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointermove → pointerover → pointerenter on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for hover3D. */\nexport interface Hover3DOptions {\n /**\n * Whether to verify the hover hit via raycast.\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a hover3D operation. */\nexport interface Hover3DResult {\n /** Whether the hover was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the hover was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically hover over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic hover event\n * sequence on the canvas, and optionally verifies the hit.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Hover options\n * @returns Hover result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * window.__R3F_DOM__.hover('chair-primary');\n * ```\n */\nexport function hover3D(\n idOrUuid: string,\n options: Hover3DOptions = {},\n): Hover3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('hover', `hover3D(\"${idOrUuid}\") — resolving projection`);\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] hover3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch hover on canvas\n const canvas = gl.domElement;\n dispatchHover(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] hover3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Clear hover state by moving the pointer off-canvas.\n * Call between hover/click interactions to reset R3F's internal pointer state.\n */\nexport function unhover3D(): void {\n const gl = getRenderer();\n dispatchUnhover(gl.domElement);\n}\n","/**\n * @module drag\n *\n * Deterministic drag interactions on 3D objects. Supports world-space deltas\n * (move N units along an axis) and screen-space deltas (move N pixels).\n * Projects start/end points and dispatches a full pointerdown → pointermove × N\n * → pointerup sequence on the canvas.\n */\nimport { Vector3 } from 'three';\nimport { projectToScreen, screenDeltaToWorld } from './projection';\nimport { dispatchDrag, type DragOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// drag3D — deterministic drag on a 3D object\n//\n// Supports two modes:\n// 1. World-space delta: drag by { x, y, z } in world units\n// 2. Screen-space delta: drag by { dx, dy } in CSS pixels\n//\n// Both modes dispatch a pointerdown → N × pointermove → pointerup sequence.\n// ---------------------------------------------------------------------------\n\n/** World-space drag delta. */\nexport interface WorldDelta {\n x: number;\n y: number;\n z: number;\n}\n\n/** Screen-space drag delta (CSS pixels). */\nexport interface ScreenDelta {\n dx: number;\n dy: number;\n}\n\n/** Options for drag3D. */\nexport interface Drag3DOptions extends DragOptions {\n /**\n * If 'world', the delta is interpreted as world units.\n * If 'screen', the delta is interpreted as CSS pixels.\n * Default: 'world'\n */\n mode?: 'world' | 'screen';\n}\n\n/** Result of a drag3D operation. */\nexport interface Drag3DResult {\n /** Whether the drag was dispatched. */\n dispatched: true;\n /** Start screen point. */\n startPoint: { x: number; y: number };\n /** End screen point. */\n endPoint: { x: number; y: number };\n /** Which projection strategy was used for the start point. */\n strategy: string;\n}\n\n/**\n * Programmatically drag a 3D object by its testId or uuid.\n *\n * Projects the object to screen space for the start point, then computes\n * the end point based on the delta (world-space or screen-space), and\n * dispatches a full drag sequence on the canvas.\n *\n * @param idOrUuid The object's testId or uuid\n * @param delta Drag delta (world-space { x, y, z } or screen-space { dx, dy })\n * @param options Drag options (steps, delay, mode)\n * @returns Drag result with start/end points\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // World-space drag: move 2 units on X axis\n * window.__R3F_DOM__.drag('chair-primary', { x: 2, y: 0, z: 0 });\n *\n * // Screen-space drag: move 100px right, 50px down\n * drag3D('chair-primary', { dx: 100, dy: 50 }, { mode: 'screen' });\n * ```\n */\nexport async function drag3D(\n idOrUuid: string,\n delta: WorldDelta | ScreenDelta,\n options: Drag3DOptions = {},\n): Promise<Drag3DResult> {\n const { mode = 'world', ...dragOptions } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('drag', `drag3D(\"${idOrUuid}\") mode=${mode}`, delta);\n\n // 2. Project start point\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] drag3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n const startPoint = projection.point;\n let endPoint: { x: number; y: number };\n\n if (mode === 'screen' && 'dx' in delta) {\n // Screen-space mode: directly add pixel delta\n const screenDelta = delta as ScreenDelta;\n endPoint = {\n x: startPoint.x + screenDelta.dx,\n y: startPoint.y + screenDelta.dy,\n };\n } else {\n // World-space mode: convert world delta to screen delta\n const worldDelta = delta as WorldDelta;\n\n // Get the object's current world position\n const worldPos = new Vector3();\n obj.getWorldPosition(worldPos);\n\n // Compute the target world position\n const targetPos = worldPos.clone().add(new Vector3(worldDelta.x, worldDelta.y, worldDelta.z));\n\n // Project target position to screen space\n targetPos.project(camera);\n endPoint = {\n x: ((targetPos.x + 1) / 2) * size.width,\n y: ((-targetPos.y + 1) / 2) * size.height,\n };\n }\n\n // 3. Dispatch drag sequence\n const canvas = gl.domElement;\n await dispatchDrag(canvas, startPoint, endPoint, dragOptions);\n\n return {\n dispatched: true,\n startPoint,\n endPoint,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Compute what world-space displacement a screen-space drag would produce.\n * Useful for previewing drag effects before committing.\n */\nexport function previewDragWorldDelta(\n idOrUuid: string,\n screenDx: number,\n screenDy: number,\n): Vector3 {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const size = getCanvasSize();\n return screenDeltaToWorld(screenDx, screenDy, obj, camera, size);\n}\n","/**\n * @module wheel\n *\n * Deterministic wheel/scroll interaction on a 3D object. Projects the target\n * to screen space and dispatches a synthetic WheelEvent on the canvas,\n * triggering R3F's onWheel handler.\n */\nimport { projectToScreen } from './projection';\nimport { dispatchWheel, type WheelOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\n\n// ---------------------------------------------------------------------------\n// wheel3D — deterministic wheel/scroll on a 3D object\n//\n// Projects the object to screen space and dispatches a WheelEvent on the\n// canvas at the projected coordinates. Triggers R3F's onWheel handler.\n// ---------------------------------------------------------------------------\n\n/** Options for wheel3D. */\nexport interface Wheel3DOptions extends WheelOptions {}\n\n/** Result of a wheel3D operation. */\nexport interface Wheel3DResult {\n /** Whether the wheel event was dispatched. */\n dispatched: true;\n /** The screen point where the wheel was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically scroll the wheel over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space and dispatches a synthetic WheelEvent\n * on the canvas. Triggers R3F's `onWheel` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Wheel options (deltaY, deltaX, deltaMode)\n * @returns Wheel result with screen point info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // Scroll down 200 units over the chair\n * wheel3D('chair-primary', { deltaY: 200 });\n *\n * // Scroll up\n * wheel3D('chair-primary', { deltaY: -100 });\n * ```\n */\nexport function wheel3D(\n idOrUuid: string,\n options: Wheel3DOptions = {},\n): Wheel3DResult {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] wheel3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchWheel(canvas, projection.point, options);\n\n return {\n dispatched: true,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","/**\n * @module pointerMiss\n *\n * Simulates a click on empty canvas space to trigger R3F's onPointerMissed\n * handler on all objects. Commonly used for deselection workflows in\n * editor-type applications.\n */\nimport { dispatchPointerMiss } from './dispatch';\nimport { getRenderer } from './resolve';\nimport type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// pointerMiss3D — click on empty canvas space\n//\n// Dispatches a click at a point unlikely to hit any mesh, causing R3F\n// to fire onPointerMissed on all objects that have that handler.\n// Commonly used for deselection in editor-type applications.\n// ---------------------------------------------------------------------------\n\n/** Options for pointerMiss3D. */\nexport interface PointerMiss3DOptions {\n /**\n * Specific screen point to click. If not provided, clicks at (1, 1)\n * which is the top-left corner — very unlikely to hit any mesh.\n */\n point?: ScreenPoint;\n}\n\n/**\n * Dispatch a click on empty canvas space, triggering `onPointerMissed`.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler\n * when a click doesn't hit any mesh. This is commonly used for\n * deselection workflows.\n *\n * @param options Optional point to click at\n *\n * @example\n * ```typescript\n * // Click empty space to deselect\n * pointerMiss3D();\n *\n * // Click at a specific empty spot\n * pointerMiss3D({ point: { x: 10, y: 10 } });\n * ```\n */\nexport function pointerMiss3D(options: PointerMiss3DOptions = {}): void {\n const gl = getRenderer();\n const canvas = gl.domElement;\n dispatchPointerMiss(canvas, options.point);\n}\n","/**\n * @module drawPath\n *\n * Simulates freeform drawing strokes on the canvas by dispatching a full\n * pointer sequence (pointerdown → pointermove × N → pointerup) through an\n * array of screen-space points. Includes path generators for lines, bezier\n * curves, rectangles, and circles. Designed for canvas drawing/annotation\n * apps built on R3F.\n */\nimport { r3fLog } from '../debug';\nimport { getRenderer } from './resolve';\n\n// ---------------------------------------------------------------------------\n// drawPath — simulate a freeform drawing stroke on the canvas\n//\n// Dispatches a full pointer sequence:\n// pointerdown (at first point) → N × pointermove → pointerup (at last point)\n//\n// Designed for canvas drawing apps that listen to pointer events on the\n// R3F canvas to create lines, paths, or annotations.\n// ---------------------------------------------------------------------------\n\n/** A 2D screen-space point in CSS pixels, relative to the canvas top-left. */\nexport interface DrawPoint {\n /** X coordinate in CSS pixels from canvas left edge. */\n x: number;\n /** Y coordinate in CSS pixels from canvas top edge. */\n y: number;\n /** Optional pressure (0–1). Default: 0.5 */\n pressure?: number;\n}\n\n/** Options for drawPath. */\nexport interface DrawPathOptions {\n /**\n * Delay in milliseconds between successive pointermove events.\n * Useful for apps that sample pointer events per-frame.\n * Default: 0 (dispatch all moves synchronously, which is fastest)\n */\n stepDelayMs?: number;\n\n /**\n * Pointer type. Some drawing apps differentiate between mouse and pen.\n * Default: 'mouse'\n */\n pointerType?: 'mouse' | 'pen' | 'touch';\n\n /**\n * If true, also dispatches a 'click' event at the end of the path.\n * Useful if the app interprets short strokes as clicks.\n * Default: false\n */\n clickAtEnd?: boolean;\n\n /**\n * If provided, draws on a specific canvas element.\n * Default: the R3F canvas (from the current renderer).\n */\n canvas?: HTMLCanvasElement;\n}\n\n/** Result of a drawPath operation. */\nexport interface DrawPathResult {\n /** Total number of pointer events dispatched. */\n eventCount: number;\n /** The number of points in the path. */\n pointCount: number;\n /** First point of the path. */\n startPoint: DrawPoint;\n /** Last point of the path. */\n endPoint: DrawPoint;\n}\n\n/** Monotonically increasing pointer ID for synthetic events. */\nlet _nextDrawPointerId = 5000;\n\n/**\n * Build a PointerEvent init object for drawing.\n */\nfunction makeDrawPointerInit(\n canvas: HTMLCanvasElement,\n point: DrawPoint,\n pointerId: number,\n pointerType: string,\n overrides?: Partial<PointerEventInit>,\n): PointerEventInit {\n const rect = canvas.getBoundingClientRect();\n const clientX = rect.left + point.x;\n const clientY = rect.top + point.y;\n\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX,\n clientY,\n screenX: clientX,\n screenY: clientY,\n pointerId,\n pointerType,\n isPrimary: true,\n button: 0,\n buttons: 1,\n width: 1,\n height: 1,\n pressure: point.pressure ?? 0.5,\n ...overrides,\n };\n}\n\n/**\n * Simulate a freeform drawing stroke on the canvas.\n *\n * Dispatches a full pointer sequence through the provided path of points:\n * `pointerdown` at the first point, `pointermove` at each subsequent point,\n * and `pointerup` at the last point.\n *\n * This is designed for canvas drawing applications (e.g. whiteboard, annotation\n * tools, CAD sketch mode) that respond to pointer events to create geometry.\n *\n * @param points Array of screen-space points (min 2 required)\n * @param options Drawing options\n * @returns Result with event counts and start/end points\n * @throws If fewer than 2 points are provided\n *\n * @example\n * ```typescript\n * // Draw a simple line from (100, 100) to (300, 200)\n * await drawPath([\n * { x: 100, y: 100 },\n * { x: 200, y: 150 },\n * { x: 300, y: 200 },\n * ]);\n *\n * // Draw with pen pressure simulation\n * await drawPath([\n * { x: 50, y: 50, pressure: 0.2 },\n * { x: 100, y: 80, pressure: 0.6 },\n * { x: 150, y: 70, pressure: 0.9 },\n * { x: 200, y: 60, pressure: 0.4 },\n * ], { pointerType: 'pen', stepDelayMs: 16 });\n * ```\n */\nexport async function drawPath(\n points: DrawPoint[],\n options: DrawPathOptions = {},\n): Promise<DrawPathResult> {\n if (points.length < 2) {\n throw new Error(\n `[react-three-dom] drawPath requires at least 2 points, got ${points.length}.`,\n );\n }\n\n const {\n stepDelayMs = 0,\n pointerType = 'mouse',\n clickAtEnd = false,\n canvas: explicitCanvas,\n } = options;\n\n // Resolve the canvas\n const canvas = explicitCanvas ?? getRenderer().domElement;\n const pointerId = _nextDrawPointerId++;\n let eventCount = 0;\n\n r3fLog('draw', `drawPath — ${points.length} points, delay=${stepDelayMs}ms, pointerType=${pointerType}`);\n\n // 1. Pointer down at first point\n const first = points[0];\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makeDrawPointerInit(canvas, first, pointerId, pointerType)),\n );\n eventCount++;\n\n // 2. Pointer moves through all intermediate points (including last)\n for (let i = 1; i < points.length; i++) {\n if (stepDelayMs > 0) {\n await sleep(stepDelayMs);\n }\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointermove',\n makeDrawPointerInit(canvas, points[i], pointerId, pointerType),\n ),\n );\n eventCount++;\n }\n\n // 3. Pointer up at last point\n const last = points[points.length - 1];\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makeDrawPointerInit(canvas, last, pointerId, pointerType, {\n buttons: 0,\n pressure: 0,\n }),\n ),\n );\n eventCount++;\n\n // 4. Optional click at end\n if (clickAtEnd) {\n const rect = canvas.getBoundingClientRect();\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n clientX: rect.left + last.x,\n clientY: rect.top + last.y,\n button: 0,\n }),\n );\n eventCount++;\n }\n\n r3fLog('draw', `drawPath complete — ${eventCount} events dispatched`);\n\n return {\n eventCount,\n pointCount: points.length,\n startPoint: first,\n endPoint: last,\n };\n}\n\n/**\n * Generate an array of DrawPoints along a straight line.\n * Useful for creating uniform stroke paths programmatically.\n *\n * @param start Start point (screen-space CSS pixels)\n * @param end End point (screen-space CSS pixels)\n * @param steps Number of intermediate points (excluding start/end). Default: 10\n * @param pressure Uniform pressure for all points. Default: 0.5\n * @returns Array of DrawPoints including start and end\n *\n * @example\n * ```typescript\n * const points = linePath({ x: 0, y: 0 }, { x: 200, y: 200 }, 20);\n * await drawPath(points);\n * ```\n */\nexport function linePath(\n start: { x: number; y: number },\n end: { x: number; y: number },\n steps = 10,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n const totalSteps = steps + 1; // +1 because we include start and end\n\n for (let i = 0; i <= totalSteps; i++) {\n const t = i / totalSteps;\n points.push({\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n pressure,\n });\n }\n\n return points;\n}\n\n/**\n * Generate an array of DrawPoints along a quadratic bezier curve.\n * Great for simulating smooth freehand drawing strokes.\n *\n * @param start Start point\n * @param control Control point (determines curve shape)\n * @param end End point\n * @param steps Number of steps. Default: 20\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints along the curve\n *\n * @example\n * ```typescript\n * const points = curvePath(\n * { x: 50, y: 200 }, // start\n * { x: 150, y: 50 }, // control (peak of the curve)\n * { x: 250, y: 200 }, // end\n * 30,\n * );\n * await drawPath(points);\n * ```\n */\nexport function curvePath(\n start: { x: number; y: number },\n control: { x: number; y: number },\n end: { x: number; y: number },\n steps = 20,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const invT = 1 - t;\n // Quadratic bezier: B(t) = (1-t)²·P0 + 2·(1-t)·t·P1 + t²·P2\n points.push({\n x: invT * invT * start.x + 2 * invT * t * control.x + t * t * end.x,\n y: invT * invT * start.y + 2 * invT * t * control.y + t * t * end.y,\n pressure,\n });\n }\n\n return points;\n}\n\n/**\n * Generate an array of DrawPoints forming a rectangle.\n * Useful for drawing rectangular selections or bounding boxes.\n *\n * @param topLeft Top-left corner\n * @param bottomRight Bottom-right corner\n * @param pointsPerSide Number of points per side. Default: 5\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints tracing the rectangle\n */\nexport function rectPath(\n topLeft: { x: number; y: number },\n bottomRight: { x: number; y: number },\n pointsPerSide = 5,\n pressure = 0.5,\n): DrawPoint[] {\n const topRight = { x: bottomRight.x, y: topLeft.y };\n const bottomLeft = { x: topLeft.x, y: bottomRight.y };\n\n const sides = [\n [topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft],\n ] as const;\n\n const points: DrawPoint[] = [];\n\n for (const [from, to] of sides) {\n for (let i = 0; i < pointsPerSide; i++) {\n const t = i / pointsPerSide;\n points.push({\n x: from.x + (to.x - from.x) * t,\n y: from.y + (to.y - from.y) * t,\n pressure,\n });\n }\n }\n\n // Close the path by returning to start\n points.push({ x: topLeft.x, y: topLeft.y, pressure });\n\n return points;\n}\n\n/**\n * Generate an array of DrawPoints forming a circle/ellipse.\n *\n * @param center Center of the circle (screen-space)\n * @param radiusX Horizontal radius in CSS pixels\n * @param radiusY Vertical radius in CSS pixels. Default: same as radiusX (circle)\n * @param steps Number of points. Default: 36 (10° increments)\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints forming the circle\n */\nexport function circlePath(\n center: { x: number; y: number },\n radiusX: number,\n radiusY?: number,\n steps = 36,\n pressure = 0.5,\n): DrawPoint[] {\n const ry = radiusY ?? radiusX;\n const points: DrawPoint[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * Math.PI * 2;\n points.push({\n x: center.x + Math.cos(angle) * radiusX,\n y: center.y + Math.sin(angle) * ry,\n pressure,\n });\n }\n\n return points;\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * @module worldInteraction\n *\n * Position-centric interactions: click/hover/doubleClick at arbitrary world\n * coordinates. Projects the 3D point to screen space and dispatches synthetic\n * pointer events on the canvas. Complements the object-centric APIs\n * (click3D, hover3D, etc.) for use cases like BIM drawing tools, waypoint\n * placement, and spatial testing.\n */\nimport { Vector3 } from 'three';\nimport { dispatchClick, dispatchDoubleClick, dispatchContextMenu, dispatchHover } from './dispatch';\nimport { getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { ScreenPoint, CanvasSize } from './projection';\nimport { r3fLog } from '../debug';\nimport type { Camera } from 'three';\n\n// Reusable vector to avoid per-call allocation\nconst _v = new Vector3();\n\n/** A 3D world-space coordinate. */\nexport interface WorldPoint {\n x: number;\n y: number;\n z: number;\n}\n\n/** Options shared by all world-coordinate interactions. */\nexport interface WorldInteractionOptions {\n /** Modifier keys to include on the synthetic events. */\n shiftKey?: boolean;\n ctrlKey?: boolean;\n altKey?: boolean;\n metaKey?: boolean;\n}\n\n/** Result returned by world-coordinate interactions. */\nexport interface WorldInteractionResult {\n dispatched: boolean;\n screenPoint: ScreenPoint;\n behindCamera: boolean;\n}\n\n/**\n * Project a world point to canvas-relative screen coordinates.\n * Returns null if the point is behind the camera.\n */\nfunction projectWorld(\n point: WorldPoint,\n camera: Camera,\n size: CanvasSize,\n): ScreenPoint | null {\n _v.set(point.x, point.y, point.z).project(camera);\n\n // Behind camera\n if (_v.z > 1) return null;\n\n return {\n x: ((_v.x + 1) / 2) * size.width,\n y: ((-_v.y + 1) / 2) * size.height,\n };\n}\n\n/**\n * Click at an arbitrary world coordinate.\n *\n * Projects the point to screen space and dispatches a full click sequence\n * (pointerdown → pointerup → click) on the canvas. R3F's event system will\n * raycast from that screen position and fire onClick on whatever mesh is hit.\n *\n * @returns Result with the screen point used and whether the point was behind the camera.\n */\nexport function clickAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `clickAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `clickAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchClick(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Double-click at an arbitrary world coordinate.\n */\nexport function doubleClickAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `doubleClickAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `doubleClickAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchDoubleClick(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Right-click (context menu) at an arbitrary world coordinate.\n */\nexport function contextMenuAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `contextMenuAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `contextMenuAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchContextMenu(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Hover at an arbitrary world coordinate.\n *\n * Dispatches pointermove → pointerover → pointerenter at the projected\n * screen position. R3F will raycast and fire onPointerEnter/onPointerOver\n * on whatever mesh is at that position.\n */\nexport function hoverAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `hoverAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `hoverAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchHover(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Click a sequence of world coordinates with optional delay between each.\n * Useful for BIM drawing tools (polyline, measurement, etc.).\n *\n * @returns Array of results, one per point.\n */\nexport async function clickAtWorldSequence(\n points: WorldPoint[],\n options: { delayMs?: number } & WorldInteractionOptions = {},\n): Promise<WorldInteractionResult[]> {\n const { delayMs = 50, ...interactionOpts } = options;\n const results: WorldInteractionResult[] = [];\n\n for (let i = 0; i < points.length; i++) {\n results.push(clickAtWorld(points[i], interactionOpts));\n if (delayMs > 0 && i < points.length - 1) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n return results;\n}\n","/**\n * @module SelectionManager\n *\n * Lightweight selection state manager for 3D objects. Supports single and\n * multi-selection, notifies listeners on change so Highlighter and the\n * devtools inspector panel can react. Decoupled from rendering — purely\n * manages which Object3D references are \"selected\".\n */\nimport type { Object3D } from 'three';\n\n// ---------------------------------------------------------------------------\n// SelectionManager\n//\n// Manages the currently selected/highlighted object(s) in the scene.\n// Supports single selection (click to select) and multi-selection.\n// Notifies listeners when the selection changes so the Highlighter\n// can update visuals and the Inspector can update its UI.\n// ---------------------------------------------------------------------------\n\nexport type SelectionListener = (selected: Object3D[]) => void;\n\n/**\n * Tracks the set of currently selected Object3D instances and notifies\n * subscribers when the selection changes.\n */\nexport class SelectionManager {\n /** Currently selected objects (ordered by selection time). */\n private _selected: Object3D[] = [];\n\n /** Listeners notified on selection change. */\n private _listeners: SelectionListener[] = [];\n\n // -----------------------------------------------------------------------\n // Selection API\n // -----------------------------------------------------------------------\n\n /** Select a single object (clears previous selection). */\n select(obj: Object3D): void {\n if (this._selected.length === 1 && this._selected[0] === obj) return;\n this._selected = [obj];\n this._notify();\n }\n\n /** Add an object to the current selection (multi-select). */\n addToSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) return;\n this._selected.push(obj);\n this._notify();\n }\n\n /** Remove an object from the selection. */\n removeFromSelection(obj: Object3D): void {\n const idx = this._selected.indexOf(obj);\n if (idx === -1) return;\n this._selected.splice(idx, 1);\n this._notify();\n }\n\n /** Toggle an object in/out of the selection. */\n toggleSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) {\n this.removeFromSelection(obj);\n } else {\n this.addToSelection(obj);\n }\n }\n\n /** Clear all selections. */\n clearSelection(): void {\n if (this._selected.length === 0) return;\n this._selected = [];\n this._notify();\n }\n\n /** Get the currently selected objects. */\n getSelected(): readonly Object3D[] {\n return this._selected;\n }\n\n /** Get the primary (first) selected object, or null. */\n getPrimary(): Object3D | null {\n return this._selected[0] ?? null;\n }\n\n /** Check if an object is selected. */\n isSelected(obj: Object3D): boolean {\n return this._selected.includes(obj);\n }\n\n /** Number of selected objects. */\n get count(): number {\n return this._selected.length;\n }\n\n // -----------------------------------------------------------------------\n // Event system\n // -----------------------------------------------------------------------\n\n /** Subscribe to selection changes. Returns unsubscribe function. */\n subscribe(listener: SelectionListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _notify(): void {\n const snapshot = [...this._selected];\n for (const listener of this._listeners) {\n listener(snapshot);\n }\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n dispose(): void {\n this._selected = [];\n this._listeners = [];\n }\n}\n","/**\n * @module Highlighter\n *\n * Renders Chrome DevTools-style translucent fill overlays on hovered and\n * selected Three.js objects. Subscribes to SelectionManager for selection\n * state and polls `window.__r3fdom_hovered__` for DevTools element-picker\n * hover. Highlight meshes are marked `__r3fdom_internal` so they're excluded\n * from raycasting and the ObjectStore.\n */\nimport {\n Object3D,\n Scene,\n Vector3,\n Mesh,\n Line,\n Points,\n MeshBasicMaterial,\n LineBasicMaterial,\n EdgesGeometry,\n LineSegments,\n DoubleSide,\n BufferGeometry,\n Box3,\n BoxGeometry,\n} from 'three';\nimport type { Camera, WebGLRenderer } from 'three';\nimport type { SelectionManager } from './SelectionManager';\n\n// ---------------------------------------------------------------------------\n// Highlighter — Chrome DevTools-style 3D object highlighting\n//\n// Renders a translucent fill overlay matching Chrome's rgb(111,168,220) 66%.\n// No edge outlines — clean filled highlight only.\n// ---------------------------------------------------------------------------\n\n// Chrome DevTools highlight: rgb(111, 168, 220) ~66% opacity\nconst HOVER_FILL_COLOR = 0x6fa8dc;\nconst HOVER_FILL_OPACITY = 0.66;\n\nconst SELECTION_FILL_COLOR = 0x6fa8dc;\nconst SELECTION_FILL_OPACITY = 0.75;\nconst SELECTION_BBOX_COLOR = 0x6fa8dc;\nconst SELECTION_BBOX_OPACITY = 0.3;\n\nconst _box3 = /* @__PURE__ */ new Box3();\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction hasRenderableGeometry(obj: Object3D): boolean {\n return (\n (obj as Mesh).isMesh === true ||\n (obj as Line).isLine === true ||\n (obj as Points).isPoints === true\n );\n}\n\nfunction collectHighlightTargets(obj: Object3D): Object3D[] {\n if (hasRenderableGeometry(obj)) return [obj];\n\n const targets: Object3D[] = [];\n obj.traverse((child) => {\n if (child === obj) return;\n if (child.userData?.__r3fdom_internal) return;\n if (hasRenderableGeometry(child)) targets.push(child);\n });\n return targets;\n}\n\nfunction markInternal(obj: Object3D): void {\n obj.userData.__r3fdom_internal = true;\n obj.raycast = () => {};\n obj.traverse((child) => {\n child.userData.__r3fdom_internal = true;\n child.raycast = () => {};\n });\n}\n\n/**\n * Sync highlight group to match the source object's world transform.\n * Called from useFrame as a best-effort early sync.\n */\nfunction _syncGroupTransform(source: Object3D, highlightRoot: Object3D): void {\n source.updateWorldMatrix(true, false);\n source.matrixWorld.decompose(\n highlightRoot.position,\n highlightRoot.quaternion,\n highlightRoot.scale,\n );\n}\n\n/**\n * Override updateMatrixWorld on the highlight group so that whenever\n * Three.js traverses the scene graph (during renderer.render()),\n * the highlight group's matrixWorld is copied directly from the source.\n *\n * This runs during scene.updateMatrixWorld() — which happens AFTER all\n * useFrame callbacks — so the source's position/quaternion/scale are\n * guaranteed to reflect the current frame's animations.\n */\nfunction _attachRenderSync(source: Object3D, highlightRoot: Object3D): void {\n highlightRoot.matrixAutoUpdate = false;\n\n highlightRoot.updateMatrixWorld = (force?: boolean) => {\n source.updateWorldMatrix(true, false);\n highlightRoot.matrixWorld.copy(source.matrixWorld);\n for (const child of highlightRoot.children) {\n child.updateMatrixWorld(force);\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Highlight mesh factories\n// ---------------------------------------------------------------------------\n\ninterface HighlightGroup {\n root: Object3D;\n disposables: { dispose(): void }[];\n}\n\nfunction createHighlightMesh(\n source: Object3D,\n fillColor: number,\n fillOpacity: number,\n): HighlightGroup | null {\n const geom = (source as Mesh).geometry as BufferGeometry | undefined;\n if (!geom) return null;\n\n const group = new Object3D();\n const disposables: { dispose(): void }[] = [];\n\n const fillMat = new MeshBasicMaterial({\n color: fillColor,\n transparent: true,\n opacity: fillOpacity,\n depthTest: false,\n depthWrite: false,\n side: DoubleSide,\n });\n disposables.push(fillMat);\n\n const fillMesh = new Mesh(geom, fillMat);\n fillMesh.scale.setScalar(1.005);\n fillMesh.raycast = () => {};\n group.add(fillMesh);\n\n source.updateWorldMatrix(true, false);\n source.matrixWorld.decompose(group.position, group.quaternion, group.scale);\n\n markInternal(group);\n _attachRenderSync(source, group);\n\n return { root: group, disposables };\n}\n\nfunction createBoundingBoxHighlight(obj: Object3D): HighlightGroup | null {\n _box3.makeEmpty();\n\n const targets = collectHighlightTargets(obj);\n if (targets.length === 0) return null;\n\n for (const target of targets) {\n target.updateWorldMatrix(true, false);\n const geom = (target as Mesh).geometry as BufferGeometry | undefined;\n if (geom) {\n if (!geom.boundingBox) geom.computeBoundingBox();\n if (geom.boundingBox) {\n const childBox = geom.boundingBox.clone();\n childBox.applyMatrix4(target.matrixWorld);\n _box3.union(childBox);\n }\n }\n }\n\n if (_box3.isEmpty()) return null;\n\n const size = _box3.getSize(new Vector3());\n const center = _box3.getCenter(new Vector3());\n\n const disposables: { dispose(): void }[] = [];\n\n const boxGeom = new BoxGeometry(size.x, size.y, size.z);\n disposables.push(boxGeom);\n\n const fillMat = new MeshBasicMaterial({\n color: SELECTION_BBOX_COLOR,\n transparent: true,\n opacity: SELECTION_BBOX_OPACITY,\n depthTest: false,\n depthWrite: false,\n side: DoubleSide,\n });\n disposables.push(fillMat);\n const fillMesh = new Mesh(boxGeom, fillMat);\n fillMesh.raycast = () => {};\n\n const edgesGeom = new EdgesGeometry(boxGeom);\n disposables.push(edgesGeom);\n const edgeMat = new LineBasicMaterial({\n color: SELECTION_BBOX_COLOR,\n transparent: true,\n opacity: 0.5,\n depthTest: false,\n depthWrite: false,\n });\n disposables.push(edgeMat);\n const edgeMesh = new LineSegments(edgesGeom, edgeMat);\n edgeMesh.raycast = () => {};\n\n const group = new Object3D();\n group.add(fillMesh);\n group.add(edgeMesh);\n group.position.copy(center);\n group.renderOrder = 998;\n\n markInternal(group);\n\n group.matrixAutoUpdate = false;\n group.updateMatrixWorld = (force?: boolean) => {\n _box3.makeEmpty();\n for (const target of targets) {\n target.updateWorldMatrix(true, false);\n const g = (target as Mesh).geometry as BufferGeometry | undefined;\n if (g) {\n if (!g.boundingBox) g.computeBoundingBox();\n if (g.boundingBox) {\n const childBox = g.boundingBox.clone();\n childBox.applyMatrix4(target.matrixWorld);\n _box3.union(childBox);\n }\n }\n }\n if (!_box3.isEmpty()) {\n const s = _box3.getSize(new Vector3());\n const c = _box3.getCenter(new Vector3());\n group.position.copy(c);\n group.scale.set(\n s.x / size.x || 1,\n s.y / size.y || 1,\n s.z / size.z || 1,\n );\n }\n group.updateMatrix();\n group.matrixWorld.copy(group.matrix);\n for (const child of group.children) {\n child.updateMatrixWorld(force);\n }\n };\n\n return { root: group, disposables };\n}\n\n// ---------------------------------------------------------------------------\n// Highlighter class\n// ---------------------------------------------------------------------------\n\nexport interface HighlighterOptions {\n showTooltip?: boolean;\n}\n\ninterface HoverEntry {\n source: Object3D;\n group: HighlightGroup;\n}\n\ninterface SelectionEntry {\n source: Object3D;\n meshGroups: HighlightGroup[];\n bboxGroup: HighlightGroup | null;\n}\n\n/**\n * Manages hover and selection highlight overlays in the 3D scene.\n * Attaches to a Scene + SelectionManager and creates/disposes translucent\n * mesh clones that track the source object's world transform each frame.\n */\nexport class Highlighter {\n private _scene: Scene | null = null;\n private _unsubscribe: (() => void) | null = null;\n\n private _hoverEntries: HoverEntry[] = [];\n private _hoverTarget: Object3D | null = null;\n private _selectedEntries: Map<Object3D, SelectionEntry> = new Map();\n\n private _hoverPollId: ReturnType<typeof setInterval> | null = null;\n private _lastHoveredUuid: string | null = null;\n private _store: { getObject3D(uuid: string): Object3D | null } | null = null;\n\n constructor(_options: HighlighterOptions = {}) {}\n\n // -----------------------------------------------------------------------\n // Lifecycle\n // -----------------------------------------------------------------------\n\n /** Bind to a scene and selection manager, start hover polling. */\n attach(\n scene: Scene,\n selectionManager: SelectionManager,\n _camera: Camera,\n _renderer: WebGLRenderer,\n store: { getObject3D(uuid: string): Object3D | null },\n ): void {\n this.detach();\n this._scene = scene;\n this._store = store;\n\n this._unsubscribe = selectionManager.subscribe((selected) => {\n this._syncSelectionHighlights(selected);\n });\n\n this._syncSelectionHighlights([...selectionManager.getSelected()]);\n this._startHoverPolling();\n }\n\n /** Unbind from the scene, stop polling, and remove all highlights. */\n detach(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n this._stopHoverPolling();\n if (this._suppressTimer) {\n clearTimeout(this._suppressTimer);\n this._suppressTimer = null;\n }\n this._hoverPollSuppressed = false;\n this.clearHoverHighlight();\n this._clearAllSelectionHighlights();\n this._scene = null;\n this._store = null;\n }\n\n // -----------------------------------------------------------------------\n // Per-frame update\n // -----------------------------------------------------------------------\n\n /** Sync highlight group transforms to their source objects. Call each frame. */\n update(): void {\n for (const entry of this._hoverEntries) {\n _syncGroupTransform(entry.source, entry.group.root);\n }\n\n for (const selEntry of this._selectedEntries.values()) {\n for (const mg of selEntry.meshGroups) {\n const src = mg.root.userData.__r3fdom_source as Object3D | undefined;\n if (src) {\n _syncGroupTransform(src, mg.root);\n }\n }\n }\n\n }\n\n // -----------------------------------------------------------------------\n // Public API: hover highlight\n // -----------------------------------------------------------------------\n\n /** Show a hover highlight on the given object (replaces any previous hover). */\n showHoverHighlight(obj: Object3D): void {\n if (this._hoverPollSuppressed) return;\n if (obj === this._hoverTarget) return;\n this._clearHoverVisuals();\n if (!this._scene) return;\n\n this._hoverTarget = obj;\n const targets = collectHighlightTargets(obj);\n\n for (const target of targets) {\n const hg = createHighlightMesh(target, HOVER_FILL_COLOR, HOVER_FILL_OPACITY);\n if (hg) {\n hg.root.renderOrder = 997;\n this._scene.add(hg.root);\n this._hoverEntries.push({ source: target, group: hg });\n }\n }\n\n }\n\n /** Remove the current hover highlight. */\n clearHoverHighlight(): void {\n this._clearHoverVisuals();\n this._lastHoveredUuid = null;\n }\n\n private _clearHoverVisuals(): void {\n for (const entry of this._hoverEntries) {\n this._disposeHighlightGroup(entry.group);\n }\n this._hoverEntries = [];\n this._hoverTarget = null;\n }\n\n // -----------------------------------------------------------------------\n // Public API: queries\n // -----------------------------------------------------------------------\n\n /** Check if an object currently has a selection highlight. */\n isHighlighted(obj: Object3D): boolean {\n return this._selectedEntries.has(obj);\n }\n\n /** Remove all hover and selection highlights. */\n clearAll(): void {\n this.clearHoverHighlight();\n this._clearAllSelectionHighlights();\n }\n\n /** When true, the hover poll is paused and showHoverHighlight is blocked. */\n private _hoverPollSuppressed = false;\n private _suppressTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Stop the hover poll, clear all hover state, and restart after a delay.\n * This prevents the DevTools extension from re-applying highlights after\n * inspect mode is disabled (the extension polls `$0` every 200ms and\n * keeps writing `__r3fdom_hovered__`).\n */\n suppressHoverPoll(durationMs = 1500): void {\n this._hoverPollSuppressed = true;\n this._stopHoverPolling();\n this._clearHoverVisuals();\n this._lastHoveredUuid = null;\n window.__r3fdom_hovered__ = null;\n\n if (this._suppressTimer) clearTimeout(this._suppressTimer);\n this._suppressTimer = setTimeout(() => {\n this._hoverPollSuppressed = false;\n this._suppressTimer = null;\n // Null it one more time right before restarting\n window.__r3fdom_hovered__ = null;\n this._startHoverPolling();\n }, durationMs);\n }\n\n // -----------------------------------------------------------------------\n // Internal: selection highlights\n // -----------------------------------------------------------------------\n\n private _syncSelectionHighlights(selected: Object3D[]): void {\n if (!this._scene) return;\n\n const selectedSet = new Set(selected);\n\n for (const [obj] of this._selectedEntries) {\n if (!selectedSet.has(obj)) {\n this._removeSelectionHighlight(obj);\n }\n }\n\n for (const obj of selected) {\n if (!this._selectedEntries.has(obj)) {\n this._addSelectionHighlight(obj);\n }\n }\n }\n\n private _addSelectionHighlight(obj: Object3D): void {\n if (!this._scene) return;\n const targets = collectHighlightTargets(obj);\n const meshGroups: HighlightGroup[] = [];\n\n for (const target of targets) {\n const hg = createHighlightMesh(target, SELECTION_FILL_COLOR, SELECTION_FILL_OPACITY);\n if (hg) {\n hg.root.userData.__r3fdom_source = target;\n hg.root.renderOrder = 999;\n this._scene.add(hg.root);\n meshGroups.push(hg);\n }\n }\n\n // Skip the bounding box for Groups — individual mesh highlights are\n // sufficient and a filled bbox just obscures the scene.\n let bboxGroup: HighlightGroup | null = null;\n if (targets.length > 1 && obj.type !== 'Group') {\n bboxGroup = createBoundingBoxHighlight(obj);\n if (bboxGroup) {\n this._scene.add(bboxGroup.root);\n }\n }\n\n if (meshGroups.length > 0 || bboxGroup) {\n this._selectedEntries.set(obj, { source: obj, meshGroups, bboxGroup });\n }\n }\n\n private _removeSelectionHighlight(obj: Object3D): void {\n const entry = this._selectedEntries.get(obj);\n if (!entry) return;\n for (const mg of entry.meshGroups) {\n this._disposeHighlightGroup(mg);\n }\n if (entry.bboxGroup) {\n this._disposeHighlightGroup(entry.bboxGroup);\n }\n this._selectedEntries.delete(obj);\n }\n\n private _clearAllSelectionHighlights(): void {\n for (const entry of this._selectedEntries.values()) {\n for (const mg of entry.meshGroups) {\n this._disposeHighlightGroup(mg);\n }\n if (entry.bboxGroup) {\n this._disposeHighlightGroup(entry.bboxGroup);\n }\n }\n this._selectedEntries.clear();\n }\n\n // -----------------------------------------------------------------------\n // Internal: DevTools hover polling\n // -----------------------------------------------------------------------\n\n private _startHoverPolling(): void {\n this._hoverPollId = setInterval(() => {\n this._pollDevToolsHover();\n }, 100);\n }\n\n private _stopHoverPolling(): void {\n if (this._hoverPollId) {\n clearInterval(this._hoverPollId);\n this._hoverPollId = null;\n }\n }\n\n private _pollDevToolsHover(): void {\n if (!this._store) return;\n\n try {\n const hoveredEl = window.__r3fdom_hovered__;\n const uuid = hoveredEl?.getAttribute?.('data-uuid') ?? null;\n\n // After inspect mode is disabled, the DevTools extension keeps\n // re-setting __r3fdom_hovered__ via its 200ms poll. Suppress\n // all hover highlights during the suppression window.\n if (this._hoverPollSuppressed) {\n if (uuid) {\n window.__r3fdom_hovered__ = null;\n }\n if (this._hoverTarget) {\n this._clearHoverVisuals();\n }\n this._lastHoveredUuid = null;\n return;\n }\n\n if (uuid === this._lastHoveredUuid) return;\n this._lastHoveredUuid = uuid;\n\n if (!uuid) {\n this._clearHoverVisuals();\n return;\n }\n\n const obj = this._store.getObject3D(uuid);\n if (obj) {\n this.showHoverHighlight(obj);\n } else {\n this._clearHoverVisuals();\n }\n } catch {\n // Ignore errors\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal: cleanup\n // -----------------------------------------------------------------------\n\n private _disposeHighlightGroup(hg: HighlightGroup): void {\n hg.root.removeFromParent();\n for (const d of hg.disposables) {\n d.dispose();\n }\n }\n\n /** Detach and release all resources. */\n dispose(): void {\n this.detach();\n }\n}\n","/**\n * @module selectionDisplayTarget\n *\n * Heuristic for promoting a raw raycast hit (specific sub-mesh) to its\n * logical parent group for display/selection purposes. E.g. clicking a\n * table top mesh selects the whole table Group.\n */\nimport type { Object3D } from 'three';\nimport { getTagForType } from '../mirror/CustomElements';\n\n/**\n * When a mesh is the \"main\" geometry of its parent group (e.g. table top for a table group),\n * we show the group as highlighted so the whole table is selected. When the mesh is a\n * \"detail\" (e.g. a table leg), we show the mesh itself.\n * Heuristic: the first mesh child of a Group is treated as the main one → promote to group.\n */\nfunction isFirstMeshInGroup(obj: Object3D): boolean {\n const parent = obj.parent;\n if (!parent || parent.type !== 'Group') return false;\n const firstMesh = parent.children.find((c) => getTagForType(c.type) === 'three-mesh');\n return firstMesh === obj;\n}\n\n/**\n * Resolve the uuid to use for display/selection.\n * If the object is a mesh and is the first (main) mesh of its parent Group, returns the parent's uuid.\n * Otherwise returns the given uuid.\n */\nexport function resolveSelectionDisplayTarget(\n getObject3D: (id: string) => Object3D | null,\n uuid: string,\n): string | null {\n const obj = getObject3D(uuid);\n if (!obj) return null;\n if (getTagForType(obj.type) !== 'three-mesh') return uuid;\n if (isFirstMeshInGroup(obj) && obj.parent) return obj.parent.uuid;\n return uuid;\n}\n","/**\n * @module InspectController\n *\n * Chrome DevTools-style inspect mode for 3D scenes. When enabled, places a\n * transparent overlay on top of the WebGL canvas that intercepts all pointer\n * events (preventing R3F's event system and camera controls from consuming\n * them), raycasts to identify the object under the cursor, drives\n * hover/selection highlights, and sets a global reference so the DevTools\n * extension can reveal the corresponding mirror DOM node.\n * Zero overhead when disabled — no overlay, no listeners.\n */\nimport {\n Object3D,\n Camera,\n WebGLRenderer,\n} from 'three';\nimport type { SelectionManager } from './SelectionManager';\nimport type { Highlighter } from './Highlighter';\nimport type { RaycastAccelerator } from './RaycastAccelerator';\nimport type { DomMirror } from '../mirror/DomMirror';\nimport { resolveSelectionDisplayTarget } from './selectionDisplayTarget';\nimport { r3fLog } from '../debug';\n\nconst RAYCAST_THROTTLE_MS = 50;\nconst HOVER_REVEAL_DEBOUNCE_MS = 300;\n\n/**\n * Manages the inspect-mode lifecycle: creates/removes an overlay div,\n * throttles raycasts, and coordinates Highlighter + SelectionManager + DomMirror.\n */\nexport class InspectController {\n private _active = false;\n private _camera: Camera;\n private _renderer: WebGLRenderer;\n private _selectionManager: SelectionManager;\n private _highlighter: Highlighter;\n private _raycastAccelerator: RaycastAccelerator;\n private _mirror: DomMirror;\n private _store: { getObject3D(uuid: string): Object3D | null };\n\n private _lastRaycastTime = 0;\n private _hoveredObject: Object3D | null = null;\n private _hoverRevealTimer: ReturnType<typeof setTimeout> | null = null;\n\n private _overlay: HTMLDivElement | null = null;\n private _boundPointerMove: ((e: PointerEvent) => void) | null = null;\n private _boundPointerDown: ((e: PointerEvent) => void) | null = null;\n private _boundContextMenu: ((e: MouseEvent) => void) | null = null;\n\n constructor(opts: {\n camera: Camera;\n renderer: WebGLRenderer;\n selectionManager: SelectionManager;\n highlighter: Highlighter;\n raycastAccelerator: RaycastAccelerator;\n mirror: DomMirror;\n store: { getObject3D(uuid: string): Object3D | null };\n }) {\n this._camera = opts.camera;\n this._renderer = opts.renderer;\n this._selectionManager = opts.selectionManager;\n this._highlighter = opts.highlighter;\n this._raycastAccelerator = opts.raycastAccelerator;\n this._mirror = opts.mirror;\n this._store = opts.store;\n }\n\n get active(): boolean {\n return this._active;\n }\n\n /** Update the camera reference (e.g. after a camera switch). */\n updateCamera(camera: Camera): void {\n this._camera = camera;\n }\n\n // -----------------------------------------------------------------------\n // Enable / disable\n // -----------------------------------------------------------------------\n\n /** Activate inspect mode — creates overlay on top of canvas. */\n enable(): void {\n if (this._active) return;\n this._active = true;\n\n const canvas = this._renderer.domElement;\n const parent = canvas.parentElement;\n if (!parent) return;\n\n // Create a transparent overlay that sits on top of the canvas and\n // intercepts all pointer events, preventing R3F's event system and\n // camera controls (OrbitControls etc.) from consuming them.\n const overlay = document.createElement('div');\n overlay.dataset.r3fdomInspect = 'true';\n overlay.style.cssText = [\n 'position:absolute',\n 'inset:0',\n 'z-index:999999',\n 'cursor:crosshair',\n 'background:transparent',\n ].join(';');\n\n // Ensure parent is positioned so absolute overlay works\n const parentPos = getComputedStyle(parent).position;\n if (parentPos === 'static') {\n parent.style.position = 'relative';\n }\n\n this._boundPointerMove = this._onPointerMove.bind(this);\n this._boundPointerDown = this._onPointerDown.bind(this);\n this._boundContextMenu = (e: MouseEvent) => e.preventDefault();\n\n overlay.addEventListener('pointermove', this._boundPointerMove);\n overlay.addEventListener('pointerdown', this._boundPointerDown);\n overlay.addEventListener('contextmenu', this._boundContextMenu);\n\n parent.appendChild(overlay);\n this._overlay = overlay;\n\n r3fLog('inspect', 'Inspect mode enabled — hover to highlight, click to select');\n }\n\n /** Deactivate inspect mode — removes overlay and clears all inspect state. */\n disable(): void {\n if (!this._active) return;\n this._active = false;\n\n if (this._overlay) {\n if (this._boundPointerMove) this._overlay.removeEventListener('pointermove', this._boundPointerMove);\n if (this._boundPointerDown) this._overlay.removeEventListener('pointerdown', this._boundPointerDown);\n if (this._boundContextMenu) this._overlay.removeEventListener('contextmenu', this._boundContextMenu);\n this._overlay.remove();\n this._overlay = null;\n }\n\n this._boundPointerMove = null;\n this._boundPointerDown = null;\n this._boundContextMenu = null;\n\n this._hoveredObject = null;\n this._cancelHoverReveal();\n this._highlighter.clearAll();\n this._highlighter.suppressHoverPoll();\n this._selectionManager.clearSelection();\n\n window.__r3fdom_hovered__ = null;\n window.__r3fdom_selected_element__ = null;\n\n r3fLog('inspect', 'InspectController disabled — highlights and selection cleared');\n }\n\n /** Disable and release all resources. */\n dispose(): void {\n this.disable();\n }\n\n // -----------------------------------------------------------------------\n // Raycasting (delegated to RaycastAccelerator)\n // -----------------------------------------------------------------------\n\n private _raycastFromEvent(e: MouseEvent): Object3D | null {\n return this._raycastAccelerator.raycastAtMouse(\n e,\n this._camera,\n this._renderer.domElement,\n );\n }\n\n /**\n * Resolve a raw raycast hit to the logical selection target.\n * Walks up to find the best Group parent if applicable.\n */\n private _resolveTarget(hit: Object3D): Object3D | null {\n const displayUuid = resolveSelectionDisplayTarget(\n (id) => this._store.getObject3D(id),\n hit.uuid,\n );\n if (!displayUuid) return hit;\n return this._store.getObject3D(displayUuid) ?? hit;\n }\n\n // -----------------------------------------------------------------------\n // Event handlers\n // -----------------------------------------------------------------------\n\n private _onPointerMove(e: PointerEvent): void {\n e.stopPropagation();\n e.preventDefault();\n\n const now = performance.now();\n if (now - this._lastRaycastTime < RAYCAST_THROTTLE_MS) return;\n this._lastRaycastTime = now;\n\n const hit = this._raycastFromEvent(e);\n\n if (!hit) {\n if (this._hoveredObject) {\n this._hoveredObject = null;\n this._highlighter.clearHoverHighlight();\n this._cancelHoverReveal();\n }\n return;\n }\n\n if (hit === this._hoveredObject) return;\n\n this._hoveredObject = hit;\n this._highlighter.showHoverHighlight(hit);\n this._scheduleHoverReveal(hit);\n }\n\n /**\n * After hovering an object for HOVER_REVEAL_DEBOUNCE_MS, auto-reveal its\n * mirror element in the Elements tab.\n */\n private _scheduleHoverReveal(target: Object3D): void {\n this._cancelHoverReveal();\n this._hoverRevealTimer = setTimeout(() => {\n const mirrorEl = this._mirror.getOrMaterialize(target.uuid);\n if (mirrorEl) {\n window.__r3fdom_selected_element__ = mirrorEl;\n }\n }, HOVER_REVEAL_DEBOUNCE_MS);\n }\n\n private _cancelHoverReveal(): void {\n if (this._hoverRevealTimer) {\n clearTimeout(this._hoverRevealTimer);\n this._hoverRevealTimer = null;\n }\n }\n\n private _onPointerDown(e: PointerEvent): void {\n e.stopPropagation();\n e.preventDefault();\n\n const hit = this._raycastFromEvent(e);\n\n if (!hit) {\n this._selectionManager.clearSelection();\n return;\n }\n\n const target = this._resolveTarget(hit);\n if (!target) return;\n\n this._selectionManager.select(target);\n\n const mirrorEl = this._mirror.getOrMaterialize(target.uuid);\n if (mirrorEl) {\n window.__r3fdom_selected_element__ = mirrorEl;\n }\n\n r3fLog('inspect', 'Object selected via canvas click', {\n uuid: target.uuid.slice(0, 8),\n name: target.name || '(unnamed)',\n type: target.type,\n });\n }\n}\n","/**\n * @module RaycastAccelerator\n *\n * Two-layer acceleration structure for BIM-scale raycasting (100k+ objects).\n * Layer 1 maintains a pre-filtered flat list of raycastable meshes from the\n * ObjectStore (avoids recursive scene traversal). Layer 2 uses three-mesh-bvh\n * to build per-geometry BVH trees, turning per-mesh triangle intersection\n * from O(t) brute-force into O(log t). Combined: ~0.01–0.1ms at 200k objects.\n */\nimport {\n Raycaster,\n Vector2,\n Object3D,\n Camera,\n Mesh,\n Line,\n Points,\n BufferGeometry,\n Intersection,\n} from 'three';\nimport {\n computeBoundsTree,\n disposeBoundsTree,\n acceleratedRaycast,\n} from 'three-mesh-bvh';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// RaycastAccelerator\n//\n// Two-layer acceleration for BIM-scale raycasting (100k-200k objects):\n//\n// Layer 1 — Flat target list:\n// Maintains a pre-filtered array of only raycastable meshes from the\n// ObjectStore. Avoids the recursive scene graph traverse that makes\n// Three.js's default `intersectObjects(scene.children, true)` O(n).\n//\n// Layer 2 — Per-geometry BVH (three-mesh-bvh):\n// Patches Three.js so each BufferGeometry builds a Bounding Volume\n// Hierarchy on first raycast. For high-poly BIM meshes (50k-500k\n// triangles), this turns per-mesh triangle intersection from O(t)\n// brute-force into O(log t) tree traversal.\n//\n// Combined: ~0.01-0.1ms at 200k objects vs ~200ms without.\n// ---------------------------------------------------------------------------\n\nlet _bvhPatched = false;\n\nfunction ensureBVHPatched(): void {\n if (_bvhPatched) return;\n _bvhPatched = true;\n\n BufferGeometry.prototype.computeBoundsTree = computeBoundsTree;\n BufferGeometry.prototype.disposeBoundsTree = disposeBoundsTree;\n Mesh.prototype.raycast = acceleratedRaycast;\n\n r3fLog('raycast', 'three-mesh-bvh patched into Three.js');\n}\n\nconst _raycaster = /* @__PURE__ */ new Raycaster();\nconst _mouse = /* @__PURE__ */ new Vector2();\n\nfunction isRaycastable(obj: Object3D): boolean {\n if (obj.userData?.__r3fdom_internal) return false;\n if (!obj.visible) return false;\n const isMeshLike =\n (obj as Mesh).isMesh === true ||\n (obj as Line).isLine === true ||\n (obj as Points).isPoints === true;\n if (!isMeshLike) return false;\n // Skip objects with disposed geometry (position attribute array is null after dispose)\n const geom = (obj as Mesh).geometry;\n if (geom) {\n const posAttr = geom.getAttribute('position');\n if (posAttr && !posAttr.array) return false;\n }\n return true;\n}\n\n/**\n * Maintains an accelerated raycast target list and per-geometry BVH trees.\n * Rebuilds lazily when the ObjectStore emits changes, with a per-rebuild\n * BVH budget to avoid blocking the main thread on large model loads.\n */\nexport class RaycastAccelerator {\n private _store: ObjectStore;\n private _targets: Object3D[] = [];\n private _dirty = true;\n private _unsubscribe: (() => void) | null = null;\n private _bvhBuiltFor = new WeakSet<BufferGeometry>();\n\n constructor(store: ObjectStore) {\n this._store = store;\n ensureBVHPatched();\n\n this._unsubscribe = store.subscribe(() => {\n this._dirty = true;\n });\n }\n\n /** Force a target list rebuild on the next raycast. */\n markDirty(): void {\n this._dirty = true;\n }\n\n private _rebuild(): void {\n this._dirty = false;\n const flatList = this._store.getFlatList();\n const targets: Object3D[] = [];\n\n for (let i = 0; i < flatList.length; i++) {\n const obj = flatList[i];\n if (isRaycastable(obj)) {\n targets.push(obj);\n }\n }\n\n this._targets = targets;\n\n // Build BVHs incrementally — only for meshes not yet processed.\n // Spread across frames: cap at 50 BVH builds per rebuild to avoid\n // blocking the main thread when a large model first loads.\n let bvhBudget = 50;\n for (let i = 0; i < targets.length && bvhBudget > 0; i++) {\n const obj = targets[i];\n if ((obj as Mesh).isMesh) {\n const geom = (obj as Mesh).geometry;\n if (geom && !this._bvhBuiltFor.has(geom) && !geom.boundsTree) {\n this._ensureBVH(obj);\n bvhBudget--;\n }\n }\n }\n\n // If we hit the budget, stay dirty so remaining BVHs are built next call\n if (bvhBudget === 0) {\n this._dirty = true;\n }\n }\n\n /**\n * Build a BVH for a mesh's geometry if it doesn't have one yet.\n * Uses indirect mode to avoid modifying the index buffer.\n * Skips disposed geometries and does NOT mark failed builds so they\n * can be retried (e.g. after geometry is re-uploaded).\n */\n private _ensureBVH(obj: Object3D): void {\n if (!(obj as Mesh).isMesh) return;\n const geom = (obj as Mesh).geometry;\n if (!geom || this._bvhBuiltFor.has(geom)) return;\n\n // Skip disposed geometries — position attribute is null after dispose\n const posAttr = geom.getAttribute('position');\n if (!posAttr || !posAttr.array) return;\n\n if (geom.boundsTree) {\n this._bvhBuiltFor.add(geom);\n return;\n }\n\n try {\n geom.computeBoundsTree({ indirect: true });\n this._bvhBuiltFor.add(geom);\n } catch {\n r3fLog('raycast', `BVH build failed for geometry, will retry next rebuild`);\n }\n }\n\n /**\n * Raycast from mouse position against only raycastable meshes.\n * Returns the closest non-internal hit, or null.\n */\n raycastAtMouse(\n e: MouseEvent,\n camera: Camera,\n canvas: HTMLCanvasElement,\n ): Object3D | null {\n if (this._dirty) this._rebuild();\n\n const rect = canvas.getBoundingClientRect();\n _mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n _mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n\n _raycaster.setFromCamera(_mouse, camera);\n _raycaster.firstHitOnly = true;\n\n const intersections = _raycaster.intersectObjects(this._targets, false);\n\n _raycaster.firstHitOnly = false;\n\n for (const intersection of intersections) {\n if (intersection.object.userData?.__r3fdom_internal) continue;\n return intersection.object;\n }\n\n return null;\n }\n\n /**\n * Raycast from NDC coordinates. Used by raycastVerify.\n */\n raycastAtNdc(\n ndcX: number,\n ndcY: number,\n camera: Camera,\n ): Intersection[] {\n if (this._dirty) this._rebuild();\n\n _mouse.set(ndcX, ndcY);\n _raycaster.setFromCamera(_mouse, camera);\n\n return _raycaster.intersectObjects(this._targets, false);\n }\n\n /** Current number of raycastable targets. */\n get targetCount(): number {\n if (this._dirty) this._rebuild();\n return this._targets.length;\n }\n\n /** Unsubscribe from the store and release the target list. */\n dispose(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n this._targets = [];\n }\n}\n","import { useEffect, useRef } from 'react';\nimport { useThree, useFrame } from '@react-three/fiber';\nimport { Vector3 } from 'three';\nimport type { Object3D, Scene, Camera } from 'three';\nimport { ObjectStore } from '../store/ObjectStore';\nimport { DomMirror } from '../mirror/DomMirror';\nimport { ensureCustomElements } from '../mirror/CustomElements';\nimport { patchObject3D } from './patchObject3D';\nimport { createSnapshot } from '../snapshot/snapshot';\nimport { click3D, doubleClick3D, contextMenu3D } from '../interactions/click';\nimport { hover3D, unhover3D } from '../interactions/hover';\nimport { drag3D } from '../interactions/drag';\nimport { wheel3D } from '../interactions/wheel';\nimport { pointerMiss3D } from '../interactions/pointerMiss';\nimport { drawPath as drawPathFn } from '../interactions/drawPath';\nimport { clickAtWorld, doubleClickAtWorld, contextMenuAtWorld, hoverAtWorld, clickAtWorldSequence } from '../interactions/worldInteraction';\nimport { setInteractionState, clearInteractionState } from '../interactions/resolve';\nimport { SelectionManager } from '../highlight/SelectionManager';\nimport { Highlighter } from '../highlight/Highlighter';\nimport { InspectController } from '../highlight/InspectController';\nimport { RaycastAccelerator } from '../highlight/RaycastAccelerator';\nimport { resolveSelectionDisplayTarget } from '../highlight/selectionDisplayTarget';\nimport { version } from '../version';\nimport { r3fLog, enableDebug } from '../debug';\nimport type { R3FDOM, ObjectMetadata, CameraState } from '../types';\n\n// ---------------------------------------------------------------------------\n// ThreeDom Props\n// ---------------------------------------------------------------------------\n\nexport interface ThreeDomProps {\n /**\n * Unique identifier for this canvas instance. Required when using multiple\n * canvases. The bridge is registered in `window.__R3F_DOM_INSTANCES__[canvasId]`.\n * When omitted the bridge is only set on `window.__R3F_DOM__`.\n */\n canvasId?: string;\n /**\n * Mark this canvas as the primary / default instance.\n * `window.__R3F_DOM__` always points to the primary bridge.\n * When only one canvas is used (no canvasId), it is implicitly primary.\n * Default: true when canvasId is omitted, false otherwise.\n */\n primary?: boolean;\n /**\n * Registration mode:\n * - \"auto\" (default): traverses and registers all objects in the scene.\n * - \"manual\": nothing is auto-registered. Use `useR3FRegister` hook or\n * `__R3F_DOM__.r3fRegister()` to add objects explicitly.\n */\n mode?: 'auto' | 'manual';\n /**\n * Filter function for auto mode. Only objects that pass the filter are\n * registered. Ignored in manual mode.\n * Example: `filter={(obj) => !!obj.userData.testId}`\n */\n filter?: (obj: Object3D) => boolean;\n /** CSS selector or HTMLElement for the mirror DOM root. Default: \"#three-dom-root\" */\n root?: string | HTMLElement;\n /** Objects to process per amortized batch per frame. Default: 500 */\n batchSize?: number;\n /** Max time budget (ms) for sync work per frame. Default: 0.5 */\n syncBudgetMs?: number;\n /** Max materialized DOM nodes (LRU eviction). Default: 2000 */\n maxDomNodes?: number;\n /** Initial DOM tree materialization depth. Default: 3 */\n initialDepth?: number;\n /** Disable all sync. Default: true */\n enabled?: boolean;\n /** Enable debug logging to browser console. Default: false */\n debug?: boolean;\n /** Enable inspect mode on mount. Default: false */\n inspect?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Per-instance registries (keyed by canvasId, '' for default)\n// ---------------------------------------------------------------------------\n\nconst _stores = new Map<string, ObjectStore>();\nconst _mirrors = new Map<string, DomMirror>();\nconst _selectionManagers = new Map<string, SelectionManager>();\nconst _highlighters = new Map<string, Highlighter>();\nconst _inspectControllers = new Map<string, InspectController>();\nconst _filters = new Map<string, ((obj: Object3D) => boolean) | null>();\nconst _modes = new Map<string, 'auto' | 'manual'>();\n\n/** Check if an object passes the filter for a given instance. */\nexport function shouldRegister(instanceKey: string, obj: Object3D): boolean {\n const mode = _modes.get(instanceKey);\n if (mode === 'manual') return false;\n const filter = _filters.get(instanceKey);\n if (filter) return filter(obj);\n return true;\n}\n\n/**\n * Ensure every ancestor from the scene root down to `obj.parent` is registered\n * in the store and mirror. This builds the connected parent chain that\n * DomMirror needs to correctly nest DOM elements, even when those ancestors\n * don't pass the user-supplied filter.\n */\nexport function ensureAncestorChain(\n obj: Object3D,\n store: ObjectStore,\n mirror: DomMirror,\n): void {\n const chain: Object3D[] = [];\n let cursor = obj.parent;\n while (cursor) {\n if (store.has(cursor)) break; // already registered — chain is connected\n chain.push(cursor);\n cursor = cursor.parent;\n }\n // Register from root-most ancestor down so each parent exists before its child\n for (let i = chain.length - 1; i >= 0; i--) {\n const ancestor = chain[i];\n store.register(ancestor);\n mirror.onObjectAdded(ancestor);\n mirror.materialize(ancestor.uuid);\n }\n}\n\n/** Get the store for a canvas instance. Default: primary ('') instance. */\nexport function getStore(canvasId = ''): ObjectStore | null { return _stores.get(canvasId) ?? null; }\n/** Get the mirror for a canvas instance. Default: primary ('') instance. */\nexport function getMirror(canvasId = ''): DomMirror | null { return _mirrors.get(canvasId) ?? null; }\n/** Get the selection manager for a canvas instance. */\nexport function getSelectionManager(canvasId = ''): SelectionManager | null { return _selectionManagers.get(canvasId) ?? null; }\n/** Get the highlighter for a canvas instance. */\nexport function getHighlighter(canvasId = ''): Highlighter | null { return _highlighters.get(canvasId) ?? null; }\n/** Get the inspect controller for a canvas instance. */\nexport function getInspectController(canvasId = ''): InspectController | null { return _inspectControllers.get(canvasId) ?? null; }\n/** List all active canvas IDs. */\nexport function getCanvasIds(): string[] { return Array.from(_stores.keys()); }\n\n// ---------------------------------------------------------------------------\n// Global API exposure (window.__R3F_DOM__)\n// ---------------------------------------------------------------------------\n\nfunction exposeGlobalAPI(\n store: ObjectStore,\n gl: { domElement: HTMLCanvasElement; getContext(): unknown },\n cameraRef: { current: Camera },\n selMgr: SelectionManager | null,\n inspCtrl: InspectController | null,\n mirror: DomMirror | null,\n canvasId?: string,\n isPrimary = true,\n): void {\n const api: R3FDOM = {\n _ready: true,\n canvasId,\n getByTestId: (id: string) => store.getByTestId(id),\n getByUuid: (uuid: string) => store.getByUuid(uuid),\n getByName: (name: string) => store.getByName(name),\n getChildren: (idOrUuid: string) => store.getChildren(idOrUuid),\n getParent: (idOrUuid: string) => store.getParent(idOrUuid),\n getCount: () => store.getCount(),\n getByType: (type: string) => store.getByType(type),\n getByGeometryType: (type: string) => store.getByGeometryType(type),\n getByMaterialType: (type: string) => store.getByMaterialType(type),\n getByUserData: (key: string, value?: unknown) => store.getByUserData(key, value),\n getCountByType: (type: string) => store.getCountByType(type),\n getObjects: (ids: string[]) => {\n const map = store.getObjects(ids);\n const result: Record<string, ObjectMetadata | null> = {};\n for (const [id, meta] of map) {\n result[id] = meta;\n }\n return result;\n },\n snapshot: () => createSnapshot(store),\n inspect: (idOrUuid: string, options?: { includeGeometryData?: boolean }) => store.inspect(idOrUuid, options),\n click: (idOrUuid: string) => { click3D(idOrUuid); },\n doubleClick: (idOrUuid: string) => { doubleClick3D(idOrUuid); },\n contextMenu: (idOrUuid: string) => { contextMenu3D(idOrUuid); },\n hover: (idOrUuid: string) => { hover3D(idOrUuid); },\n unhover: () => { unhover3D(); },\n drag: async (idOrUuid: string, delta: { x: number; y: number; z: number }) => { await drag3D(idOrUuid, delta); },\n wheel: (idOrUuid: string, options?: { deltaY?: number; deltaX?: number }) => { wheel3D(idOrUuid, options); },\n pointerMiss: () => { pointerMiss3D(); },\n drawPath: async (points, options) => {\n const result = await drawPathFn(points, options);\n return { eventCount: result.eventCount, pointCount: result.pointCount };\n },\n clickAtWorld: (point, options) => clickAtWorld(point, options),\n doubleClickAtWorld: (point, options) => doubleClickAtWorld(point, options),\n contextMenuAtWorld: (point, options) => contextMenuAtWorld(point, options),\n hoverAtWorld: (point, options) => hoverAtWorld(point, options),\n clickAtWorldSequence: (points, options) => clickAtWorldSequence(points, options),\n select: (idOrUuid: string) => {\n const obj = store.getObject3D(idOrUuid);\n if (obj && selMgr) selMgr.select(obj);\n },\n clearSelection: () => { selMgr?.clearSelection(); },\n getSelection: () =>\n selMgr\n ? selMgr.getSelected().map((o: { uuid: string }) => o.uuid)\n : [],\n getObject3D: (idOrUuid: string) => store.getObject3D(idOrUuid),\n getSelectionDisplayTarget: (uuid: string) =>\n resolveSelectionDisplayTarget((id) => store.getObject3D(id), uuid) ?? uuid,\n setInspectMode: (on: boolean) => {\n r3fLog('inspect', 'Global API setInspectMode called', { on });\n const ctrl = inspCtrl ?? _inspectControllers.get(canvasId ?? '');\n if (on) {\n ctrl?.enable();\n mirror?.setInspectMode(true);\n } else {\n ctrl?.disable();\n mirror?.setInspectMode(false);\n }\n },\n getInspectMode: () => {\n const ctrl = inspCtrl ?? _inspectControllers.get(canvasId ?? '');\n return ctrl?.active ?? false;\n },\n sweepOrphans: () => store.sweepOrphans(),\n getDiagnostics: () => ({\n version,\n ready: true,\n objectCount: store.getCount(),\n meshCount: store.getCountByType('Mesh'),\n groupCount: store.getCountByType('Group'),\n lightCount: store.getCountByType('DirectionalLight') + store.getCountByType('PointLight') + store.getCountByType('SpotLight') + store.getCountByType('AmbientLight') + store.getCountByType('HemisphereLight'),\n cameraCount: store.getCountByType('PerspectiveCamera') + store.getCountByType('OrthographicCamera'),\n materializedDomNodes: mirror?.getMaterializedCount() ?? 0,\n maxDomNodes: mirror?.getMaxNodes() ?? 0,\n canvasWidth: gl.domElement.width,\n canvasHeight: gl.domElement.height,\n webglRenderer: (() => {\n try {\n const ctx = gl.getContext() as WebGLRenderingContext;\n const dbg = ctx.getExtension('WEBGL_debug_renderer_info');\n return dbg ? ctx.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : 'unknown';\n } catch { return 'unknown'; }\n })(),\n dirtyQueueSize: store.getDirtyCount(),\n }),\n getCameraState: (): CameraState => {\n const cam = cameraRef.current;\n const dir = new Vector3(0, 0, -1).applyQuaternion(cam.quaternion);\n const target: [number, number, number] = [\n cam.position.x + dir.x * 100,\n cam.position.y + dir.y * 100,\n cam.position.z + dir.z * 100,\n ];\n const state: CameraState = {\n type: cam.type,\n position: [cam.position.x, cam.position.y, cam.position.z],\n rotation: [cam.rotation.x, cam.rotation.y, cam.rotation.z],\n target,\n near: (cam as unknown as { near: number }).near,\n far: (cam as unknown as { far: number }).far,\n zoom: (cam as unknown as { zoom: number }).zoom,\n };\n if (cam.type === 'PerspectiveCamera') {\n const pc = cam as unknown as { fov: number; aspect: number };\n state.fov = pc.fov;\n state.aspect = pc.aspect;\n } else if (cam.type === 'OrthographicCamera') {\n const oc = cam as unknown as { left: number; right: number; top: number; bottom: number };\n state.left = oc.left;\n state.right = oc.right;\n state.top = oc.top;\n state.bottom = oc.bottom;\n }\n return state;\n },\n r3fRegister: (obj) => {\n if (store.has(obj)) return;\n if (!store.isInTrackedScene(obj)) {\n console.warn(\n `[react-three-dom] r3fRegister: object \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" is not in a tracked scene. ` +\n `Add it to the scene graph first.`,\n );\n return;\n }\n obj.userData.__r3fdom_manual = true;\n ensureAncestorChain(obj, store!, mirror!);\n let count = 0;\n obj.traverse((child) => {\n if (!store!.has(child)) {\n store!.register(child);\n mirror?.onObjectAdded(child);\n mirror?.materialize(child.uuid);\n count++;\n }\n });\n r3fLog('bridge', `r3fRegister: \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" (${obj.type}) — ${count} objects`);\n },\n r3fUnregister: (obj) => {\n if (!store.has(obj)) return;\n if (!obj.userData?.__r3fdom_manual) {\n r3fLog('bridge', `r3fUnregister skipped — \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" was auto-registered`);\n return;\n }\n delete obj.userData.__r3fdom_manual;\n mirror?.onObjectRemoved(obj);\n obj.traverse((child) => store.unregister(child));\n r3fLog('bridge', `r3fUnregister: \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" (${obj.type})`);\n },\n fuzzyFind: (query: string, limit = 5) => {\n const q = query.toLowerCase();\n const results: ObjectMetadata[] = [];\n for (const obj of store.getFlatList()) {\n if (results.length >= limit) break;\n const meta = store.getMetadata(obj);\n if (!meta) continue;\n const testId = meta.testId?.toLowerCase() ?? '';\n const name = meta.name?.toLowerCase() ?? '';\n if (testId.includes(q) || name.includes(q) || meta.uuid.startsWith(q)) {\n results.push(meta);\n }\n }\n return results;\n },\n version,\n };\n\n if (isPrimary) {\n window.__R3F_DOM__ = api;\n }\n if (canvasId) {\n if (!window.__R3F_DOM_INSTANCES__) window.__R3F_DOM_INSTANCES__ = {};\n if (window.__R3F_DOM_INSTANCES__[canvasId]) {\n console.warn(\n `[react-three-dom] Duplicate canvasId \"${canvasId}\" — the previous bridge instance will be overwritten. ` +\n `Each <ThreeDom> must have a unique canvasId.`,\n );\n }\n window.__R3F_DOM_INSTANCES__[canvasId] = api;\n }\n}\n\nfunction removeGlobalAPI(onlyIfEquals?: R3FDOM, canvasId?: string): void {\n r3fLog('bridge', 'removeGlobalAPI called (deferred)');\n\n const removeFromRegistry = (ref?: R3FDOM) => {\n if (canvasId && window.__R3F_DOM_INSTANCES__) {\n if (!ref || window.__R3F_DOM_INSTANCES__[canvasId] === ref) {\n delete window.__R3F_DOM_INSTANCES__[canvasId];\n if (Object.keys(window.__R3F_DOM_INSTANCES__).length === 0) {\n delete (window as Window & { __R3F_DOM_INSTANCES__?: Record<string, R3FDOM> }).__R3F_DOM_INSTANCES__;\n }\n }\n }\n };\n\n if (onlyIfEquals !== undefined) {\n const ref = onlyIfEquals;\n queueMicrotask(() => {\n if ((window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__ === ref) {\n delete (window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__;\n r3fLog('bridge', 'Global API removed');\n } else {\n r3fLog('bridge', 'Global API not removed — replaced by new instance (Strict Mode remount)');\n }\n removeFromRegistry(ref);\n });\n } else {\n delete (window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__;\n removeFromRegistry();\n r3fLog('bridge', 'Global API removed (immediate)');\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stub bridge for error / no-WebGL states\n// ---------------------------------------------------------------------------\n\nfunction createStubBridge(error?: string, canvasId?: string): R3FDOM {\n return {\n _ready: false,\n _error: error,\n canvasId,\n getByTestId: () => null,\n getByUuid: () => null,\n getByName: () => [],\n getChildren: () => [],\n getParent: () => null,\n getCount: () => 0,\n getByType: () => [],\n getByGeometryType: () => [],\n getByMaterialType: () => [],\n getByUserData: () => [],\n getCountByType: () => 0,\n getObjects: (ids: string[]) => {\n const result: Record<string, null> = {};\n for (const id of ids) result[id] = null;\n return result;\n },\n snapshot: () => ({\n timestamp: 0,\n objectCount: 0,\n tree: {\n uuid: '', name: '', type: 'Scene', visible: true,\n position: [0, 0, 0], rotation: [0, 0, 0], scale: [1, 1, 1], children: [],\n },\n }),\n inspect: () => null,\n click: () => {},\n doubleClick: () => {},\n contextMenu: () => {},\n hover: () => {},\n unhover: () => {},\n drag: async () => {},\n wheel: () => {},\n pointerMiss: () => {},\n drawPath: async () => ({ eventCount: 0, pointCount: 0 }),\n clickAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n doubleClickAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n contextMenuAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n hoverAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n clickAtWorldSequence: async () => [],\n select: () => {},\n clearSelection: () => {},\n getSelection: () => [],\n getObject3D: () => null,\n getSelectionDisplayTarget: (uuid: string) => uuid,\n setInspectMode: () => {},\n getInspectMode: () => false,\n r3fRegister: () => {},\n r3fUnregister: () => {},\n sweepOrphans: () => 0,\n getDiagnostics: () => ({\n version,\n ready: false,\n error: error ?? undefined,\n objectCount: 0,\n meshCount: 0,\n groupCount: 0,\n lightCount: 0,\n cameraCount: 0,\n materializedDomNodes: 0,\n maxDomNodes: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n webglRenderer: 'unavailable',\n dirtyQueueSize: 0,\n }),\n getCameraState: () => ({\n type: 'unknown',\n position: [0, 0, 0] as [number, number, number],\n rotation: [0, 0, 0] as [number, number, number],\n target: [0, 0, -100] as [number, number, number],\n near: 0.1,\n far: 1000,\n zoom: 1,\n }),\n fuzzyFind: () => [],\n version,\n };\n}\n\n// ---------------------------------------------------------------------------\n// ThreeDom Component\n// ---------------------------------------------------------------------------\n\nexport function ThreeDom({\n canvasId,\n primary,\n root = '#three-dom-root',\n mode = 'auto',\n filter,\n batchSize = 500,\n syncBudgetMs = 0.5,\n maxDomNodes = 2000,\n initialDepth = 3,\n enabled = true,\n debug = false,\n inspect: inspectProp = false,\n}: ThreeDomProps = {}) {\n const isPrimary = primary ?? (canvasId === undefined);\n const instanceKey = canvasId ?? '';\n const scene = useThree((s) => s.scene);\n const camera = useThree((s) => s.camera);\n const gl = useThree((s) => s.gl);\n const size = useThree((s) => s.size);\n const cursorRef = useRef(0);\n const lastSweepRef = useRef(0);\n const cameraRef = useRef(camera);\n cameraRef.current = camera;\n\n // -----------------------------------------------------------------------\n // Setup\n // -----------------------------------------------------------------------\n\n useEffect(() => {\n if (!enabled) return;\n\n if (debug) enableDebug(true);\n r3fLog('setup', 'ThreeDom effect started', { enabled, debug, root, maxDomNodes });\n\n const canvas = gl.domElement;\n canvas.setAttribute('data-r3f-canvas', canvasId ?? 'true');\n const canvasParent = canvas.parentElement!;\n\n // ---- Create / resolve root element ----\n let rootElement: HTMLElement | null = null;\n let createdRoot = false;\n\n if (typeof root === 'string') {\n rootElement = document.querySelector<HTMLElement>(root);\n } else {\n rootElement = root;\n }\n\n if (!rootElement) {\n rootElement = document.createElement('div');\n rootElement.id = typeof root === 'string' ? root.replace(/^#/, '') : 'three-dom-root';\n createdRoot = true;\n }\n\n canvasParent.style.position = canvasParent.style.position || 'relative';\n canvasParent.appendChild(rootElement);\n\n rootElement.style.cssText = 'width:0;height:0;overflow:hidden;pointer-events:none;opacity:0;';\n\n let store: ObjectStore | null = null;\n let mirror: DomMirror | null = null;\n let unpatch: (() => void) | null = null;\n let cancelAsyncReg: (() => void) | null = null;\n let selectionManager: SelectionManager | null = null;\n let highlighter: Highlighter | null = null;\n let raycastAccelerator: RaycastAccelerator | null = null;\n let inspectController: InspectController | null = null;\n let currentApi: R3FDOM | undefined;\n\n try {\n // ---- Check WebGL availability (headless / CI often has no WebGL) ----\n const webglContext = gl.getContext();\n if (!webglContext || (webglContext as WebGLRenderingContext).isContextLost?.()) {\n const msg =\n 'WebGL context not available. For headless Chromium, add --enable-webgl and optionally --use-gl=angle --use-angle=swiftshader-webgl to launch args.';\n const stubApi = createStubBridge(msg, canvasId);\n if (isPrimary) window.__R3F_DOM__ = stubApi;\n if (canvasId) {\n if (!window.__R3F_DOM_INSTANCES__) window.__R3F_DOM_INSTANCES__ = {};\n window.__R3F_DOM_INSTANCES__[canvasId] = stubApi;\n }\n r3fLog('setup', msg);\n return () => {\n removeGlobalAPI(stubApi, canvasId);\n canvas.removeAttribute('data-r3f-canvas');\n if (createdRoot && rootElement?.parentNode) {\n rootElement.parentNode.removeChild(rootElement);\n }\n if (debug) enableDebug(false);\n };\n }\n\n // ---- Create store and mirror ----\n store = new ObjectStore();\n mirror = new DomMirror(store, maxDomNodes);\n mirror.setRoot(rootElement);\n r3fLog('setup', 'Store and mirror created');\n\n ensureCustomElements(store);\n\n // Store mode/filter so patchObject3D can check them\n _modes.set(instanceKey, mode);\n _filters.set(instanceKey, filter ?? null);\n\n // Install patch BEFORE async registration so any objects added to the\n // scene while registration is in progress are caught by the patch.\n unpatch = patchObject3D(store, mirror, instanceKey);\n setInteractionState(store, camera, gl, size);\n r3fLog('setup', `Object3D patched (mode=${mode}), interaction state set`);\n\n if (mode === 'auto') {\n // Register the full tree synchronously first so that materializeSubtree\n // can resolve children. Then kick off async registration for any objects\n // added later (caught by the Object3D.add patch).\n if (filter) {\n store!.addTrackedRoot(scene);\n store!.register(scene);\n mirror!.onObjectAdded(scene);\n scene.traverse((obj) => {\n if (obj === scene) return;\n if (filter(obj)) {\n ensureAncestorChain(obj, store!, mirror!);\n store!.register(obj);\n mirror!.onObjectAdded(obj);\n }\n });\n } else {\n store.registerTree(scene);\n }\n\n // R3F's default camera lives outside the scene graph (managed by the\n // fiber store, not added as a scene child). Register it explicitly so\n // it appears as <three-camera> in the DOM and DevTools, nested under\n // the scene element.\n if (!store.has(camera)) {\n const camMeta = store.register(camera);\n camMeta.parentUuid = scene.uuid;\n mirror.materialize(camera.uuid);\n }\n\n mirror.materializeSubtree(scene.uuid, initialDepth);\n if (!filter) {\n cancelAsyncReg = store.registerTreeAsync(scene);\n }\n } else {\n // Manual mode: only register the scene root so the mirror has a container\n store.addTrackedRoot(scene);\n store.register(scene);\n mirror.onObjectAdded(scene);\n }\n r3fLog('setup', `Scene registered (mode=${mode}): ${store.getCount()} objects`);\n\n // ---- Selection, highlighting, and inspect controller ----\n selectionManager = new SelectionManager();\n highlighter = new Highlighter();\n highlighter.attach(scene as Scene, selectionManager, camera, gl, store);\n raycastAccelerator = new RaycastAccelerator(store);\n\n inspectController = new InspectController({\n camera,\n renderer: gl,\n selectionManager,\n highlighter,\n raycastAccelerator,\n mirror,\n store,\n });\n\n _selectionManagers.set(instanceKey, selectionManager);\n _highlighters.set(instanceKey, highlighter);\n _inspectControllers.set(instanceKey, inspectController);\n\n exposeGlobalAPI(store, gl, cameraRef, selectionManager, inspectController, mirror, canvasId, isPrimary);\n r3fLog('bridge', `exposeGlobalAPI called — bridge is live, _ready=true${canvasId ? `, canvasId=\"${canvasId}\"` : ''}`);\n currentApi = canvasId\n ? window.__R3F_DOM_INSTANCES__?.[canvasId]\n : window.__R3F_DOM__;\n _stores.set(instanceKey, store);\n _mirrors.set(instanceKey, mirror);\n\n if (inspectProp) {\n inspectController.enable();\n }\n\n if (debug) {\n const inspectStatus = inspectProp ? 'on' : 'off';\n // eslint-disable-next-line no-console\n console.log(\n '%c[react-three-dom]%c v' + version + ' — ' + store.getCount() + ' objects · inspect: ' + inspectStatus + '\\n' +\n ' %c→%c Toggle inspect: %c__R3F_DOM__.setInspectMode(true|false)%c\\n' +\n ' %c→%c Hover 3D objects to highlight + auto-reveal in Elements tab',\n 'background:#1a73e8;color:#fff;padding:2px 6px;border-radius:3px;font-weight:bold',\n 'color:inherit',\n 'color:#1a73e8', 'color:inherit',\n 'color:#e8a317;font-family:monospace', 'color:inherit',\n 'color:#1a73e8', 'color:inherit',\n );\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n r3fLog('setup', 'ThreeDom setup failed', err);\n console.error('[react-three-dom] Setup failed:', err);\n const stubApi = createStubBridge(errorMsg, canvasId);\n if (isPrimary) window.__R3F_DOM__ = stubApi;\n if (canvasId) {\n if (!window.__R3F_DOM_INSTANCES__) window.__R3F_DOM_INSTANCES__ = {};\n window.__R3F_DOM_INSTANCES__[canvasId] = stubApi;\n }\n currentApi = stubApi;\n }\n\n // ---- Cleanup ----\n return () => {\n r3fLog('setup', 'ThreeDom cleanup started');\n if (cancelAsyncReg) cancelAsyncReg();\n if (inspectController) inspectController.dispose();\n if (raycastAccelerator) raycastAccelerator.dispose();\n if (highlighter) highlighter.dispose();\n if (unpatch) unpatch();\n removeGlobalAPI(currentApi, canvasId);\n clearInteractionState();\n if (selectionManager) selectionManager.dispose();\n if (mirror) mirror.dispose();\n if (store) store.dispose();\n canvas.removeAttribute('data-r3f-canvas');\n if (createdRoot && rootElement?.parentNode) {\n rootElement.parentNode.removeChild(rootElement);\n }\n _stores.delete(instanceKey);\n _mirrors.delete(instanceKey);\n _selectionManagers.delete(instanceKey);\n _highlighters.delete(instanceKey);\n _inspectControllers.delete(instanceKey);\n _modes.delete(instanceKey);\n _filters.delete(instanceKey);\n if (debug) enableDebug(false);\n r3fLog('setup', 'ThreeDom cleanup complete');\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `size` is intentionally excluded:\n // it's synced every frame via setInteractionState in useFrame. Including it here\n // would tear down and rebuild the entire bridge on every resize, losing inspect\n // mode state, selection, and highlights.\n }, [scene, camera, gl, enabled, root, maxDomNodes, initialDepth, debug, inspectProp, canvasId, isPrimary, instanceKey]);\n\n // -----------------------------------------------------------------------\n // Per-frame sync\n // -----------------------------------------------------------------------\n\n useFrame(() => {\n const _store = _stores.get(instanceKey);\n const _mirror = _mirrors.get(instanceKey);\n const _highlighter = _highlighters.get(instanceKey);\n const _inspectController = _inspectControllers.get(instanceKey);\n\n if (!enabled || !_store || !_mirror) return;\n\n try {\n setInteractionState(_store, camera, gl, size);\n\n if (_inspectController) _inspectController.updateCamera(camera);\n\n const store = _store;\n const mirror = _mirror;\n const start = performance.now();\n\n // Sync priority (dirty) objects first\n const dirtyObjects = store.drainDirtyQueue();\n for (const obj of dirtyObjects) {\n store.update(obj);\n mirror.syncAttributes(obj);\n }\n\n // Amortized attribute sync\n const budgetRemaining = syncBudgetMs - (performance.now() - start);\n if (budgetRemaining > 0.1) {\n const objects = store.getFlatList();\n if (objects.length > 0) {\n const end = Math.min(cursorRef.current + batchSize, objects.length);\n for (let i = cursorRef.current; i < end; i++) {\n if (performance.now() - start > syncBudgetMs) break;\n const obj = objects[i];\n const changed = store.update(obj);\n if (changed) mirror.syncAttributes(obj);\n }\n cursorRef.current = end >= objects.length ? 0 : end;\n }\n }\n\n // Update 3D highlights (sync transforms with source objects)\n if (_highlighter) _highlighter.update();\n\n // Periodic orphan sweep (~every 30s) to prevent memory leaks\n const now = performance.now();\n if (now - lastSweepRef.current > 30_000) {\n lastSweepRef.current = now;\n store.sweepOrphans();\n }\n } catch (err) {\n r3fLog('sync', 'Per-frame sync error', err);\n }\n });\n\n return null;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { Object3D } from 'three';\n\ntype BridgeAPI = {\n r3fRegister(o: Object3D): void;\n r3fUnregister(o: Object3D): void;\n};\n\nfunction getAPI(canvasId?: string): BridgeAPI | undefined {\n if (canvasId) {\n return (window as Window & { __R3F_DOM_INSTANCES__?: Record<string, BridgeAPI> })\n .__R3F_DOM_INSTANCES__?.[canvasId];\n }\n return (window as Window & { __R3F_DOM__?: BridgeAPI }).__R3F_DOM__;\n}\n\n/**\n * Registers a Three.js object with the react-three-dom bridge on mount and\n * unregisters it on unmount. Works in both `auto` and `manual` mode.\n *\n * - In `manual` mode this is the primary way to opt objects into the mirror DOM.\n * - In `auto` mode it can force-register objects excluded by a `filter`.\n * - Handles `ref.current` identity changes automatically.\n * - If the bridge isn't ready on mount, retries each frame until available.\n * - Supports multi-canvas via the optional `canvasId` parameter.\n *\n * @param ref - Ref to the Three.js object to register\n * @param canvasId - Optional canvas ID for multi-canvas setups. When omitted,\n * uses the primary bridge (`window.__R3F_DOM__`).\n *\n * @example\n * ```tsx\n * function Wall({ geometry }) {\n * const ref = useRef<Mesh>(null!);\n * useR3FRegister(ref);\n * return <mesh ref={ref} geometry={geometry} userData={{ testId: 'wall' }} />;\n * }\n *\n * // Multi-canvas\n * function Overlay() {\n * const ref = useRef<Mesh>(null!);\n * useR3FRegister(ref, 'overlay');\n * return <mesh ref={ref} />;\n * }\n * ```\n */\nexport function useR3FRegister(\n ref: React.RefObject<Object3D | null>,\n canvasId?: string,\n): void {\n const trackedObj = useRef<Object3D | null>(null);\n const canvasIdRef = useRef(canvasId);\n canvasIdRef.current = canvasId;\n\n const register = useCallback((obj: Object3D) => {\n const api = getAPI(canvasIdRef.current);\n if (!api) return false;\n api.r3fRegister(obj);\n trackedObj.current = obj;\n return true;\n }, []);\n\n const unregister = useCallback(() => {\n if (!trackedObj.current) return;\n const api = getAPI(canvasIdRef.current);\n api?.r3fUnregister(trackedObj.current);\n trackedObj.current = null;\n }, []);\n\n useEffect(() => {\n const obj = ref.current;\n if (obj) register(obj);\n return () => unregister();\n }, [ref, register, unregister]);\n\n // Per-frame: detect ref.current swaps + retry if bridge wasn't ready on mount\n useFrame(() => {\n const current = ref.current;\n if (current === trackedObj.current) return;\n unregister();\n if (current) register(current);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/debug.ts","../src/store/ObjectStore.ts","../src/mirror/CustomElements.ts","../src/mirror/attributes.ts","../src/mirror/DomMirror.ts","../src/bridge/patchObject3D.ts","../src/snapshot/snapshot.ts","../src/interactions/projection.ts","../src/interactions/dispatch.ts","../src/interactions/raycastVerify.ts","../src/interactions/resolve.ts","../src/interactions/click.ts","../src/interactions/hover.ts","../src/interactions/drag.ts","../src/interactions/wheel.ts","../src/interactions/pointerMiss.ts","../src/interactions/drawPath.ts","../src/interactions/worldInteraction.ts","../src/highlight/SelectionManager.ts","../src/highlight/Highlighter.ts","../src/highlight/selectionDisplayTarget.ts","../src/highlight/InspectController.ts","../src/highlight/RaycastAccelerator.ts","../src/bridge/ThreeDom.tsx","../src/hooks/useR3FRegister.ts"],"names":["version","_enabled","enableDebug","on","isDebugEnabled","r3fLog","area","msg","data","extractMetadata","obj","meta","c","extractStaticFields","geom","BufferGeometry","posAttr","mat","Material","InstancedMesh","PerspectiveCamera","OrthographicCamera","updateDynamicFields","changed","testId","p","r","s","parentUuid","children","cached","i","_box3","Box3","inspectObject","metadata","options","worldMatrix","boundsMin","boundsMax","inspection","geoInspection","name","attr","sphere","rawMat","matInspection","Color","map","uniforms","key","uniform","val","ObjectStore","existing","nameSet","root","err","queue","callback","deadline","hasTime","processed","prevTestId","prevName","idOrUuid","uuid","objs","results","childUuid","childMeta","ids","id","type","value","checkValue","valueJson","count","current","objects","listener","idx","event","swept","TAG_MAP","ALL_TAGS","DEFAULT_TAG","getTagForType","_store","ThreeElement","tag","_registered","ensureCustomElements","store","elementClass","ATTRIBUTE_MAP","m","serializeTuple","MANAGED_ATTRIBUTES","tuple","round","n","rounded","computeAttributes","attrs","extractor","applyAttributes","element","prevAttrs","writeCount","newAttrs","DomMirror","maxNodes","rootElement","scene","lruNode","node","depth","descendants","descUuid","descNode","result","pUuid","parentNode","parentMeta","child","selector","uuids","elements","el","max","_uuid","chain","currentUuid","flatList","hasTimeRemaining","testIdMatch","uuidMatch","nameMatch","metas","tagMatch","targetTag","allObjects","_patched","_originalAdd","_originalRemove","_activePairs","findTrackingPair","pair","registerSubtree","mirror","instanceKey","shouldRegister","ensureAncestorChain","patchObject3D","Object3D","restoreObject3D","isPatched","buildNodeTree","findRoot","createSnapshot","rootMeta","tree","createFlatSnapshot","_vec3","Vector3","_vec3B","_frustum","Frustum","_projMatrix","Matrix4","ndcToScreen","ndc","size","isNdcOnScreen","isInFrontOfCamera","getWorldCenter","getBboxCorners","min","getBboxFaceCenters","center","tryProjectPoint","worldPoint","camera","projectToScreen","centerResult","faceCenters","faceResult","findBestOnScreenPoint","corners","cornerResult","originResult","candidates","bestResult","bestDistSq","halfW","halfH","point","dx","dy","distSq","isInFrustum","screenDeltaToWorld","start","right","up","rightDir","upDir","projectAllSamplePoints","points","wsPt","_nextPointerId","allocPointerId","toClientCoords","canvas","rect","makePointerInit","pointerId","overrides","clientX","clientY","dispatchClick","withSafePointerCapture","dispatchHover","init","dispatchDrag","end","steps","stepDelayMs","t","intermediate","sleep","dispatchDoubleClick","coords","dispatchContextMenu","dispatchWheel","deltaY","deltaX","deltaMode","dispatchPointerMiss","dispatchUnhover","fn","original","ms","resolve","_raycaster","Raycaster","_ndc","Vector2","screenToNdc","getObjectLabel","isTargetOrDescendant","candidate","target","findScene","verifyRaycastHit","intersections","firstHit","verifyRaycastHitMultiPoint","lastResult","_camera","_gl","_size","setInteractionState","gl","clearInteractionState","getStore","getCamera","getRenderer","getCanvasSize","resolveObject","click3D","verify","projection","raycast","doubleClick3D","contextMenu3D","hover3D","unhover3D","drag3D","delta","mode","dragOptions","startPoint","endPoint","screenDelta","worldDelta","worldPos","targetPos","previewDragWorldDelta","screenDx","screenDy","wheel3D","pointerMiss3D","_nextDrawPointerId","makeDrawPointerInit","pointerType","drawPath","clickAtEnd","explicitCanvas","eventCount","first","last","linePath","pressure","totalSteps","curvePath","control","invT","rectPath","topLeft","bottomRight","pointsPerSide","topRight","bottomLeft","sides","from","to","circlePath","radiusX","radiusY","ry","angle","_v","projectWorld","clickAtWorld","_options","screen","doubleClickAtWorld","contextMenuAtWorld","hoverAtWorld","clickAtWorldSequence","delayMs","interactionOpts","SelectionManager","snapshot","HOVER_FILL_COLOR","HOVER_FILL_OPACITY","SELECTION_FILL_COLOR","SELECTION_FILL_OPACITY","SELECTION_BBOX_COLOR","SELECTION_BBOX_OPACITY","hasRenderableGeometry","collectHighlightTargets","targets","markInternal","_syncGroupTransform","source","highlightRoot","_attachRenderSync","force","createHighlightMesh","fillColor","fillOpacity","group","disposables","fillMat","MeshBasicMaterial","DoubleSide","fillMesh","Mesh","createBoundingBoxHighlight","childBox","boxGeom","BoxGeometry","edgesGeom","EdgesGeometry","edgeMat","LineBasicMaterial","edgeMesh","LineSegments","g","Highlighter","selectionManager","_renderer","selected","entry","selEntry","mg","src","hg","selectedSet","meshGroups","bboxGroup","d","isFirstMeshInGroup","parent","resolveSelectionDisplayTarget","getObject3D","RAYCAST_THROTTLE_MS","HOVER_REVEAL_DEBOUNCE_MS","InspectController","opts","overlay","e","hit","displayUuid","now","mirrorEl","_bvhPatched","_bvhLoadPromise","loadAndPatchBVH","_mouse","isRaycastable","RaycastAccelerator","bvhBudget","intersection","ndcX","ndcY","_stores","_mirrors","_selectionManagers","_highlighters","_inspectControllers","_filters","_modes","filter","cursor","ancestor","canvasId","getMirror","getSelectionManager","getHighlighter","getInspectController","getCanvasIds","exposeGlobalAPI","cameraRef","selMgr","inspCtrl","isPrimary","api","o","ctrl","ctx","dbg","cam","dir","state","pc","oc","query","limit","q","removeGlobalAPI","onlyIfEquals","removeFromRegistry","ref","createStubBridge","error","ThreeDom","primary","batchSize","syncBudgetMs","maxDomNodes","initialDepth","enabled","debug","inspectProp","useThree","cursorRef","useRef","lastSweepRef","useEffect","canvasParent","createdRoot","unpatch","cancelAsyncReg","highlighter","raycastAccelerator","inspectController","currentApi","webglContext","stubApi","camMeta","inspectStatus","errorMsg","useFrame","_mirror","_highlighter","_inspectController","dirtyObjects","getAPI","useR3FRegister","trackedObj","canvasIdRef","register","useCallback","unregister"],"mappings":"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","file":"index.js","sourcesContent":["export const version = '0.6.0';\n","// ---------------------------------------------------------------------------\n// Debug logging for react-three-dom\n//\n// Three-layer system:\n// Layer 1 (this file): r3fLog() writes to browser console.log\n// Layer 2 (Playwright): r3f.enableDebug() forwards browser logs to test terminal\n// Layer 3 (Cypress): cy.r3fEnableDebug() mirrors to Cypress command log\n//\n// Enable via:\n// - <ThreeDom debug /> prop\n// - enableDebug(true) programmatically\n// - window.__R3F_DOM_DEBUG__ = true (from test code or DevTools console)\n// ---------------------------------------------------------------------------\n\nlet _enabled = false;\n\n/**\n * Enable or disable debug logging globally.\n * When enabled, all r3fLog calls will output to console.log.\n */\nexport function enableDebug(on = true): void {\n _enabled = on;\n}\n\n/**\n * Check if debug logging is currently enabled.\n */\nexport function isDebugEnabled(): boolean {\n return (\n _enabled ||\n (typeof window !== 'undefined' && !!window.__R3F_DOM_DEBUG__)\n );\n}\n\n/**\n * Log a debug message. Only outputs when debug is enabled via:\n * - enableDebug(true)\n * - window.__R3F_DOM_DEBUG__ = true\n * - <ThreeDom debug /> prop\n *\n * @param area - Module area (e.g. 'setup', 'store', 'patch', 'click', 'drag')\n * @param msg - Human-readable message\n * @param data - Optional data payload (object, error, etc.)\n */\nexport function r3fLog(area: string, msg: string, data?: unknown): void {\n if (\n !_enabled &&\n !(typeof window !== 'undefined' && window.__R3F_DOM_DEBUG__)\n ) {\n return;\n }\n if (data !== undefined) {\n console.log(`[r3f-dom:${area}]`, msg, data);\n } else {\n console.log(`[r3f-dom:${area}]`, msg);\n }\n}\n","/**\n * @module ObjectStore\n *\n * Central registry for all tracked Three.js objects in a react-three-dom session.\n * Provides two-tier data access: Tier 1 (lightweight metadata cached per-frame)\n * and Tier 2 (on-demand deep inspection of geometry, materials, and bounds).\n * Designed for BIM-scale scenes (100k+ objects) with O(1) lookups by uuid,\n * testId, and name, plus amortized flat-list iteration and async registration.\n */\nimport {\n Object3D,\n Mesh,\n InstancedMesh,\n BufferGeometry,\n Material,\n Box3,\n Color,\n PerspectiveCamera,\n OrthographicCamera,\n} from 'three';\nimport type {\n ObjectMetadata,\n ObjectInspection,\n GeometryInspection,\n MaterialInspection,\n InspectOptions,\n StoreEvent,\n StoreListener,\n} from '../types';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// Helper: extract Tier 1 metadata from a live Three.js object\n//\n// Split into two paths for performance at BIM scale:\n// - extractMetadata(): full extraction, called once on register\n// - updateDynamicFields(): only reads fields that change per-frame\n// (position, rotation, scale, visible, children count, parent),\n// skipping geometry/material/instanceCount which are static.\n// Reuses the existing metadata object to avoid allocation.\n// ---------------------------------------------------------------------------\n\nfunction extractMetadata(obj: Object3D): ObjectMetadata {\n const meta: ObjectMetadata = {\n uuid: obj.uuid,\n name: obj.name,\n type: obj.type,\n visible: obj.visible,\n testId: obj.userData?.testId as string | undefined,\n position: [obj.position.x, obj.position.y, obj.position.z],\n rotation: [obj.rotation.x, obj.rotation.y, obj.rotation.z],\n scale: [obj.scale.x, obj.scale.y, obj.scale.z],\n parentUuid: obj.parent?.uuid ?? null,\n childrenUuids: obj.children.map((c) => c.uuid),\n boundsDirty: true,\n };\n\n extractStaticFields(obj, meta);\n return meta;\n}\n\nfunction extractStaticFields(obj: Object3D, meta: ObjectMetadata): void {\n try {\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry) {\n meta.geometryType = geom.type;\n const posAttr = geom.getAttribute('position');\n if (posAttr) {\n meta.vertexCount = posAttr.count;\n if (geom.index) {\n meta.triangleCount = Math.floor(geom.index.count / 3);\n } else {\n meta.triangleCount = Math.floor(posAttr.count / 3);\n }\n }\n }\n }\n } catch {\n r3fLog('store', `extractMetadata: geometry access failed for \"${obj.name || obj.uuid}\"`);\n }\n\n try {\n if ('material' in obj) {\n const mat = (obj as Mesh).material;\n if (mat instanceof Material) {\n meta.materialType = mat.type;\n } else if (Array.isArray(mat) && mat.length > 0) {\n meta.materialType = mat[0].type + (mat.length > 1 ? ` (+${mat.length - 1})` : '');\n }\n }\n } catch {\n r3fLog('store', `extractMetadata: material access failed for \"${obj.name || obj.uuid}\"`);\n }\n\n try {\n if (obj instanceof InstancedMesh) {\n meta.instanceCount = obj.count;\n }\n } catch {\n // Skip instance count if access fails\n }\n\n try {\n if (obj instanceof PerspectiveCamera) {\n meta.fov = obj.fov;\n meta.near = obj.near;\n meta.far = obj.far;\n meta.zoom = obj.zoom;\n } else if (obj instanceof OrthographicCamera) {\n meta.near = obj.near;\n meta.far = obj.far;\n meta.zoom = obj.zoom;\n }\n } catch {\n // Skip camera fields if access fails\n }\n}\n\n/**\n * Fast per-frame update: only reads dynamic fields that actually change\n * between frames (transform, visibility, children, parent).\n * Mutates `meta` in-place and returns true if anything changed.\n * Avoids allocating a new metadata object or reading static geometry/material.\n */\nfunction updateDynamicFields(obj: Object3D, meta: ObjectMetadata): boolean {\n let changed = false;\n\n if (meta.visible !== obj.visible) { meta.visible = obj.visible; changed = true; }\n if (meta.name !== obj.name) { meta.name = obj.name; changed = true; }\n\n const testId = obj.userData?.testId as string | undefined;\n if (meta.testId !== testId) { meta.testId = testId; changed = true; }\n\n const p = obj.position;\n if (meta.position[0] !== p.x || meta.position[1] !== p.y || meta.position[2] !== p.z) {\n meta.position[0] = p.x; meta.position[1] = p.y; meta.position[2] = p.z;\n changed = true;\n }\n\n const r = obj.rotation;\n if (meta.rotation[0] !== r.x || meta.rotation[1] !== r.y || meta.rotation[2] !== r.z) {\n meta.rotation[0] = r.x; meta.rotation[1] = r.y; meta.rotation[2] = r.z;\n changed = true;\n }\n\n const s = obj.scale;\n if (meta.scale[0] !== s.x || meta.scale[1] !== s.y || meta.scale[2] !== s.z) {\n meta.scale[0] = s.x; meta.scale[1] = s.y; meta.scale[2] = s.z;\n changed = true;\n }\n\n const parentUuid = obj.parent?.uuid ?? null;\n if (meta.parentUuid !== parentUuid) { meta.parentUuid = parentUuid; changed = true; }\n\n const children = obj.children;\n const cached = meta.childrenUuids;\n if (cached.length !== children.length) {\n meta.childrenUuids = children.map((c) => c.uuid);\n changed = true;\n } else {\n for (let i = 0; i < cached.length; i++) {\n if (cached[i] !== children[i].uuid) {\n meta.childrenUuids = children.map((c) => c.uuid);\n changed = true;\n break;\n }\n }\n }\n\n return changed;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Tier 2 on-demand inspection\n// ---------------------------------------------------------------------------\n\nconst _box3 = new Box3();\n\nfunction inspectObject(obj: Object3D, metadata: ObjectMetadata, options?: InspectOptions): ObjectInspection {\n // Start with a minimal valid inspection — each section fills in details\n // and is wrapped in try/catch so a failure in one area (e.g. disposed\n // geometry) doesn't prevent the rest from being returned.\n let worldMatrix: number[] = Array(16).fill(0);\n let boundsMin: [number, number, number] = [0, 0, 0];\n let boundsMax: [number, number, number] = [0, 0, 0];\n\n // World matrix + bounds\n try {\n obj.updateWorldMatrix(true, false);\n worldMatrix = Array.from(obj.matrixWorld.elements);\n _box3.setFromObject(obj);\n boundsMin = [_box3.min.x, _box3.min.y, _box3.min.z];\n boundsMax = [_box3.max.x, _box3.max.y, _box3.max.z];\n } catch {\n r3fLog('store', `inspectObject: world matrix / bounds failed for \"${obj.name || obj.uuid}\"`);\n }\n\n const inspection: ObjectInspection = {\n metadata,\n worldMatrix,\n bounds: { min: boundsMin, max: boundsMax },\n userData: {},\n };\n\n // userData (shallow copy, may contain non-serializable values)\n try {\n inspection.userData = { ...obj.userData };\n } catch {\n r3fLog('store', `inspectObject: userData copy failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // Geometry details\n try {\n if ('geometry' in obj) {\n const geom = (obj as Mesh).geometry;\n if (geom instanceof BufferGeometry && geom.attributes) {\n const geoInspection: GeometryInspection = {\n type: geom.type,\n attributes: {},\n };\n\n for (const [name, attr] of Object.entries(geom.attributes)) {\n if (!attr) continue;\n geoInspection.attributes[name] = {\n itemSize: attr.itemSize,\n count: attr.count,\n };\n }\n\n if (geom.index) {\n geoInspection.index = { count: geom.index.count };\n }\n\n if (options?.includeGeometryData) {\n const posAttr = geom.getAttribute('position');\n if (posAttr?.array) {\n geoInspection.positionData = Array.from(posAttr.array);\n }\n if (geom.index?.array) {\n geoInspection.indexData = Array.from(geom.index.array);\n }\n }\n\n geom.computeBoundingSphere();\n const sphere = geom.boundingSphere;\n if (sphere) {\n geoInspection.boundingSphere = {\n center: [sphere.center.x, sphere.center.y, sphere.center.z],\n radius: sphere.radius,\n };\n }\n\n inspection.geometry = geoInspection;\n }\n }\n } catch {\n r3fLog('store', `inspectObject: geometry inspection failed for \"${obj.name || obj.uuid}\"`);\n }\n\n // Material details\n try {\n if ('material' in obj) {\n const rawMat = (obj as Mesh).material;\n if (!rawMat) throw new Error('disposed');\n const mat = Array.isArray(rawMat) ? rawMat[0] : rawMat;\n if (mat instanceof Material) {\n const matInspection: MaterialInspection = {\n type: mat.type,\n transparent: mat.transparent,\n opacity: mat.opacity,\n side: mat.side,\n };\n\n // Color (most materials have it)\n if ('color' in mat && (mat as unknown as { color: Color }).color instanceof Color) {\n matInspection.color = '#' + (mat as unknown as { color: Color }).color.getHexString();\n }\n\n // Map texture\n if ('map' in mat) {\n const map = (mat as unknown as { map: { name?: string; uuid?: string } | null }).map;\n if (map) {\n matInspection.map = map.name || map.uuid || 'unnamed';\n }\n }\n\n // ShaderMaterial uniforms\n if ('uniforms' in mat) {\n const uniforms = (mat as unknown as { uniforms: Record<string, { value: unknown }> })\n .uniforms;\n matInspection.uniforms = {};\n for (const [key, uniform] of Object.entries(uniforms)) {\n const val = uniform.value;\n if (val === null || val === undefined) {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'number' || typeof val === 'boolean' || typeof val === 'string') {\n matInspection.uniforms[key] = val;\n } else if (typeof val === 'object' && 'toArray' in val) {\n matInspection.uniforms[key] = (val as { toArray(): number[] }).toArray();\n } else {\n matInspection.uniforms[key] = `[${typeof val}]`;\n }\n }\n }\n\n inspection.material = matInspection;\n }\n }\n } catch {\n r3fLog('store', `inspectObject: material inspection failed for \"${obj.name || obj.uuid}\"`);\n }\n\n return inspection;\n}\n\n// ---------------------------------------------------------------------------\n// ObjectStore — the source of truth for all tracked Three.js objects\n// ---------------------------------------------------------------------------\n\n/**\n * Source of truth for all tracked Three.js objects.\n * Maintains O(1) indexes by uuid, testId, and name, a dirty queue for\n * priority per-frame sync, and an event system for add/remove/update\n * notifications consumed by DomMirror and the devtools panel.\n */\nexport class ObjectStore {\n // Tier 1: metadata for every tracked object\n private _metaByObject = new WeakMap<Object3D, ObjectMetadata>();\n private _objectByUuid = new Map<string, Object3D>();\n private _objectsByTestId = new Map<string, Object3D>();\n private _objectsByName = new Map<string, Set<Object3D>>();\n\n // Flat list for amortized iteration\n private _flatList: Object3D[] = [];\n private _flatListDirty = true;\n\n // Priority dirty queue: objects that changed and need immediate sync\n private _dirtyQueue = new Set<Object3D>();\n\n // Event listeners\n private _listeners: StoreListener[] = [];\n\n // Track the root scene(s) for scoping\n private _trackedRoots = new WeakSet<Object3D>();\n\n // -------------------------------------------------------------------------\n // Registration\n // -------------------------------------------------------------------------\n\n /**\n * Register a single object into the store.\n * Populates Tier 1 metadata and all indexes.\n * Tags the object with `__r3fdom_tracked = true` for O(1) scene membership checks.\n */\n register(obj: Object3D): ObjectMetadata {\n // Skip internal highlight/label helpers created by Highlighter\n if (obj.userData?.__r3fdom_internal) {\n return extractMetadata(obj);\n }\n\n // Skip if already registered\n const existing = this._metaByObject.get(obj);\n if (existing) return existing;\n\n const meta = extractMetadata(obj);\n this._metaByObject.set(obj, meta);\n this._objectByUuid.set(meta.uuid, obj);\n this._flatListDirty = true;\n\n // O(1) tracking flag for patchObject3D.findTrackingPair\n obj.userData.__r3fdom_tracked = true;\n\n if (meta.testId) {\n this._objectsByTestId.set(meta.testId, obj);\n }\n\n if (meta.name) {\n let nameSet = this._objectsByName.get(meta.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(meta.name, nameSet);\n }\n nameSet.add(obj);\n }\n\n this._emit({ type: 'add', object: obj, metadata: meta });\n if (meta.testId) {\n r3fLog('store', `Registered \"${meta.testId}\" (${meta.type})`);\n }\n return meta;\n }\n\n /**\n * Register an entire subtree (object + all descendants) synchronously.\n * Prefer `registerTreeAsync` for large scenes (100k+) to avoid blocking.\n */\n registerTree(root: Object3D): void {\n this._trackedRoots.add(root);\n root.traverse((obj) => {\n try {\n this.register(obj);\n } catch (err) {\n r3fLog('store', `registerTree: failed to register \"${obj.name || obj.uuid}\"`, err);\n }\n });\n }\n\n // ---- Async registration state ----\n private _asyncRegQueue: Object3D[] = [];\n private _asyncRegHandle: number | null = null;\n private _asyncRegBatchSize = 1000;\n\n /**\n * Register an entire subtree asynchronously using requestIdleCallback.\n * Processes ~1000 objects per idle slice to avoid blocking the main thread.\n *\n * IMPORTANT: install patchObject3D BEFORE calling this so that objects\n * added to the scene during async registration are caught by the patch.\n *\n * Returns a cancel function. Also cancelled automatically by dispose().\n */\n registerTreeAsync(root: Object3D): () => void {\n this._trackedRoots.add(root);\n\n // Collect all objects upfront (traverse is fast — no DOM/GPU work)\n const queue: Object3D[] = [];\n root.traverse((obj) => queue.push(obj));\n\n this._asyncRegQueue = queue;\n r3fLog('store', `registerTreeAsync: ${queue.length} objects queued`);\n\n this._scheduleRegChunk();\n\n return () => this._cancelAsyncRegistration();\n }\n\n private _scheduleRegChunk(): void {\n if (this._asyncRegQueue.length === 0) {\n this._asyncRegHandle = null;\n r3fLog('store', `registerTreeAsync complete: ${this.getCount()} objects registered`);\n return;\n }\n\n const callback = (deadline?: IdleDeadline) => {\n const hasTime = deadline\n ? () => deadline.timeRemaining() > 1\n : () => true;\n\n let processed = 0;\n while (\n this._asyncRegQueue.length > 0 &&\n processed < this._asyncRegBatchSize &&\n hasTime()\n ) {\n const obj = this._asyncRegQueue.shift()!;\n try {\n this.register(obj);\n } catch (err) {\n r3fLog('store', `registerTreeAsync: failed to register \"${obj.name || obj.uuid}\"`, err);\n }\n processed++;\n }\n\n this._scheduleRegChunk();\n };\n\n if (typeof requestIdleCallback === 'function') {\n this._asyncRegHandle = requestIdleCallback(callback, { timeout: 50 }) as unknown as number;\n } else {\n this._asyncRegHandle = setTimeout(callback, 4) as unknown as number;\n }\n }\n\n private _cancelAsyncRegistration(): void {\n if (this._asyncRegHandle !== null) {\n if (typeof cancelIdleCallback === 'function') {\n cancelIdleCallback(this._asyncRegHandle);\n } else {\n clearTimeout(this._asyncRegHandle);\n }\n this._asyncRegHandle = null;\n }\n this._asyncRegQueue = [];\n }\n\n /**\n * Unregister a single object from the store.\n * Clears the `__r3fdom_tracked` flag.\n */\n unregister(obj: Object3D): void {\n const meta = this._metaByObject.get(obj);\n if (!meta) return;\n\n this._metaByObject.delete(obj);\n this._objectByUuid.delete(meta.uuid);\n this._dirtyQueue.delete(obj);\n this._flatListDirty = true;\n\n delete obj.userData.__r3fdom_tracked;\n delete obj.userData.__r3fdom_manual;\n\n if (meta.testId) {\n this._objectsByTestId.delete(meta.testId);\n }\n\n if (meta.name) {\n const nameSet = this._objectsByName.get(meta.name);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) {\n this._objectsByName.delete(meta.name);\n }\n }\n }\n\n if (meta.testId) {\n r3fLog('store', `Unregistered \"${meta.testId}\" (${meta.type})`);\n }\n this._emit({ type: 'remove', object: obj, metadata: meta });\n }\n\n /**\n * Unregister an entire subtree (object + all descendants).\n */\n /** Mark a root as tracked without traversing/registering its children. */\n addTrackedRoot(root: Object3D): void {\n this._trackedRoots.add(root);\n }\n\n unregisterTree(root: Object3D): void {\n root.traverse((obj) => {\n this.unregister(obj);\n });\n this._trackedRoots.delete(root);\n }\n\n // -------------------------------------------------------------------------\n // Tier 1: Update (compare-and-set, returns true if changed)\n // -------------------------------------------------------------------------\n\n /**\n * Refresh dynamic Tier 1 fields from the live Three.js object.\n * Only reads transform, visibility, children count, and parent —\n * skips static fields (geometry, material) that don't change per-frame.\n * Mutates metadata in-place to avoid allocation.\n * Returns true if any values changed.\n */\n update(obj: Object3D): boolean {\n const meta = this._metaByObject.get(obj);\n if (!meta) return false;\n\n let changed: boolean;\n try {\n const prevTestId = meta.testId;\n const prevName = meta.name;\n\n changed = updateDynamicFields(obj, meta);\n\n if (changed) {\n if (prevTestId !== meta.testId) {\n r3fLog('store', `testId changed: \"${prevTestId}\" → \"${meta.testId}\" (${meta.type})`);\n if (prevTestId) this._objectsByTestId.delete(prevTestId);\n if (meta.testId) this._objectsByTestId.set(meta.testId, obj);\n }\n if (prevName !== meta.name) {\n if (prevName) {\n const nameSet = this._objectsByName.get(prevName);\n if (nameSet) {\n nameSet.delete(obj);\n if (nameSet.size === 0) this._objectsByName.delete(prevName);\n }\n }\n if (meta.name) {\n let nameSet = this._objectsByName.get(meta.name);\n if (!nameSet) {\n nameSet = new Set();\n this._objectsByName.set(meta.name, nameSet);\n }\n nameSet.add(obj);\n }\n }\n\n this._emit({ type: 'update', object: obj, metadata: meta });\n }\n } catch (err) {\n r3fLog('store', `update: updateDynamicFields failed for \"${obj.name || obj.uuid}\"`, err);\n return false;\n }\n\n return changed;\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand inspection (never cached)\n // -------------------------------------------------------------------------\n\n /**\n * Compute full inspection data from a live Three.js object.\n * This reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n * Pass { includeGeometryData: true } to include vertex positions and triangle indices (higher cost for large meshes).\n */\n inspect(idOrUuid: string, options?: InspectOptions): ObjectInspection | null {\n const obj = this.getObject3D(idOrUuid);\n if (!obj) return null;\n\n const meta = this._metaByObject.get(obj);\n if (!meta) return null;\n\n return inspectObject(obj, meta, options);\n }\n\n // -------------------------------------------------------------------------\n // Lookups (O(1))\n // -------------------------------------------------------------------------\n\n /** Get metadata by testId. O(1). */\n getByTestId(testId: string): ObjectMetadata | null {\n const obj = this._objectsByTestId.get(testId);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by uuid. O(1). */\n getByUuid(uuid: string): ObjectMetadata | null {\n const obj = this._objectByUuid.get(uuid);\n if (!obj) return null;\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Get metadata by name (returns array since names aren't unique). O(1). */\n getByName(name: string): ObjectMetadata[] {\n const objs = this._objectsByName.get(name);\n if (!objs) return [];\n const results: ObjectMetadata[] = [];\n for (const obj of objs) {\n const meta = this._metaByObject.get(obj);\n if (meta) results.push(meta);\n }\n return results;\n }\n\n /** Get direct children of an object by testId or uuid. Returns empty array if not found. */\n getChildren(idOrUuid: string): ObjectMetadata[] {\n const meta = this.getByTestId(idOrUuid) ?? this.getByUuid(idOrUuid);\n if (!meta) return [];\n const results: ObjectMetadata[] = [];\n for (const childUuid of meta.childrenUuids) {\n const childMeta = this.getByUuid(childUuid);\n if (childMeta) results.push(childMeta);\n }\n return results;\n }\n\n /** Get parent of an object by testId or uuid. Returns null if not found or if root. */\n getParent(idOrUuid: string): ObjectMetadata | null {\n const meta = this.getByTestId(idOrUuid) ?? this.getByUuid(idOrUuid);\n if (!meta || meta.parentUuid === null) return null;\n return this.getByUuid(meta.parentUuid);\n }\n\n /**\n * Batch lookup: get metadata for multiple objects by testId or uuid.\n * Returns a Map from the requested id to its metadata (or null if not found).\n * Single round-trip — much more efficient than calling getByTestId/getByUuid\n * in a loop for BIM/CAD scenes with many objects.\n * O(k) where k is the number of requested ids.\n */\n getObjects(ids: string[]): Map<string, ObjectMetadata | null> {\n const results = new Map<string, ObjectMetadata | null>();\n for (const id of ids) {\n const meta = this.getByTestId(id) ?? this.getByUuid(id);\n results.set(id, meta);\n }\n return results;\n }\n\n /**\n * Get all objects of a given Three.js type (e.g. \"Mesh\", \"Group\", \"Line\").\n * Linear scan — O(n) where n is total tracked objects.\n */\n getByType(type: string): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.type === type) results.push(meta);\n }\n return results;\n }\n\n /**\n * Get all objects with a given geometry type (e.g. \"BoxGeometry\", \"BufferGeometry\").\n * Linear scan — O(n). Only meshes/points/lines have geometryType.\n */\n getByGeometryType(type: string): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.geometryType === type) results.push(meta);\n }\n return results;\n }\n\n /**\n * Get all objects with a given material type (e.g. \"MeshStandardMaterial\").\n * Linear scan — O(n). Only meshes/points/lines have materialType.\n */\n getByMaterialType(type: string): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.materialType === type) results.push(meta);\n }\n return results;\n }\n\n /**\n * Get all objects that have a specific userData key.\n * If `value` is provided, only returns objects where `userData[key]` matches.\n * Uses JSON.stringify for deep equality on complex values.\n * Linear scan — O(n).\n */\n getByUserData(key: string, value?: unknown): ObjectMetadata[] {\n const results: ObjectMetadata[] = [];\n const checkValue = value !== undefined;\n const valueJson = checkValue ? JSON.stringify(value) : '';\n for (const obj of this.getFlatList()) {\n if (!(key in obj.userData)) continue;\n if (checkValue && JSON.stringify(obj.userData[key]) !== valueJson) continue;\n const meta = this._metaByObject.get(obj);\n if (meta) results.push(meta);\n }\n return results;\n }\n\n /**\n * Count objects of a given Three.js type.\n * More efficient than getByType().length — no array allocation.\n * Linear scan — O(n).\n */\n getCountByType(type: string): number {\n let count = 0;\n for (const obj of this.getFlatList()) {\n const meta = this._metaByObject.get(obj);\n if (meta && meta.type === type) count++;\n }\n return count;\n }\n\n /** Get the raw Three.js Object3D by testId or uuid. */\n getObject3D(idOrUuid: string): Object3D | null {\n // Try testId first, then uuid\n return this._objectsByTestId.get(idOrUuid)\n ?? this._objectByUuid.get(idOrUuid)\n ?? null;\n }\n\n /** Get metadata for a known Object3D reference. */\n getMetadata(obj: Object3D): ObjectMetadata | null {\n return this._metaByObject.get(obj) ?? null;\n }\n\n /** Check if an object is registered. */\n has(obj: Object3D): boolean {\n return this._metaByObject.has(obj);\n }\n\n /** Total number of tracked objects. */\n getCount(): number {\n return this._objectByUuid.size;\n }\n\n /** Check if a root scene is tracked. */\n isTrackedRoot(obj: Object3D): boolean {\n return this._trackedRoots.has(obj);\n }\n\n /**\n * Check if an object belongs to a tracked scene.\n * Fast path: checks the `__r3fdom_tracked` flag set during register (O(1)).\n * Fallback: walks up the parent chain to find a tracked root.\n * The fallback is needed for newly added objects that aren't registered yet.\n */\n isInTrackedScene(obj: Object3D): boolean {\n if (obj.userData?.__r3fdom_tracked) return true;\n let current: Object3D | null = obj.parent;\n while (current) {\n if (current.userData?.__r3fdom_tracked) return true;\n if (this._trackedRoots.has(current)) return true;\n current = current.parent;\n }\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Flat list for amortized iteration\n // -------------------------------------------------------------------------\n\n /**\n * Get a flat array of all tracked objects for amortized batch processing.\n * Rebuilds lazily when the list is dirty (objects added/removed).\n */\n getFlatList(): Object3D[] {\n if (this._flatListDirty) {\n this._flatList = Array.from(this._objectByUuid.values());\n this._flatListDirty = false;\n }\n return this._flatList;\n }\n\n // -------------------------------------------------------------------------\n // Priority dirty queue\n // -------------------------------------------------------------------------\n\n /** Mark an object as dirty (needs priority sync next frame). */\n markDirty(obj: Object3D): void {\n if (this._metaByObject.has(obj)) {\n this._dirtyQueue.add(obj);\n }\n }\n\n /**\n * Drain the dirty queue, returning all objects that need priority sync.\n * Clears the queue after draining.\n */\n drainDirtyQueue(): Object3D[] {\n if (this._dirtyQueue.size === 0) return [];\n const objects = Array.from(this._dirtyQueue);\n this._dirtyQueue.clear();\n return objects;\n }\n\n /** Number of objects currently in the dirty queue. */\n getDirtyCount(): number {\n return this._dirtyQueue.size;\n }\n\n // -------------------------------------------------------------------------\n // Event system\n // -------------------------------------------------------------------------\n\n /** Subscribe to store events (add, remove, update). */\n subscribe(listener: StoreListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _emit(event: StoreEvent): void {\n for (const listener of this._listeners) {\n listener(event);\n }\n }\n\n // -------------------------------------------------------------------------\n // GC: sweep orphaned objects\n // -------------------------------------------------------------------------\n\n /**\n * Sweep objects in `_objectByUuid` that are no longer in any tracked scene.\n * This catches objects that were removed from the scene graph without\n * triggering the patched Object3D.remove (e.g. direct `.children` splice,\n * or the remove hook failing silently).\n *\n * At BIM scale, call this periodically (e.g. every 30s or after a floor\n * load/unload) to prevent memory leaks from retained Object3D references.\n *\n * Returns the number of orphans cleaned up.\n */\n sweepOrphans(): number {\n let swept = 0;\n for (const [uuid, obj] of this._objectByUuid) {\n if (!obj.parent && !this._trackedRoots.has(obj)) {\n this.unregister(obj);\n swept++;\n r3fLog('store', `sweepOrphans: removed orphan \"${obj.name || uuid}\"`);\n }\n }\n return swept;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /** Remove all tracked objects and reset state. */\n dispose(): void {\n this._cancelAsyncRegistration();\n for (const obj of this._objectByUuid.values()) {\n if (obj.userData) delete obj.userData.__r3fdom_tracked;\n }\n this._objectByUuid.clear();\n this._objectsByTestId.clear();\n this._objectsByName.clear();\n this._flatList = [];\n this._flatListDirty = true;\n this._dirtyQueue.clear();\n this._listeners = [];\n }\n}\n","/**\n * @module CustomElements\n *\n * Defines and registers the custom HTML elements (<three-scene>, <three-mesh>,\n * <three-light>, etc.) used by DomMirror to represent Three.js objects in the\n * DOM. The ThreeElement base class exposes interactive properties (metadata,\n * inspect, object3D) accessible from the DevTools console via `$0.metadata`.\n */\nimport type { Object3D } from 'three';\nimport type { ObjectMetadata, ObjectInspection } from '../types';\nimport type { ObjectStore } from '../store/ObjectStore';\n\n// ---------------------------------------------------------------------------\n// Tag mapping: Three.js type → custom element tag name\n// ---------------------------------------------------------------------------\n\n/**\n * Maps Three.js object types to custom element tag names.\n * Multiple Three.js types can map to the same tag.\n */\nexport const TAG_MAP: Record<string, string> = {\n // Scenes\n Scene: 'three-scene',\n\n // Groups / containers\n Group: 'three-group',\n LOD: 'three-group',\n Bone: 'three-group',\n\n // Meshes\n Mesh: 'three-mesh',\n SkinnedMesh: 'three-mesh',\n InstancedMesh: 'three-mesh',\n LineSegments: 'three-mesh',\n Line: 'three-mesh',\n LineLoop: 'three-mesh',\n Points: 'three-mesh',\n Sprite: 'three-mesh',\n\n // Lights\n AmbientLight: 'three-light',\n DirectionalLight: 'three-light',\n HemisphereLight: 'three-light',\n PointLight: 'three-light',\n RectAreaLight: 'three-light',\n SpotLight: 'three-light',\n LightProbe: 'three-light',\n\n // Cameras\n PerspectiveCamera: 'three-camera',\n OrthographicCamera: 'three-camera',\n ArrayCamera: 'three-camera',\n CubeCamera: 'three-camera',\n\n // Helpers (map to object as fallback)\n BoxHelper: 'three-object',\n ArrowHelper: 'three-object',\n AxesHelper: 'three-object',\n GridHelper: 'three-object',\n SkeletonHelper: 'three-object',\n};\n\n/** All unique tag names that need to be registered. */\nconst ALL_TAGS = [\n 'three-scene',\n 'three-group',\n 'three-mesh',\n 'three-light',\n 'three-camera',\n 'three-object',\n] as const;\n\nexport type ThreeTagName = (typeof ALL_TAGS)[number];\n\n/** Default fallback tag for any Object3D type not in TAG_MAP. */\nconst DEFAULT_TAG: ThreeTagName = 'three-object';\n\n/**\n * Get the custom element tag name for a Three.js object type.\n */\nexport function getTagForType(type: string): ThreeTagName {\n return (TAG_MAP[type] as ThreeTagName) ?? DEFAULT_TAG;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: reference to the store (set once during ensureCustomElements)\n// ---------------------------------------------------------------------------\n\nlet _store: ObjectStore | null = null;\n\n/**\n * Set the ObjectStore reference that custom elements use for lookups.\n * Must be called before any custom element properties/methods are used.\n */\nexport function setElementStore(store: ObjectStore): void {\n _store = store;\n}\n\n// ---------------------------------------------------------------------------\n// ThreeElement: base class for all custom elements\n// ---------------------------------------------------------------------------\n\n/**\n * Base custom element class for the DOM mirror.\n * Provides interactive properties and methods accessible via DevTools console.\n *\n * Usage in DevTools after selecting a <three-mesh> in the Elements panel:\n * $0.metadata → Tier 1 cached metadata (instant)\n * $0.inspect() → Tier 2 heavy inspection (reads live Three.js object)\n * $0.object3D → raw THREE.Object3D reference\n * $0.position → [x, y, z] shortcut\n * $0.bounds → { min, max } shortcut\n * $0.click() → trigger deterministic click\n * $0.hover() → trigger deterministic hover\n */\nexport class ThreeElement extends HTMLElement {\n // -------------------------------------------------------------------------\n // Tier 1: Lightweight cached metadata (always available)\n // -------------------------------------------------------------------------\n\n /**\n * Returns the Tier 1 cached metadata for this object.\n * Instant, no computation. Returns null if the element is not linked.\n */\n get metadata(): ObjectMetadata | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getByUuid(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Tier 2: On-demand heavy inspection (reads live Three.js object)\n // -------------------------------------------------------------------------\n\n /**\n * Performs a full inspection of the linked Three.js object.\n * Reads geometry buffers, material properties, world bounds, etc.\n * Cost: 0.1–2ms depending on geometry complexity.\n */\n inspect(): ObjectInspection | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.inspect(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Raw Three.js object reference\n // -------------------------------------------------------------------------\n\n /**\n * Returns the raw Three.js Object3D linked to this DOM element.\n * Allows direct access to any Three.js property or method.\n */\n get object3D(): Object3D | null {\n const uuid = this.dataset.uuid;\n if (!uuid || !_store) return null;\n return _store.getObject3D(uuid);\n }\n\n // -------------------------------------------------------------------------\n // Convenience shortcuts (read from Tier 1 metadata)\n // -------------------------------------------------------------------------\n\n /**\n * Local position as [x, y, z].\n */\n get position(): [number, number, number] | null {\n return this.metadata?.position ?? null;\n }\n\n /**\n * Local euler rotation as [x, y, z] in radians.\n */\n get rotation(): [number, number, number] | null {\n return this.metadata?.rotation ?? null;\n }\n\n /**\n * Local scale as [x, y, z].\n */\n get scale(): [number, number, number] | null {\n return this.metadata?.scale ?? null;\n }\n\n /**\n * Whether the object is visible (does not check parent chain).\n */\n get visible(): boolean {\n return this.metadata?.visible ?? false;\n }\n\n /**\n * The testId from userData.testId, if set.\n */\n get testId(): string | undefined {\n return this.metadata?.testId;\n }\n\n /**\n * World-space bounding box. Computed on-demand (Tier 2).\n */\n get bounds(): { min: [number, number, number]; max: [number, number, number] } | null {\n const inspection = this.inspect();\n return inspection?.bounds ?? null;\n }\n\n // -------------------------------------------------------------------------\n // Interaction methods\n // -------------------------------------------------------------------------\n\n /**\n * Trigger a deterministic click on the linked 3D object.\n * Projects the object center to screen coordinates and dispatches pointer events.\n */\n click(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot click: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.click === 'function') {\n window.__R3F_DOM__.click(uuid);\n } else {\n console.warn('[react-three-dom] Cannot click: bridge API not initialized');\n }\n }\n\n /**\n * Trigger a deterministic hover on the linked 3D object.\n */\n hover(): void {\n const uuid = this.dataset.uuid;\n if (!uuid) {\n console.warn('[react-three-dom] Cannot hover: element has no data-uuid');\n return;\n }\n if (typeof window.__R3F_DOM__?.hover === 'function') {\n window.__R3F_DOM__.hover(uuid);\n } else {\n console.warn('[react-three-dom] Cannot hover: bridge API not initialized');\n }\n }\n\n // -------------------------------------------------------------------------\n // Console-friendly output\n // -------------------------------------------------------------------------\n\n /**\n * Returns a readable string representation for console output.\n */\n override toString(): string {\n const tag = this.tagName.toLowerCase();\n const name = this.dataset.name ? ` name=\"${this.dataset.name}\"` : '';\n const testId = this.dataset.testId ? ` testId=\"${this.dataset.testId}\"` : '';\n const type = this.dataset.type ? ` type=\"${this.dataset.type}\"` : '';\n return `<${tag}${name}${testId}${type}>`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nlet _registered = false;\n\n/**\n * Register all custom elements (<three-scene>, <three-mesh>, etc.).\n * Safe to call multiple times — only registers once.\n *\n * @param store - The ObjectStore instance for element property lookups\n */\nexport function ensureCustomElements(store: ObjectStore): void {\n if (_registered) return;\n\n // Check if we're in a browser environment\n if (typeof customElements === 'undefined') return;\n\n _store = store;\n\n for (const tag of ALL_TAGS) {\n if (!customElements.get(tag)) {\n // Each tag gets its own class so instanceof checks work\n // and DevTools shows distinct element types\n const elementClass = class extends ThreeElement {};\n // Set displayName for debugging\n Object.defineProperty(elementClass, 'name', { value: `ThreeElement_${tag}` });\n customElements.define(tag, elementClass);\n }\n }\n\n _registered = true;\n}\n\n/**\n * Check if custom elements have been registered.\n */\nexport function isRegistered(): boolean {\n return _registered;\n}\n","/**\n * @module attributes\n *\n * Serializes ObjectStore Tier 1 metadata into DOM data-attributes and applies\n * them to mirror elements with minimal DOM writes. Only attributes whose values\n * actually changed are written, keeping per-frame cost near zero for static objects.\n */\nimport type { ObjectMetadata } from '../types';\n\n// ---------------------------------------------------------------------------\n// Attribute serialization: converts Tier 1 metadata to DOM attribute strings\n// ---------------------------------------------------------------------------\n\n/**\n * Attribute definitions: maps data-attribute names to extractor functions.\n * Each extractor takes metadata and returns a string value, or undefined\n * to skip setting the attribute (avoids empty attributes in DOM).\n */\nconst ATTRIBUTE_MAP: Record<string, (meta: ObjectMetadata) => string | undefined> = {\n 'data-uuid': (m) => m.uuid,\n 'data-name': (m) => m.name || undefined,\n 'data-type': (m) => m.type,\n 'data-visible': (m) => String(m.visible),\n 'data-test-id': (m) => m.testId,\n 'data-geometry': (m) => m.geometryType,\n 'data-material': (m) => m.materialType,\n 'data-position': (m) => serializeTuple(m.position),\n 'data-rotation': (m) => serializeTuple(m.rotation),\n 'data-scale': (m) => serializeTuple(m.scale),\n 'data-vertex-count': (m) => m.vertexCount !== undefined ? String(m.vertexCount) : undefined,\n 'data-triangle-count': (m) => m.triangleCount !== undefined ? String(m.triangleCount) : undefined,\n 'data-instance-count': (m) => m.instanceCount !== undefined ? String(m.instanceCount) : undefined,\n 'data-fov': (m) => m.fov !== undefined ? String(m.fov) : undefined,\n 'data-near': (m) => m.near !== undefined ? String(m.near) : undefined,\n 'data-far': (m) => m.far !== undefined ? String(m.far) : undefined,\n 'data-zoom': (m) => m.zoom !== undefined ? String(m.zoom) : undefined,\n};\n\n/** All attribute names we manage (for diffing). */\nexport const MANAGED_ATTRIBUTES = Object.keys(ATTRIBUTE_MAP);\n\n// ---------------------------------------------------------------------------\n// Serialization helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Serialize a 3-element tuple to a compact string: \"1.23,4.56,7.89\"\n * Uses 2 decimal places for readability without excessive precision.\n */\nfunction serializeTuple(tuple: [number, number, number]): string {\n return `${round(tuple[0])},${round(tuple[1])},${round(tuple[2])}`;\n}\n\n/**\n * Round to 4 decimal places to avoid floating point noise\n * while preserving meaningful precision.\n */\nfunction round(n: number): string {\n // Avoid -0 display\n const rounded = Math.round(n * 10000) / 10000;\n return String(rounded === 0 ? 0 : rounded);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute all attribute key-value pairs for a metadata object.\n * Returns a map of attribute name → value.\n * Attributes with undefined values are excluded.\n */\nexport function computeAttributes(meta: ObjectMetadata): Map<string, string> {\n const attrs = new Map<string, string>();\n for (const [key, extractor] of Object.entries(ATTRIBUTE_MAP)) {\n const value = extractor(meta);\n if (value !== undefined) {\n attrs.set(key, value);\n }\n }\n return attrs;\n}\n\n/**\n * Apply attributes to a DOM element, only writing those that changed.\n * Returns the number of attributes that were actually written (for perf tracking).\n *\n * @param element - The custom element to update\n * @param meta - Current Tier 1 metadata\n * @param prevAttrs - Previous attribute values (mutated in-place to reflect new state)\n * @returns Number of DOM setAttribute calls made\n */\nexport function applyAttributes(\n element: HTMLElement,\n meta: ObjectMetadata,\n prevAttrs: Map<string, string>,\n): number {\n let writeCount = 0;\n const newAttrs = computeAttributes(meta);\n\n // Set or update attributes that changed\n for (const [key, value] of newAttrs) {\n const prev = prevAttrs.get(key);\n if (prev !== value) {\n element.setAttribute(key, value);\n prevAttrs.set(key, value);\n writeCount++;\n }\n }\n\n // Remove attributes that no longer exist\n for (const key of prevAttrs.keys()) {\n if (!newAttrs.has(key)) {\n element.removeAttribute(key);\n prevAttrs.delete(key);\n writeCount++;\n }\n }\n\n return writeCount;\n}\n","/**\n * @module DomMirror\n *\n * Maintains a parallel DOM tree that mirrors the Three.js scene graph using\n * custom elements (<three-mesh>, <three-group>, etc.). This enables standard\n * DOM tooling — CSS selectors, DevTools Elements panel, Accessibility tree —\n * to work with 3D objects. Only a subset of objects are materialized as DOM\n * nodes at any time (capped via LRU eviction) to stay performant at BIM scale.\n */\nimport type { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport { getTagForType } from './CustomElements';\nimport { applyAttributes } from './attributes';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// LRU tracking node (doubly-linked list for O(1) eviction)\n// ---------------------------------------------------------------------------\n\ninterface LRUNode {\n uuid: string;\n prev: LRUNode | null;\n next: LRUNode | null;\n}\n\n// ---------------------------------------------------------------------------\n// Materialized node record — tracks a DOM element and its cached attributes\n// ---------------------------------------------------------------------------\n\ninterface MaterializedNode {\n element: HTMLElement;\n /** Previously applied attribute values for diffing */\n prevAttrs: Map<string, string>;\n /** LRU tracking node */\n lruNode: LRUNode;\n}\n\n// ---------------------------------------------------------------------------\n// DomMirror — lazy DOM tree builder with LRU eviction\n// ---------------------------------------------------------------------------\n\n/**\n * Manages the parallel DOM tree that mirrors the Three.js scene graph.\n *\n * Key design for 100k-scale:\n * - ObjectStore holds Tier 1 metadata for ALL objects (cheap, ~120 bytes each)\n * - DomMirror only materializes DOM nodes for actively viewed/queried objects\n * - Max materialized DOM nodes capped (default 2,000) with LRU eviction\n * - DOM writes only happen for materialized nodes where values actually differ\n */\nexport class DomMirror {\n private _store: ObjectStore;\n private _rootElement: HTMLElement | null = null;\n\n // Materialized nodes indexed by uuid\n private _nodes = new Map<string, MaterializedNode>();\n\n // LRU doubly-linked list for eviction (head = most recently used, tail = least)\n private _lruHead: LRUNode | null = null;\n private _lruTail: LRUNode | null = null;\n private _lruSize = 0;\n\n // Max materialized DOM nodes\n private _maxNodes: number;\n\n // UUID → parent UUID mapping for DOM tree structure\n private _parentMap = new Map<string, string | null>();\n\n /** When true, mirror elements use pointer-events: auto so DevTools element picker can select them. */\n private _inspectMode = false;\n\n /** Async materialization state for inspect mode */\n private _asyncQueue: string[] = [];\n private _asyncIdleHandle: number | null = null;\n private _asyncBatchSize = 200;\n\n constructor(store: ObjectStore, maxNodes = 2000) {\n this._store = store;\n this._maxNodes = maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Initialization\n // -------------------------------------------------------------------------\n\n /**\n * Set the root DOM element where the mirror tree will be appended.\n * Typically a hidden div: <div id=\"three-dom-root\" style=\"display:none\">\n */\n setRoot(rootElement: HTMLElement): void {\n this._rootElement = rootElement;\n }\n\n /**\n * Enable or disable \"inspect mode\". When turning on, kicks off async\n * chunked materialization so the full tree becomes browsable in the\n * Elements tab without blocking the main thread.\n *\n * At BIM scale (100k-200k objects) the old synchronous loop would freeze\n * the page for 2-10s. The new approach uses requestIdleCallback to\n * spread work across idle frames (~200 nodes per idle slice, ~5ms each).\n */\n setInspectMode(on: boolean): void {\n if (this._inspectMode === on) return;\n this._inspectMode = on;\n\n if (on) {\n this._startAsyncMaterialization();\n } else {\n this._cancelAsyncMaterialization();\n }\n\n r3fLog('inspect', 'setInspectMode', { on, nodeCount: this._nodes.size });\n }\n\n /** Whether inspect mode is currently enabled. */\n getInspectMode(): boolean {\n return this._inspectMode;\n }\n\n /**\n * Build the initial DOM tree from the scene.\n * Materializes the top 2 levels of the scene hierarchy.\n */\n buildInitialTree(scene: Object3D): void {\n if (!this._rootElement) return;\n this.materializeSubtree(scene.uuid, 2);\n }\n\n // -------------------------------------------------------------------------\n // Materialization\n // -------------------------------------------------------------------------\n\n /**\n * Create a DOM node for a single object.\n * If already materialized, touches the LRU and returns the existing element.\n */\n materialize(uuid: string): HTMLElement | null {\n // Already materialized — touch LRU and return\n const existing = this._nodes.get(uuid);\n if (existing) {\n this._lruTouch(existing.lruNode);\n return existing.element;\n }\n\n // Get metadata from the store\n const meta = this._store.getByUuid(uuid);\n if (!meta) return null;\n\n // Evict if at capacity\n if (this._lruSize >= this._maxNodes) {\n this._evictLRU();\n }\n\n // Create the custom element\n const tag = getTagForType(meta.type);\n const element = document.createElement(tag);\n\n element.style.cssText = 'display:contents;';\n\n // Apply all Tier 1 attributes\n const prevAttrs = new Map<string, string>();\n applyAttributes(element, meta, prevAttrs);\n\n // Create LRU node\n const lruNode: LRUNode = { uuid, prev: null, next: null };\n this._lruPush(lruNode);\n\n // Store the materialized node\n const node: MaterializedNode = { element, prevAttrs, lruNode };\n this._nodes.set(uuid, node);\n\n // Track parent for DOM structure\n this._parentMap.set(uuid, meta.parentUuid);\n\n // Insert into DOM tree\n this._insertIntoDom(uuid, meta.parentUuid, element);\n\n return element;\n }\n\n /**\n * Materialize a subtree starting from the given uuid, up to the specified depth.\n * depth=0 materializes just the node, depth=1 includes direct children, etc.\n */\n materializeSubtree(uuid: string, depth: number): void {\n this.materialize(uuid);\n\n if (depth <= 0) return;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return;\n\n for (const childUuid of meta.childrenUuids) {\n this.materializeSubtree(childUuid, depth - 1);\n }\n }\n\n /**\n * Remove a DOM node but keep JS metadata in the ObjectStore.\n * Called by LRU eviction or when an object is removed from the scene.\n * Also dematerializes any materialized descendants so they don't become\n * orphaned entries in the LRU / _nodes maps.\n */\n dematerialize(uuid: string): void {\n const node = this._nodes.get(uuid);\n if (!node) return;\n\n // Collect materialized descendants before removing the parent.\n // Walk _parentMap to find children whose parent is this uuid.\n const descendants = this._collectMaterializedDescendants(uuid);\n\n // Dematerialize descendants bottom-up (deepest first doesn't matter\n // since we're removing from maps, but process children before parent\n // avoids redundant DOM detach since parent.remove() already detaches them).\n for (const descUuid of descendants) {\n const descNode = this._nodes.get(descUuid);\n if (descNode) {\n this._lruRemove(descNode.lruNode);\n this._nodes.delete(descUuid);\n this._parentMap.delete(descUuid);\n }\n }\n\n // Remove the node itself\n node.element.remove();\n this._lruRemove(node.lruNode);\n this._nodes.delete(uuid);\n this._parentMap.delete(uuid);\n }\n\n /**\n * Collect all materialized descendants of a uuid by walking _parentMap.\n */\n private _collectMaterializedDescendants(parentUuid: string): string[] {\n const result: string[] = [];\n for (const [childUuid, pUuid] of this._parentMap) {\n if (pUuid === parentUuid) {\n result.push(childUuid);\n result.push(...this._collectMaterializedDescendants(childUuid));\n }\n }\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Structural updates (called by Object3D.add/remove patch)\n // -------------------------------------------------------------------------\n\n /**\n * Called when a new object is added to the tracked scene.\n * Only materializes if the parent is already materialized (lazy expansion).\n */\n onObjectAdded(obj: Object3D): void {\n const parentUuid = obj.parent?.uuid;\n if (!parentUuid) return;\n\n // Only materialize if parent is already visible in the DOM tree\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n this.materialize(obj.uuid);\n }\n\n // Update parent's children in DOM (add the new child)\n if (parentNode) {\n const parentMeta = this._store.getByUuid(parentUuid);\n if (parentMeta) {\n applyAttributes(parentNode.element, parentMeta, parentNode.prevAttrs);\n }\n }\n }\n\n /**\n * Called when an object is removed from the tracked scene.\n * Dematerializes the object and all its descendants.\n */\n onObjectRemoved(obj: Object3D): void {\n // Dematerialize entire subtree\n obj.traverse((child) => {\n this.dematerialize(child.uuid);\n });\n }\n\n // -------------------------------------------------------------------------\n // Attribute sync (called per-frame by ThreeDom)\n // -------------------------------------------------------------------------\n\n /**\n * Sync Tier 1 attributes for an object if it's materialized.\n * No-op if the object has no materialized DOM node.\n * Returns the number of DOM writes performed.\n */\n syncAttributes(obj: Object3D): number {\n const node = this._nodes.get(obj.uuid);\n if (!node) return 0;\n\n const meta = this._store.getMetadata(obj);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n /**\n * Sync attributes by uuid (when you don't have the Object3D ref).\n */\n syncAttributesByUuid(uuid: string): number {\n const node = this._nodes.get(uuid);\n if (!node) return 0;\n\n const meta = this._store.getByUuid(uuid);\n if (!meta) return 0;\n\n return applyAttributes(node.element, meta, node.prevAttrs);\n }\n\n // -------------------------------------------------------------------------\n // Querying\n // -------------------------------------------------------------------------\n\n /**\n * Get the root DOM element.\n */\n getRootElement(): HTMLElement | null {\n return this._rootElement;\n }\n\n /**\n * Get the materialized DOM element for an object, if it exists.\n */\n getElement(uuid: string): HTMLElement | null {\n const node = this._nodes.get(uuid);\n if (node) {\n this._lruTouch(node.lruNode);\n return node.element;\n }\n return null;\n }\n\n /**\n * Get or lazily materialize a DOM element for an object.\n * Also materializes the ancestor chain so the element is correctly\n * nested in the DOM tree. Used by InspectController so that\n * hover/click always produces a valid mirror element regardless\n * of whether async materialization has reached it yet.\n */\n getOrMaterialize(uuid: string): HTMLElement | null {\n const existing = this._nodes.get(uuid);\n if (existing) {\n this._lruTouch(existing.lruNode);\n return existing.element;\n }\n\n this._materializeAncestorChain(uuid);\n return this.materialize(uuid);\n }\n\n /**\n * Check if an object has a materialized DOM node.\n */\n isMaterialized(uuid: string): boolean {\n return this._nodes.has(uuid);\n }\n\n /**\n * Query the mirror DOM using a CSS selector.\n * Falls back to searching the ObjectStore if no materialized nodes match,\n * then materializes the matching objects.\n */\n querySelector(selector: string): HTMLElement | null {\n if (!this._rootElement) return null;\n\n // First try the already-materialized DOM\n const existing = this._rootElement.querySelector<HTMLElement>(selector);\n if (existing) return existing;\n\n // If not found, search by common patterns against the store\n const uuid = this._findUuidBySelector(selector);\n if (uuid) {\n return this.materialize(uuid);\n }\n\n return null;\n }\n\n /**\n * Query all matching elements in the mirror DOM.\n */\n querySelectorAll(selector: string): HTMLElement[] {\n if (!this._rootElement) return [];\n\n // Find all matching UUIDs from the store\n const uuids = this._findAllUuidsBySelector(selector);\n\n // Materialize each and collect elements\n const elements: HTMLElement[] = [];\n for (const uuid of uuids) {\n const el = this.materialize(uuid);\n if (el) elements.push(el);\n }\n\n return elements;\n }\n\n // -------------------------------------------------------------------------\n // Configuration\n // -------------------------------------------------------------------------\n\n /**\n * Set the maximum number of materialized DOM nodes.\n * If current count exceeds the new max, excess nodes are evicted immediately.\n */\n setMaxNodes(max: number): void {\n this._maxNodes = max;\n while (this._lruSize > this._maxNodes) {\n this._evictLRU();\n }\n }\n\n /** Current number of materialized DOM nodes. */\n getMaterializedCount(): number {\n return this._nodes.size;\n }\n\n /** Maximum allowed materialized DOM nodes. */\n getMaxNodes(): number {\n return this._maxNodes;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /**\n * Remove all materialized DOM nodes and reset state.\n */\n dispose(): void {\n this._cancelAsyncMaterialization();\n for (const [, node] of this._nodes) {\n node.element.remove();\n }\n this._nodes.clear();\n this._parentMap.clear();\n this._lruHead = null;\n this._lruTail = null;\n this._lruSize = 0;\n if (this._rootElement) {\n this._rootElement.innerHTML = '';\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: DOM insertion\n // -------------------------------------------------------------------------\n\n /**\n * Insert a newly created element into the correct position in the DOM tree.\n */\n private _insertIntoDom(\n _uuid: string,\n parentUuid: string | null,\n element: HTMLElement,\n ): void {\n if (!this._rootElement) return;\n\n if (!parentUuid) {\n // Root-level object (scene) — append to mirror root\n this._rootElement.appendChild(element);\n return;\n }\n\n // Try to find materialized parent\n const parentNode = this._nodes.get(parentUuid);\n if (parentNode) {\n parentNode.element.appendChild(element);\n } else {\n // Parent not materialized — append to mirror root as orphan\n // (will be reparented when parent is materialized)\n this._rootElement.appendChild(element);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Ancestor chain materialization\n // -------------------------------------------------------------------------\n\n /**\n * Materialize all ancestors of a uuid from root down, so the target\n * element will be correctly nested when materialized.\n */\n private _materializeAncestorChain(uuid: string): void {\n const chain: string[] = [];\n let currentUuid: string | null = uuid;\n\n while (currentUuid) {\n if (this._nodes.has(currentUuid)) break;\n const meta = this._store.getByUuid(currentUuid);\n if (!meta) break;\n chain.push(currentUuid);\n currentUuid = meta.parentUuid;\n }\n\n // Materialize from root-most ancestor down (skip the target itself)\n for (let i = chain.length - 1; i > 0; i--) {\n this.materialize(chain[i]);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Async chunked materialization for inspect mode\n // -------------------------------------------------------------------------\n\n private _startAsyncMaterialization(): void {\n this._cancelAsyncMaterialization();\n\n const flatList = this._store.getFlatList();\n this._asyncQueue = [];\n for (const obj of flatList) {\n if (obj.userData?.__r3fdom_internal) continue;\n if (this._nodes.has(obj.uuid)) continue;\n this._asyncQueue.push(obj.uuid);\n }\n\n if (this._asyncQueue.length === 0) return;\n\n r3fLog('inspect', `Async materialization started: ${this._asyncQueue.length} objects queued`);\n this._scheduleAsyncChunk();\n }\n\n private _cancelAsyncMaterialization(): void {\n if (this._asyncIdleHandle !== null) {\n if (typeof cancelIdleCallback === 'function') {\n cancelIdleCallback(this._asyncIdleHandle);\n } else {\n clearTimeout(this._asyncIdleHandle);\n }\n this._asyncIdleHandle = null;\n }\n this._asyncQueue = [];\n }\n\n private _scheduleAsyncChunk(): void {\n if (this._asyncQueue.length === 0) {\n this._asyncIdleHandle = null;\n r3fLog('inspect', `Async materialization complete: ${this._nodes.size} nodes materialized`);\n return;\n }\n\n const callback = (deadline?: IdleDeadline) => {\n const hasTimeRemaining = deadline\n ? () => deadline.timeRemaining() > 2\n : () => true;\n\n let processed = 0;\n while (\n this._asyncQueue.length > 0 &&\n processed < this._asyncBatchSize &&\n hasTimeRemaining()\n ) {\n const uuid = this._asyncQueue.shift()!;\n if (!this._nodes.has(uuid)) {\n this.materialize(uuid);\n }\n processed++;\n }\n\n this._scheduleAsyncChunk();\n };\n\n if (typeof requestIdleCallback === 'function') {\n this._asyncIdleHandle = requestIdleCallback(callback, { timeout: 100 }) as unknown as number;\n } else {\n this._asyncIdleHandle = setTimeout(callback, 16) as unknown as number;\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Selector → UUID resolution\n // -------------------------------------------------------------------------\n\n /**\n * Parse common CSS selector patterns and resolve to a uuid from the store.\n * Supports:\n * [data-test-id=\"value\"]\n * [data-name=\"value\"]\n * [data-uuid=\"value\"]\n * three-mesh, three-light, etc. (by tag/type)\n */\n private _findUuidBySelector(selector: string): string | null {\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-uuid=\"value\"]\n const uuidMatch = selector.match(/\\[data-uuid=[\"']([^\"']+)[\"']\\]/);\n if (uuidMatch) {\n const meta = this._store.getByUuid(uuidMatch[1]);\n return meta?.uuid ?? null;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n return metas.length > 0 ? metas[0].uuid : null;\n }\n\n return null;\n }\n\n /**\n * Find all UUIDs matching a selector pattern.\n */\n private _findAllUuidsBySelector(selector: string): string[] {\n const uuids: string[] = [];\n\n // [data-test-id=\"value\"]\n const testIdMatch = selector.match(/\\[data-test-id=[\"']([^\"']+)[\"']\\]/);\n if (testIdMatch) {\n const meta = this._store.getByTestId(testIdMatch[1]);\n if (meta) uuids.push(meta.uuid);\n return uuids;\n }\n\n // [data-name=\"value\"]\n const nameMatch = selector.match(/\\[data-name=[\"']([^\"']+)[\"']\\]/);\n if (nameMatch) {\n const metas = this._store.getByName(nameMatch[1]);\n for (const m of metas) uuids.push(m.uuid);\n return uuids;\n }\n\n // Tag-based: three-mesh, three-light, etc.\n // Resolve by iterating all objects and filtering by type\n const tagMatch = selector.match(/^(three-(?:scene|group|mesh|light|camera|object))$/);\n if (tagMatch) {\n const targetTag = tagMatch[1];\n const allObjects = this._store.getFlatList();\n for (const obj of allObjects) {\n const meta = this._store.getMetadata(obj);\n if (meta && getTagForType(meta.type) === targetTag) {\n uuids.push(meta.uuid);\n }\n }\n return uuids;\n }\n\n return uuids;\n }\n\n // -------------------------------------------------------------------------\n // Private: LRU doubly-linked list operations\n // -------------------------------------------------------------------------\n\n /** Add a node to the front (most recently used). */\n private _lruPush(node: LRUNode): void {\n node.prev = null;\n node.next = this._lruHead;\n if (this._lruHead) {\n this._lruHead.prev = node;\n }\n this._lruHead = node;\n if (!this._lruTail) {\n this._lruTail = node;\n }\n this._lruSize++;\n }\n\n /** Remove a node from the list. */\n private _lruRemove(node: LRUNode): void {\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n this._lruHead = node.next;\n }\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n this._lruTail = node.prev;\n }\n node.prev = null;\n node.next = null;\n this._lruSize--;\n }\n\n /** Move a node to the front (most recently used). */\n private _lruTouch(node: LRUNode): void {\n if (this._lruHead === node) return; // already at front\n this._lruRemove(node);\n this._lruPush(node);\n }\n\n /** Evict the least recently used node. */\n private _evictLRU(): void {\n if (!this._lruTail) return;\n const uuid = this._lruTail.uuid;\n this.dematerialize(uuid);\n }\n}\n","import { Object3D } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { DomMirror } from '../mirror/DomMirror';\nimport { r3fLog } from '../debug';\nimport { shouldRegister, ensureAncestorChain } from './ThreeDom';\n\n// ---------------------------------------------------------------------------\n// Object3D.add / Object3D.remove monkey-patch\n//\n// Intercepts structural changes (add/remove children) on Object3D so the\n// ObjectStore and DomMirror are updated instantly (event-driven, O(1) per\n// change) without requiring per-frame traversal.\n//\n// Scoping: only fires for objects that belong to a tracked scene.\n// This avoids interfering with other Three.js scenes on the same page.\n// ---------------------------------------------------------------------------\n\n/** Tracks whether the patch has been applied. */\nlet _patched = false;\n\n/** Original methods saved for restoration. */\nlet _originalAdd: typeof Object3D.prototype.add | null = null;\nlet _originalRemove: typeof Object3D.prototype.remove | null = null;\n\n/** Active store/mirror pairs (supports multiple tracked scenes). */\nconst _activePairs: Array<{ store: ObjectStore; mirror: DomMirror; instanceKey: string }> = [];\n\n/**\n * Find the store/mirror pair that tracks the scene containing this object.\n * Walks up the parent chain to check each ancestor against tracked roots.\n */\nfunction findTrackingPair(\n obj: Object3D,\n): { store: ObjectStore; mirror: DomMirror; instanceKey: string } | null {\n for (const pair of _activePairs) {\n if (pair.store.isInTrackedScene(obj)) {\n return pair;\n }\n }\n return null;\n}\n\n/**\n * Register an object and all its descendants into the store and mirror.\n * Respects the mode/filter settings for the instance.\n */\nfunction registerSubtree(\n obj: Object3D,\n store: ObjectStore,\n mirror: DomMirror,\n instanceKey: string,\n): void {\n obj.traverse((child) => {\n if (!store.has(child) && shouldRegister(instanceKey, child)) {\n ensureAncestorChain(child, store, mirror);\n store.register(child);\n mirror.onObjectAdded(child);\n }\n });\n}\n\n/**\n * Patch Object3D.prototype.add and Object3D.prototype.remove to intercept\n * structural changes for tracked scenes.\n *\n * @param store - The ObjectStore managing scene metadata\n * @param mirror - The DomMirror managing the parallel DOM tree\n * @returns A cleanup function that unregisters this store/mirror pair\n */\nexport function patchObject3D(\n store: ObjectStore,\n mirror: DomMirror,\n instanceKey = '',\n): () => void {\n // Register this store/mirror pair\n _activePairs.push({ store, mirror, instanceKey });\n\n // Only patch the prototype once (supports multiple store/mirror pairs)\n if (!_patched) {\n r3fLog('patch', 'Patching Object3D.prototype.add and .remove');\n _originalAdd = Object3D.prototype.add;\n _originalRemove = Object3D.prototype.remove;\n\n Object3D.prototype.add = function patchedAdd(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Call the original add first\n _originalAdd!.call(this, ...objects);\n\n // Check if this parent belongs to a tracked scene\n const pair = findTrackingPair(this);\n if (pair) {\n for (const obj of objects) {\n // Skip if it's the object adding itself (Three.js guard)\n if (obj === this) continue;\n try {\n r3fLog('patch', `patchedAdd: \"${obj.name || obj.type}\" added to \"${this.name || this.type}\"`);\n registerSubtree(obj, pair.store, pair.mirror, pair.instanceKey);\n } catch (err) {\n r3fLog('patch', `patchedAdd: failed to register \"${obj.name || obj.type}\"`, err);\n }\n }\n // Immediately update the parent's metadata (so childrenUuids is\n // current for any snapshot() call in the same frame) and also mark\n // it dirty for the DOM position sync on the next useFrame.\n pair.store.update(this);\n pair.store.markDirty(this);\n }\n\n return this;\n };\n\n Object3D.prototype.remove = function patchedRemove(\n this: Object3D,\n ...objects: Object3D[]\n ) {\n // Check tracking BEFORE removal (parent is still set)\n const pair = findTrackingPair(this);\n\n // Notify store/mirror before actual removal\n if (pair) {\n for (const obj of objects) {\n if (obj === this) continue;\n try {\n r3fLog('patch', `patchedRemove: \"${obj.name || obj.type}\" removed from \"${this.name || this.type}\"`);\n\n // Notify mirror first (it needs to traverse for DOM cleanup)\n pair.mirror.onObjectRemoved(obj);\n\n // Then unregister from store (traverses descendants)\n obj.traverse((child) => {\n pair.store.unregister(child);\n });\n } catch (err) {\n r3fLog('patch', `patchedRemove: failed to unregister \"${obj.name || obj.type}\"`, err);\n }\n }\n // Immediately update the parent's metadata (so childrenUuids is\n // current for any snapshot() call in the same frame) and also mark\n // it dirty for the DOM position sync on the next useFrame.\n pair.store.update(this);\n pair.store.markDirty(this);\n }\n\n // Call the original remove\n _originalRemove!.call(this, ...objects);\n\n return this;\n };\n\n _patched = true;\n }\n\n // Return cleanup function\n return () => {\n const idx = _activePairs.findIndex(\n (p) => p.store === store && p.mirror === mirror,\n );\n if (idx !== -1) {\n _activePairs.splice(idx, 1);\n }\n\n // If no more active pairs, restore original methods\n if (_activePairs.length === 0 && _patched) {\n restoreObject3D();\n }\n };\n}\n\n/**\n * Restore the original Object3D.prototype.add and remove methods.\n * Called automatically when the last store/mirror pair is removed.\n * Can also be called manually for testing.\n */\nexport function restoreObject3D(): void {\n if (!_patched) return;\n r3fLog('patch', 'Restoring original Object3D.prototype.add and .remove');\n\n if (_originalAdd) {\n Object3D.prototype.add = _originalAdd;\n _originalAdd = null;\n }\n if (_originalRemove) {\n Object3D.prototype.remove = _originalRemove;\n _originalRemove = null;\n }\n\n _patched = false;\n}\n\n/**\n * Check if Object3D prototype is currently patched.\n */\nexport function isPatched(): boolean {\n return _patched;\n}\n","import type { ObjectStore } from '../store/ObjectStore';\nimport type { ObjectMetadata, SceneSnapshot, SnapshotNode } from '../types';\n\n// ---------------------------------------------------------------------------\n// Snapshot: builds a structured JSON tree from the ObjectStore\n//\n// Reads exclusively from Tier 1 metadata — no Three.js object access,\n// no DOM reads. Cost scales linearly with object count but is cheap\n// since it's just Map lookups and object construction.\n// ---------------------------------------------------------------------------\n\n/**\n * Build a recursive SnapshotNode tree from a metadata entry.\n */\nfunction buildNodeTree(store: ObjectStore, meta: ObjectMetadata): SnapshotNode {\n const children: SnapshotNode[] = [];\n\n for (const childUuid of meta.childrenUuids) {\n const childMeta = store.getByUuid(childUuid);\n if (childMeta) {\n children.push(buildNodeTree(store, childMeta));\n }\n }\n\n const node: SnapshotNode = {\n uuid: meta.uuid,\n name: meta.name,\n type: meta.type,\n testId: meta.testId,\n visible: meta.visible,\n position: [...meta.position],\n rotation: [...meta.rotation],\n scale: [...meta.scale],\n children,\n };\n\n if (meta.geometryType) node.geometryType = meta.geometryType;\n if (meta.materialType) node.materialType = meta.materialType;\n if (meta.vertexCount != null) node.vertexCount = meta.vertexCount;\n if (meta.triangleCount != null) node.triangleCount = meta.triangleCount;\n if (meta.instanceCount != null) node.instanceCount = meta.instanceCount;\n\n return node;\n}\n\n/**\n * Find the root node (scene) in the store.\n * The root is the object whose parentUuid is null.\n */\nfunction findRoot(store: ObjectStore): ObjectMetadata | null {\n const allObjects = store.getFlatList();\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta && meta.parentUuid === null) {\n return meta;\n }\n }\n return null;\n}\n\n/**\n * Create a full scene snapshot from the ObjectStore.\n *\n * Returns a structured JSON tree built entirely from Tier 1 cached metadata.\n * No Three.js objects or DOM nodes are accessed.\n *\n * @example\n * ```ts\n * const snap = createSnapshot(store);\n * console.log(snap.objectCount); // 1234\n * console.log(snap.tree.children[0].name); // \"Furniture\"\n * ```\n */\nexport function createSnapshot(store: ObjectStore): SceneSnapshot {\n const rootMeta = findRoot(store);\n\n const tree: SnapshotNode = rootMeta\n ? buildNodeTree(store, rootMeta)\n : {\n uuid: '',\n name: 'empty',\n type: 'Scene',\n visible: true,\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n children: [],\n };\n\n return {\n timestamp: Date.now(),\n objectCount: store.getCount(),\n tree,\n };\n}\n\n/**\n * Create a flat snapshot — an array of all object metadata without tree structure.\n * Useful for searching/filtering without recursion.\n *\n * @example\n * ```ts\n * const flat = createFlatSnapshot(store);\n * const meshes = flat.objects.filter(m => m.type === 'Mesh');\n * ```\n */\nexport function createFlatSnapshot(store: ObjectStore): {\n timestamp: number;\n objectCount: number;\n objects: ObjectMetadata[];\n} {\n const objects: ObjectMetadata[] = [];\n const allObjects = store.getFlatList();\n\n for (const obj of allObjects) {\n const meta = store.getMetadata(obj);\n if (meta) {\n objects.push({ ...meta });\n }\n }\n\n return {\n timestamp: Date.now(),\n objectCount: objects.length,\n objects,\n };\n}\n","/**\n * @module projection\n *\n * Projects Three.js objects from world space to screen-space CSS pixel\n * coordinates using a multi-strategy approach (bbox center → face centers →\n * corners → origin fallback). Also provides frustum visibility checks and\n * screen-to-world conversion for drag deltas. Core utility used by all\n * interaction modules to determine where to dispatch synthetic events.\n */\nimport {\n Object3D,\n Camera,\n Vector3,\n Box3,\n Frustum,\n Matrix4,\n} from 'three';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Screen-space coordinates in CSS pixels relative to the canvas. */\nexport interface ScreenPoint {\n /** X coordinate in CSS pixels, left = 0. */\n x: number;\n /** Y coordinate in CSS pixels, top = 0. */\n y: number;\n}\n\n/** Canvas dimensions in CSS pixels. */\nexport interface CanvasSize {\n width: number;\n height: number;\n}\n\n/** Result of a projection attempt. */\nexport interface ProjectionResult {\n /** The screen-space point (CSS pixels relative to the canvas element). */\n point: ScreenPoint;\n /** Which strategy produced the result. */\n strategy: 'center' | 'corner' | 'face-center' | 'fallback-origin';\n /** NDC coordinates (-1..+1 range) for the projected point. */\n ndc: { x: number; y: number };\n}\n\n// ---------------------------------------------------------------------------\n// Reusable temporaries (avoids GC pressure in hot paths)\n// ---------------------------------------------------------------------------\n\nconst _vec3 = /* @__PURE__ */ new Vector3();\nconst _vec3B = /* @__PURE__ */ new Vector3();\nconst _box3 = /* @__PURE__ */ new Box3();\nconst _frustum = /* @__PURE__ */ new Frustum();\nconst _projMatrix = /* @__PURE__ */ new Matrix4();\n\n// ---------------------------------------------------------------------------\n// NDC → screen helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a Vector3 in NDC (after `vector.project(camera)`) to CSS-pixel\n * coordinates relative to the canvas.\n *\n * NDC convention: x ∈ [-1, +1], y ∈ [-1, +1], z ∈ [-1, +1]\n * Screen convention: x ∈ [0, width], y ∈ [0, height] (top-left origin)\n */\nfunction ndcToScreen(ndc: Vector3, size: CanvasSize): ScreenPoint {\n return {\n x: ((ndc.x + 1) / 2) * size.width,\n y: ((-ndc.y + 1) / 2) * size.height,\n };\n}\n\n/**\n * Returns true if the NDC coordinate is within the visible viewport.\n * Z check: z ∈ (-1, 1) means in front of camera and within far plane.\n */\nfunction isNdcOnScreen(ndc: Vector3): boolean {\n return (\n ndc.x >= -1 && ndc.x <= 1 &&\n ndc.y >= -1 && ndc.y <= 1 &&\n ndc.z >= -1 && ndc.z <= 1\n );\n}\n\n/**\n * Returns true if the NDC coordinate is in front of the camera.\n * After `vector.project(camera)`, z < 1 means in front of the camera.\n * A point behind the camera gets z > 1.\n */\nfunction isInFrontOfCamera(ndc: Vector3): boolean {\n return ndc.z >= -1 && ndc.z <= 1;\n}\n\n// ---------------------------------------------------------------------------\n// Candidate point generators\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the world-space bounding box center of an Object3D.\n * Falls back to the object's world position if the bbox is empty.\n */\nfunction getWorldCenter(obj: Object3D): Vector3 {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _vec3;\n }\n _box3.getCenter(_vec3);\n return _vec3;\n}\n\n/**\n * Get the 8 corners of the world-space bounding box.\n * Returns an empty array if the bbox is degenerate.\n */\nfunction getBboxCorners(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const { min, max } = _box3;\n return [\n new Vector3(min.x, min.y, min.z),\n new Vector3(min.x, min.y, max.z),\n new Vector3(min.x, max.y, min.z),\n new Vector3(min.x, max.y, max.z),\n new Vector3(max.x, min.y, min.z),\n new Vector3(max.x, min.y, max.z),\n new Vector3(max.x, max.y, min.z),\n new Vector3(max.x, max.y, max.z),\n ];\n}\n\n/**\n * Get the 6 face centers of the world-space bounding box.\n * These are better click targets than corners for many geometries.\n */\nfunction getBboxFaceCenters(obj: Object3D): Vector3[] {\n _box3.setFromObject(obj);\n if (_box3.isEmpty()) return [];\n\n const center = _box3.getCenter(new Vector3());\n const { min, max } = _box3;\n\n return [\n new Vector3(min.x, center.y, center.z), // -X face\n new Vector3(max.x, center.y, center.z), // +X face\n new Vector3(center.x, min.y, center.z), // -Y face\n new Vector3(center.x, max.y, center.z), // +Y face\n new Vector3(center.x, center.y, min.z), // -Z face\n new Vector3(center.x, center.y, max.z), // +Z face\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Core projection\n// ---------------------------------------------------------------------------\n\n/**\n * Try to project a single world-space point to screen coordinates.\n * Returns null if the point is behind the camera.\n */\nfunction tryProjectPoint(\n worldPoint: Vector3,\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number }; ndcZ: number; onScreen: boolean } | null {\n // Clone to avoid mutating the input\n _vec3B.copy(worldPoint).project(camera);\n\n if (!isInFrontOfCamera(_vec3B)) return null;\n\n const screen = ndcToScreen(_vec3B, size);\n return {\n screen,\n ndc: { x: _vec3B.x, y: _vec3B.y },\n ndcZ: _vec3B.z,\n onScreen: isNdcOnScreen(_vec3B),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Project a 3D object to screen coordinates using a multi-strategy approach:\n *\n * 1. **Center**: Try the bounding box center (most natural click target).\n * 2. **Face centers**: Try the 6 face centers (better for large/flat objects).\n * 3. **Corners**: Try the 8 bbox corners (catches partially visible objects).\n * 4. **Fallback origin**: Try the object's world position (lights, empty groups).\n *\n * For each strategy, we prefer points that are both on-screen AND closest to\n * the viewport center (most reliable for event dispatch).\n *\n * Returns `null` if no part of the object is visible on screen.\n */\nexport function projectToScreen(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ProjectionResult | null {\n // Ensure world matrices are up to date\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n // Strategy 1: Bounding box center\n const center = getWorldCenter(obj);\n const centerResult = tryProjectPoint(center, camera, size);\n\n if (centerResult && centerResult.onScreen) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Strategy 2: Face centers — better fallback for large objects\n const faceCenters = getBboxFaceCenters(obj);\n const faceResult = findBestOnScreenPoint(faceCenters, camera, size);\n if (faceResult) {\n return {\n point: faceResult.screen,\n strategy: 'face-center',\n ndc: faceResult.ndc,\n };\n }\n\n // Strategy 3: Bbox corners — catches partially visible objects\n const corners = getBboxCorners(obj);\n const cornerResult = findBestOnScreenPoint(corners, camera, size);\n if (cornerResult) {\n return {\n point: cornerResult.screen,\n strategy: 'corner',\n ndc: cornerResult.ndc,\n };\n }\n\n // Strategy 4: Fallback to world position (lights, helpers, empty groups)\n obj.getWorldPosition(_vec3);\n const originResult = tryProjectPoint(_vec3.clone(), camera, size);\n if (originResult && originResult.onScreen) {\n return {\n point: originResult.screen,\n strategy: 'fallback-origin',\n ndc: originResult.ndc,\n };\n }\n\n // If center projected but was off-screen, still return it as a best-effort\n // (useful for drag targets that are partially off-screen)\n if (centerResult) {\n return {\n point: centerResult.screen,\n strategy: 'center',\n ndc: centerResult.ndc,\n };\n }\n\n // Object is entirely behind the camera or degenerate\n return null;\n}\n\n/**\n * From a list of candidate world-space points, find the one that projects\n * on-screen and is closest to the viewport center (most reliable dispatch).\n */\nfunction findBestOnScreenPoint(\n candidates: Vector3[],\n camera: Camera,\n size: CanvasSize,\n): { screen: ScreenPoint; ndc: { x: number; y: number } } | null {\n let bestResult: { screen: ScreenPoint; ndc: { x: number; y: number } } | null = null;\n let bestDistSq = Infinity;\n const halfW = size.width / 2;\n const halfH = size.height / 2;\n\n for (const point of candidates) {\n const result = tryProjectPoint(point, camera, size);\n if (!result || !result.onScreen) continue;\n\n // Distance from viewport center — prefer more central points\n const dx = result.screen.x - halfW;\n const dy = result.screen.y - halfH;\n const distSq = dx * dx + dy * dy;\n\n if (distSq < bestDistSq) {\n bestDistSq = distSq;\n bestResult = { screen: result.screen, ndc: result.ndc };\n }\n }\n\n return bestResult;\n}\n\n// ---------------------------------------------------------------------------\n// Frustum visibility check\n// ---------------------------------------------------------------------------\n\n/**\n * Check whether any part of an Object3D is within the camera frustum.\n * Uses the bounding box intersection test (fast, conservative).\n */\nexport function isInFrustum(obj: Object3D, camera: Camera): boolean {\n camera.updateWorldMatrix(true, false);\n obj.updateWorldMatrix(true, false);\n\n _projMatrix.multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n _frustum.setFromProjectionMatrix(_projMatrix);\n\n _box3.setFromObject(obj);\n\n // Empty bbox (lights, empties) — fall back to position check\n if (_box3.isEmpty()) {\n obj.getWorldPosition(_vec3);\n return _frustum.containsPoint(_vec3);\n }\n\n return _frustum.intersectsBox(_box3);\n}\n\n// ---------------------------------------------------------------------------\n// Screen-to-world projection (for drag deltas)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a screen-space delta (CSS pixels) to a world-space displacement\n * vector on the plane perpendicular to the camera at the given depth.\n *\n * Used by drag3D to convert pixel movements to 3D movements that feel\n * natural regardless of camera position/zoom.\n */\nexport function screenDeltaToWorld(\n dx: number,\n dy: number,\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): Vector3 {\n // Get the object's depth in NDC\n obj.getWorldPosition(_vec3);\n _vec3.project(camera);\n const depth = _vec3.z;\n\n // Unproject two points at the same depth to get world-space scale\n const start = new Vector3(0, 0, depth).unproject(camera);\n const right = new Vector3(2 / size.width, 0, depth).unproject(camera);\n const up = new Vector3(0, -2 / size.height, depth).unproject(camera);\n\n // World-space pixels per CSS pixel\n const rightDir = right.sub(start);\n const upDir = up.sub(start);\n\n return new Vector3()\n .addScaledVector(rightDir, dx)\n .addScaledVector(upDir, dy);\n}\n\n// ---------------------------------------------------------------------------\n// Multi-point projection (for assertions / testing)\n// ---------------------------------------------------------------------------\n\n/**\n * Project multiple sample points of an object to screen space.\n * Returns all on-screen points, useful for assertions like\n * \"object covers at least 50px² of screen area\".\n */\nexport function projectAllSamplePoints(\n obj: Object3D,\n camera: Camera,\n size: CanvasSize,\n): ScreenPoint[] {\n obj.updateWorldMatrix(true, false);\n camera.updateWorldMatrix(true, false);\n\n const points: ScreenPoint[] = [];\n\n // Collect all candidate world-space points\n const candidates: Vector3[] = [];\n\n // Center\n candidates.push(getWorldCenter(obj).clone());\n\n // Face centers\n candidates.push(...getBboxFaceCenters(obj));\n\n // Corners\n candidates.push(...getBboxCorners(obj));\n\n // Project each\n for (const wsPt of candidates) {\n const result = tryProjectPoint(wsPt, camera, size);\n if (result && result.onScreen) {\n points.push(result.screen);\n }\n }\n\n return points;\n}\n","/**\n * @module dispatch\n *\n * Low-level synthetic PointerEvent/MouseEvent/WheelEvent dispatch on the\n * canvas element. Produces the exact DOM event sequences that R3F's internal\n * event system expects (e.g. pointerdown → pointerup → click). All higher-level\n * interaction modules (click3D, hover3D, drag3D, etc.) delegate here.\n */\nimport type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// Synthetic PointerEvent dispatch\n//\n// Dispatches DOM events on the canvas element at the projected screen\n// coordinates, matching the exact sequence that a real browser interaction\n// would produce. R3F's event system listens on the canvas, so these\n// synthetic events flow through the full pointer → raycaster pipeline.\n// ---------------------------------------------------------------------------\n\n/** Monotonically increasing pointer ID for synthetic events. */\nlet _nextPointerId = 1000;\n\n/** Get a fresh pointerId for each interaction sequence. */\nfunction allocPointerId(): number {\n return _nextPointerId++;\n}\n\n/**\n * Compute clientX/clientY from a canvas-relative ScreenPoint.\n * Events need clientX/clientY (relative to viewport), not the canvas.\n */\nfunction toClientCoords(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): { clientX: number; clientY: number } {\n const rect = canvas.getBoundingClientRect();\n return {\n clientX: rect.left + point.x,\n clientY: rect.top + point.y,\n };\n}\n\n/**\n * Build a PointerEvent init object with correct coordinates and metadata.\n */\nfunction makePointerInit(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n pointerId: number,\n overrides?: Partial<PointerEventInit>,\n): PointerEventInit {\n const { clientX, clientY } = toClientCoords(canvas, point);\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX,\n clientY,\n screenX: clientX,\n screenY: clientY,\n pointerId,\n pointerType: 'mouse',\n isPrimary: true,\n button: 0,\n buttons: 1,\n width: 1,\n height: 1,\n pressure: 0.5,\n ...overrides,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click\n *\n * This matches what R3F's event system expects. The canvas is the event\n * target because R3F attaches its listeners to the canvas element.\n */\nexport function dispatchClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 0,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Hover sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a hover sequence on the canvas at the given screen point.\n *\n * Sequence: pointermove → pointerover → pointerenter\n *\n * R3F translates pointermove into onPointerMove/onPointerOver/onPointerEnter\n * via its internal raycaster. We dispatch the raw DOM events and let R3F\n * do the rest.\n */\nexport function dispatchHover(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n const pointerId = allocPointerId();\n const init = makePointerInit(canvas, point, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerover', init));\n canvas.dispatchEvent(new PointerEvent('pointerenter', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Drag sequence\n// ---------------------------------------------------------------------------\n\n/** Options for a drag interaction. */\nexport interface DragOptions {\n /** Number of intermediate pointermove steps. Default: 10 */\n steps?: number;\n /** Delay between steps in ms (for requestAnimationFrame pacing). Default: 0 */\n stepDelayMs?: number;\n}\n\n/**\n * Dispatch a full drag sequence from `start` to `end` on the canvas.\n *\n * Sequence: pointerdown → N × pointermove (interpolated) → pointerup\n *\n * Returns a Promise that resolves when the drag is complete.\n * The async nature allows optional frame-pacing via stepDelayMs.\n */\nexport async function dispatchDrag(\n canvas: HTMLCanvasElement,\n start: ScreenPoint,\n end: ScreenPoint,\n options: DragOptions = {},\n): Promise<void> {\n const { steps = 10, stepDelayMs = 0 } = options;\n const pointerId = allocPointerId();\n\n // Pointer down at start\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, start, pointerId)),\n );\n });\n\n // Interpolate intermediate moves\n for (let i = 1; i <= steps; i++) {\n const t = i / steps;\n const intermediate: ScreenPoint = {\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n };\n\n if (stepDelayMs > 0) {\n await sleep(stepDelayMs);\n }\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointermove',\n makePointerInit(canvas, intermediate, pointerId),\n ),\n );\n }\n\n // Pointer up at end\n withSafePointerCapture(() => {\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, end, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Double-click sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a full double-click sequence on the canvas at the given screen point.\n *\n * Sequence: pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * R3F translates the `dblclick` DOM event into `onDoubleClick` on the hit object.\n */\nexport function dispatchDoubleClick(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n const coords = toClientCoords(canvas, point);\n\n // First click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 1,\n }),\n );\n\n // Second click\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makePointerInit(canvas, point, pointerId)),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, { buttons: 0, pressure: 0 }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n\n // dblclick\n canvas.dispatchEvent(\n new MouseEvent('dblclick', {\n bubbles: true,\n cancelable: true,\n ...coords,\n button: 0,\n detail: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Context menu (right-click) sequence\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a right-click / context menu sequence on the canvas.\n *\n * Sequence: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * R3F translates the `contextmenu` DOM event into `onContextMenu`.\n */\nexport function dispatchContextMenu(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n): void {\n withSafePointerCapture(() => {\n const pointerId = allocPointerId();\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerdown',\n makePointerInit(canvas, point, pointerId, { button: 2, buttons: 2 }),\n ),\n );\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makePointerInit(canvas, point, pointerId, {\n button: 2,\n buttons: 0,\n pressure: 0,\n }),\n ),\n );\n canvas.dispatchEvent(\n new MouseEvent('contextmenu', {\n bubbles: true,\n cancelable: true,\n ...toClientCoords(canvas, point),\n button: 2,\n }),\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Wheel event\n// ---------------------------------------------------------------------------\n\n/** Options for a wheel dispatch. */\nexport interface WheelOptions {\n /** Vertical scroll delta (positive = scroll down). Default: 100 */\n deltaY?: number;\n /** Horizontal scroll delta. Default: 0 */\n deltaX?: number;\n /** DOM_DELTA_PIXEL (0), DOM_DELTA_LINE (1), or DOM_DELTA_PAGE (2). Default: 0 */\n deltaMode?: number;\n}\n\n/**\n * Dispatch a wheel event on the canvas at the given screen point.\n *\n * R3F translates the `wheel` DOM event into `onWheel` on the hit object.\n */\nexport function dispatchWheel(\n canvas: HTMLCanvasElement,\n point: ScreenPoint,\n options: WheelOptions = {},\n): void {\n const { deltaY = 100, deltaX = 0, deltaMode = 0 } = options;\n const coords = toClientCoords(canvas, point);\n\n canvas.dispatchEvent(\n new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n ...coords,\n deltaX,\n deltaY,\n deltaZ: 0,\n deltaMode,\n }),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pointer miss (click on empty space)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch a click on the canvas at a point where no meshes are present.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler when\n * a click lands on empty space. This dispatches a click at a configurable\n * point (default: top-left corner, which is very unlikely to hit a mesh).\n *\n * @param canvas The canvas element\n * @param point Optional specific screen point. Default: { x: 1, y: 1 }\n */\nexport function dispatchPointerMiss(\n canvas: HTMLCanvasElement,\n point: ScreenPoint = { x: 1, y: 1 },\n): void {\n dispatchClick(canvas, point);\n}\n\n// ---------------------------------------------------------------------------\n// Unhover (pointer leave)\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatch an unhover sequence — moves the pointer off-canvas.\n * Useful for cleaning up hover state between interactions.\n */\nexport function dispatchUnhover(canvas: HTMLCanvasElement): void {\n const pointerId = allocPointerId();\n const offScreen: ScreenPoint = { x: -9999, y: -9999 };\n const init = makePointerInit(canvas, offScreen, pointerId, {\n buttons: 0,\n pressure: 0,\n });\n\n canvas.dispatchEvent(new PointerEvent('pointermove', init));\n canvas.dispatchEvent(new PointerEvent('pointerout', init));\n canvas.dispatchEvent(new PointerEvent('pointerleave', { ...init, bubbles: false }));\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Guard against `releasePointerCapture` throwing when no pointer capture\n * is active. Libraries like @react-three/drei register global pointerup\n * handlers that call `releasePointerCapture`, which throws a `NotFoundError`\n * when the pointer was never captured (as with our synthetic events).\n *\n * This wrapper patches `Element.prototype.releasePointerCapture` for the\n * duration of `fn()` so that the `NotFoundError` is silently swallowed.\n */\nfunction withSafePointerCapture<T>(fn: () => T): T {\n const original = Element.prototype.releasePointerCapture;\n Element.prototype.releasePointerCapture = function safeRelease(\n this: Element,\n pointerId: number,\n ) {\n try {\n original.call(this, pointerId);\n } catch {\n // Swallow NotFoundError — no active pointer with the given id\n }\n };\n try {\n return fn();\n } finally {\n Element.prototype.releasePointerCapture = original;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * @module raycastVerify\n *\n * Post-dispatch raycast verification for interaction modules. After a synthetic\n * event is dispatched at projected screen coordinates, casts a ray to confirm\n * the intended object is actually the frontmost hit. Reports occlusion with\n * the identity of the occluding object for clear error messages.\n */\nimport {\n Raycaster,\n Vector2,\n Object3D,\n Camera,\n Scene,\n} from 'three';\nimport type { ScreenPoint, CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Raycast hit verification\n//\n// After dispatching a synthetic event at projected screen coordinates,\n// cast a ray to verify the intended object is actually the first hit.\n// This catches occlusion and provides clear error messages.\n// ---------------------------------------------------------------------------\n\nconst _raycaster = /* @__PURE__ */ new Raycaster();\nconst _ndc = /* @__PURE__ */ new Vector2();\n\n/** Result of a raycast verification. */\nexport interface RaycastResult {\n /** Whether the intended object was hit. */\n hit: boolean;\n /** If not hit, the object that was hit instead (occluder). */\n occluder?: Object3D;\n /** Name or testId of the occluder, for error messages. */\n occluderLabel?: string;\n}\n\n/**\n * Convert a screen-space point to NDC coordinates for raycasting.\n */\nfunction screenToNdc(point: ScreenPoint, size: CanvasSize): Vector2 {\n _ndc.set(\n (point.x / size.width) * 2 - 1,\n -(point.y / size.height) * 2 + 1,\n );\n return _ndc;\n}\n\n/**\n * Get a human-readable label for an Object3D (for error messages).\n */\nfunction getObjectLabel(obj: Object3D): string {\n const testId = obj.userData?.testId;\n if (testId) return `testId=\"${testId}\"`;\n if (obj.name) return `name=\"${obj.name}\"`;\n return `uuid=\"${obj.uuid.slice(0, 8)}…\"`;\n}\n\n/**\n * Walk up the parent chain to check if `candidate` is the target or\n * a descendant of the target. This is needed because raycaster returns\n * the specific sub-mesh (e.g. a merged geometry child) rather than\n * the logical parent group.\n */\nfunction isTargetOrDescendant(candidate: Object3D, target: Object3D): boolean {\n let current: Object3D | null = candidate;\n while (current) {\n if (current === target) return true;\n current = current.parent;\n }\n return false;\n}\n\n/**\n * Find the scene root by walking up the parent chain.\n */\nfunction findScene(obj: Object3D): Scene | null {\n let current: Object3D | null = obj;\n while (current) {\n if ((current as Scene).isScene) return current as Scene;\n current = current.parent;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Verify that a raycast from the given screen point hits the intended object.\n *\n * Returns a RaycastResult indicating success or failure with details about\n * what was hit instead (for useful error messages).\n *\n * @param point Screen-space coordinates (CSS pixels relative to canvas)\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHit(\n point: ScreenPoint,\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n const scene = findScene(target);\n if (!scene) {\n return { hit: false, occluderLabel: 'object not in scene' };\n }\n\n const ndc = screenToNdc(point, size);\n _raycaster.setFromCamera(ndc, camera);\n\n // Raycast against the entire scene\n const intersections = _raycaster.intersectObjects(scene.children, true);\n\n if (intersections.length === 0) {\n // No hits at all — object might be transparent, or a light/helper\n // For non-mesh objects (lights, cameras), this is expected\n return { hit: true };\n }\n\n // Check if the first hit is our target (or a child of our target)\n const firstHit = intersections[0].object;\n if (isTargetOrDescendant(firstHit, target)) {\n return { hit: true };\n }\n\n // Check if our target appears anywhere in the intersections\n // (it might be behind something but still hit)\n const targetHit = intersections.find((i) =>\n isTargetOrDescendant(i.object, target),\n );\n\n if (targetHit) {\n // Target was hit but is behind another object\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n }\n\n // Target was not hit at all at this point\n return {\n hit: false,\n occluder: firstHit,\n occluderLabel: getObjectLabel(firstHit),\n };\n}\n\n/**\n * Verify a hit, trying multiple sample points if the first fails.\n * This is more robust than single-point verification for objects\n * that are partially occluded.\n *\n * @param points Array of screen-space points to try\n * @param target The intended Object3D to hit\n * @param camera The active camera\n * @param size Canvas size in CSS pixels\n */\nexport function verifyRaycastHitMultiPoint(\n points: ScreenPoint[],\n target: Object3D,\n camera: Camera,\n size: CanvasSize,\n): RaycastResult {\n let lastResult: RaycastResult = { hit: false };\n\n for (const point of points) {\n const result = verifyRaycastHit(point, target, camera, size);\n if (result.hit) return result;\n lastResult = result;\n }\n\n return lastResult;\n}\n","/**\n * @module resolve\n *\n * Shared resolution helpers for all interaction modules. Caches references\n * to the current ObjectStore, Camera, WebGLRenderer, and canvas size (set\n * by ThreeDom each frame) so interaction functions can resolve objects and\n * access rendering state without prop-drilling.\n */\nimport type { Object3D, Camera, WebGLRenderer } from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport type { CanvasSize } from './projection';\n\n// ---------------------------------------------------------------------------\n// Shared resolution helpers for interaction modules\n// ---------------------------------------------------------------------------\n\n/** Cached references to the current R3F state (set by ThreeDom). */\nlet _store: ObjectStore | null = null;\nlet _camera: Camera | null = null;\nlet _gl: WebGLRenderer | null = null;\nlet _size: CanvasSize | null = null;\n\n/**\n * Set the current R3F state references. Called by ThreeDom during setup\n * and on every frame to keep camera/size current.\n */\nexport function setInteractionState(\n store: ObjectStore,\n camera: Camera,\n gl: WebGLRenderer,\n size: CanvasSize,\n): void {\n _store = store;\n _camera = camera;\n _gl = gl;\n _size = size;\n}\n\n/** Clear all interaction state (called on cleanup). */\nexport function clearInteractionState(): void {\n _store = null;\n _camera = null;\n _gl = null;\n _size = null;\n}\n\n/** Get the current store, or throw if not initialized. */\nexport function getStore(): ObjectStore {\n if (!_store) {\n throw new Error(\n '[react-three-dom] Interaction state not initialized. Is <ThreeDom> mounted?',\n );\n }\n return _store;\n}\n\n/** Get the current camera, or throw. */\nexport function getCamera(): Camera {\n if (!_camera) {\n throw new Error(\n '[react-three-dom] Camera not available. Is <ThreeDom> mounted?',\n );\n }\n return _camera;\n}\n\n/** Get the current WebGL renderer, or throw. */\nexport function getRenderer(): WebGLRenderer {\n if (!_gl) {\n throw new Error(\n '[react-three-dom] Renderer not available. Is <ThreeDom> mounted?',\n );\n }\n return _gl;\n}\n\n/** Get the current canvas size, or throw. */\nexport function getCanvasSize(): CanvasSize {\n if (!_size) {\n throw new Error(\n '[react-three-dom] Canvas size not available. Is <ThreeDom> mounted?',\n );\n }\n return _size;\n}\n\n/**\n * Resolve a testId or uuid to a live Object3D reference.\n * Throws a descriptive error if the object is not found.\n */\nexport function resolveObject(idOrUuid: string): Object3D {\n const store = getStore();\n const obj = store.getObject3D(idOrUuid);\n if (!obj) {\n throw new Error(\n `[react-three-dom] Object \"${idOrUuid}\" not found. ` +\n `Check that the object has userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\".`,\n );\n }\n return obj;\n}\n","/**\n * @module click\n *\n * Deterministic click, double-click, and context-menu interactions on 3D objects.\n * Resolves an object by testId/uuid, projects it to screen space, dispatches\n * synthetic pointer events on the canvas, and optionally verifies the hit via\n * raycasting to detect occlusion.\n */\nimport { projectToScreen } from './projection';\nimport { dispatchClick, dispatchDoubleClick, dispatchContextMenu } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// click3D — deterministic click on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointerdown → pointerup → click on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for click3D. */\nexport interface Click3DOptions {\n /**\n * Whether to verify the click hit via raycast.\n * Set to false for non-mesh objects (lights, cameras, groups).\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a click3D operation. */\nexport interface Click3DResult {\n /** Whether the click was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the click was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically click a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic click event\n * on the canvas at the projected coordinates, and optionally verifies\n * the click hit the intended object via raycasting.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Click options\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // From the global API\n * window.__R3F_DOM__.click('chair-primary');\n *\n * // With verification disabled (for lights, cameras)\n * click3D('sun-light', { verify: false });\n * ```\n */\nexport function click3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('click', `click3D(\"${idOrUuid}\") — resolving projection`);\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] click3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch click on canvas\n const canvas = gl.domElement;\n dispatchClick(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] click3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead. ` +\n `The object may be occluded.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// doubleClick3D — deterministic double-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically double-click a 3D object by its testId or uuid.\n *\n * Dispatches the full double-click sequence:\n * pointerdown → pointerup → click → pointerdown → pointerup → click → dblclick\n *\n * Triggers R3F's `onDoubleClick` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function doubleClick3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchDoubleClick(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] doubleClick3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n// ---------------------------------------------------------------------------\n// contextMenu3D — deterministic right-click on a 3D object\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatically right-click a 3D object by its testId or uuid.\n *\n * Dispatches: pointerdown (button=2) → pointerup (button=2) → contextmenu\n *\n * Triggers R3F's `onContextMenu` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Same options as click3D\n * @returns Click result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n */\nexport function contextMenu3D(\n idOrUuid: string,\n options: Click3DOptions = {},\n): Click3DResult {\n const { verify = true } = options;\n\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchContextMenu(canvas, projection.point);\n\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] contextMenu3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","/**\n * @module hover\n *\n * Deterministic hover and unhover interactions on 3D objects. Projects the\n * target object to screen space and dispatches synthetic pointermove/pointerover\n * events on the canvas, triggering R3F's onPointerOver/onPointerEnter handlers.\n */\nimport { projectToScreen } from './projection';\nimport { dispatchHover, dispatchUnhover } from './dispatch';\nimport { verifyRaycastHit } from './raycastVerify';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { RaycastResult } from './raycastVerify';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// hover3D — deterministic hover on a 3D object\n//\n// 1. Resolve the object by testId or uuid\n// 2. Project its center to screen coordinates\n// 3. Dispatch pointermove → pointerover → pointerenter on the canvas\n// 4. Verify the raycast hit (optional)\n// ---------------------------------------------------------------------------\n\n/** Options for hover3D. */\nexport interface Hover3DOptions {\n /**\n * Whether to verify the hover hit via raycast.\n * Default: true\n */\n verify?: boolean;\n}\n\n/** Result of a hover3D operation. */\nexport interface Hover3DResult {\n /** Whether the hover was dispatched. Always true if no error thrown. */\n dispatched: true;\n /** Raycast verification result (only if verify: true). */\n raycast?: RaycastResult;\n /** The screen point where the hover was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically hover over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space, dispatches a synthetic hover event\n * sequence on the canvas, and optionally verifies the hit.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Hover options\n * @returns Hover result with dispatch and verification info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * window.__R3F_DOM__.hover('chair-primary');\n * ```\n */\nexport function hover3D(\n idOrUuid: string,\n options: Hover3DOptions = {},\n): Hover3DResult {\n const { verify = true } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('hover', `hover3D(\"${idOrUuid}\") — resolving projection`);\n\n // 2. Project to screen\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] hover3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n // 3. Dispatch hover on canvas\n const canvas = gl.domElement;\n dispatchHover(canvas, projection.point);\n\n // 4. Optional raycast verification\n let raycast: RaycastResult | undefined;\n if (verify) {\n raycast = verifyRaycastHit(projection.point, obj, camera, size);\n if (!raycast.hit && raycast.occluderLabel) {\n console.warn(\n `[react-three-dom] hover3D(\"${idOrUuid}\") dispatched at ` +\n `(${Math.round(projection.point.x)}, ${Math.round(projection.point.y)}) ` +\n `but raycast hit ${raycast.occluderLabel} instead.`,\n );\n }\n }\n\n return {\n dispatched: true,\n raycast,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Clear hover state by moving the pointer off-canvas.\n * Call between hover/click interactions to reset R3F's internal pointer state.\n */\nexport function unhover3D(): void {\n const gl = getRenderer();\n dispatchUnhover(gl.domElement);\n}\n","/**\n * @module drag\n *\n * Deterministic drag interactions on 3D objects. Supports world-space deltas\n * (move N units along an axis) and screen-space deltas (move N pixels).\n * Projects start/end points and dispatches a full pointerdown → pointermove × N\n * → pointerup sequence on the canvas.\n */\nimport { Vector3 } from 'three';\nimport { projectToScreen, screenDeltaToWorld } from './projection';\nimport { dispatchDrag, type DragOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// drag3D — deterministic drag on a 3D object\n//\n// Supports two modes:\n// 1. World-space delta: drag by { x, y, z } in world units\n// 2. Screen-space delta: drag by { dx, dy } in CSS pixels\n//\n// Both modes dispatch a pointerdown → N × pointermove → pointerup sequence.\n// ---------------------------------------------------------------------------\n\n/** World-space drag delta. */\nexport interface WorldDelta {\n x: number;\n y: number;\n z: number;\n}\n\n/** Screen-space drag delta (CSS pixels). */\nexport interface ScreenDelta {\n dx: number;\n dy: number;\n}\n\n/** Options for drag3D. */\nexport interface Drag3DOptions extends DragOptions {\n /**\n * If 'world', the delta is interpreted as world units.\n * If 'screen', the delta is interpreted as CSS pixels.\n * Default: 'world'\n */\n mode?: 'world' | 'screen';\n}\n\n/** Result of a drag3D operation. */\nexport interface Drag3DResult {\n /** Whether the drag was dispatched. */\n dispatched: true;\n /** Start screen point. */\n startPoint: { x: number; y: number };\n /** End screen point. */\n endPoint: { x: number; y: number };\n /** Which projection strategy was used for the start point. */\n strategy: string;\n}\n\n/**\n * Programmatically drag a 3D object by its testId or uuid.\n *\n * Projects the object to screen space for the start point, then computes\n * the end point based on the delta (world-space or screen-space), and\n * dispatches a full drag sequence on the canvas.\n *\n * @param idOrUuid The object's testId or uuid\n * @param delta Drag delta (world-space { x, y, z } or screen-space { dx, dy })\n * @param options Drag options (steps, delay, mode)\n * @returns Drag result with start/end points\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // World-space drag: move 2 units on X axis\n * window.__R3F_DOM__.drag('chair-primary', { x: 2, y: 0, z: 0 });\n *\n * // Screen-space drag: move 100px right, 50px down\n * drag3D('chair-primary', { dx: 100, dy: 50 }, { mode: 'screen' });\n * ```\n */\nexport async function drag3D(\n idOrUuid: string,\n delta: WorldDelta | ScreenDelta,\n options: Drag3DOptions = {},\n): Promise<Drag3DResult> {\n const { mode = 'world', ...dragOptions } = options;\n\n // 1. Resolve object\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n r3fLog('drag', `drag3D(\"${idOrUuid}\") mode=${mode}`, delta);\n\n // 2. Project start point\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] drag3D(\"${idOrUuid}\") failed: object is not visible on screen. ` +\n `It may be behind the camera or outside the viewport.`,\n );\n }\n\n const startPoint = projection.point;\n let endPoint: { x: number; y: number };\n\n if (mode === 'screen' && 'dx' in delta) {\n // Screen-space mode: directly add pixel delta\n const screenDelta = delta as ScreenDelta;\n endPoint = {\n x: startPoint.x + screenDelta.dx,\n y: startPoint.y + screenDelta.dy,\n };\n } else {\n // World-space mode: convert world delta to screen delta\n const worldDelta = delta as WorldDelta;\n\n // Get the object's current world position\n const worldPos = new Vector3();\n obj.getWorldPosition(worldPos);\n\n // Compute the target world position\n const targetPos = worldPos.clone().add(new Vector3(worldDelta.x, worldDelta.y, worldDelta.z));\n\n // Project target position to screen space\n targetPos.project(camera);\n endPoint = {\n x: ((targetPos.x + 1) / 2) * size.width,\n y: ((-targetPos.y + 1) / 2) * size.height,\n };\n }\n\n // 3. Dispatch drag sequence\n const canvas = gl.domElement;\n await dispatchDrag(canvas, startPoint, endPoint, dragOptions);\n\n return {\n dispatched: true,\n startPoint,\n endPoint,\n strategy: projection.strategy,\n };\n}\n\n/**\n * Compute what world-space displacement a screen-space drag would produce.\n * Useful for previewing drag effects before committing.\n */\nexport function previewDragWorldDelta(\n idOrUuid: string,\n screenDx: number,\n screenDy: number,\n): Vector3 {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const size = getCanvasSize();\n return screenDeltaToWorld(screenDx, screenDy, obj, camera, size);\n}\n","/**\n * @module wheel\n *\n * Deterministic wheel/scroll interaction on a 3D object. Projects the target\n * to screen space and dispatches a synthetic WheelEvent on the canvas,\n * triggering R3F's onWheel handler.\n */\nimport { projectToScreen } from './projection';\nimport { dispatchWheel, type WheelOptions } from './dispatch';\nimport { resolveObject, getCamera, getRenderer, getCanvasSize } from './resolve';\n\n// ---------------------------------------------------------------------------\n// wheel3D — deterministic wheel/scroll on a 3D object\n//\n// Projects the object to screen space and dispatches a WheelEvent on the\n// canvas at the projected coordinates. Triggers R3F's onWheel handler.\n// ---------------------------------------------------------------------------\n\n/** Options for wheel3D. */\nexport interface Wheel3DOptions extends WheelOptions {}\n\n/** Result of a wheel3D operation. */\nexport interface Wheel3DResult {\n /** Whether the wheel event was dispatched. */\n dispatched: true;\n /** The screen point where the wheel was dispatched. */\n screenPoint: { x: number; y: number };\n /** Which projection strategy was used. */\n strategy: string;\n}\n\n/**\n * Programmatically scroll the wheel over a 3D object by its testId or uuid.\n *\n * Projects the object to screen space and dispatches a synthetic WheelEvent\n * on the canvas. Triggers R3F's `onWheel` handler on the hit object.\n *\n * @param idOrUuid The object's testId or uuid\n * @param options Wheel options (deltaY, deltaX, deltaMode)\n * @returns Wheel result with screen point info\n * @throws If the object is not found or not visible on screen\n *\n * @example\n * ```typescript\n * // Scroll down 200 units over the chair\n * wheel3D('chair-primary', { deltaY: 200 });\n *\n * // Scroll up\n * wheel3D('chair-primary', { deltaY: -100 });\n * ```\n */\nexport function wheel3D(\n idOrUuid: string,\n options: Wheel3DOptions = {},\n): Wheel3DResult {\n const obj = resolveObject(idOrUuid);\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n\n const projection = projectToScreen(obj, camera, size);\n if (!projection) {\n throw new Error(\n `[react-three-dom] wheel3D(\"${idOrUuid}\") failed: object is not visible on screen.`,\n );\n }\n\n const canvas = gl.domElement;\n dispatchWheel(canvas, projection.point, options);\n\n return {\n dispatched: true,\n screenPoint: projection.point,\n strategy: projection.strategy,\n };\n}\n","/**\n * @module pointerMiss\n *\n * Simulates a click on empty canvas space to trigger R3F's onPointerMissed\n * handler on all objects. Commonly used for deselection workflows in\n * editor-type applications.\n */\nimport { dispatchPointerMiss } from './dispatch';\nimport { getRenderer } from './resolve';\nimport type { ScreenPoint } from './projection';\n\n// ---------------------------------------------------------------------------\n// pointerMiss3D — click on empty canvas space\n//\n// Dispatches a click at a point unlikely to hit any mesh, causing R3F\n// to fire onPointerMissed on all objects that have that handler.\n// Commonly used for deselection in editor-type applications.\n// ---------------------------------------------------------------------------\n\n/** Options for pointerMiss3D. */\nexport interface PointerMiss3DOptions {\n /**\n * Specific screen point to click. If not provided, clicks at (1, 1)\n * which is the top-left corner — very unlikely to hit any mesh.\n */\n point?: ScreenPoint;\n}\n\n/**\n * Dispatch a click on empty canvas space, triggering `onPointerMissed`.\n *\n * R3F fires `onPointerMissed` on all objects that have that handler\n * when a click doesn't hit any mesh. This is commonly used for\n * deselection workflows.\n *\n * @param options Optional point to click at\n *\n * @example\n * ```typescript\n * // Click empty space to deselect\n * pointerMiss3D();\n *\n * // Click at a specific empty spot\n * pointerMiss3D({ point: { x: 10, y: 10 } });\n * ```\n */\nexport function pointerMiss3D(options: PointerMiss3DOptions = {}): void {\n const gl = getRenderer();\n const canvas = gl.domElement;\n dispatchPointerMiss(canvas, options.point);\n}\n","/**\n * @module drawPath\n *\n * Simulates freeform drawing strokes on the canvas by dispatching a full\n * pointer sequence (pointerdown → pointermove × N → pointerup) through an\n * array of screen-space points. Includes path generators for lines, bezier\n * curves, rectangles, and circles. Designed for canvas drawing/annotation\n * apps built on R3F.\n */\nimport { r3fLog } from '../debug';\nimport { getRenderer } from './resolve';\n\n// ---------------------------------------------------------------------------\n// drawPath — simulate a freeform drawing stroke on the canvas\n//\n// Dispatches a full pointer sequence:\n// pointerdown (at first point) → N × pointermove → pointerup (at last point)\n//\n// Designed for canvas drawing apps that listen to pointer events on the\n// R3F canvas to create lines, paths, or annotations.\n// ---------------------------------------------------------------------------\n\n/** A 2D screen-space point in CSS pixels, relative to the canvas top-left. */\nexport interface DrawPoint {\n /** X coordinate in CSS pixels from canvas left edge. */\n x: number;\n /** Y coordinate in CSS pixels from canvas top edge. */\n y: number;\n /** Optional pressure (0–1). Default: 0.5 */\n pressure?: number;\n}\n\n/** Options for drawPath. */\nexport interface DrawPathOptions {\n /**\n * Delay in milliseconds between successive pointermove events.\n * Useful for apps that sample pointer events per-frame.\n * Default: 0 (dispatch all moves synchronously, which is fastest)\n */\n stepDelayMs?: number;\n\n /**\n * Pointer type. Some drawing apps differentiate between mouse and pen.\n * Default: 'mouse'\n */\n pointerType?: 'mouse' | 'pen' | 'touch';\n\n /**\n * If true, also dispatches a 'click' event at the end of the path.\n * Useful if the app interprets short strokes as clicks.\n * Default: false\n */\n clickAtEnd?: boolean;\n\n /**\n * If provided, draws on a specific canvas element.\n * Default: the R3F canvas (from the current renderer).\n */\n canvas?: HTMLCanvasElement;\n}\n\n/** Result of a drawPath operation. */\nexport interface DrawPathResult {\n /** Total number of pointer events dispatched. */\n eventCount: number;\n /** The number of points in the path. */\n pointCount: number;\n /** First point of the path. */\n startPoint: DrawPoint;\n /** Last point of the path. */\n endPoint: DrawPoint;\n}\n\n/** Monotonically increasing pointer ID for synthetic events. */\nlet _nextDrawPointerId = 5000;\n\n/**\n * Build a PointerEvent init object for drawing.\n */\nfunction makeDrawPointerInit(\n canvas: HTMLCanvasElement,\n point: DrawPoint,\n pointerId: number,\n pointerType: string,\n overrides?: Partial<PointerEventInit>,\n): PointerEventInit {\n const rect = canvas.getBoundingClientRect();\n const clientX = rect.left + point.x;\n const clientY = rect.top + point.y;\n\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX,\n clientY,\n screenX: clientX,\n screenY: clientY,\n pointerId,\n pointerType,\n isPrimary: true,\n button: 0,\n buttons: 1,\n width: 1,\n height: 1,\n pressure: point.pressure ?? 0.5,\n ...overrides,\n };\n}\n\n/**\n * Simulate a freeform drawing stroke on the canvas.\n *\n * Dispatches a full pointer sequence through the provided path of points:\n * `pointerdown` at the first point, `pointermove` at each subsequent point,\n * and `pointerup` at the last point.\n *\n * This is designed for canvas drawing applications (e.g. whiteboard, annotation\n * tools, CAD sketch mode) that respond to pointer events to create geometry.\n *\n * @param points Array of screen-space points (min 2 required)\n * @param options Drawing options\n * @returns Result with event counts and start/end points\n * @throws If fewer than 2 points are provided\n *\n * @example\n * ```typescript\n * // Draw a simple line from (100, 100) to (300, 200)\n * await drawPath([\n * { x: 100, y: 100 },\n * { x: 200, y: 150 },\n * { x: 300, y: 200 },\n * ]);\n *\n * // Draw with pen pressure simulation\n * await drawPath([\n * { x: 50, y: 50, pressure: 0.2 },\n * { x: 100, y: 80, pressure: 0.6 },\n * { x: 150, y: 70, pressure: 0.9 },\n * { x: 200, y: 60, pressure: 0.4 },\n * ], { pointerType: 'pen', stepDelayMs: 16 });\n * ```\n */\nexport async function drawPath(\n points: DrawPoint[],\n options: DrawPathOptions = {},\n): Promise<DrawPathResult> {\n if (points.length < 2) {\n throw new Error(\n `[react-three-dom] drawPath requires at least 2 points, got ${points.length}.`,\n );\n }\n\n const {\n stepDelayMs = 0,\n pointerType = 'mouse',\n clickAtEnd = false,\n canvas: explicitCanvas,\n } = options;\n\n // Resolve the canvas\n const canvas = explicitCanvas ?? getRenderer().domElement;\n const pointerId = _nextDrawPointerId++;\n let eventCount = 0;\n\n r3fLog('draw', `drawPath — ${points.length} points, delay=${stepDelayMs}ms, pointerType=${pointerType}`);\n\n // 1. Pointer down at first point\n const first = points[0];\n canvas.dispatchEvent(\n new PointerEvent('pointerdown', makeDrawPointerInit(canvas, first, pointerId, pointerType)),\n );\n eventCount++;\n\n // 2. Pointer moves through all intermediate points (including last)\n for (let i = 1; i < points.length; i++) {\n if (stepDelayMs > 0) {\n await sleep(stepDelayMs);\n }\n\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointermove',\n makeDrawPointerInit(canvas, points[i], pointerId, pointerType),\n ),\n );\n eventCount++;\n }\n\n // 3. Pointer up at last point\n const last = points[points.length - 1];\n canvas.dispatchEvent(\n new PointerEvent(\n 'pointerup',\n makeDrawPointerInit(canvas, last, pointerId, pointerType, {\n buttons: 0,\n pressure: 0,\n }),\n ),\n );\n eventCount++;\n\n // 4. Optional click at end\n if (clickAtEnd) {\n const rect = canvas.getBoundingClientRect();\n canvas.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n clientX: rect.left + last.x,\n clientY: rect.top + last.y,\n button: 0,\n }),\n );\n eventCount++;\n }\n\n r3fLog('draw', `drawPath complete — ${eventCount} events dispatched`);\n\n return {\n eventCount,\n pointCount: points.length,\n startPoint: first,\n endPoint: last,\n };\n}\n\n/**\n * Generate an array of DrawPoints along a straight line.\n * Useful for creating uniform stroke paths programmatically.\n *\n * @param start Start point (screen-space CSS pixels)\n * @param end End point (screen-space CSS pixels)\n * @param steps Number of intermediate points (excluding start/end). Default: 10\n * @param pressure Uniform pressure for all points. Default: 0.5\n * @returns Array of DrawPoints including start and end\n *\n * @example\n * ```typescript\n * const points = linePath({ x: 0, y: 0 }, { x: 200, y: 200 }, 20);\n * await drawPath(points);\n * ```\n */\nexport function linePath(\n start: { x: number; y: number },\n end: { x: number; y: number },\n steps = 10,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n const totalSteps = steps + 1; // +1 because we include start and end\n\n for (let i = 0; i <= totalSteps; i++) {\n const t = i / totalSteps;\n points.push({\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n pressure,\n });\n }\n\n return points;\n}\n\n/**\n * Generate an array of DrawPoints along a quadratic bezier curve.\n * Great for simulating smooth freehand drawing strokes.\n *\n * @param start Start point\n * @param control Control point (determines curve shape)\n * @param end End point\n * @param steps Number of steps. Default: 20\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints along the curve\n *\n * @example\n * ```typescript\n * const points = curvePath(\n * { x: 50, y: 200 }, // start\n * { x: 150, y: 50 }, // control (peak of the curve)\n * { x: 250, y: 200 }, // end\n * 30,\n * );\n * await drawPath(points);\n * ```\n */\nexport function curvePath(\n start: { x: number; y: number },\n control: { x: number; y: number },\n end: { x: number; y: number },\n steps = 20,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const invT = 1 - t;\n // Quadratic bezier: B(t) = (1-t)²·P0 + 2·(1-t)·t·P1 + t²·P2\n points.push({\n x: invT * invT * start.x + 2 * invT * t * control.x + t * t * end.x,\n y: invT * invT * start.y + 2 * invT * t * control.y + t * t * end.y,\n pressure,\n });\n }\n\n return points;\n}\n\n/**\n * Generate an array of DrawPoints forming a rectangle.\n * Useful for drawing rectangular selections or bounding boxes.\n *\n * @param topLeft Top-left corner\n * @param bottomRight Bottom-right corner\n * @param pointsPerSide Number of points per side. Default: 5\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints tracing the rectangle\n */\nexport function rectPath(\n topLeft: { x: number; y: number },\n bottomRight: { x: number; y: number },\n pointsPerSide = 5,\n pressure = 0.5,\n): DrawPoint[] {\n const topRight = { x: bottomRight.x, y: topLeft.y };\n const bottomLeft = { x: topLeft.x, y: bottomRight.y };\n\n const sides = [\n [topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft],\n ] as const;\n\n const points: DrawPoint[] = [];\n\n for (const [from, to] of sides) {\n for (let i = 0; i < pointsPerSide; i++) {\n const t = i / pointsPerSide;\n points.push({\n x: from.x + (to.x - from.x) * t,\n y: from.y + (to.y - from.y) * t,\n pressure,\n });\n }\n }\n\n // Close the path by returning to start\n points.push({ x: topLeft.x, y: topLeft.y, pressure });\n\n return points;\n}\n\n/**\n * Generate an array of DrawPoints forming a circle/ellipse.\n *\n * @param center Center of the circle (screen-space)\n * @param radiusX Horizontal radius in CSS pixels\n * @param radiusY Vertical radius in CSS pixels. Default: same as radiusX (circle)\n * @param steps Number of points. Default: 36 (10° increments)\n * @param pressure Uniform pressure. Default: 0.5\n * @returns Array of DrawPoints forming the circle\n */\nexport function circlePath(\n center: { x: number; y: number },\n radiusX: number,\n radiusY?: number,\n steps = 36,\n pressure = 0.5,\n): DrawPoint[] {\n const ry = radiusY ?? radiusX;\n const points: DrawPoint[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * Math.PI * 2;\n points.push({\n x: center.x + Math.cos(angle) * radiusX,\n y: center.y + Math.sin(angle) * ry,\n pressure,\n });\n }\n\n return points;\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * @module worldInteraction\n *\n * Position-centric interactions: click/hover/doubleClick at arbitrary world\n * coordinates. Projects the 3D point to screen space and dispatches synthetic\n * pointer events on the canvas. Complements the object-centric APIs\n * (click3D, hover3D, etc.) for use cases like BIM drawing tools, waypoint\n * placement, and spatial testing.\n */\nimport { Vector3 } from 'three';\nimport { dispatchClick, dispatchDoubleClick, dispatchContextMenu, dispatchHover } from './dispatch';\nimport { getCamera, getRenderer, getCanvasSize } from './resolve';\nimport type { ScreenPoint, CanvasSize } from './projection';\nimport { r3fLog } from '../debug';\nimport type { Camera } from 'three';\n\n// Reusable vector to avoid per-call allocation\nconst _v = new Vector3();\n\n/** A 3D world-space coordinate. */\nexport interface WorldPoint {\n x: number;\n y: number;\n z: number;\n}\n\n/** Options shared by all world-coordinate interactions. */\nexport interface WorldInteractionOptions {\n /** Modifier keys to include on the synthetic events. */\n shiftKey?: boolean;\n ctrlKey?: boolean;\n altKey?: boolean;\n metaKey?: boolean;\n}\n\n/** Result returned by world-coordinate interactions. */\nexport interface WorldInteractionResult {\n dispatched: boolean;\n screenPoint: ScreenPoint;\n behindCamera: boolean;\n}\n\n/**\n * Project a world point to canvas-relative screen coordinates.\n * Returns null if the point is behind the camera.\n */\nfunction projectWorld(\n point: WorldPoint,\n camera: Camera,\n size: CanvasSize,\n): ScreenPoint | null {\n _v.set(point.x, point.y, point.z).project(camera);\n\n // Behind camera\n if (_v.z > 1) return null;\n\n return {\n x: ((_v.x + 1) / 2) * size.width,\n y: ((-_v.y + 1) / 2) * size.height,\n };\n}\n\n/**\n * Click at an arbitrary world coordinate.\n *\n * Projects the point to screen space and dispatches a full click sequence\n * (pointerdown → pointerup → click) on the canvas. R3F's event system will\n * raycast from that screen position and fire onClick on whatever mesh is hit.\n *\n * @returns Result with the screen point used and whether the point was behind the camera.\n */\nexport function clickAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `clickAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `clickAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchClick(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Double-click at an arbitrary world coordinate.\n */\nexport function doubleClickAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `doubleClickAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `doubleClickAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchDoubleClick(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Right-click (context menu) at an arbitrary world coordinate.\n */\nexport function contextMenuAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `contextMenuAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `contextMenuAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchContextMenu(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Hover at an arbitrary world coordinate.\n *\n * Dispatches pointermove → pointerover → pointerenter at the projected\n * screen position. R3F will raycast and fire onPointerEnter/onPointerOver\n * on whatever mesh is at that position.\n */\nexport function hoverAtWorld(\n point: WorldPoint,\n _options: WorldInteractionOptions = {},\n): WorldInteractionResult {\n const camera = getCamera();\n const gl = getRenderer();\n const size = getCanvasSize();\n const canvas = gl.domElement;\n\n const screen = projectWorld(point, camera, size);\n if (!screen) {\n r3fLog('interaction', `hoverAtWorld(${point.x}, ${point.y}, ${point.z}) — behind camera, skipped`);\n return { dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: true };\n }\n\n r3fLog('interaction', `hoverAtWorld(${point.x}, ${point.y}, ${point.z}) → screen(${Math.round(screen.x)}, ${Math.round(screen.y)})`);\n dispatchHover(canvas, screen);\n\n return { dispatched: true, screenPoint: screen, behindCamera: false };\n}\n\n/**\n * Click a sequence of world coordinates with optional delay between each.\n * Useful for BIM drawing tools (polyline, measurement, etc.).\n *\n * @returns Array of results, one per point.\n */\nexport async function clickAtWorldSequence(\n points: WorldPoint[],\n options: { delayMs?: number } & WorldInteractionOptions = {},\n): Promise<WorldInteractionResult[]> {\n const { delayMs = 50, ...interactionOpts } = options;\n const results: WorldInteractionResult[] = [];\n\n for (let i = 0; i < points.length; i++) {\n results.push(clickAtWorld(points[i], interactionOpts));\n if (delayMs > 0 && i < points.length - 1) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n return results;\n}\n","/**\n * @module SelectionManager\n *\n * Lightweight selection state manager for 3D objects. Supports single and\n * multi-selection, notifies listeners on change so Highlighter and the\n * devtools inspector panel can react. Decoupled from rendering — purely\n * manages which Object3D references are \"selected\".\n */\nimport type { Object3D } from 'three';\n\n// ---------------------------------------------------------------------------\n// SelectionManager\n//\n// Manages the currently selected/highlighted object(s) in the scene.\n// Supports single selection (click to select) and multi-selection.\n// Notifies listeners when the selection changes so the Highlighter\n// can update visuals and the Inspector can update its UI.\n// ---------------------------------------------------------------------------\n\nexport type SelectionListener = (selected: Object3D[]) => void;\n\n/**\n * Tracks the set of currently selected Object3D instances and notifies\n * subscribers when the selection changes.\n */\nexport class SelectionManager {\n /** Currently selected objects (ordered by selection time). */\n private _selected: Object3D[] = [];\n\n /** Listeners notified on selection change. */\n private _listeners: SelectionListener[] = [];\n\n // -----------------------------------------------------------------------\n // Selection API\n // -----------------------------------------------------------------------\n\n /** Select a single object (clears previous selection). */\n select(obj: Object3D): void {\n if (this._selected.length === 1 && this._selected[0] === obj) return;\n this._selected = [obj];\n this._notify();\n }\n\n /** Add an object to the current selection (multi-select). */\n addToSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) return;\n this._selected.push(obj);\n this._notify();\n }\n\n /** Remove an object from the selection. */\n removeFromSelection(obj: Object3D): void {\n const idx = this._selected.indexOf(obj);\n if (idx === -1) return;\n this._selected.splice(idx, 1);\n this._notify();\n }\n\n /** Toggle an object in/out of the selection. */\n toggleSelection(obj: Object3D): void {\n if (this._selected.includes(obj)) {\n this.removeFromSelection(obj);\n } else {\n this.addToSelection(obj);\n }\n }\n\n /** Clear all selections. */\n clearSelection(): void {\n if (this._selected.length === 0) return;\n this._selected = [];\n this._notify();\n }\n\n /** Get the currently selected objects. */\n getSelected(): readonly Object3D[] {\n return this._selected;\n }\n\n /** Get the primary (first) selected object, or null. */\n getPrimary(): Object3D | null {\n return this._selected[0] ?? null;\n }\n\n /** Check if an object is selected. */\n isSelected(obj: Object3D): boolean {\n return this._selected.includes(obj);\n }\n\n /** Number of selected objects. */\n get count(): number {\n return this._selected.length;\n }\n\n // -----------------------------------------------------------------------\n // Event system\n // -----------------------------------------------------------------------\n\n /** Subscribe to selection changes. Returns unsubscribe function. */\n subscribe(listener: SelectionListener): () => void {\n this._listeners.push(listener);\n return () => {\n const idx = this._listeners.indexOf(listener);\n if (idx !== -1) this._listeners.splice(idx, 1);\n };\n }\n\n private _notify(): void {\n const snapshot = [...this._selected];\n for (const listener of this._listeners) {\n listener(snapshot);\n }\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n dispose(): void {\n this._selected = [];\n this._listeners = [];\n }\n}\n","/**\n * @module Highlighter\n *\n * Renders Chrome DevTools-style translucent fill overlays on hovered and\n * selected Three.js objects. Subscribes to SelectionManager for selection\n * state and polls `window.__r3fdom_hovered__` for DevTools element-picker\n * hover. Highlight meshes are marked `__r3fdom_internal` so they're excluded\n * from raycasting and the ObjectStore.\n */\nimport {\n Object3D,\n Scene,\n Vector3,\n Mesh,\n Line,\n Points,\n MeshBasicMaterial,\n LineBasicMaterial,\n EdgesGeometry,\n LineSegments,\n DoubleSide,\n BufferGeometry,\n Box3,\n BoxGeometry,\n} from 'three';\nimport type { Camera, WebGLRenderer } from 'three';\nimport type { SelectionManager } from './SelectionManager';\n\n// ---------------------------------------------------------------------------\n// Highlighter — Chrome DevTools-style 3D object highlighting\n//\n// Renders a translucent fill overlay matching Chrome's rgb(111,168,220) 66%.\n// No edge outlines — clean filled highlight only.\n// ---------------------------------------------------------------------------\n\n// Chrome DevTools highlight: rgb(111, 168, 220) ~66% opacity\nconst HOVER_FILL_COLOR = 0x6fa8dc;\nconst HOVER_FILL_OPACITY = 0.66;\n\nconst SELECTION_FILL_COLOR = 0x6fa8dc;\nconst SELECTION_FILL_OPACITY = 0.75;\nconst SELECTION_BBOX_COLOR = 0x6fa8dc;\nconst SELECTION_BBOX_OPACITY = 0.3;\n\nconst _box3 = /* @__PURE__ */ new Box3();\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction hasRenderableGeometry(obj: Object3D): boolean {\n return (\n (obj as Mesh).isMesh === true ||\n (obj as Line).isLine === true ||\n (obj as Points).isPoints === true\n );\n}\n\nfunction collectHighlightTargets(obj: Object3D): Object3D[] {\n if (hasRenderableGeometry(obj)) return [obj];\n\n const targets: Object3D[] = [];\n obj.traverse((child) => {\n if (child === obj) return;\n if (child.userData?.__r3fdom_internal) return;\n if (hasRenderableGeometry(child)) targets.push(child);\n });\n return targets;\n}\n\nfunction markInternal(obj: Object3D): void {\n obj.userData.__r3fdom_internal = true;\n obj.raycast = () => {};\n obj.traverse((child) => {\n child.userData.__r3fdom_internal = true;\n child.raycast = () => {};\n });\n}\n\n/**\n * Sync highlight group to match the source object's world transform.\n * Called from useFrame as a best-effort early sync.\n */\nfunction _syncGroupTransform(source: Object3D, highlightRoot: Object3D): void {\n source.updateWorldMatrix(true, false);\n source.matrixWorld.decompose(\n highlightRoot.position,\n highlightRoot.quaternion,\n highlightRoot.scale,\n );\n}\n\n/**\n * Override updateMatrixWorld on the highlight group so that whenever\n * Three.js traverses the scene graph (during renderer.render()),\n * the highlight group's matrixWorld is copied directly from the source.\n *\n * This runs during scene.updateMatrixWorld() — which happens AFTER all\n * useFrame callbacks — so the source's position/quaternion/scale are\n * guaranteed to reflect the current frame's animations.\n */\nfunction _attachRenderSync(source: Object3D, highlightRoot: Object3D): void {\n highlightRoot.matrixAutoUpdate = false;\n\n highlightRoot.updateMatrixWorld = (force?: boolean) => {\n source.updateWorldMatrix(true, false);\n highlightRoot.matrixWorld.copy(source.matrixWorld);\n for (const child of highlightRoot.children) {\n child.updateMatrixWorld(force);\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Highlight mesh factories\n// ---------------------------------------------------------------------------\n\ninterface HighlightGroup {\n root: Object3D;\n disposables: { dispose(): void }[];\n}\n\nfunction createHighlightMesh(\n source: Object3D,\n fillColor: number,\n fillOpacity: number,\n): HighlightGroup | null {\n const geom = (source as Mesh).geometry as BufferGeometry | undefined;\n if (!geom) return null;\n\n const group = new Object3D();\n const disposables: { dispose(): void }[] = [];\n\n const fillMat = new MeshBasicMaterial({\n color: fillColor,\n transparent: true,\n opacity: fillOpacity,\n depthTest: false,\n depthWrite: false,\n side: DoubleSide,\n });\n disposables.push(fillMat);\n\n const fillMesh = new Mesh(geom, fillMat);\n fillMesh.scale.setScalar(1.005);\n fillMesh.raycast = () => {};\n group.add(fillMesh);\n\n source.updateWorldMatrix(true, false);\n source.matrixWorld.decompose(group.position, group.quaternion, group.scale);\n\n markInternal(group);\n _attachRenderSync(source, group);\n\n return { root: group, disposables };\n}\n\nfunction createBoundingBoxHighlight(obj: Object3D): HighlightGroup | null {\n _box3.makeEmpty();\n\n const targets = collectHighlightTargets(obj);\n if (targets.length === 0) return null;\n\n for (const target of targets) {\n target.updateWorldMatrix(true, false);\n const geom = (target as Mesh).geometry as BufferGeometry | undefined;\n if (geom) {\n if (!geom.boundingBox) geom.computeBoundingBox();\n if (geom.boundingBox) {\n const childBox = geom.boundingBox.clone();\n childBox.applyMatrix4(target.matrixWorld);\n _box3.union(childBox);\n }\n }\n }\n\n if (_box3.isEmpty()) return null;\n\n const size = _box3.getSize(new Vector3());\n const center = _box3.getCenter(new Vector3());\n\n const disposables: { dispose(): void }[] = [];\n\n const boxGeom = new BoxGeometry(size.x, size.y, size.z);\n disposables.push(boxGeom);\n\n const fillMat = new MeshBasicMaterial({\n color: SELECTION_BBOX_COLOR,\n transparent: true,\n opacity: SELECTION_BBOX_OPACITY,\n depthTest: false,\n depthWrite: false,\n side: DoubleSide,\n });\n disposables.push(fillMat);\n const fillMesh = new Mesh(boxGeom, fillMat);\n fillMesh.raycast = () => {};\n\n const edgesGeom = new EdgesGeometry(boxGeom);\n disposables.push(edgesGeom);\n const edgeMat = new LineBasicMaterial({\n color: SELECTION_BBOX_COLOR,\n transparent: true,\n opacity: 0.5,\n depthTest: false,\n depthWrite: false,\n });\n disposables.push(edgeMat);\n const edgeMesh = new LineSegments(edgesGeom, edgeMat);\n edgeMesh.raycast = () => {};\n\n const group = new Object3D();\n group.add(fillMesh);\n group.add(edgeMesh);\n group.position.copy(center);\n group.renderOrder = 998;\n\n markInternal(group);\n\n group.matrixAutoUpdate = false;\n group.updateMatrixWorld = (force?: boolean) => {\n _box3.makeEmpty();\n for (const target of targets) {\n target.updateWorldMatrix(true, false);\n const g = (target as Mesh).geometry as BufferGeometry | undefined;\n if (g) {\n if (!g.boundingBox) g.computeBoundingBox();\n if (g.boundingBox) {\n const childBox = g.boundingBox.clone();\n childBox.applyMatrix4(target.matrixWorld);\n _box3.union(childBox);\n }\n }\n }\n if (!_box3.isEmpty()) {\n const s = _box3.getSize(new Vector3());\n const c = _box3.getCenter(new Vector3());\n group.position.copy(c);\n group.scale.set(\n s.x / size.x || 1,\n s.y / size.y || 1,\n s.z / size.z || 1,\n );\n }\n group.updateMatrix();\n group.matrixWorld.copy(group.matrix);\n for (const child of group.children) {\n child.updateMatrixWorld(force);\n }\n };\n\n return { root: group, disposables };\n}\n\n// ---------------------------------------------------------------------------\n// Highlighter class\n// ---------------------------------------------------------------------------\n\nexport interface HighlighterOptions {\n showTooltip?: boolean;\n}\n\ninterface HoverEntry {\n source: Object3D;\n group: HighlightGroup;\n}\n\ninterface SelectionEntry {\n source: Object3D;\n meshGroups: HighlightGroup[];\n bboxGroup: HighlightGroup | null;\n}\n\n/**\n * Manages hover and selection highlight overlays in the 3D scene.\n * Attaches to a Scene + SelectionManager and creates/disposes translucent\n * mesh clones that track the source object's world transform each frame.\n */\nexport class Highlighter {\n private _scene: Scene | null = null;\n private _unsubscribe: (() => void) | null = null;\n\n private _hoverEntries: HoverEntry[] = [];\n private _hoverTarget: Object3D | null = null;\n private _selectedEntries: Map<Object3D, SelectionEntry> = new Map();\n\n private _hoverPollId: ReturnType<typeof setInterval> | null = null;\n private _lastHoveredUuid: string | null = null;\n private _store: { getObject3D(uuid: string): Object3D | null } | null = null;\n\n constructor(_options: HighlighterOptions = {}) {}\n\n // -----------------------------------------------------------------------\n // Lifecycle\n // -----------------------------------------------------------------------\n\n /** Bind to a scene and selection manager, start hover polling. */\n attach(\n scene: Scene,\n selectionManager: SelectionManager,\n _camera: Camera,\n _renderer: WebGLRenderer,\n store: { getObject3D(uuid: string): Object3D | null },\n ): void {\n this.detach();\n this._scene = scene;\n this._store = store;\n\n this._unsubscribe = selectionManager.subscribe((selected) => {\n this._syncSelectionHighlights(selected);\n });\n\n this._syncSelectionHighlights([...selectionManager.getSelected()]);\n this._startHoverPolling();\n }\n\n /** Unbind from the scene, stop polling, and remove all highlights. */\n detach(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n this._stopHoverPolling();\n this.clearHoverHighlight();\n this._clearAllSelectionHighlights();\n this._scene = null;\n this._store = null;\n }\n\n // -----------------------------------------------------------------------\n // Per-frame update\n // -----------------------------------------------------------------------\n\n /** Sync highlight group transforms to their source objects. Call each frame. */\n update(): void {\n for (const entry of this._hoverEntries) {\n _syncGroupTransform(entry.source, entry.group.root);\n }\n\n for (const selEntry of this._selectedEntries.values()) {\n for (const mg of selEntry.meshGroups) {\n const src = mg.root.userData.__r3fdom_source as Object3D | undefined;\n if (src) {\n _syncGroupTransform(src, mg.root);\n }\n }\n }\n\n }\n\n // -----------------------------------------------------------------------\n // Public API: hover highlight\n // -----------------------------------------------------------------------\n\n /** Show a hover highlight on the given object (replaces any previous hover). */\n showHoverHighlight(obj: Object3D): void {\n if (obj === this._hoverTarget) return;\n this._clearHoverVisuals();\n if (!this._scene) return;\n\n this._hoverTarget = obj;\n const targets = collectHighlightTargets(obj);\n\n for (const target of targets) {\n const hg = createHighlightMesh(target, HOVER_FILL_COLOR, HOVER_FILL_OPACITY);\n if (hg) {\n hg.root.renderOrder = 997;\n this._scene.add(hg.root);\n this._hoverEntries.push({ source: target, group: hg });\n }\n }\n\n }\n\n /** Remove the current hover highlight. */\n clearHoverHighlight(): void {\n this._clearHoverVisuals();\n this._lastHoveredUuid = null;\n }\n\n private _clearHoverVisuals(): void {\n for (const entry of this._hoverEntries) {\n this._disposeHighlightGroup(entry.group);\n }\n this._hoverEntries = [];\n this._hoverTarget = null;\n }\n\n // -----------------------------------------------------------------------\n // Public API: queries\n // -----------------------------------------------------------------------\n\n /** Check if an object currently has a selection highlight. */\n isHighlighted(obj: Object3D): boolean {\n return this._selectedEntries.has(obj);\n }\n\n /** Remove all hover and selection highlights. */\n clearAll(): void {\n this.clearHoverHighlight();\n this._clearAllSelectionHighlights();\n }\n\n // -----------------------------------------------------------------------\n // Internal: selection highlights\n // -----------------------------------------------------------------------\n\n private _syncSelectionHighlights(selected: Object3D[]): void {\n if (!this._scene) return;\n\n const selectedSet = new Set(selected);\n\n for (const [obj] of this._selectedEntries) {\n if (!selectedSet.has(obj)) {\n this._removeSelectionHighlight(obj);\n }\n }\n\n for (const obj of selected) {\n if (!this._selectedEntries.has(obj)) {\n this._addSelectionHighlight(obj);\n }\n }\n }\n\n private _addSelectionHighlight(obj: Object3D): void {\n if (!this._scene) return;\n const targets = collectHighlightTargets(obj);\n const meshGroups: HighlightGroup[] = [];\n\n for (const target of targets) {\n const hg = createHighlightMesh(target, SELECTION_FILL_COLOR, SELECTION_FILL_OPACITY);\n if (hg) {\n hg.root.userData.__r3fdom_source = target;\n hg.root.renderOrder = 999;\n this._scene.add(hg.root);\n meshGroups.push(hg);\n }\n }\n\n // Skip the bounding box for Groups — individual mesh highlights are\n // sufficient and a filled bbox just obscures the scene.\n let bboxGroup: HighlightGroup | null = null;\n if (targets.length > 1 && obj.type !== 'Group') {\n bboxGroup = createBoundingBoxHighlight(obj);\n if (bboxGroup) {\n this._scene.add(bboxGroup.root);\n }\n }\n\n if (meshGroups.length > 0 || bboxGroup) {\n this._selectedEntries.set(obj, { source: obj, meshGroups, bboxGroup });\n }\n }\n\n private _removeSelectionHighlight(obj: Object3D): void {\n const entry = this._selectedEntries.get(obj);\n if (!entry) return;\n for (const mg of entry.meshGroups) {\n this._disposeHighlightGroup(mg);\n }\n if (entry.bboxGroup) {\n this._disposeHighlightGroup(entry.bboxGroup);\n }\n this._selectedEntries.delete(obj);\n }\n\n private _clearAllSelectionHighlights(): void {\n for (const entry of this._selectedEntries.values()) {\n for (const mg of entry.meshGroups) {\n this._disposeHighlightGroup(mg);\n }\n if (entry.bboxGroup) {\n this._disposeHighlightGroup(entry.bboxGroup);\n }\n }\n this._selectedEntries.clear();\n }\n\n // -----------------------------------------------------------------------\n // Internal: DevTools hover polling\n // -----------------------------------------------------------------------\n\n private _startHoverPolling(): void {\n this._hoverPollId = setInterval(() => {\n this._pollDevToolsHover();\n }, 100);\n }\n\n private _stopHoverPolling(): void {\n if (this._hoverPollId) {\n clearInterval(this._hoverPollId);\n this._hoverPollId = null;\n }\n }\n\n private _pollDevToolsHover(): void {\n if (!this._store) return;\n\n try {\n const hoveredEl = window.__r3fdom_hovered__;\n const uuid = hoveredEl?.getAttribute?.('data-uuid') ?? null;\n\n if (uuid === this._lastHoveredUuid) return;\n this._lastHoveredUuid = uuid;\n\n if (!uuid) {\n this._clearHoverVisuals();\n return;\n }\n\n const obj = this._store.getObject3D(uuid);\n if (obj) {\n this.showHoverHighlight(obj);\n } else {\n this._clearHoverVisuals();\n }\n } catch {\n // Ignore errors\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal: cleanup\n // -----------------------------------------------------------------------\n\n private _disposeHighlightGroup(hg: HighlightGroup): void {\n hg.root.removeFromParent();\n for (const d of hg.disposables) {\n d.dispose();\n }\n }\n\n /** Detach and release all resources. */\n dispose(): void {\n this.detach();\n }\n}\n","/**\n * @module selectionDisplayTarget\n *\n * Heuristic for promoting a raw raycast hit (specific sub-mesh) to its\n * logical parent group for display/selection purposes. E.g. clicking a\n * table top mesh selects the whole table Group.\n */\nimport type { Object3D } from 'three';\nimport { getTagForType } from '../mirror/CustomElements';\n\n/**\n * When a mesh is the \"main\" geometry of its parent group (e.g. table top for a table group),\n * we show the group as highlighted so the whole table is selected. When the mesh is a\n * \"detail\" (e.g. a table leg), we show the mesh itself.\n * Heuristic: the first mesh child of a Group is treated as the main one → promote to group.\n */\nfunction isFirstMeshInGroup(obj: Object3D): boolean {\n const parent = obj.parent;\n if (!parent || parent.type !== 'Group') return false;\n const firstMesh = parent.children.find((c) => getTagForType(c.type) === 'three-mesh');\n return firstMesh === obj;\n}\n\n/**\n * Resolve the uuid to use for display/selection.\n * If the object is a mesh and is the first (main) mesh of its parent Group, returns the parent's uuid.\n * Otherwise returns the given uuid.\n */\nexport function resolveSelectionDisplayTarget(\n getObject3D: (id: string) => Object3D | null,\n uuid: string,\n): string | null {\n const obj = getObject3D(uuid);\n if (!obj) return null;\n if (getTagForType(obj.type) !== 'three-mesh') return uuid;\n if (isFirstMeshInGroup(obj) && obj.parent) return obj.parent.uuid;\n return uuid;\n}\n","/**\n * @module InspectController\n *\n * Chrome DevTools-style inspect mode for 3D scenes. When enabled, places a\n * transparent overlay on top of the WebGL canvas that intercepts all pointer\n * events (preventing R3F's event system and camera controls from consuming\n * them), raycasts to identify the object under the cursor, drives\n * hover/selection highlights, and sets a global reference so the DevTools\n * extension can reveal the corresponding mirror DOM node.\n * Zero overhead when disabled — no overlay, no listeners.\n */\nimport {\n Object3D,\n Camera,\n WebGLRenderer,\n} from 'three';\nimport type { SelectionManager } from './SelectionManager';\nimport type { Highlighter } from './Highlighter';\nimport type { RaycastAccelerator } from './RaycastAccelerator';\nimport type { DomMirror } from '../mirror/DomMirror';\nimport { resolveSelectionDisplayTarget } from './selectionDisplayTarget';\nimport { r3fLog } from '../debug';\n\nconst RAYCAST_THROTTLE_MS = 50;\nconst HOVER_REVEAL_DEBOUNCE_MS = 300;\n\n/**\n * Manages the inspect-mode lifecycle: creates/removes an overlay div,\n * throttles raycasts, and coordinates Highlighter + SelectionManager + DomMirror.\n */\nexport class InspectController {\n private _active = false;\n private _camera: Camera;\n private _renderer: WebGLRenderer;\n private _selectionManager: SelectionManager;\n private _highlighter: Highlighter;\n private _raycastAccelerator: RaycastAccelerator;\n private _mirror: DomMirror;\n private _store: { getObject3D(uuid: string): Object3D | null };\n\n private _lastRaycastTime = 0;\n private _hoveredObject: Object3D | null = null;\n private _hoverRevealTimer: ReturnType<typeof setTimeout> | null = null;\n\n private _overlay: HTMLDivElement | null = null;\n private _boundPointerMove: ((e: PointerEvent) => void) | null = null;\n private _boundPointerDown: ((e: PointerEvent) => void) | null = null;\n private _boundContextMenu: ((e: MouseEvent) => void) | null = null;\n\n constructor(opts: {\n camera: Camera;\n renderer: WebGLRenderer;\n selectionManager: SelectionManager;\n highlighter: Highlighter;\n raycastAccelerator: RaycastAccelerator;\n mirror: DomMirror;\n store: { getObject3D(uuid: string): Object3D | null };\n }) {\n this._camera = opts.camera;\n this._renderer = opts.renderer;\n this._selectionManager = opts.selectionManager;\n this._highlighter = opts.highlighter;\n this._raycastAccelerator = opts.raycastAccelerator;\n this._mirror = opts.mirror;\n this._store = opts.store;\n }\n\n get active(): boolean {\n return this._active;\n }\n\n /** Update the camera reference (e.g. after a camera switch). */\n updateCamera(camera: Camera): void {\n this._camera = camera;\n }\n\n // -----------------------------------------------------------------------\n // Enable / disable\n // -----------------------------------------------------------------------\n\n /** Activate inspect mode — creates overlay on top of canvas. */\n enable(): void {\n if (this._active) return;\n this._active = true;\n\n const canvas = this._renderer.domElement;\n const parent = canvas.parentElement;\n if (!parent) return;\n\n // Create a transparent overlay that sits on top of the canvas and\n // intercepts all pointer events, preventing R3F's event system and\n // camera controls (OrbitControls etc.) from consuming them.\n const overlay = document.createElement('div');\n overlay.dataset.r3fdomInspect = 'true';\n overlay.style.cssText = [\n 'position:absolute',\n 'inset:0',\n 'z-index:999999',\n 'cursor:crosshair',\n 'background:transparent',\n ].join(';');\n\n // Ensure parent is positioned so absolute overlay works\n const parentPos = getComputedStyle(parent).position;\n if (parentPos === 'static') {\n parent.style.position = 'relative';\n }\n\n this._boundPointerMove = this._onPointerMove.bind(this);\n this._boundPointerDown = this._onPointerDown.bind(this);\n this._boundContextMenu = (e: MouseEvent) => e.preventDefault();\n\n overlay.addEventListener('pointermove', this._boundPointerMove);\n overlay.addEventListener('pointerdown', this._boundPointerDown);\n overlay.addEventListener('contextmenu', this._boundContextMenu);\n\n parent.appendChild(overlay);\n this._overlay = overlay;\n\n r3fLog('inspect', 'Inspect mode enabled — hover to highlight, click to select');\n }\n\n /** Deactivate inspect mode — removes overlay and clears all inspect state. */\n disable(): void {\n if (!this._active) return;\n this._active = false;\n\n if (this._overlay) {\n if (this._boundPointerMove) this._overlay.removeEventListener('pointermove', this._boundPointerMove);\n if (this._boundPointerDown) this._overlay.removeEventListener('pointerdown', this._boundPointerDown);\n if (this._boundContextMenu) this._overlay.removeEventListener('contextmenu', this._boundContextMenu);\n this._overlay.remove();\n this._overlay = null;\n }\n\n this._boundPointerMove = null;\n this._boundPointerDown = null;\n this._boundContextMenu = null;\n\n this._hoveredObject = null;\n this._cancelHoverReveal();\n this._highlighter.clearHoverHighlight();\n\n window.__r3fdom_selected_element__ = null;\n\n r3fLog('inspect', 'InspectController disabled');\n }\n\n /** Disable and release all resources. */\n dispose(): void {\n this.disable();\n }\n\n // -----------------------------------------------------------------------\n // Raycasting (delegated to RaycastAccelerator)\n // -----------------------------------------------------------------------\n\n private _raycastFromEvent(e: MouseEvent): Object3D | null {\n return this._raycastAccelerator.raycastAtMouse(\n e,\n this._camera,\n this._renderer.domElement,\n );\n }\n\n /**\n * Resolve a raw raycast hit to the logical selection target.\n * Walks up to find the best Group parent if applicable.\n */\n private _resolveTarget(hit: Object3D): Object3D | null {\n const displayUuid = resolveSelectionDisplayTarget(\n (id) => this._store.getObject3D(id),\n hit.uuid,\n );\n if (!displayUuid) return hit;\n return this._store.getObject3D(displayUuid) ?? hit;\n }\n\n // -----------------------------------------------------------------------\n // Event handlers\n // -----------------------------------------------------------------------\n\n private _onPointerMove(e: PointerEvent): void {\n e.stopPropagation();\n e.preventDefault();\n\n const now = performance.now();\n if (now - this._lastRaycastTime < RAYCAST_THROTTLE_MS) return;\n this._lastRaycastTime = now;\n\n const hit = this._raycastFromEvent(e);\n\n if (!hit) {\n if (this._hoveredObject) {\n this._hoveredObject = null;\n this._highlighter.clearHoverHighlight();\n this._cancelHoverReveal();\n }\n return;\n }\n\n if (hit === this._hoveredObject) return;\n\n this._hoveredObject = hit;\n this._highlighter.showHoverHighlight(hit);\n this._scheduleHoverReveal(hit);\n }\n\n /**\n * After hovering an object for HOVER_REVEAL_DEBOUNCE_MS, auto-reveal its\n * mirror element in the Elements tab.\n */\n private _scheduleHoverReveal(target: Object3D): void {\n this._cancelHoverReveal();\n this._hoverRevealTimer = setTimeout(() => {\n const mirrorEl = this._mirror.getOrMaterialize(target.uuid);\n if (mirrorEl) {\n window.__r3fdom_selected_element__ = mirrorEl;\n }\n }, HOVER_REVEAL_DEBOUNCE_MS);\n }\n\n private _cancelHoverReveal(): void {\n if (this._hoverRevealTimer) {\n clearTimeout(this._hoverRevealTimer);\n this._hoverRevealTimer = null;\n }\n }\n\n private _onPointerDown(e: PointerEvent): void {\n e.stopPropagation();\n e.preventDefault();\n\n const hit = this._raycastFromEvent(e);\n\n if (!hit) {\n this._selectionManager.clearSelection();\n return;\n }\n\n const target = this._resolveTarget(hit);\n if (!target) return;\n\n this._selectionManager.select(target);\n\n const mirrorEl = this._mirror.getOrMaterialize(target.uuid);\n if (mirrorEl) {\n window.__r3fdom_selected_element__ = mirrorEl;\n }\n\n r3fLog('inspect', 'Object selected via canvas click', {\n uuid: target.uuid.slice(0, 8),\n name: target.name || '(unnamed)',\n type: target.type,\n });\n }\n}\n","/**\n * @module RaycastAccelerator\n *\n * Two-layer acceleration structure for BIM-scale raycasting (100k+ objects).\n * Layer 1 maintains a pre-filtered flat list of raycastable meshes from the\n * ObjectStore (avoids recursive scene traversal). Layer 2 uses three-mesh-bvh\n * to build per-geometry BVH trees, turning per-mesh triangle intersection\n * from O(t) brute-force into O(log t). Combined: ~0.01–0.1ms at 200k objects.\n */\nimport {\n Raycaster,\n Vector2,\n Object3D,\n Camera,\n Mesh,\n Line,\n Points,\n BufferGeometry,\n Intersection,\n} from 'three';\nimport type { ObjectStore } from '../store/ObjectStore';\nimport { r3fLog } from '../debug';\n\n// ---------------------------------------------------------------------------\n// RaycastAccelerator\n//\n// Two-layer acceleration for BIM-scale raycasting (100k-200k objects):\n//\n// Layer 1 — Flat target list:\n// Maintains a pre-filtered array of only raycastable meshes from the\n// ObjectStore. Avoids the recursive scene graph traverse that makes\n// Three.js's default `intersectObjects(scene.children, true)` O(n).\n//\n// Layer 2 — Per-geometry BVH (three-mesh-bvh):\n// Lazy-loaded on first use. Patches Three.js so each BufferGeometry builds\n// a Bounding Volume Hierarchy on first raycast. For high-poly BIM meshes\n// (50k-500k triangles), this turns per-mesh triangle intersection from\n// O(t) brute-force into O(log t) tree traversal.\n//\n// Combined: ~0.01-0.1ms at 200k objects vs ~200ms without.\n// ---------------------------------------------------------------------------\n\nlet _bvhPatched = false;\nlet _bvhLoadPromise: Promise<void> | null = null;\n\n/** Lazy-load three-mesh-bvh and patch Three.js. Resolves when patch is applied. */\nfunction loadAndPatchBVH(): Promise<void> {\n if (_bvhPatched) return Promise.resolve();\n if (_bvhLoadPromise) return _bvhLoadPromise;\n _bvhLoadPromise = import('three-mesh-bvh').then((m) => {\n BufferGeometry.prototype.computeBoundsTree = m.computeBoundsTree;\n BufferGeometry.prototype.disposeBoundsTree = m.disposeBoundsTree;\n Mesh.prototype.raycast = m.acceleratedRaycast;\n _bvhPatched = true;\n r3fLog('raycast', 'three-mesh-bvh patched into Three.js');\n });\n return _bvhLoadPromise;\n}\n\nconst _raycaster = /* @__PURE__ */ new Raycaster();\nconst _mouse = /* @__PURE__ */ new Vector2();\n\nfunction isRaycastable(obj: Object3D): boolean {\n if (obj.userData?.__r3fdom_internal) return false;\n if (!obj.visible) return false;\n const isMeshLike =\n (obj as Mesh).isMesh === true ||\n (obj as Line).isLine === true ||\n (obj as Points).isPoints === true;\n if (!isMeshLike) return false;\n // Skip objects with disposed geometry (position attribute array is null after dispose)\n const geom = (obj as Mesh).geometry;\n if (geom) {\n const posAttr = geom.getAttribute('position');\n if (posAttr && !posAttr.array) return false;\n }\n return true;\n}\n\n/**\n * Maintains an accelerated raycast target list and per-geometry BVH trees.\n * Rebuilds lazily when the ObjectStore emits changes, with a per-rebuild\n * BVH budget to avoid blocking the main thread on large model loads.\n */\nexport class RaycastAccelerator {\n private _store: ObjectStore;\n private _targets: Object3D[] = [];\n private _dirty = true;\n private _unsubscribe: (() => void) | null = null;\n private _bvhBuiltFor = new WeakSet<BufferGeometry>();\n\n constructor(store: ObjectStore) {\n this._store = store;\n // Kick off lazy load of three-mesh-bvh; patch applied when chunk loads\n loadAndPatchBVH();\n\n this._unsubscribe = store.subscribe(() => {\n this._dirty = true;\n });\n }\n\n /** Force a target list rebuild on the next raycast. */\n markDirty(): void {\n this._dirty = true;\n }\n\n private _rebuild(): void {\n this._dirty = false;\n const flatList = this._store.getFlatList();\n const targets: Object3D[] = [];\n\n for (let i = 0; i < flatList.length; i++) {\n const obj = flatList[i];\n if (isRaycastable(obj)) {\n targets.push(obj);\n }\n }\n\n this._targets = targets;\n\n // Build BVHs incrementally when three-mesh-bvh has loaded (lazy-loaded).\n // Only for meshes not yet processed; cap at 50 BVH builds per rebuild.\n if (_bvhPatched) {\n let bvhBudget = 50;\n for (let i = 0; i < targets.length && bvhBudget > 0; i++) {\n const obj = targets[i];\n if ((obj as Mesh).isMesh) {\n const geom = (obj as Mesh).geometry;\n if (geom && !this._bvhBuiltFor.has(geom) && !geom.boundsTree) {\n this._ensureBVH(obj);\n bvhBudget--;\n }\n }\n }\n if (bvhBudget === 0) this._dirty = true;\n }\n }\n\n /**\n * Build a BVH for a mesh's geometry if it doesn't have one yet.\n * Uses indirect mode to avoid modifying the index buffer.\n * Skips disposed geometries and does NOT mark failed builds so they\n * can be retried (e.g. after geometry is re-uploaded).\n */\n private _ensureBVH(obj: Object3D): void {\n if (!(obj as Mesh).isMesh) return;\n const geom = (obj as Mesh).geometry;\n if (!geom || this._bvhBuiltFor.has(geom)) return;\n\n // Skip disposed geometries — position attribute is null after dispose\n const posAttr = geom.getAttribute('position');\n if (!posAttr || !posAttr.array) return;\n\n if (geom.boundsTree) {\n this._bvhBuiltFor.add(geom);\n return;\n }\n\n try {\n geom.computeBoundsTree({ indirect: true });\n this._bvhBuiltFor.add(geom);\n } catch {\n r3fLog('raycast', `BVH build failed for geometry, will retry next rebuild`);\n }\n }\n\n /**\n * Raycast from mouse position against only raycastable meshes.\n * Returns the closest non-internal hit, or null.\n */\n raycastAtMouse(\n e: MouseEvent,\n camera: Camera,\n canvas: HTMLCanvasElement,\n ): Object3D | null {\n if (this._dirty) this._rebuild();\n\n const rect = canvas.getBoundingClientRect();\n _mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n _mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n\n _raycaster.setFromCamera(_mouse, camera);\n _raycaster.firstHitOnly = true;\n\n const intersections = _raycaster.intersectObjects(this._targets, false);\n\n _raycaster.firstHitOnly = false;\n\n for (const intersection of intersections) {\n if (intersection.object.userData?.__r3fdom_internal) continue;\n return intersection.object;\n }\n\n return null;\n }\n\n /**\n * Raycast from NDC coordinates. Used by raycastVerify.\n */\n raycastAtNdc(\n ndcX: number,\n ndcY: number,\n camera: Camera,\n ): Intersection[] {\n if (this._dirty) this._rebuild();\n\n _mouse.set(ndcX, ndcY);\n _raycaster.setFromCamera(_mouse, camera);\n\n return _raycaster.intersectObjects(this._targets, false);\n }\n\n /** Current number of raycastable targets. */\n get targetCount(): number {\n if (this._dirty) this._rebuild();\n return this._targets.length;\n }\n\n /** Unsubscribe from the store and release the target list. */\n dispose(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n this._targets = [];\n }\n}\n","import { useEffect, useRef } from 'react';\nimport { useThree, useFrame } from '@react-three/fiber';\nimport { Vector3 } from 'three';\nimport type { Object3D, Scene, Camera } from 'three';\nimport { ObjectStore } from '../store/ObjectStore';\nimport { DomMirror } from '../mirror/DomMirror';\nimport { ensureCustomElements } from '../mirror/CustomElements';\nimport { patchObject3D } from './patchObject3D';\nimport { createSnapshot } from '../snapshot/snapshot';\nimport { click3D, doubleClick3D, contextMenu3D } from '../interactions/click';\nimport { hover3D, unhover3D } from '../interactions/hover';\nimport { drag3D } from '../interactions/drag';\nimport { wheel3D } from '../interactions/wheel';\nimport { pointerMiss3D } from '../interactions/pointerMiss';\nimport { drawPath as drawPathFn } from '../interactions/drawPath';\nimport { clickAtWorld, doubleClickAtWorld, contextMenuAtWorld, hoverAtWorld, clickAtWorldSequence } from '../interactions/worldInteraction';\nimport { setInteractionState, clearInteractionState } from '../interactions/resolve';\nimport { SelectionManager } from '../highlight/SelectionManager';\nimport { Highlighter } from '../highlight/Highlighter';\nimport { InspectController } from '../highlight/InspectController';\nimport { RaycastAccelerator } from '../highlight/RaycastAccelerator';\nimport { resolveSelectionDisplayTarget } from '../highlight/selectionDisplayTarget';\nimport { version } from '../version';\nimport { r3fLog, enableDebug } from '../debug';\nimport type { R3FDOM, ObjectMetadata, CameraState } from '../types';\n\n// ---------------------------------------------------------------------------\n// ThreeDom Props\n// ---------------------------------------------------------------------------\n\nexport interface ThreeDomProps {\n /**\n * Unique identifier for this canvas instance. Required when using multiple\n * canvases. The bridge is registered in `window.__R3F_DOM_INSTANCES__[canvasId]`.\n * When omitted the bridge is only set on `window.__R3F_DOM__`.\n */\n canvasId?: string;\n /**\n * Mark this canvas as the primary / default instance.\n * `window.__R3F_DOM__` always points to the primary bridge.\n * When only one canvas is used (no canvasId), it is implicitly primary.\n * Default: true when canvasId is omitted, false otherwise.\n */\n primary?: boolean;\n /**\n * Registration mode:\n * - \"auto\" (default): traverses and registers all objects in the scene.\n * - \"manual\": nothing is auto-registered. Use `useR3FRegister` hook or\n * `__R3F_DOM__.r3fRegister()` to add objects explicitly.\n */\n mode?: 'auto' | 'manual';\n /**\n * Filter function for auto mode. Only objects that pass the filter are\n * registered. Ignored in manual mode.\n * Example: `filter={(obj) => !!obj.userData.testId}`\n */\n filter?: (obj: Object3D) => boolean;\n /** CSS selector or HTMLElement for the mirror DOM root. Default: \"#three-dom-root\" */\n root?: string | HTMLElement;\n /** Objects to process per amortized batch per frame. Default: 500 */\n batchSize?: number;\n /** Max time budget (ms) for sync work per frame. Default: 0.5 */\n syncBudgetMs?: number;\n /** Max materialized DOM nodes (LRU eviction). Default: 2000 */\n maxDomNodes?: number;\n /** Initial DOM tree materialization depth. Default: 3 */\n initialDepth?: number;\n /** Disable all sync. Default: true */\n enabled?: boolean;\n /** Enable debug logging to browser console. Default: false */\n debug?: boolean;\n /** Enable inspect mode on mount. Default: false */\n inspect?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Per-instance registries (keyed by canvasId, '' for default)\n// ---------------------------------------------------------------------------\n\nconst _stores = new Map<string, ObjectStore>();\nconst _mirrors = new Map<string, DomMirror>();\nconst _selectionManagers = new Map<string, SelectionManager>();\nconst _highlighters = new Map<string, Highlighter>();\nconst _inspectControllers = new Map<string, InspectController>();\nconst _filters = new Map<string, ((obj: Object3D) => boolean) | null>();\nconst _modes = new Map<string, 'auto' | 'manual'>();\n\n/** Check if an object passes the filter for a given instance. */\nexport function shouldRegister(instanceKey: string, obj: Object3D): boolean {\n const mode = _modes.get(instanceKey);\n if (mode === 'manual') return false;\n const filter = _filters.get(instanceKey);\n if (filter) return filter(obj);\n return true;\n}\n\n/**\n * Ensure every ancestor from the scene root down to `obj.parent` is registered\n * in the store and mirror. This builds the connected parent chain that\n * DomMirror needs to correctly nest DOM elements, even when those ancestors\n * don't pass the user-supplied filter.\n */\nexport function ensureAncestorChain(\n obj: Object3D,\n store: ObjectStore,\n mirror: DomMirror,\n): void {\n const chain: Object3D[] = [];\n let cursor = obj.parent;\n while (cursor) {\n if (store.has(cursor)) break; // already registered — chain is connected\n chain.push(cursor);\n cursor = cursor.parent;\n }\n // Register from root-most ancestor down so each parent exists before its child\n for (let i = chain.length - 1; i >= 0; i--) {\n const ancestor = chain[i];\n store.register(ancestor);\n mirror.onObjectAdded(ancestor);\n mirror.materialize(ancestor.uuid);\n }\n}\n\n/** Get the store for a canvas instance. Default: primary ('') instance. */\nexport function getStore(canvasId = ''): ObjectStore | null { return _stores.get(canvasId) ?? null; }\n/** Get the mirror for a canvas instance. Default: primary ('') instance. */\nexport function getMirror(canvasId = ''): DomMirror | null { return _mirrors.get(canvasId) ?? null; }\n/** Get the selection manager for a canvas instance. */\nexport function getSelectionManager(canvasId = ''): SelectionManager | null { return _selectionManagers.get(canvasId) ?? null; }\n/** Get the highlighter for a canvas instance. */\nexport function getHighlighter(canvasId = ''): Highlighter | null { return _highlighters.get(canvasId) ?? null; }\n/** Get the inspect controller for a canvas instance. */\nexport function getInspectController(canvasId = ''): InspectController | null { return _inspectControllers.get(canvasId) ?? null; }\n/** List all active canvas IDs. */\nexport function getCanvasIds(): string[] { return Array.from(_stores.keys()); }\n\n// ---------------------------------------------------------------------------\n// Global API exposure (window.__R3F_DOM__)\n// ---------------------------------------------------------------------------\n\nfunction exposeGlobalAPI(\n store: ObjectStore,\n gl: { domElement: HTMLCanvasElement; getContext(): unknown },\n cameraRef: { current: Camera },\n selMgr: SelectionManager | null,\n inspCtrl: InspectController | null,\n mirror: DomMirror | null,\n canvasId?: string,\n isPrimary = true,\n): void {\n const api: R3FDOM = {\n _ready: true,\n canvasId,\n getByTestId: (id: string) => store.getByTestId(id),\n getByUuid: (uuid: string) => store.getByUuid(uuid),\n getByName: (name: string) => store.getByName(name),\n getChildren: (idOrUuid: string) => store.getChildren(idOrUuid),\n getParent: (idOrUuid: string) => store.getParent(idOrUuid),\n getCount: () => store.getCount(),\n getByType: (type: string) => store.getByType(type),\n getByGeometryType: (type: string) => store.getByGeometryType(type),\n getByMaterialType: (type: string) => store.getByMaterialType(type),\n getByUserData: (key: string, value?: unknown) => store.getByUserData(key, value),\n getCountByType: (type: string) => store.getCountByType(type),\n getObjects: (ids: string[]) => {\n const map = store.getObjects(ids);\n const result: Record<string, ObjectMetadata | null> = {};\n for (const [id, meta] of map) {\n result[id] = meta;\n }\n return result;\n },\n snapshot: () => createSnapshot(store),\n inspect: (idOrUuid: string, options?: { includeGeometryData?: boolean }) => store.inspect(idOrUuid, options),\n click: (idOrUuid: string) => { click3D(idOrUuid); },\n doubleClick: (idOrUuid: string) => { doubleClick3D(idOrUuid); },\n contextMenu: (idOrUuid: string) => { contextMenu3D(idOrUuid); },\n hover: (idOrUuid: string) => { hover3D(idOrUuid); },\n unhover: () => { unhover3D(); },\n drag: async (idOrUuid: string, delta: { x: number; y: number; z: number }) => { await drag3D(idOrUuid, delta); },\n wheel: (idOrUuid: string, options?: { deltaY?: number; deltaX?: number }) => { wheel3D(idOrUuid, options); },\n pointerMiss: () => { pointerMiss3D(); },\n drawPath: async (points, options) => {\n const result = await drawPathFn(points, options);\n return { eventCount: result.eventCount, pointCount: result.pointCount };\n },\n clickAtWorld: (point, options) => clickAtWorld(point, options),\n doubleClickAtWorld: (point, options) => doubleClickAtWorld(point, options),\n contextMenuAtWorld: (point, options) => contextMenuAtWorld(point, options),\n hoverAtWorld: (point, options) => hoverAtWorld(point, options),\n clickAtWorldSequence: (points, options) => clickAtWorldSequence(points, options),\n select: (idOrUuid: string) => {\n const obj = store.getObject3D(idOrUuid);\n if (obj && selMgr) selMgr.select(obj);\n },\n clearSelection: () => { selMgr?.clearSelection(); },\n getSelection: () =>\n selMgr\n ? selMgr.getSelected().map((o: { uuid: string }) => o.uuid)\n : [],\n getObject3D: (idOrUuid: string) => store.getObject3D(idOrUuid),\n getSelectionDisplayTarget: (uuid: string) =>\n resolveSelectionDisplayTarget((id) => store.getObject3D(id), uuid) ?? uuid,\n setInspectMode: (on: boolean) => {\n r3fLog('inspect', 'Global API setInspectMode called', { on });\n const ctrl = inspCtrl ?? _inspectControllers.get(canvasId ?? '');\n if (on) {\n ctrl?.enable();\n mirror?.setInspectMode(true);\n } else {\n ctrl?.disable();\n mirror?.setInspectMode(false);\n }\n },\n getInspectMode: () => {\n const ctrl = inspCtrl ?? _inspectControllers.get(canvasId ?? '');\n return ctrl?.active ?? false;\n },\n sweepOrphans: () => store.sweepOrphans(),\n getDiagnostics: () => ({\n version,\n ready: true,\n objectCount: store.getCount(),\n meshCount: store.getCountByType('Mesh'),\n groupCount: store.getCountByType('Group'),\n lightCount: store.getCountByType('DirectionalLight') + store.getCountByType('PointLight') + store.getCountByType('SpotLight') + store.getCountByType('AmbientLight') + store.getCountByType('HemisphereLight'),\n cameraCount: store.getCountByType('PerspectiveCamera') + store.getCountByType('OrthographicCamera'),\n materializedDomNodes: mirror?.getMaterializedCount() ?? 0,\n maxDomNodes: mirror?.getMaxNodes() ?? 0,\n canvasWidth: gl.domElement.width,\n canvasHeight: gl.domElement.height,\n webglRenderer: (() => {\n try {\n const ctx = gl.getContext() as WebGLRenderingContext;\n const dbg = ctx.getExtension('WEBGL_debug_renderer_info');\n return dbg ? ctx.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : 'unknown';\n } catch { return 'unknown'; }\n })(),\n dirtyQueueSize: store.getDirtyCount(),\n }),\n getCameraState: (): CameraState => {\n const cam = cameraRef.current;\n const dir = new Vector3(0, 0, -1).applyQuaternion(cam.quaternion);\n const target: [number, number, number] = [\n cam.position.x + dir.x * 100,\n cam.position.y + dir.y * 100,\n cam.position.z + dir.z * 100,\n ];\n const state: CameraState = {\n type: cam.type,\n position: [cam.position.x, cam.position.y, cam.position.z],\n rotation: [cam.rotation.x, cam.rotation.y, cam.rotation.z],\n target,\n near: (cam as unknown as { near: number }).near,\n far: (cam as unknown as { far: number }).far,\n zoom: (cam as unknown as { zoom: number }).zoom,\n };\n if (cam.type === 'PerspectiveCamera') {\n const pc = cam as unknown as { fov: number; aspect: number };\n state.fov = pc.fov;\n state.aspect = pc.aspect;\n } else if (cam.type === 'OrthographicCamera') {\n const oc = cam as unknown as { left: number; right: number; top: number; bottom: number };\n state.left = oc.left;\n state.right = oc.right;\n state.top = oc.top;\n state.bottom = oc.bottom;\n }\n return state;\n },\n r3fRegister: (obj) => {\n if (store.has(obj)) return;\n if (!store.isInTrackedScene(obj)) {\n console.warn(\n `[react-three-dom] r3fRegister: object \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" is not in a tracked scene. ` +\n `Add it to the scene graph first.`,\n );\n return;\n }\n obj.userData.__r3fdom_manual = true;\n ensureAncestorChain(obj, store!, mirror!);\n let count = 0;\n obj.traverse((child) => {\n if (!store!.has(child)) {\n store!.register(child);\n mirror?.onObjectAdded(child);\n mirror?.materialize(child.uuid);\n count++;\n }\n });\n r3fLog('bridge', `r3fRegister: \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" (${obj.type}) — ${count} objects`);\n },\n r3fUnregister: (obj) => {\n if (!store.has(obj)) return;\n if (!obj.userData?.__r3fdom_manual) {\n r3fLog('bridge', `r3fUnregister skipped — \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" was auto-registered`);\n return;\n }\n delete obj.userData.__r3fdom_manual;\n mirror?.onObjectRemoved(obj);\n obj.traverse((child) => store.unregister(child));\n r3fLog('bridge', `r3fUnregister: \"${obj.userData?.testId || obj.name || obj.uuid.slice(0, 8)}\" (${obj.type})`);\n },\n fuzzyFind: (query: string, limit = 5) => {\n const q = query.toLowerCase();\n const results: ObjectMetadata[] = [];\n for (const obj of store.getFlatList()) {\n if (results.length >= limit) break;\n const meta = store.getMetadata(obj);\n if (!meta) continue;\n const testId = meta.testId?.toLowerCase() ?? '';\n const name = meta.name?.toLowerCase() ?? '';\n if (testId.includes(q) || name.includes(q) || meta.uuid.startsWith(q)) {\n results.push(meta);\n }\n }\n return results;\n },\n version,\n };\n\n if (isPrimary) {\n window.__R3F_DOM__ = api;\n }\n if (canvasId) {\n if (!window.__R3F_DOM_INSTANCES__) window.__R3F_DOM_INSTANCES__ = {};\n if (window.__R3F_DOM_INSTANCES__[canvasId]) {\n console.warn(\n `[react-three-dom] Duplicate canvasId \"${canvasId}\" — the previous bridge instance will be overwritten. ` +\n `Each <ThreeDom> must have a unique canvasId.`,\n );\n }\n window.__R3F_DOM_INSTANCES__[canvasId] = api;\n }\n}\n\nfunction removeGlobalAPI(onlyIfEquals?: R3FDOM, canvasId?: string): void {\n r3fLog('bridge', 'removeGlobalAPI called (deferred)');\n\n const removeFromRegistry = (ref?: R3FDOM) => {\n if (canvasId && window.__R3F_DOM_INSTANCES__) {\n if (!ref || window.__R3F_DOM_INSTANCES__[canvasId] === ref) {\n delete window.__R3F_DOM_INSTANCES__[canvasId];\n if (Object.keys(window.__R3F_DOM_INSTANCES__).length === 0) {\n delete (window as Window & { __R3F_DOM_INSTANCES__?: Record<string, R3FDOM> }).__R3F_DOM_INSTANCES__;\n }\n }\n }\n };\n\n if (onlyIfEquals !== undefined) {\n const ref = onlyIfEquals;\n queueMicrotask(() => {\n if ((window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__ === ref) {\n delete (window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__;\n r3fLog('bridge', 'Global API removed');\n } else {\n r3fLog('bridge', 'Global API not removed — replaced by new instance (Strict Mode remount)');\n }\n removeFromRegistry(ref);\n });\n } else {\n delete (window as Window & { __R3F_DOM__?: R3FDOM }).__R3F_DOM__;\n removeFromRegistry();\n r3fLog('bridge', 'Global API removed (immediate)');\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stub bridge for error / no-WebGL states\n// ---------------------------------------------------------------------------\n\nfunction createStubBridge(error?: string, canvasId?: string): R3FDOM {\n return {\n _ready: false,\n _error: error,\n canvasId,\n getByTestId: () => null,\n getByUuid: () => null,\n getByName: () => [],\n getChildren: () => [],\n getParent: () => null,\n getCount: () => 0,\n getByType: () => [],\n getByGeometryType: () => [],\n getByMaterialType: () => [],\n getByUserData: () => [],\n getCountByType: () => 0,\n getObjects: (ids: string[]) => {\n const result: Record<string, null> = {};\n for (const id of ids) result[id] = null;\n return result;\n },\n snapshot: () => ({\n timestamp: 0,\n objectCount: 0,\n tree: {\n uuid: '', name: '', type: 'Scene', visible: true,\n position: [0, 0, 0], rotation: [0, 0, 0], scale: [1, 1, 1], children: [],\n },\n }),\n inspect: () => null,\n click: () => {},\n doubleClick: () => {},\n contextMenu: () => {},\n hover: () => {},\n unhover: () => {},\n drag: async () => {},\n wheel: () => {},\n pointerMiss: () => {},\n drawPath: async () => ({ eventCount: 0, pointCount: 0 }),\n clickAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n doubleClickAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n contextMenuAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n hoverAtWorld: () => ({ dispatched: false, screenPoint: { x: 0, y: 0 }, behindCamera: false }),\n clickAtWorldSequence: async () => [],\n select: () => {},\n clearSelection: () => {},\n getSelection: () => [],\n getObject3D: () => null,\n getSelectionDisplayTarget: (uuid: string) => uuid,\n setInspectMode: () => {},\n getInspectMode: () => false,\n r3fRegister: () => {},\n r3fUnregister: () => {},\n sweepOrphans: () => 0,\n getDiagnostics: () => ({\n version,\n ready: false,\n error: error ?? undefined,\n objectCount: 0,\n meshCount: 0,\n groupCount: 0,\n lightCount: 0,\n cameraCount: 0,\n materializedDomNodes: 0,\n maxDomNodes: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n webglRenderer: 'unavailable',\n dirtyQueueSize: 0,\n }),\n getCameraState: () => ({\n type: 'unknown',\n position: [0, 0, 0] as [number, number, number],\n rotation: [0, 0, 0] as [number, number, number],\n target: [0, 0, -100] as [number, number, number],\n near: 0.1,\n far: 1000,\n zoom: 1,\n }),\n fuzzyFind: () => [],\n version,\n };\n}\n\n// ---------------------------------------------------------------------------\n// ThreeDom Component\n// ---------------------------------------------------------------------------\n\nexport function ThreeDom({\n canvasId,\n primary,\n root = '#three-dom-root',\n mode = 'auto',\n filter,\n batchSize = 500,\n syncBudgetMs = 0.5,\n maxDomNodes = 2000,\n initialDepth = 3,\n enabled = true,\n debug = false,\n inspect: inspectProp = false,\n}: ThreeDomProps = {}) {\n const isPrimary = primary ?? (canvasId === undefined);\n const instanceKey = canvasId ?? '';\n const scene = useThree((s) => s.scene);\n const camera = useThree((s) => s.camera);\n const gl = useThree((s) => s.gl);\n const size = useThree((s) => s.size);\n const cursorRef = useRef(0);\n const lastSweepRef = useRef(0);\n const cameraRef = useRef(camera);\n cameraRef.current = camera;\n\n // -----------------------------------------------------------------------\n // Setup\n // -----------------------------------------------------------------------\n\n useEffect(() => {\n if (!enabled) return;\n\n if (debug) enableDebug(true);\n r3fLog('setup', 'ThreeDom effect started', { enabled, debug, root, maxDomNodes });\n\n const canvas = gl.domElement;\n canvas.setAttribute('data-r3f-canvas', canvasId ?? 'true');\n const canvasParent = canvas.parentElement!;\n\n // ---- Create / resolve root element ----\n let rootElement: HTMLElement | null = null;\n let createdRoot = false;\n\n if (typeof root === 'string') {\n rootElement = document.querySelector<HTMLElement>(root);\n } else {\n rootElement = root;\n }\n\n if (!rootElement) {\n rootElement = document.createElement('div');\n rootElement.id = typeof root === 'string' ? root.replace(/^#/, '') : 'three-dom-root';\n createdRoot = true;\n }\n\n canvasParent.style.position = canvasParent.style.position || 'relative';\n canvasParent.appendChild(rootElement);\n\n rootElement.style.cssText = 'width:0;height:0;overflow:hidden;pointer-events:none;opacity:0;';\n\n let store: ObjectStore | null = null;\n let mirror: DomMirror | null = null;\n let unpatch: (() => void) | null = null;\n let cancelAsyncReg: (() => void) | null = null;\n let selectionManager: SelectionManager | null = null;\n let highlighter: Highlighter | null = null;\n let raycastAccelerator: RaycastAccelerator | null = null;\n let inspectController: InspectController | null = null;\n let currentApi: R3FDOM | undefined;\n\n try {\n // ---- Check WebGL availability (headless / CI often has no WebGL) ----\n const webglContext = gl.getContext();\n if (!webglContext || (webglContext as WebGLRenderingContext).isContextLost?.()) {\n const msg =\n 'WebGL context not available. For headless Chromium, add --enable-webgl and optionally --use-gl=angle --use-angle=swiftshader-webgl to launch args.';\n const stubApi = createStubBridge(msg, canvasId);\n if (isPrimary) window.__R3F_DOM__ = stubApi;\n if (canvasId) {\n if (!window.__R3F_DOM_INSTANCES__) window.__R3F_DOM_INSTANCES__ = {};\n window.__R3F_DOM_INSTANCES__[canvasId] = stubApi;\n }\n r3fLog('setup', msg);\n return () => {\n removeGlobalAPI(stubApi, canvasId);\n canvas.removeAttribute('data-r3f-canvas');\n if (createdRoot && rootElement?.parentNode) {\n rootElement.parentNode.removeChild(rootElement);\n }\n if (debug) enableDebug(false);\n };\n }\n\n // ---- Create store and mirror ----\n store = new ObjectStore();\n mirror = new DomMirror(store, maxDomNodes);\n mirror.setRoot(rootElement);\n r3fLog('setup', 'Store and mirror created');\n\n ensureCustomElements(store);\n\n // Store mode/filter so patchObject3D can check them\n _modes.set(instanceKey, mode);\n _filters.set(instanceKey, filter ?? null);\n\n // Install patch BEFORE async registration so any objects added to the\n // scene while registration is in progress are caught by the patch.\n unpatch = patchObject3D(store, mirror, instanceKey);\n setInteractionState(store, camera, gl, size);\n r3fLog('setup', `Object3D patched (mode=${mode}), interaction state set`);\n\n if (mode === 'auto') {\n // Register the full tree synchronously first so that materializeSubtree\n // can resolve children. Then kick off async registration for any objects\n // added later (caught by the Object3D.add patch).\n if (filter) {\n store!.addTrackedRoot(scene);\n store!.register(scene);\n mirror!.onObjectAdded(scene);\n scene.traverse((obj) => {\n if (obj === scene) return;\n if (filter(obj)) {\n ensureAncestorChain(obj, store!, mirror!);\n store!.register(obj);\n mirror!.onObjectAdded(obj);\n }\n });\n } else {\n store.registerTree(scene);\n }\n\n // R3F's default camera lives outside the scene graph (managed by the\n // fiber store, not added as a scene child). Register it explicitly so\n // it appears as <three-camera> in the DOM and DevTools, nested under\n // the scene element.\n if (!store.has(camera)) {\n const camMeta = store.register(camera);\n camMeta.parentUuid = scene.uuid;\n mirror.materialize(camera.uuid);\n }\n\n mirror.materializeSubtree(scene.uuid, initialDepth);\n if (!filter) {\n cancelAsyncReg = store.registerTreeAsync(scene);\n }\n } else {\n // Manual mode: only register the scene root so the mirror has a container\n store.addTrackedRoot(scene);\n store.register(scene);\n mirror.onObjectAdded(scene);\n }\n r3fLog('setup', `Scene registered (mode=${mode}): ${store.getCount()} objects`);\n\n // ---- Selection, highlighting, and inspect controller ----\n selectionManager = new SelectionManager();\n highlighter = new Highlighter();\n highlighter.attach(scene as Scene, selectionManager, camera, gl, store);\n raycastAccelerator = new RaycastAccelerator(store);\n\n inspectController = new InspectController({\n camera,\n renderer: gl,\n selectionManager,\n highlighter,\n raycastAccelerator,\n mirror,\n store,\n });\n\n _selectionManagers.set(instanceKey, selectionManager);\n _highlighters.set(instanceKey, highlighter);\n _inspectControllers.set(instanceKey, inspectController);\n\n exposeGlobalAPI(store, gl, cameraRef, selectionManager, inspectController, mirror, canvasId, isPrimary);\n r3fLog('bridge', `exposeGlobalAPI called — bridge is live, _ready=true${canvasId ? `, canvasId=\"${canvasId}\"` : ''}`);\n currentApi = canvasId\n ? window.__R3F_DOM_INSTANCES__?.[canvasId]\n : window.__R3F_DOM__;\n _stores.set(instanceKey, store);\n _mirrors.set(instanceKey, mirror);\n\n if (inspectProp) {\n inspectController.enable();\n }\n\n if (debug) {\n const inspectStatus = inspectProp ? 'on' : 'off';\n // eslint-disable-next-line no-console\n console.log(\n '%c[react-three-dom]%c v' + version + ' — ' + store.getCount() + ' objects · inspect: ' + inspectStatus + '\\n' +\n ' %c→%c Toggle inspect: %c__R3F_DOM__.setInspectMode(true|false)%c\\n' +\n ' %c→%c Hover 3D objects to highlight + auto-reveal in Elements tab',\n 'background:#1a73e8;color:#fff;padding:2px 6px;border-radius:3px;font-weight:bold',\n 'color:inherit',\n 'color:#1a73e8', 'color:inherit',\n 'color:#e8a317;font-family:monospace', 'color:inherit',\n 'color:#1a73e8', 'color:inherit',\n );\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n r3fLog('setup', 'ThreeDom setup failed', err);\n console.error('[react-three-dom] Setup failed:', err);\n const stubApi = createStubBridge(errorMsg, canvasId);\n if (isPrimary) window.__R3F_DOM__ = stubApi;\n if (canvasId) {\n if (!window.__R3F_DOM_INSTANCES__) window.__R3F_DOM_INSTANCES__ = {};\n window.__R3F_DOM_INSTANCES__[canvasId] = stubApi;\n }\n currentApi = stubApi;\n }\n\n // ---- Cleanup ----\n return () => {\n r3fLog('setup', 'ThreeDom cleanup started');\n if (cancelAsyncReg) cancelAsyncReg();\n if (inspectController) inspectController.dispose();\n if (raycastAccelerator) raycastAccelerator.dispose();\n if (highlighter) highlighter.dispose();\n if (unpatch) unpatch();\n removeGlobalAPI(currentApi, canvasId);\n clearInteractionState();\n if (selectionManager) selectionManager.dispose();\n if (mirror) mirror.dispose();\n if (store) store.dispose();\n canvas.removeAttribute('data-r3f-canvas');\n if (createdRoot && rootElement?.parentNode) {\n rootElement.parentNode.removeChild(rootElement);\n }\n _stores.delete(instanceKey);\n _mirrors.delete(instanceKey);\n _selectionManagers.delete(instanceKey);\n _highlighters.delete(instanceKey);\n _inspectControllers.delete(instanceKey);\n _modes.delete(instanceKey);\n _filters.delete(instanceKey);\n if (debug) enableDebug(false);\n r3fLog('setup', 'ThreeDom cleanup complete');\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `size` is intentionally excluded:\n // it's synced every frame via setInteractionState in useFrame. Including it here\n // would tear down and rebuild the entire bridge on every resize, losing inspect\n // mode state, selection, and highlights.\n }, [scene, camera, gl, enabled, root, maxDomNodes, initialDepth, debug, inspectProp, canvasId, isPrimary, instanceKey]);\n\n // -----------------------------------------------------------------------\n // Per-frame sync\n // -----------------------------------------------------------------------\n\n useFrame(() => {\n const _store = _stores.get(instanceKey);\n const _mirror = _mirrors.get(instanceKey);\n const _highlighter = _highlighters.get(instanceKey);\n const _inspectController = _inspectControllers.get(instanceKey);\n\n if (!enabled || !_store || !_mirror) return;\n\n try {\n setInteractionState(_store, camera, gl, size);\n\n if (_inspectController) _inspectController.updateCamera(camera);\n\n const store = _store;\n const mirror = _mirror;\n const start = performance.now();\n\n // Sync priority (dirty) objects first\n const dirtyObjects = store.drainDirtyQueue();\n for (const obj of dirtyObjects) {\n store.update(obj);\n mirror.syncAttributes(obj);\n }\n\n // Amortized attribute sync\n const budgetRemaining = syncBudgetMs - (performance.now() - start);\n if (budgetRemaining > 0.1) {\n const objects = store.getFlatList();\n if (objects.length > 0) {\n const end = Math.min(cursorRef.current + batchSize, objects.length);\n for (let i = cursorRef.current; i < end; i++) {\n if (performance.now() - start > syncBudgetMs) break;\n const obj = objects[i];\n const changed = store.update(obj);\n if (changed) mirror.syncAttributes(obj);\n }\n cursorRef.current = end >= objects.length ? 0 : end;\n }\n }\n\n // Update 3D highlights (sync transforms with source objects)\n if (_highlighter) _highlighter.update();\n\n // Periodic orphan sweep (~every 30s) to prevent memory leaks\n const now = performance.now();\n if (now - lastSweepRef.current > 30_000) {\n lastSweepRef.current = now;\n store.sweepOrphans();\n }\n } catch (err) {\n r3fLog('sync', 'Per-frame sync error', err);\n }\n });\n\n return null;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { Object3D } from 'three';\n\ntype BridgeAPI = {\n r3fRegister(o: Object3D): void;\n r3fUnregister(o: Object3D): void;\n};\n\nfunction getAPI(canvasId?: string): BridgeAPI | undefined {\n if (canvasId) {\n return (window as Window & { __R3F_DOM_INSTANCES__?: Record<string, BridgeAPI> })\n .__R3F_DOM_INSTANCES__?.[canvasId];\n }\n return (window as Window & { __R3F_DOM__?: BridgeAPI }).__R3F_DOM__;\n}\n\n/**\n * Registers a Three.js object with the react-three-dom bridge on mount and\n * unregisters it on unmount. Works in both `auto` and `manual` mode.\n *\n * - In `manual` mode this is the primary way to opt objects into the mirror DOM.\n * - In `auto` mode it can force-register objects excluded by a `filter`.\n * - Handles `ref.current` identity changes automatically.\n * - If the bridge isn't ready on mount, retries each frame until available.\n * - Supports multi-canvas via the optional `canvasId` parameter.\n *\n * @param ref - Ref to the Three.js object to register\n * @param canvasId - Optional canvas ID for multi-canvas setups. When omitted,\n * uses the primary bridge (`window.__R3F_DOM__`).\n *\n * @example\n * ```tsx\n * function Wall({ geometry }) {\n * const ref = useRef<Mesh>(null!);\n * useR3FRegister(ref);\n * return <mesh ref={ref} geometry={geometry} userData={{ testId: 'wall' }} />;\n * }\n *\n * // Multi-canvas\n * function Overlay() {\n * const ref = useRef<Mesh>(null!);\n * useR3FRegister(ref, 'overlay');\n * return <mesh ref={ref} />;\n * }\n * ```\n */\nexport function useR3FRegister(\n ref: React.RefObject<Object3D | null>,\n canvasId?: string,\n): void {\n const trackedObj = useRef<Object3D | null>(null);\n const canvasIdRef = useRef(canvasId);\n canvasIdRef.current = canvasId;\n\n const register = useCallback((obj: Object3D) => {\n const api = getAPI(canvasIdRef.current);\n if (!api) return false;\n api.r3fRegister(obj);\n trackedObj.current = obj;\n return true;\n }, []);\n\n const unregister = useCallback(() => {\n if (!trackedObj.current) return;\n const api = getAPI(canvasIdRef.current);\n api?.r3fUnregister(trackedObj.current);\n trackedObj.current = null;\n }, []);\n\n useEffect(() => {\n const obj = ref.current;\n if (obj) register(obj);\n return () => unregister();\n }, [ref, register, unregister]);\n\n // Per-frame: detect ref.current swaps + retry if bridge wasn't ready on mount\n useFrame(() => {\n const current = ref.current;\n if (current === trackedObj.current) return;\n unregister();\n if (current) register(current);\n });\n}\n"]}
|