From 2693eb1da4c3e982e815176463431c2a44b5df5f 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 12:55:02 +0000 Subject: [PATCH] Changes Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com> --- src/components/three/SmartMeasure.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/components/three/SmartMeasure.ts b/src/components/three/SmartMeasure.ts index 33b1792..a7075ba 100644 --- a/src/components/three/SmartMeasure.ts +++ b/src/components/three/SmartMeasure.ts @@ -316,3 +316,22 @@ function pointToSegmentDist(px: number, py: number, ax: number, ay: number, bx: const closestY = ay + t * dy; return Math.sqrt((px - closestX) ** 2 + (py - closestY) ** 2); } + +/** + * Combined snap resolver: tries vertex first, then edge midpoint, + * falling back to the raw hit point. Returns { point, type }. + */ +export function resolveSnap( + mesh: THREE.Mesh, + hitPoint: THREE.Vector3, + camera: THREE.Camera, + canvasSize: { width: number; height: number }, + vertexThresholdPx: number = 12, + edgeThresholdPx: number = 16 +): { point: THREE.Vector3; type: 'vertex' | 'edge' | 'surface' } { + const v = findNearestVertex(mesh, hitPoint, camera, canvasSize, vertexThresholdPx); + if (v) return { point: v, type: 'vertex' }; + const e = findNearestEdgeSegment(mesh, hitPoint, camera, canvasSize, edgeThresholdPx); + if (e) return { point: e.midpoint, type: 'edge' }; + return { point: hitPoint.clone(), type: 'surface' }; +}