From 1535f95cf11b92185ce2918b236ee8a25e81cd61 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 3 Feb 2026 13:18:02 +0100 Subject: [PATCH] Fix mesh collision proxy setup for meshes using packed positions format #3791 --- Source/Engine/Core/Math/Half.h | 13 ++++++++ Source/Engine/Core/Math/Packed.cpp | 10 ------ Source/Engine/Core/Math/Packed.h | 11 +++++-- .../Engine/Graphics/Models/CollisionProxy.h | 33 ++++++++++++++----- Source/Engine/Graphics/Models/MeshBase.cpp | 5 +-- 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/Source/Engine/Core/Math/Half.h b/Source/Engine/Core/Math/Half.h index 2617649d0..ebb2cc951 100644 --- a/Source/Engine/Core/Math/Half.h +++ b/Source/Engine/Core/Math/Half.h @@ -248,6 +248,19 @@ public: explicit Half4(const Color& c); explicit Half4(const Rectangle& rect); + operator Float2() const + { + return ToFloat2(); + } + operator Float3() const + { + return ToFloat3(); + } + operator Float4() const + { + return ToFloat4(); + } + public: Float2 ToFloat2() const; Float3 ToFloat3() const; diff --git a/Source/Engine/Core/Math/Packed.cpp b/Source/Engine/Core/Math/Packed.cpp index 55ebd9ccf..b22e65d3e 100644 --- a/Source/Engine/Core/Math/Packed.cpp +++ b/Source/Engine/Core/Math/Packed.cpp @@ -41,16 +41,6 @@ FloatR10G10B10A2::FloatR10G10B10A2(const float* values) { } -FloatR10G10B10A2::operator Float3() const -{ - return ToFloat3(); -} - -FloatR10G10B10A2::operator Float4() const -{ - return ToFloat4(); -} - Float3 FloatR10G10B10A2::ToFloat3() const { Float3 vectorOut; diff --git a/Source/Engine/Core/Math/Packed.h b/Source/Engine/Core/Math/Packed.h index 8e3aad41f..c5b5e827f 100644 --- a/Source/Engine/Core/Math/Packed.h +++ b/Source/Engine/Core/Math/Packed.h @@ -40,9 +40,14 @@ struct FLAXENGINE_API FloatR10G10B10A2 { return Value; } - - operator Float3() const; - operator Float4() const; + operator Float3() const + { + return ToFloat3(); + } + operator Float4() const + { + return ToFloat4(); + } FloatR10G10B10A2& operator=(const FloatR10G10B10A2& other) { diff --git a/Source/Engine/Graphics/Models/CollisionProxy.h b/Source/Engine/Graphics/Models/CollisionProxy.h index 5dc021867..eba17cf4e 100644 --- a/Source/Engine/Graphics/Models/CollisionProxy.h +++ b/Source/Engine/Graphics/Models/CollisionProxy.h @@ -6,7 +6,9 @@ #include "Engine/Core/Math/Transform.h" #include "Engine/Core/Math/Ray.h" #include "Engine/Core/Math/CollisionsHelper.h" +#include "Engine/Core/Math/Packed.h" #include "Engine/Core/Collections/Array.h" +#include "Engine/Graphics/PixelFormat.h" /// /// Helper container used for detailed triangle mesh intersections tests. @@ -31,23 +33,38 @@ public: } template - void Init(uint32 vertices, uint32 triangles, const Float3* positions, const IndexType* indices, uint32 positionsStride = sizeof(Float3)) + void Init(uint32 vertices, uint32 triangles, const Float3* positions, const IndexType* indices, uint32 positionsStride = sizeof(Float3), PixelFormat positionsFormat = PixelFormat::R32G32B32_Float) { Triangles.Clear(); Triangles.EnsureCapacity(triangles, false); const IndexType* it = indices; - for (uint32 i = 0; i < triangles; i++) +#define LOOP_BEGIN() \ + for (uint32 i = 0; i < triangles; i++) \ + { \ + const IndexType i0 = *(it++); \ + const IndexType i1 = *(it++); \ + const IndexType i2 = *(it++); \ + if (i0 < vertices && i1 < vertices && i2 < vertices) \ { - const IndexType i0 = *(it++); - const IndexType i1 = *(it++); - const IndexType i2 = *(it++); - if (i0 < vertices && i1 < vertices && i2 < vertices) - { +#define LOOP_END() } } + if (positionsFormat == PixelFormat::R32G32B32_Float) + { + LOOP_BEGIN() #define GET_POS(idx) *(const Float3*)((const byte*)positions + positionsStride * idx) Triangles.Add({ GET_POS(i0), GET_POS(i1), GET_POS(i2) }); #undef GET_POS - } + LOOP_END() } + else if (positionsFormat == PixelFormat::R16G16B16A16_Float) + { + LOOP_BEGIN() +#define GET_POS(idx) (Float3)*(const Half4*)((const byte*)positions + positionsStride * idx) + Triangles.Add({ GET_POS(i0), GET_POS(i1), GET_POS(i2) }); +#undef GET_POS + LOOP_END() + } +#undef LOOP_BEGIN +#undef LOOP_END } void Clear() diff --git a/Source/Engine/Graphics/Models/MeshBase.cpp b/Source/Engine/Graphics/Models/MeshBase.cpp index 3434cd91a..91ed892ea 100644 --- a/Source/Engine/Graphics/Models/MeshBase.cpp +++ b/Source/Engine/Graphics/Models/MeshBase.cpp @@ -470,10 +470,11 @@ bool MeshBase::Init(uint32 vertices, uint32 triangles, const ArrayFindElement(VertexElement::Types::Position); if (use16BitIndexBuffer) - _collisionProxy.Init(vertices, triangles, (const Float3*)vbData[0], (const uint16*)ibData); + _collisionProxy.Init(vertices, triangles, (const Float3*)vbData[0], (const uint16*)ibData, vertexBuffer0->GetStride(), positionsElement.Format); else - _collisionProxy.Init(vertices, triangles, (const Float3*)vbData[0], (const uint32*)ibData); + _collisionProxy.Init(vertices, triangles, (const Float3*)vbData[0], (const uint32*)ibData, vertexBuffer0->GetStride(), positionsElement.Format); #endif // Free old buffers