From 22e3ede63c66109cf92b8573da84d67f1680d63a Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 21 May 2026 21:24:35 +0000 Subject: [PATCH] Changes Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com> --- src/components/three/XRControllerMeasure.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/components/three/XRControllerMeasure.tsx b/src/components/three/XRControllerMeasure.tsx index d5ef45c..f4a3768 100644 --- a/src/components/three/XRControllerMeasure.tsx +++ b/src/components/three/XRControllerMeasure.tsx @@ -49,12 +49,21 @@ export function XRControllerMeasure() { const dwellStart = useRef(0); const dwellFired = useRef(false); + // Throttling: raycast + snap analysis are heavy on dense IFC models and + // running them every frame at 72fps can stall the Quest right after + // toggling "Medir" from the Ferramentas tab. We cap heavy work to ~24Hz. + // Trigger/A/B/L-trigger polling continues every frame for responsiveness. + const heavyFrame = useRef(0); + const cachedSnappedPoint = useRef(null); + const cachedSnapKind = useRef<'vertex' | 'edge' | 'surface' | 'hole'>('surface'); + useFrame((_state, _dt, frame: XRFrame | undefined) => { const measureMode = useModelStore.getState().measureMode; const selectionMode = useModelStore.getState().selectionMode; if (laserRef.current) laserRef.current.visible = false; if (tipRef.current) tipRef.current.visible = false; if ((!measureMode && !selectionMode) || !frame) return; + const doHeavy = (heavyFrame.current++ % 3) === 0; const session = frame.session; const refSpace = gl.xr.getReferenceSpace();