UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ImplicitObject.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include <atomic>
5#include "Chaos/Pair.h"
7#include "Chaos/Core.h"
8#include "Chaos/ImplicitFwd.h"
10#include "Chaos/AABB.h"
13#include "AutoRTFM.h"
14
15#ifndef TRACK_CHAOS_GEOMETRY
16#define TRACK_CHAOS_GEOMETRY !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
17#endif
18
19namespace Chaos
20{
21template<class T, int d>
22class TAABB;
23class FCylinder;
24template<class T, int d>
25class TSphere;
26template<class T, int d>
27class TPlane;
28template<class T, int d>
29class TParticles;
30
32class FImplicitObject;
33
36using FSphere = TSphere<FReal, 3>; // warning: code assumes that FImplicitObjects with type ImplicitObjectType::Sphere are FSpheres, but all TSpheres will think they have ImplicitObjectType::Sphere.
38
39
40template<class T, int d, bool bSerializable>
44
45template<class T, int d>
47{
49
51 {
52 return Object.GetReference();
53 }
54};
55
56template<class T, int d>
58{
60
62 {
63 return Object;
64 }
65};
66
75using FImplicitHierarchyVisitor = TFunctionRef<void(const FImplicitObject* Implicit, const FRigidTransform3& Transform, const int32 RootObjectIndex, const int32 ObjectIndex, const int32 LeafObjectIndex)>;
76using FImplicitHierarchyVisitorBool = TFunctionRef<bool(const FImplicitObject* Implicit, const FRigidTransform3& Transform, const int32 RootObjectIndex, const int32 ObjectIndex, const int32 LeafObjectIndex)>;
77
78
79// Specialized for derived classes so that we can downcast to non-leaf types in the class hierarchy
80// @see TImplicitTypeInfo<FImplicitObjectUnion>
81template<typename T>
83{
84 // Return true if implicits of type InType can be cast to T.
85 // I.e., is T a base class (or the class) of InType.
87 {
88 return (T::StaticType() == InType);
89 }
90};
91
92/*
93 * Base class for implicit collision geometry such as spheres, capsules, boxes, etc.
94 *
95 * Some shapes are represented by a core shape with a margin. E.g. Spheres are
96 * a point with a margin equal to the radius; boxes are a core AABB with a margin.
97 * The margin is considered to be physically part of the shape for the pupose
98 * of collision detection, separating distance, etc.
99 *
100 * The margin exists to make GJK and EPA collision more robust, and is not required
101 * by all derived types. E.g., We never use GJK to perform triangle-triangle collision
102 * so we do not need a margin on triangles. We would need a margin on every type
103 * that can be tested against a triangle though.
104 */
105// Some collision ispc code requires that no tail padding in FImplicitObject is reused by derived class members.
106// This is a compiler-dependent behavior, so if you are not seeing any other compile time errors about sizeof(FImplicitObject) + offsetof(...) with this disabled,
107// you should be OK.
108#define DISALLOW_FIMPLICIT_OBJECT_TAIL_PADDING INTEL_ISPC
109
111{
112public:
113 using TType = FReal;
114 static constexpr int D = 3;
116
120 CHAOS_API virtual ~FImplicitObject() override;
121
122 // Can this object be cast to type T_DERIVED?
123 template<typename TargetType>
124 bool IsA() const
125 {
127 }
128
129 // Dynamic cast to type T_DERIVED. Returns null if T_DERIVED is not a valid cast for this object.
130 template<typename TargetType>
131 const TargetType* AsA() const
132 {
133 if (IsA<TargetType>())
134 {
135 return static_cast<const TargetType*>(this);
136 }
137 return nullptr;
138 }
139
140 template<typename TargetType>
141 TargetType* AsA()
142 {
143 if (IsA<TargetType>())
144 {
145 return static_cast<TargetType*>(this);
146 }
147 return nullptr;
148 }
149
150 template<typename TargetType>
151 const TargetType* AsAChecked() const
152 {
154 return static_cast<const TargetType*>(this);
155 }
156
157 template<typename TargetType>
158 TargetType* AsAChecked()
159 {
161 return static_cast<TargetType*>(this);
162 }
163
164 template<class T_DERIVED>
166 {
167 if (T_DERIVED::StaticType() == Type)
168 {
169 return static_cast<T_DERIVED*>(this);
170 }
171 return nullptr;
172 }
173
174 template<class T_DERIVED>
175 const T_DERIVED* GetObject() const
176 {
177 if (T_DERIVED::StaticType() == Type)
178 {
179 return static_cast<const T_DERIVED*>(this);
180 }
181 return nullptr;
182 }
183
184 template<class T_DERIVED>
186 {
187 check(T_DERIVED::StaticType() == Type);
188 return static_cast<const T_DERIVED&>(*this);
189 }
190
191 template<class T_DERIVED>
193 {
194 check(T_DERIVED::StaticType() == Type);
195 return static_cast<T_DERIVED&>(*this);
196 }
197
198 virtual EImplicitObjectType GetNestedType() const { return GetType(); }
201
203
205
206
207 UE_DEPRECATED(5.6, "Please use GetRadiusf instead.")
208 virtual FReal GetRadius() const { return 0.0; }
209 virtual FRealSingle GetRadiusf() const { return 0.0f; }
210 UE_DEPRECATED(5.6, "Please use GetMarginf instead.")
211 virtual FReal GetMargin() const { return Margin; }
212 virtual FRealSingle GetMarginf() const { return Margin; }
213
215
216 CHAOS_API virtual bool IsValidGeometry() const;
217
222
223 UE_DEPRECATED(5.4, "Please use DeepCopyGeometry instead")
224 virtual FImplicitObject* Duplicate() const { check(false); return nullptr; }
225
226 UE_DEPRECATED(5.4, "Please use CopyGeometry instead")
227 virtual TUniquePtr<FImplicitObject> Copy() const { check(false); return nullptr; }
228
229 UE_DEPRECATED(5.4, "Please use CopyGeometryWithScale instead")
230 virtual TUniquePtr<FImplicitObject> CopyWithScale(const FVec3& Scale) const { check(false); return nullptr; }
231
232 UE_DEPRECATED(5.4, "Please use DeepCopyGeometry instead")
233 virtual TUniquePtr<FImplicitObject> DeepCopy() const { check(false); return nullptr; }
234
235 UE_DEPRECATED(5.4, "Please use DeepCopyGeometryWithScale instead")
236 virtual TUniquePtr<FImplicitObject> DeepCopyWithScale(const FVec3& Scale) const { check(false); return nullptr; }
237
238 //This is strictly used for optimization purposes
239 CHAOS_API bool IsUnderlyingUnion() const;
240
241 //This is strictly used for optimization purposes
242 CHAOS_API bool IsUnderlyingMesh() const;
243
244 // Explicitly non-virtual. Must cast to derived types to target their implementation.
245 CHAOS_API FReal SignedDistance(const FVec3& x) const;
246
247 // Explicitly non-virtual. Must cast to derived types to target their implementation.
248 CHAOS_API FVec3 Normal(const FVec3& x) const;
249
250 // Find the closest point on the surface, and return the separating distance and axis
251 virtual FReal PhiWithNormal(const FVec3& x, FVec3& Normal) const = 0;
252
253 // Find the closest point on the surface, and return the separating distance and axis
254 virtual FReal PhiWithNormalScaled(const FVec3& Pos, const FVec3& Scale, FVec3& Normal) const
255 {
256 // @todo(chaos): implement for all derived types - this is not a valid solution
257 const FVec3 UnscaledX = Pos / Scale;
261 const FReal ScaleFactor = Normal.SafeNormalize();
262 const FReal ScaledPhi = UnscaledPhi * ScaleFactor;
263 return ScaledPhi;
264 }
265
266 CHAOS_API virtual const FAABB3 BoundingBox() const;
267
268 // Calculate the tight-fitting world-space bounding box
274
275 bool HasBoundingBox() const { return bHasBoundingBox; }
276
277 bool IsConvex() const { return bIsConvex; }
278 void SetConvex(const bool Convex = true) { bIsConvex = Convex; }
279
280 void SetDoCollide(const bool Collide ) { bDoCollide = Collide; }
281 bool GetDoCollide() const { return bDoCollide; }
282
283#if TRACK_CHAOS_GEOMETRY
284 //Turn on memory tracking. Must pass object itself as a serializable ptr so we can save it out
285 CHAOS_API void Track(TSerializablePtr<FImplicitObject> This, const FString& DebugInfo);
286#endif
287
288 virtual bool IsPerformanceWarning() const { return false; }
290 {
291 return FString::Printf(TEXT("ImplicitObject - No Performance String"));
292 };
293
296 CHAOS_API Pair<FVec3, bool> FindClosestIntersection(const FVec3& StartPoint, const FVec3& EndPoint, const FReal Thickness) const;
297
298 //This gives derived types a way to avoid calling PhiWithNormal todo: this api is confusing
299 virtual bool Raycast(const FVec3& StartPoint, const FVec3& Dir, const FReal Length, const FReal Thickness, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex) const
300 {
301 OutFaceIndex = INDEX_NONE;
302 const FVec3 EndPoint = StartPoint + Dir * Length;
303 Pair<FVec3, bool> Result = FindClosestIntersection(StartPoint, EndPoint, Thickness);
304 if (Result.Second)
305 {
306 OutPosition = Result.First;
307 OutNormal = Normal(Result.First);
308 OutTime = Length > 0 ? (OutPosition - StartPoint).Size() : 0.f;
309 return true;
310 }
311 return false;
312 }
313
321 {
322 //Many objects have no concept of a face
323 return INDEX_NONE;
324 }
325
327 {
328 // For now, this is the implementation that used to be in FImplicitObjectScaled to use as a default.
329 // @todo(chaos): implement FindMostOpposingFaceScaled for all types that can be wrapped in ImplicitObjectScaled (Since this default implementation won't work correctly for many cases)
330 // NOTE: this isn't strictly correct. The distance check does not account for non-uniforms scales, but also the algorithm is finding the
331 // face which has the most opposing normal. The scaled-space normal for a face i is Ns_i = (N_i / S) / |(N_i / S)|
332 // We want to find i with the minimum F_i = (D . Ns_i), where D is the unit direction we are interested in.
333 // F_i = D . (N_i / S) / |(N_i / S)|
334 // Below we are effectively testing F_i = ((D / S) . N_i) and ignoring the |(N_i / S)| which is dependent on i and therefore cannot
335 // be ignored in the minimum check.
336 const FReal UnscaledSearchDist = SearchDist / Scale.Min(); //this is not quite right since it's no longer a sphere, but the whole thing is fuzzy anyway
338 //const FVec3 UnscaledDir = ScaleNormalizedHelper(UnitDir, FVec3(1.0f / Scale.X, 1.0f / Scale.Y, 1.0f / Scale.Z)); // If we want to transform like a vector
339 const FVec3 UnscaledDir = GetInnerUnscaledNormal(UnitDir, Scale); // If we want to transform like a Normal
340 // This will not work correctly for most cases (e.g. if we are comparing angles (dot product) after a non conformal transformation (like non uniform scaling))
341 // So really provide an implementation for FImplicitObjectScaled and avoid this default
343 }
344
345
351 virtual int32 FindClosestFaceAndVertices(const FVec3& Position, TArray<FVec3>& FaceVertices, FReal SearchDist = 0.01f) const
352 {
353 //Many objects have no concept of a face
354 return INDEX_NONE;
355 }
356
357
366 {
367 //Many objects have no concept of a face
368 return OriginalNormal;
369 }
370
371 //This gives derived types a way to do an overlap check without calling PhiWithNormal todo: this api is confusing
372 virtual bool Overlap(const FVec3& Point, const FReal Thickness) const
373 {
374 return SignedDistance(Point) <= Thickness;
375 }
376
377
382
383 UE_DEPRECATED(5.4, "Function no longer in use")
388
390
391 virtual FString ToString() const
392 {
393 return FString::Printf(TEXT("ImplicitObject bIsConvex:%d, bDoCollide:%d, bHasBoundingBox:%d"), bIsConvex, bDoCollide, bHasBoundingBox);
394 }
395
397
399 {
401 }
402
403 virtual void Serialize(FArchive& Ar)
404 {
405 check(false); //Aggregate implicits require FChaosArchive - check false by default
406 }
407
408 CHAOS_API virtual void Serialize(FChaosArchive& Ar);
409
411
412 virtual uint32 GetTypeHash() const = 0;
413
414 virtual FName GetTypeName() const { return GetTypeName(GetType()); }
415
417
418 virtual uint16 GetMaterialIndex(uint32 HintIndex) const { return 0; }
419
424
429
435 void VisitOverlappingLeafObjects(const FAABB3& LocalBounds, const FImplicitHierarchyVisitor& Visitor) const
436 {
438 int32 ObjectIndex = 0;
439 const int32 RootObjectIndex = INDEX_NONE;
440 VisitOverlappingLeafObjectsImpl(LocalBounds, FRigidTransform3::Identity, RootObjectIndex, ObjectIndex, LeafObjectIndex, Visitor);
441 }
442
448 {
450 int32 ObjectIndex = 0;
451 const int32 RootObjectIndex = INDEX_NONE;
452 VisitLeafObjectsImpl(FRigidTransform3::Identity, RootObjectIndex, ObjectIndex, LeafObjectIndex, Visitor);
453 }
454
460 {
462 int32 ObjectIndex = 0;
463 const int32 RootObjectIndex = INDEX_NONE;
464 VisitObjectsImpl(FRigidTransform3::Identity, RootObjectIndex, ObjectIndex, LeafObjectIndex, Visitor);
465 }
466
473 bool IsOverlappingBounds(const FAABB3& LocalBounds) const
474 {
475 return IsOverlappingBoundsImpl(LocalBounds);
476 }
477
478//protected:
479 // This should not be public, but it needs to be callable by derived classes on another instance
481 {
482 return 1;
483 }
485 {
486 return 1;
487 }
488
489 // This should not be public, but it needs to be callable by derived classes on another instance
491 const FAABB3& LocalBounds,
493 const int32 RootObjectIndex,
494 int32& ObjectIndex,
496 const FImplicitHierarchyVisitor& VisitorFunc) const
497 {
498 if (!HasBoundingBox() || LocalBounds.Intersects(BoundingBox()))
499 {
500 VisitorFunc(this, ObjectTransform, RootObjectIndex, ObjectIndex, LeafObjectIndex);
501 }
502 ++ObjectIndex;
504 }
505
506 // This should not be public, but it needs to be callable by derived classes on another instance
509 const int32 RootObjectIndex,
510 int32& ObjectIndex,
512 const FImplicitHierarchyVisitor& VisitorFunc) const
513 {
514 VisitorFunc(this, ObjectTransform, RootObjectIndex, ObjectIndex, LeafObjectIndex);
515 ++ObjectIndex;
517 }
518
519 // This should not be public, but it needs to be callable by derived classes on another instance
520 virtual bool VisitObjectsImpl(
522 const int32 RootObjectIndex,
523 int32& ObjectIndex,
525 const FImplicitHierarchyVisitorBool& VisitorFunc) const
526 {
527 const bool bResult = VisitorFunc(this, ObjectTransform, RootObjectIndex, ObjectIndex, LeafObjectIndex);
528 ++ObjectIndex;
530 return bResult;
531 }
532
533 // This should not be public, but it needs to be callable by derived classes on another instance
534 virtual bool IsOverlappingBoundsImpl(const FAABB3& LocalBounds) const
535 {
536 return (!HasBoundingBox() || LocalBounds.Intersects(BoundingBox()));
537 }
538
539protected:
540
541 // Safely scale a normalized Vec3 - used with both scale and inverse scale
543 {
544 const FVec3 ScaledNormal = Scale * Normal;
545 const FReal ScaledNormalLen = ScaledNormal.Size();
548 : FVec3(0.f, 0.f, 1.f);
549 }
550
551 // Convert a normal in the inner unscaled object space into a normal in the outer scaled object space.
552 // Note: INverse scale is passed in, not the scale
554 {
555 return ScaleNormalizedHelper(InnerNormal, FVec3(1.0f / Scale.X, 1.0f / Scale.Y, 1.0f / Scale.Z));
556 }
557
558 // Convert a normal in the outer scaled object space into a normal in the inner unscaled object space
563
564 // Not all derived types support a margin, and for some it represents some other
565 // property (the radius of a sphere for example), so the setter should only be exposed
566 // in a derived class if at all (and it may want to change the size of the core shape as well)
569
570 // Note: if you change the size of FImplicitObject or add fields, you will likely need to update the calculation of PadBytes below.
575
576#if TRACK_CHAOS_GEOMETRY
578#else
579#if DISALLOW_FIMPLICIT_OBJECT_TAIL_PADDING
580 // The purpose of this padding is just to make it easier to calculate PadBytes below.
581 bool bPad;
582#endif // DISALLOW_FIMPLICIT_OBJECT_TAIL_PADDING
583#endif
584
587
588#if DISALLOW_FIMPLICIT_OBJECT_TAIL_PADDING
589 // the following assumptions are made when calculating PadBytes and inserting any explicit padding between fields:
590 static_assert(alignof(FRealSingle) <= alignof(FChaosRefCountedObject)); // Otherwise, padding will be added before Margin
591 static_assert(alignof(bool) <= sizeof(FRealSingle)); // Otherwise, padding would be added between Margin the first bool field
592 static_assert(alignof(EImplicitObjectType) <= 4 * sizeof(bool)); // Otherwise, padding would be added between last bool field and first EImplicitObjectType field
593
594 static constexpr int AlignOfFImplicitObject = (int)FMath::Max(alignof(FChaosRefCountedObject), FMath::Max(alignof(FRealSingle), FMath::Max(alignof(bool), alignof(EImplicitObjectType))));
595 static constexpr int PadBytes =
597 static_assert(PadBytes > 0);
598 char Pad[PadBytes];
599#endif // DISALLOW_FIMPLICIT_OBJECT_TAIL_PADDING
600
601private:
602 CHAOS_API virtual Pair<FVec3, bool> FindClosestIntersectionImp(const FVec3& StartPoint, const FVec3& EndPoint, const FReal Thickness) const;
603};
604
610
612{
613 Value.Serialize(Ar);
614 return Ar;
615}
616
617typedef FImplicitObject FImplicitObject3;
620}
621
622template <
623 typename T,
624 typename... TArgs
625 UE_REQUIRES(!std::is_array_v<T>)
626>
631
632template <
633 typename T,
634 typename... TArgs
635 UE_REQUIRES(!std::is_array_v<T>)
636>
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
FORCEINLINE Chaos::FImplicitObjectPtr MakeImplicitObjectPtr(TArgs &&... Args)
Definition ImplicitObject.h:627
FORCEINLINE Chaos::FConstImplicitObjectPtr MakeImplicitObjectConstPtr(TArgs &&... Args)
Definition ImplicitObject.h:637
const bool
Definition NetworkReplayStreaming.h:178
#define UE_REQUIRES(...)
Definition Requires.h:86
uint32 Size
Definition VulkanMemory.cpp:4034
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition BVHParticles.h:24
Definition ChaosArchive.h:167
Definition RefCountedObject.h:15
FChaosRefCountedObject()
Definition RefCountedObject.h:17
Definition Cylinder.h:15
Definition ImplicitObject.h:111
virtual TUniquePtr< FImplicitObject > DeepCopy() const
Definition ImplicitObject.h:233
virtual FReal GetRadius() const
Definition ImplicitObject.h:208
bool bHasBoundingBox
Definition ImplicitObject.h:574
void SetConvex(const bool Convex=true)
Definition ImplicitObject.h:278
CHAOS_API Pair< FVec3, bool > FindDeepestIntersection(const FImplicitObject *Other, const FBVHParticles *Particles, const FMatrix33 &OtherToLocalTransform, const FReal Thickness) const
Definition ImplicitObject.cpp:126
void SetCollisionType(EImplicitObjectType InCollisionType)
Definition ImplicitObject.h:204
T_DERIVED * GetObject()
Definition ImplicitObject.h:165
const T_DERIVED * GetObject() const
Definition ImplicitObject.h:175
CHAOS_API void Track(TSerializablePtr< FImplicitObject > This, const FString &DebugInfo)
virtual int32 FindClosestFaceAndVertices(const FVec3 &Position, TArray< FVec3 > &FaceVertices, FReal SearchDist=0.01f) const
Definition ImplicitObject.h:351
CHAOS_API FReal SignedDistance(const FVec3 &x) const
Definition ImplicitObject.cpp:105
FRealSingle Margin
Definition ImplicitObject.h:571
virtual TUniquePtr< FImplicitObject > Copy() const
Definition ImplicitObject.h:227
static CHAOS_API FImplicitObject * SerializationFactory(FChaosArchive &Ar, FImplicitObject *Obj)
Definition ImplicitObject.cpp:409
const T_DERIVED & GetObjectChecked() const
Definition ImplicitObject.h:185
void VisitOverlappingLeafObjects(const FAABB3 &LocalBounds, const FImplicitHierarchyVisitor &Visitor) const
Definition ImplicitObject.h:435
FImplicitObject(FImplicitObject &&)=delete
virtual CHAOS_API void FindAllIntersectingObjects(TArray< Pair< const FImplicitObject *, FRigidTransform3 > > &Out, const FAABB3 &LocalBounds) const
Definition ImplicitObject.cpp:294
bool HasBoundingBox() const
Definition ImplicitObject.h:275
virtual void VisitLeafObjectsImpl(const FRigidTransform3 &ObjectTransform, const int32 RootObjectIndex, int32 &ObjectIndex, int32 &LeafObjectIndex, const FImplicitHierarchyVisitor &VisitorFunc) const
Definition ImplicitObject.h:507
const TargetType * AsA() const
Definition ImplicitObject.h:131
virtual FVec3 FindGeometryOpposingNormal(const FVec3 &DenormDir, int32 FaceIndex, const FVec3 &OriginalNormal) const
Definition ImplicitObject.h:365
int32 CountLeafObjectsInHierarchy() const
Definition ImplicitObject.h:425
void SetDoCollide(const bool Collide)
Definition ImplicitObject.h:280
TargetType * AsA()
Definition ImplicitObject.h:141
virtual CHAOS_API Chaos::FImplicitObjectPtr CopyGeometryWithScale(const FVec3 &Scale) const
Definition ImplicitObject.cpp:88
void VisitLeafObjects(const FImplicitHierarchyVisitor &Visitor) const
Definition ImplicitObject.h:447
EImplicitObjectType CollisionType
Definition ImplicitObject.h:586
static int32 GetOffsetOfMargin()
Definition ImplicitObject.h:214
virtual uint32 GetTypeHash() const =0
virtual int32 CountObjectsInHierarchyImpl() const
Definition ImplicitObject.h:480
int32 CountObjectsInHierarchy() const
Definition ImplicitObject.h:420
bool bIsTracked
Definition ImplicitObject.h:577
virtual bool Overlap(const FVec3 &Point, const FReal Thickness) const
Definition ImplicitObject.h:372
virtual FAABB3 CalculateTransformedBounds(const FRigidTransform3 &Transform) const
Definition ImplicitObject.h:269
virtual int32 CountLeafObjectsInHierarchyImpl() const
Definition ImplicitObject.h:484
CHAOS_API EImplicitObjectType GetCollisionType() const
Definition ImplicitObject.cpp:72
static FVec3 ScaleNormalizedHelper(const FVec3 &Normal, const FVec3 &Scale)
Definition ImplicitObject.h:542
static int32 GetOffsetOfType()
Definition ImplicitObject.h:200
TargetType * AsAChecked()
Definition ImplicitObject.h:158
CHAOS_API bool IsUnderlyingMesh() const
Definition ImplicitObject.cpp:99
virtual CHAOS_API const FAABB3 BoundingBox() const
Definition ImplicitObject.cpp:118
FReal TType
Definition ImplicitObject.h:113
static FVec3 GetOuterScaledNormal(const FVec3 &InnerNormal, const FVec3 &Scale)
Definition ImplicitObject.h:553
virtual bool IsOverlappingBoundsImpl(const FAABB3 &LocalBounds) const
Definition ImplicitObject.h:534
void VisitObjects(const FImplicitHierarchyVisitorBool &Visitor) const
Definition ImplicitObject.h:459
virtual FString PerformanceWarningAndSimplifaction()
Definition ImplicitObject.h:289
EImplicitObjectType Type
Definition ImplicitObject.h:585
virtual FReal GetMargin() const
Definition ImplicitObject.h:211
bool IsA() const
Definition ImplicitObject.h:124
virtual FRealSingle GetRadiusf() const
Definition ImplicitObject.h:209
bool bDoCollide
Definition ImplicitObject.h:573
bool IsConvex() const
Definition ImplicitObject.h:277
virtual int32 FindMostOpposingFace(const FVec3 &Position, const FVec3 &UnitDir, int32 HintFaceIndex, FReal SearchDist) const
Definition ImplicitObject.h:320
virtual EImplicitObjectType GetNestedType() const
Definition ImplicitObject.h:198
virtual FReal PhiWithNormalScaled(const FVec3 &Pos, const FVec3 &Scale, FVec3 &Normal) const
Definition ImplicitObject.h:254
virtual void Serialize(FArchive &Ar)
Definition ImplicitObject.h:403
virtual FName GetTypeName() const
Definition ImplicitObject.h:414
virtual FString ToString() const
Definition ImplicitObject.h:391
virtual void AccumulateAllSerializableImplicitObjects(TArray< Pair< TSerializablePtr< FImplicitObject >, FRigidTransform3 > > &Out, const FRigidTransform3 &ParentTM, TSerializablePtr< FImplicitObject > This) const
Definition ImplicitObject.h:384
virtual Chaos::FImplicitObjectPtr DeepCopyGeometryWithScale(const FVec3 &Scale) const
Definition ImplicitObject.h:221
CHAOS_API void SerializeImp(FArchive &Ar)
Definition ImplicitObject.cpp:337
CHAOS_API EImplicitObjectType GetType() const
Definition ImplicitObject.cpp:67
static CHAOS_API FArchive & SerializeLegacyHelper(FArchive &Ar, TUniquePtr< FImplicitObject > &Value)
Definition ImplicitObject.cpp:302
T_DERIVED & GetObjectChecked()
Definition ImplicitObject.h:192
virtual FReal PhiWithNormal(const FVec3 &x, FVec3 &Normal) const =0
void SetMargin(FReal InMargin)
Definition ImplicitObject.h:567
virtual TUniquePtr< FImplicitObject > DeepCopyWithScale(const FVec3 &Scale) const
Definition ImplicitObject.h:236
static FVec3 GetInnerUnscaledNormal(const FVec3 &OuterNormal, const FVec3 &Scale)
Definition ImplicitObject.h:559
const TargetType * AsAChecked() const
Definition ImplicitObject.h:151
virtual CHAOS_API bool IsValidGeometry() const
Definition ImplicitObject.cpp:77
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
static constexpr EImplicitObjectType StaticType()
Definition ImplicitObject.h:398
bool bIsConvex
Definition ImplicitObject.h:572
virtual CHAOS_API ~FImplicitObject() override
Definition ImplicitObject.cpp:38
virtual uint16 GetMaterialIndex(uint32 HintIndex) const
Definition ImplicitObject.h:418
virtual bool VisitObjectsImpl(const FRigidTransform3 &ObjectTransform, const int32 RootObjectIndex, int32 &ObjectIndex, int32 &LeafObjectIndex, const FImplicitHierarchyVisitorBool &VisitorFunc) const
Definition ImplicitObject.h:520
virtual FRealSingle GetMarginf() const
Definition ImplicitObject.h:212
virtual void VisitOverlappingLeafObjectsImpl(const FAABB3 &LocalBounds, const FRigidTransform3 &ObjectTransform, const int32 RootObjectIndex, int32 &ObjectIndex, int32 &LeafObjectIndex, const FImplicitHierarchyVisitor &VisitorFunc) const
Definition ImplicitObject.h:490
void SetMargin(FRealSingle InMargin)
Definition ImplicitObject.h:568
virtual TUniquePtr< FImplicitObject > CopyWithScale(const FVec3 &Scale) const
Definition ImplicitObject.h:230
static constexpr int D
Definition ImplicitObject.h:114
bool GetDoCollide() const
Definition ImplicitObject.h:281
virtual FImplicitObject * Duplicate() const
Definition ImplicitObject.h:224
bool IsOverlappingBounds(const FAABB3 &LocalBounds) const
Definition ImplicitObject.h:473
FImplicitObject(const FImplicitObject &)=delete
CHAOS_API bool IsUnderlyingUnion() const
Definition ImplicitObject.cpp:94
CHAOS_API Pair< FVec3, bool > FindClosestIntersection(const FVec3 &StartPoint, const FVec3 &EndPoint, const FReal Thickness) const
Definition ImplicitObject.cpp:183
virtual Chaos::FImplicitObjectPtr DeepCopyGeometry() const
Definition ImplicitObject.h:220
virtual int32 FindMostOpposingFaceScaled(const FVec3 &Position, const FVec3 &UnitDir, int32 HintFaceIndex, FReal SearchDist, const FVec3 &Scale) const
Definition ImplicitObject.h:326
virtual bool IsPerformanceWarning() const
Definition ImplicitObject.h:288
virtual void AccumulateAllImplicitObjects(TArray< Pair< const FImplicitObject *, FRigidTransform3 > > &Out, const FRigidTransform3 &ParentTM) const
Definition ImplicitObject.h:378
virtual CHAOS_API Chaos::FImplicitObjectPtr CopyGeometry() const
Definition ImplicitObject.cpp:82
Definition AABB.h:37
FORCEINLINE bool Intersects(const TAABB< TReal, d > &Other) const
Definition AABB.h:112
CHAOSCORE_API TAABB< T, d > TransformedAABB(const FTransform &) const
Definition AABB.cpp:385
Definition Particles.h:32
Definition Plane.h:14
Definition Serializable.h:10
Definition Sphere.h:28
virtual void Serialize(void *V, int64 Length) override
Definition ArchiveProxy.h:97
Definition Archive.h:1208
Definition NameTypes.h:617
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition SharedPointer.h:692
Definition UniquePtr.h:107
@ Unknown
Definition ImplicitObjectType.h:20
Definition SkeletalMeshComponent.h:307
FImplicitObject * FImplicitObjectRef
Definition ImplicitFwd.h:48
TRefCountPtr< FImplicitObject > FImplicitObjectPtr
Definition ImplicitFwd.h:33
TSharedPtr< Chaos::FImplicitObject, ESPMode::ThreadSafe > ThreadSafeSharedPtr_FImplicitObject
Definition ImplicitObject.h:618
uint8 EImplicitObjectType
Definition ImplicitObjectType.h:41
FChaosArchive & operator<<(FChaosArchive &Ar, FRigidParticleControlFlags &Flags)
Definition RigidParticleControlFlags.cpp:15
FRealDouble FReal
Definition Real.h:22
FImplicitObject FImplicitObject3
Definition ImplicitFwd.h:27
TSharedPtr< Chaos::FImplicitObject, ESPMode::NotThreadSafe > NotThreadSafeSharedPtr_FImplicitObject
Definition ImplicitObject.h:619
Pair< T1, T2 > MakePair(const T1 &First, const T2 &Second)
Definition Pair.h:45
float FRealSingle
Definition Real.h:14
TVector< FReal, 3 > FVec3
Definition Core.h:17
@ false
Definition radaudio_common.h:23
Definition Pair.h:8
static PtrType Convert(const Chaos::FImplicitObjectPtr &Object)
Definition ImplicitObject.h:50
static PtrType Convert(const Chaos::FImplicitObjectPtr &Object)
Definition ImplicitObject.h:61
Definition ImplicitObject.h:42
Definition ImplicitObject.h:83
static bool IsBaseOf(const EImplicitObjectType InType)
Definition ImplicitObject.h:86
Definition NumericLimits.h:41