From b17070adf50aae0c7ced00b12f460e612f4a201b Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Thu, 18 Aug 2022 15:54:02 +0200 Subject: [PATCH] Fix picking to properly select closest triangle for meshes --- Source/Engine/Graphics/Models/CollisionProxy.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/Engine/Graphics/Models/CollisionProxy.h b/Source/Engine/Graphics/Models/CollisionProxy.h index f21cae2fa..cef3b58b7 100644 --- a/Source/Engine/Graphics/Models/CollisionProxy.h +++ b/Source/Engine/Graphics/Models/CollisionProxy.h @@ -57,6 +57,7 @@ public: bool Intersects(const Ray& ray, const Matrix& world, Real& distance, Vector3& normal) const { + distance = MAX_Real; for (int32 i = 0; i < Triangles.Count(); i++) { CollisionTriangle triangle = Triangles[i]; @@ -66,18 +67,18 @@ public: // TODO: use 32-bit precision for intersection Real d; - if (CollisionsHelper::RayIntersectsTriangle(ray, triangle.V0, triangle.V1, triangle.V2, d)) + if (CollisionsHelper::RayIntersectsTriangle(ray, triangle.V0, triangle.V1, triangle.V2, d) && d < distance) { normal = Vector3::Normalize((triangle.V1 - triangle.V0) ^ (triangle.V2 - triangle.V0)); distance = d; - return true; } } - return false; + return distance < MAX_Real; } bool Intersects(const Ray& ray, const Transform& transform, Real& distance, Vector3& normal) const { + distance = MAX_Real; for (int32 i = 0; i < Triangles.Count(); i++) { CollisionTriangle triangle = Triangles[i]; @@ -88,13 +89,12 @@ public: // TODO: use 32-bit precision for intersection Real d; - if (CollisionsHelper::RayIntersectsTriangle(ray, v0, v1, v2, d)) + if (CollisionsHelper::RayIntersectsTriangle(ray, v0, v1, v2, d) && d < distance) { normal = Vector3::Normalize((v1 - v0) ^ (v2 - v0)); distance = d; - return true; } } - return false; + return distance < MAX_Real; } };