From 83f0125cf83835235154928e7a0ac6783b9e6f23 Mon Sep 17 00:00:00 2001 From: Steve Streeting Date: Wed, 8 Nov 2023 11:34:14 +0000 Subject: [PATCH] Add OverlapConvex utility function --- .../Private/StevesMathHelpers.cpp | 45 +++++++++++++++++++ .../Public/StevesMathHelpers.h | 19 ++++++++ .../StevesUEHelpers/StevesUEHelpers.Build.cs | 4 +- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 Source/StevesUEHelpers/Private/StevesMathHelpers.cpp diff --git a/Source/StevesUEHelpers/Private/StevesMathHelpers.cpp b/Source/StevesUEHelpers/Private/StevesMathHelpers.cpp new file mode 100644 index 0000000..b1b7338 --- /dev/null +++ b/Source/StevesUEHelpers/Private/StevesMathHelpers.cpp @@ -0,0 +1,45 @@ +#include "StevesMathHelpers.h" + +#include "Chaos/CastingUtilities.h" +#include "Chaos/GeometryQueries.h" + +bool StevesMathHelpers::OverlapConvex(const FKConvexElem& Convex, + const FTransform& ConvexTransform, + const FCollisionShape& Shape, + const FVector& ShapePos, + const FQuat& ShapeRot, + FMTDResult& OutResult) +{ + const FPhysicsShapeAdapter ShapeAdapter(ShapeRot, Shape); + const TSharedPtr& ChaosConvex = Convex.GetChaosConvexMesh(); + if (!ChaosConvex.IsValid()) + return false; + + const Chaos::FImplicitObject& ShapeGeom = ShapeAdapter.GetGeometry(); + const FTransform& ShapeGeomTransform = ShapeAdapter.GetGeomPose(ShapePos); + + OutResult.Distance = 0; + + bool bHasOverlap = false; + + Chaos::FMTDInfo MTDInfo; + if (Chaos::Utilities::CastHelper(ShapeGeom, + ShapeGeomTransform, + [&](const auto& Downcast, const auto& FullGeomTransform) + { + return Chaos::OverlapQuery(*ChaosConvex.Get(), + ConvexTransform, + Downcast, + FullGeomTransform, + /*Thickness=*/ + 0, + &MTDInfo); + })) + { + bHasOverlap = true; + OutResult.Distance = MTDInfo.Penetration; + OutResult.Direction = MTDInfo.Normal; + } + + return bHasOverlap; +} diff --git a/Source/StevesUEHelpers/Public/StevesMathHelpers.h b/Source/StevesUEHelpers/Public/StevesMathHelpers.h index 0805cfe..791f705 100644 --- a/Source/StevesUEHelpers/Public/StevesMathHelpers.h +++ b/Source/StevesUEHelpers/Public/StevesMathHelpers.h @@ -1,5 +1,7 @@ #pragma once +struct FKConvexElem; + /// Helper maths routines that UE4 is missing, all static class STEVESUEHELPERS_API StevesMathHelpers { @@ -79,4 +81,21 @@ public: } return false; } + + /** + * Explicitly test the overlap of any collision shape with a convex element. + * @param Convex The convex element + * @param ConvexTransform The world transform of the convex element + * @param Shape The test shape + * @param ShapePos The test shape world position + * @param ShapeRot The test shape world rotation + * @param OutResult Details of the result if returning true + * @return Whether this shape overlaps the convex element + */ + static bool OverlapConvex(const FKConvexElem& Convex, + const FTransform& ConvexTransform, + const FCollisionShape& Shape, + const FVector& ShapePos, + const FQuat& ShapeRot, + FMTDResult& OutResult); }; \ No newline at end of file diff --git a/Source/StevesUEHelpers/StevesUEHelpers.Build.cs b/Source/StevesUEHelpers/StevesUEHelpers.Build.cs index fd53c74..102a76e 100644 --- a/Source/StevesUEHelpers/StevesUEHelpers.Build.cs +++ b/Source/StevesUEHelpers/StevesUEHelpers.Build.cs @@ -37,7 +37,9 @@ public class StevesUEHelpers : ModuleRules PrivateDependencyModuleNames.AddRange( new string[] { - "RenderCore" + "RenderCore", + "PhysicsCore", + "Chaos" } );