17#if WITH_CHAOS_VISUAL_DEBUGGER
28template <
typename TLocationHit>
31 if constexpr (std::is_base_of_v<ChaosInterface::FLocationHit, TLocationHit> || std::is_base_of_v<ChaosInterface::FPTLocationHit, TLocationHit>)
35 Hit.WorldNormal = WorldNormal;
37 Hit.FaceIndex = FaceIdx;
41template <
typename QueryGeometryType,
typename TPayload,
typename THitType,
bool bGTData = true>
44 using TGeometryType = std::conditional_t<bGTData, Chaos::FGeometryParticle, Chaos::FGeometryParticleHandle>;
57 , QueryFilterDataConcrete(
C2UFilterData(QueryFilterData.data))
59 , QueryCenter(StartTM.GetLocation())
61 QueryGeomWorldBounds =
FAABB3(QueryCenter, QueryCenter);
74 , QueryFilterDataConcrete(
C2UFilterData(QueryFilterData.data))
85 UE_DEPRECATED(5.8,
"Use the overload that takes the QueryGeomWorldBounds")
99 , QueryFilterDataConcrete(
C2UFilterData(QueryFilterData.data))
110 UE_DEPRECATED(5.8,
"Use the overload that takes the QueryGeomWorldBounds")
136 return &QueryFilterDataConcrete;
168 return Payload.GetExternalGeometryParticle_ExternalThread();
170 else if constexpr (TPayload::bHasPayloadOnInternalThread)
172 return Payload.GetGeometryParticleHandle_PhysicsThread();
180 template <ESQType SQ>
187 using namespace Chaos;
205 ensureMsgf(
false,
TEXT(
"Query dangling handle detected on game Thread. Payload Id: %d, Particle Id: %d"), Payload.UniqueIdx().Idx,
GeometryParticle->UniqueIdx().Idx);
214 ensureMsgf(
false,
TEXT(
"Query dangling handle detected on Physics Thread. Payload Id: %d, Particle Id: %d"), Payload.UniqueIdx().Idx,
GeometryParticle->UniqueIdx().Idx);
231 for (
int32 ShapeIndex = 0; ShapeIndex < Shapes.
Num(); ++ShapeIndex)
242 if (
SQ == ESQType::Raycast)
254 if (
SQ != ESQType::Overlap)
287 Hit.Shape = Shape.
Get();
294 FVec3 FaceNormal = FVec3::ZeroVector;
297 if (
SQ == ESQType::Raycast)
311 else if (
SQ == ESQType::Sweep &&
ensure(QueryGeom))
313 bHit =
SweepQuery(*Geom,
ActorTM, *QueryGeom, StartTM,
CurData->Dir,
CurData->CurrentLength,
Distance,
WorldPosition, WorldNormal, FaceIdx, FaceNormal, 0.f, bComputeMTD);
315 else if (
SQ == ESQType::Overlap &&
ensure(QueryGeom))
339 if constexpr (
SQ == ESQType::Sweep && std::is_same_v<THitType, ChaosInterface::FSweepHit>)
343 if (FaceIdx !=
INDEX_NONE || !FaceNormal.IsNearlyZero())
360 HitFaceNormal = FaceNormal;
374 HitFaceNormal = FaceNormal;
390 if constexpr (std::is_base_of_v<ChaosInterface::FQueryHit, THitType> || std::is_base_of_v<ChaosInterface::FPTQueryHit, THitType>)
392 Hit.FaceNormal = HitFaceNormal;
409 if (bBlocker &&
SQ != ESQType::Overlap)
415 if (
CurData->CurrentLength == 0 && (
SQ == ESQType::Raycast))
459 Payload.DebugDraw(bExternal, bHit);
468 template <ESQType SQ>
471 if (
SQ == ESQType::Raycast)
473 const FVector EndPoint = StartPoint + (Dir *
CurData->CurrentLength);
474 Chaos::FDebugDrawQueue::GetInstance().DrawDebugDirectionalArrow(StartPoint, EndPoint, 5.f, bHit ?
FColor::Red :
FColor::
Green);
476 else if (
SQ == ESQType::Overlap)
483 Chaos::FDebugDrawQueue::GetInstance().DrawDebugBox(
Instance.Bounds.Center(),
Instance.Bounds.Extents(),
FQuat::Identity, bHit ?
FColor(100, 50, 50) :
FColor(50, 100, 50),
false, -1.f, 0, 0.f);
506 FVec3 QueryCenter = FVec3::ZeroVector;
510template <
typename QueryGeometryType,
typename TPayload,
typename THitType,
bool bGTData = true>
513 using TGeometryType = std::conditional_t<bGTData, Chaos::FGeometryParticle, Chaos::FGeometryParticleHandle>;
551 return &QueryFilterDataConcrete;
578 return Payload.GetExternalGeometryParticle_ExternalThread();
580 else if constexpr (TPayload::bHasPayloadOnInternalThread)
582 return Payload.GetGeometryParticleHandle_PhysicsThread();
590 template <ESQType SQ>
596 using namespace Chaos;
609 for (
int32 ShapeIndex = 0; ShapeIndex < Shapes.
Num(); ++ShapeIndex)
619 Hit.Shape = Shape.
Get();
653template <
typename QueryGeomType,
typename TSweepHit,
typename TPayload>
654void SweepHelper(
const QueryGeomType& QueryGeom,
const Chaos::ISpatialAcceleration<TPayload, Chaos::FReal, 3>& SpatialAcceleration,
const FTransform& StartTM,
const FVector& Dir,
const float DeltaMagnitude,
ChaosInterface::FSQHitBuffer<TSweepHit>& HitBuffer,
EHitFlags OutputFlags,
const ChaosInterface::FQueryFilterData& QueryFilterData,
ICollisionQueryFilterCallbackBase& QueryCallback,
const ChaosInterface::FQueryDebugParams& DebugParams)
656 using namespace Chaos;
659 const FAABB3 Bounds = QueryGeom.CalculateTransformedBounds(StartTM);
664 TSQVisitor<QueryGeomType, TPayload, TSweepHit, std::is_same<TSweepHit, FSweepHit>::value>
SweepVisitor(StartTM, Dir, HitBuffer, OutputFlags, QueryFilterData, QueryCallback, QueryGeom, Bounds, DebugParams);
678template <
typename QueryGeomType,
typename TOverlapHit,
typename TPayload>
681 using namespace Chaos;
684 const FAABB3 Bounds = QueryGeom.CalculateTransformedBounds(GeomPose);
693 constexpr bool bGTData = std::is_same<TOverlapHit, FOverlapHit>::value;
694 if (bSkipNarrowPhase)
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ ColocatedHitHasWorseNormal
#define CVD_FILL_HIT_DATA_HELPER(Hit, HitType)
Definition ChaosVDSQVisitorHelpers.h:98
#define CVD_TRACE_SCOPED_SCENE_QUERY_VISIT_HELPER(Type, ParticleTransform, ParticleIndex, ShapeIndex, CurData)
Definition ChaosVDSQVisitorHelpers.h:95
#define CVD_SET_SQ_SHAPE_REJECT_REASON(RejectReason)
Definition ChaosVDSQVisitorHelpers.h:101
ECollisionQueryHitType
Definition CollisionQueryFilterCallbackCore.h:13
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
EHitFlags
Definition PhysicsInterfaceWrapperShared.h:65
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
UE::Math::TTransform< double > FTransform
Definition MathFwd.h:53
FCollisionFilterData C2UFilterData(const FChaosFilterData &PFilterData)
Definition PhysicsInterfaceUtilsCore.cpp:9
FCollisionFilterData ToUnrealFilterData(const FChaosFilterData &FilterData)
Definition PhysicsInterfaceUtilsCore.cpp:24
void OverlapHelper(const QueryGeomType &QueryGeom, const Chaos::ISpatialAcceleration< TPayload, Chaos::FReal, 3 > &SpatialAcceleration, const FTransform &GeomPose, ChaosInterface::FSQHitBuffer< TOverlapHit > &HitBuffer, const ChaosInterface::FQueryFilterData &QueryFilterData, ICollisionQueryFilterCallbackBase &QueryCallback, const ChaosInterface::FQueryDebugParams &DebugParams)
Definition SQVisitor.h:679
void SweepHelper(const QueryGeomType &QueryGeom, const Chaos::ISpatialAcceleration< TPayload, Chaos::FReal, 3 > &SpatialAcceleration, const FTransform &StartTM, const FVector &Dir, const float DeltaMagnitude, ChaosInterface::FSQHitBuffer< TSweepHit > &HitBuffer, EHitFlags OutputFlags, const ChaosInterface::FQueryFilterData &QueryFilterData, ICollisionQueryFilterCallbackBase &QueryCallback, const ChaosInterface::FQueryDebugParams &DebugParams)
Definition SQVisitor.h:654
void FillHitHelper(TLocationHit &Hit, const Chaos::FReal Distance, const FVector &WorldPosition, const FVector &WorldNormal, int32 FaceIdx, bool bComputeMTD)
Definition SQVisitor.h:29
const HitType * GetCurrentHit() const
Definition SQTypes.h:268
void IncFlushCount()
Definition SQTypes.h:233
void DecFlushCount()
Definition SQTypes.h:238
void InsertHit(const HitType &Hit, bool bBlocking)
Definition SQTypes.h:271
bool HasBlockingHit() const
Definition SQTypes.h:255
bool WantsSingleResult() const
Definition SQTypes.h:286
Definition ImplicitObject.h:111
virtual bool Raycast(const FVec3 &StartPoint, const FVec3 &Dir, const FReal Length, const FReal Thickness, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex) const
Definition ImplicitObject.h:299
Definition ISpatialAcceleration.h:267
virtual void Overlap(const FAABB3 &QueryBounds, ISpatialVisitor< TPayloadType, FReal > &Visitor) const
Definition ISpatialAcceleration.h:298
virtual void Sweep(const FVec3 &Start, const FVec3 &Dir, const FReal Length, const FVec3 QueryHalfExtents, ISpatialVisitor< TPayloadType, FReal > &Visitor) const
Definition ISpatialAcceleration.h:297
Definition ISpatialAcceleration.h:120
FORCEINLINE const TVector< T, d > & Max() const
Definition AABB.h:596
FORCEINLINE TVector< T, d > Center() const
Definition AABB.h:450
FORCEINLINE TVector< T, d > Extents() const
Definition AABB.h:453
static FORCEINLINE TAABB< FReal, d > ZeroAABB()
Definition AABB.h:630
FORCEINLINE const TVector< T, d > & Min() const
Definition AABB.h:595
FORCEINLINE TVector< T, d > GetCenter() const
Definition AABB.h:451
bool ContainsNaN() const
Definition Vector.h:188
Definition IConsoleManager.h:1580
Definition CollisionQueryFilterCallbackCore.h:25
virtual ECollisionQueryHitType PostFilter(const FCollisionFilterData &FilterData, const ChaosInterface::FQueryHit &Hit)=0
virtual ECollisionQueryHitType PreFilter(const FCollisionFilterData &FilterData, const Chaos::FPerShapeData &Shape, const Chaos::FGeometryParticle &Actor)=0
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition UniquePtr.h:107
UE_FORCEINLINE_HINT T * Get() const
Definition UniquePtr.h:324
Definition ChaosInterfaceUtils.cpp:28
Definition SkeletalMeshComponent.h:307
bool SweepQuery(const FImplicitObject &A, const FRigidTransform3 &ATM, const SweptGeometry &B, const FRigidTransform3 &BTM, const FVec3 &Dir, const FReal Length, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex, FVec3 &OutFaceNormal, const FReal Thickness, const bool bComputeMTD)
Definition GeometryQueries.h:252
FRealDouble FReal
Definition Real.h:22
TVector< FReal, 3 > FVec3
Definition Core.h:17
bool OverlapQuery(const FImplicitObject &A, const FRigidTransform3 &ATM, const QueryGeometry &B, const FRigidTransform3 &BTM, const FReal Thickness=0, FMTDInfo *OutMTD=nullptr)
Definition GeometryQueries.h:34
TAABB< FReal, 3 > FAABB3
Definition ImplicitObject.h:34
@ false
Definition radaudio_common.h:23
Definition ChaosInterfaceWrapperCore.h:79
constexpr bool IsDebugQuery() const
Definition ChaosInterfaceWrapperCore.h:91
Definition GeometryQueries.h:27
Definition ISpatialAcceleration.h:14
Definition ISpatialAcceleration.h:99
Definition PhysicsInterfaceTypesCore.h:390
FChaosQueryFlags flags
Definition PhysicsInterfaceTypesCore.h:398
@ ePOSTFILTER
Run the post-intersection-test filter.
Definition PhysicsInterfaceTypesCore.h:289
@ ePREFILTER
Run the pre-intersection-test filter.
Definition PhysicsInterfaceTypesCore.h:287
@ eANY_HIT
Definition PhysicsInterfaceTypesCore.h:291
@ eSKIPNARROWPHASE
Skip narrow phase check for the query.
Definition PhysicsInterfaceTypesCore.h:297
Definition CollisionFilterData.h:46
static CORE_API const FColor Red
Definition Color.h:752
Definition PhysicsInterfaceWrapperShared.h:86
EHitFlags HitFlags
Definition PhysicsInterfaceWrapperShared.h:113
Definition SQVisitor.h:512
virtual const void * GetQueryPayload() const override
Definition SQVisitor.h:560
virtual const void * GetSimData() const override
Definition SQVisitor.h:554
virtual const void * GetQueryData() const override
Definition SQVisitor.h:549
virtual ~TBPVisitor()
Definition SQVisitor.h:530
std::conditional_t< bGTData, Chaos::FGeometryParticle, Chaos::FGeometryParticleHandle > TGeometryType
Definition SQVisitor.h:513
TBPVisitor(const FTransform &InWorldTM, ChaosInterface::FSQHitBuffer< THitType > &InHitBuffer, const ChaosInterface::FQueryFilterData &InQueryFilterData, ICollisionQueryFilterCallbackBase &InQueryCallback, const QueryGeometryType &InQueryGeom, const ChaosInterface::FQueryDebugParams &InDebugParams)
Definition SQVisitor.h:515
virtual bool Overlap(const Chaos::TSpatialVisitorData< TPayload > &Instance) override
Definition SQVisitor.h:532
virtual bool Raycast(const Chaos::TSpatialVisitorData< TPayload > &Instance, Chaos::FQueryFastData &CurData) override
Definition SQVisitor.h:537
virtual bool Sweep(const Chaos::TSpatialVisitorData< TPayload > &Instance, Chaos::FQueryFastData &CurData) override
Definition SQVisitor.h:543
Definition DelegateInstanceInterface.h:67
Definition SQVisitor.h:43
virtual const void * GetSimData() const override
Definition SQVisitor.h:139
virtual bool Overlap(const Chaos::TSpatialVisitorData< TPayload > &Instance) override
Definition SQVisitor.h:129
virtual bool Sweep(const Chaos::TSpatialVisitorData< TPayload > &Instance, Chaos::FQueryFastData &CurData) override
Definition SQVisitor.h:124
TSQVisitor(const FTransform &InWorldTM, ChaosInterface::FSQHitBuffer< THitType > &InHitBuffer, const ChaosInterface::FQueryFilterData &InQueryFilterData, ICollisionQueryFilterCallbackBase &InQueryCallback, const QueryGeometryType &InQueryGeom, const FAABB3 &InQueryGeomWorldBounds, const ChaosInterface::FQueryDebugParams &InDebugParams)
Definition SQVisitor.h:92
virtual ~TSQVisitor()
Definition SQVisitor.h:117
virtual bool HasBlockingHit() const override
Definition SQVisitor.h:150
virtual bool Raycast(const Chaos::TSpatialVisitorData< TPayload > &Instance, Chaos::FQueryFastData &CurData) override
Definition SQVisitor.h:119
TSQVisitor(const FVector &InStartPoint, const FVector &InDir, ChaosInterface::FSQHitBuffer< THitType > &InHitBuffer, EHitFlags InOutputFlags, const ChaosInterface::FQueryFilterData &InQueryFilterData, ICollisionQueryFilterCallbackBase &InQueryCallback, const ChaosInterface::FQueryDebugParams &InDebugParams)
Definition SQVisitor.h:47
virtual const void * GetQueryData() const override
Definition SQVisitor.h:134
std::conditional_t< bGTData, Chaos::FGeometryParticle, Chaos::FGeometryParticleHandle > TGeometryType
Definition SQVisitor.h:44
TSQVisitor(const FTransform &InStartTM, const FVector &InDir, ChaosInterface::FSQHitBuffer< THitType > &InHitBuffer, EHitFlags InOutputFlags, const ChaosInterface::FQueryFilterData &InQueryFilterData, ICollisionQueryFilterCallbackBase &InQueryCallback, const QueryGeometryType &InQueryGeom, const FAABB3 &InQueryGeomWorldBounds, const ChaosInterface::FQueryDebugParams &InDebugParams)
Definition SQVisitor.h:65
Chaos::FAABB3 FAABB3
Definition SQVisitor.h:45
virtual const void * GetQueryPayload() const override
Definition SQVisitor.h:145
static CORE_API const TQuat< double > Identity
Definition Quat.h:63
static CORE_API const TVector< double > ZeroVector
Definition Vector.h:79