From 0dfbcc901fddc8629b1575086fcd1b7947ede9ff Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 25 Dec 2025 16:03:07 -0700 Subject: [PATCH] Fix Pick distance calculation (#751) --- miniwin/src/d3drm/d3drmviewport.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/miniwin/src/d3drm/d3drmviewport.cpp b/miniwin/src/d3drm/d3drmviewport.cpp index e3bb79d3..165f0675 100644 --- a/miniwin/src/d3drm/d3drmviewport.cpp +++ b/miniwin/src/d3drm/d3drmviewport.cpp @@ -802,16 +802,21 @@ HRESULT Direct3DRMViewportImpl::Pick(float x, float y, LPDIRECT3DRMPICKEDARRAY* ComputeFrameWorldMatrix(frame, worldMatrix); D3DRMBOX worldBox = ComputeTransformedAABB(box, worldMatrix); - float distance = FLT_MAX; - if (RayIntersectsBox(pickRay, worldBox, distance) && - RayIntersectsMeshTriangles(pickRay, *mesh, worldMatrix, distance)) { - auto* arr = new Direct3DRMFrameArrayImpl(); - for (IDirect3DRMFrame* f : path) { - arr->AddElement(f); - } + float boxDist = FLT_MAX; - PickRecord rec = {visual, arr, {distance}}; - hits.push_back(rec); + // Check box first as an optimization + if (RayIntersectsBox(pickRay, worldBox, boxDist)) { + float meshDist = FLT_MAX; + + if (RayIntersectsMeshTriangles(pickRay, *mesh, worldMatrix, meshDist)) { + auto* arr = new Direct3DRMFrameArrayImpl(); + for (IDirect3DRMFrame* f : path) { + arr->AddElement(f); + } + + PickRecord rec = {visual, arr, {meshDist}}; + hits.push_back(rec); + } } mesh->Release(); }