UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Levelset.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/ArrayND.h"
5#include "Chaos/Box.h"
8#include "Chaos/Particles.h"
9#include "Chaos/UniformGrid.h"
10
11namespace Chaos { class FErrorReporter; }
12
13struct FKLevelSetElem;
14
15namespace Chaos
16{
17
18struct FMTDInfo;
19
20class FTriangleMesh;
21
22template<class T, int D>
23class TPlane;
24
25class FCapsule;
26
27class FConvex;
28
29class FLevelSet final : public FImplicitObject
30{
31 public:
33
35 CHAOS_API FLevelSet(FErrorReporter& ErrorReporter, const TUniformGrid<FReal, 3>& InGrid, const FImplicitObject& InObject, const int32 BandWidth = 0, const bool bUseObjectPhi = false);
36#if COMPILE_WITHOUT_UNREAL_SUPPORT
37 FLevelSet(std::istream& Stream);
38#endif
40 FLevelSet(const FLevelSet& Other) = delete;
42 CHAOS_API virtual ~FLevelSet();
43
44 CHAOS_API virtual Chaos::FImplicitObjectPtr CopyGeometry() const override;
46
47#if COMPILE_WITHOUT_UNREAL_SUPPORT
48 CHAOS_API void Write(std::ostream& Stream) const;
49#endif
50 CHAOS_API virtual FReal PhiWithNormal(const FVec3& x, FVec3& Normal) const override;
51 CHAOS_API FReal SignedDistance(const FVec3& x) const;
52
53 virtual const FAABB3 BoundingBox() const override { return MLocalBoundingBox; }
54
55 // Returns a const ref to the underlying phi grid
56 const TArrayND<FReal, 3>& GetPhiArray() const { return MPhi; }
57
58 // Returns a const ref to the underlying grid of normals
59 const TArrayND<FVec3, 3>& GetNormalsArray() const { return MNormals; }
60
61 // Returns a const ref to the underlying grid structure
62 const TUniformGrid<FReal, 3>& GetGrid() const { return MGrid; }
63
65 {
66 for (int32 i = 0; i < MGrid.Counts().Product(); ++i)
67 {
68 MPhi[i] += Value;
69 }
70 }
71
76
78 {
80 Ar << MGrid;
81 Ar << MPhi;
82 Ar << MNormals;
83 TBox<FReal, 3>::SerializeAsAABB(Ar, MLocalBoundingBox);
84 TBox<FReal, 3>::SerializeAsAABB(Ar, MOriginalLocalBoundingBox);
85 Ar << MBandWidth;
86 }
87
88 virtual void Serialize(FChaosArchive& Ar) override
89 {
90 SerializeImp(Ar);
91 }
92
93 virtual void Serialize(FArchive& Ar) override
94 {
95 SerializeImp(Ar);
96 }
97
104 {
105 const FVec3& CellDim = MGrid.Dx();
106 const FReal AvgRadius = (CellDim[0] + CellDim[1] + CellDim[2]) / (FReal)3;
107 const FReal CellVolume = CellDim.Product();
108 FReal Volume = 0.0;
109 for (int32 Idx = 0; Idx < MPhi.Num(); ++Idx)
110 {
111 const FReal Phi = MPhi[Idx];
112 if (Phi <= 0.0)
113 {
114 FReal CellRadius = AvgRadius - FMath::Abs(Phi);
115
117 {
118 const FReal Scale = FMath::Min((FReal)1, CellRadius / AvgRadius);
120 }
121 else
122 {
124 }
125 }
126 }
127 return Volume;
128 }
129
131
133
134 // Output a mesh and level set as obj files
136
138
139 // Used to generate a simple debug surface
142
143 virtual uint32 GetTypeHash() const override
144 {
145 uint32 Result = 0;
146
147 const int32 NumValues = MPhi.Num();
148
149 for(int32 Index = 0; Index < NumValues; ++Index)
150 {
151 Result = HashCombine(Result, ::GetTypeHash(MPhi[Index]));
152 }
153
154 return Result;
155 }
156
157
158 CHAOS_API bool SweepGeom(const FSphere& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
159 CHAOS_API bool SweepGeom(const TBox<FReal, 3>& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
160 CHAOS_API bool SweepGeom(const FCapsule& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
161 CHAOS_API bool SweepGeom(const FConvex& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
162
163 CHAOS_API bool SweepGeom(const TImplicitObjectScaled<FSphere>& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
164 CHAOS_API bool SweepGeom(const TImplicitObjectScaled<TBox<FReal, 3>>& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
165 CHAOS_API bool SweepGeom(const TImplicitObjectScaled<FCapsule>& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
166 CHAOS_API bool SweepGeom(const TImplicitObjectScaled<FConvex>& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness = 0, const bool bComputeMTD = false) const;
167
168 template<typename QueryGeomType>
169 bool SweepGeomImp(const QueryGeomType& QueryGeom, const FRigidTransform3& StartTM, const FVec3& Dir, const FReal Length, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex, const FReal Thickness, const bool bComputeMTD) const;
170
171 CHAOS_API bool OverlapGeom(const FSphere& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
172 CHAOS_API bool OverlapGeom(const TBox<FReal, 3>& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
173 CHAOS_API bool OverlapGeom(const FCapsule& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
174 CHAOS_API bool OverlapGeom(const FConvex& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
175
176 CHAOS_API bool OverlapGeom(const TImplicitObjectScaled<FSphere>& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
177 CHAOS_API bool OverlapGeom(const TImplicitObjectScaled<TBox<FReal, 3>>& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
178 CHAOS_API bool OverlapGeom(const TImplicitObjectScaled<FCapsule>& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
179 CHAOS_API bool OverlapGeom(const TImplicitObjectScaled<FConvex>& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
180
181 template<typename QueryGeomType>
182 bool OverlapGeomImp(const QueryGeomType& QueryGeom, const FRigidTransform3& QueryTM, const FReal Thickness, FMTDInfo* OutMTD = nullptr) const;
183
184 private:
186 CHAOS_API void ComputeDistancesNearZeroIsocontour(const FImplicitObject& Object, const TArrayND<FReal, 3>& ObjectPhi, TArray<TVec3<int32>>& InterfaceIndices);
188 CHAOS_API FReal ComputePhi(const TArrayND<bool, 3>& Done, const TVec3<int32>& CellIndex);
189 CHAOS_API void FillWithFastMarchingMethod(const FReal StoppingDistance, const TArray<TVec3<int32>>& InterfaceIndices);
192 CHAOS_API bool IsIntersectingWithTriangle(const FParticles& Particles, const TVec3<int32>& Elements, const TPlane<FReal, 3>& TrianglePlane, const TVec3<int32>& CellIndex, const TVec3<int32>& PrevCellIndex);
193 CHAOS_API void ComputeNormals();
194 CHAOS_API void ComputeConvexity(const TArray<TVec3<int32>>& InterfaceIndices);
195
196 CHAOS_API void ComputeNormals(const FParticles& InParticles, const FTriangleMesh& Mesh, const TArray<TVec3<int32>>& InterfaceIndices);
197
200 TArrayND<FVec3, 3> MNormals;
201 FAABB3 MLocalBoundingBox;
202 FAABB3 MOriginalLocalBoundingBox;
203 int32 MBandWidth;
204private:
205 FLevelSet() : FImplicitObject(EImplicitObject::HasBoundingBox, ImplicitObjectType::LevelSet) {} //needed for serialization
206 friend FImplicitObject; //needed for serialization
207 friend ::FKLevelSetElem; //needed for serialization
208};
209
210template <typename T, int d>
211using TLevelSet UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FLevelSet instead") = FLevelSet;
212}
int Volume
Definition AndroidPlatformMisc.cpp:380
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Capsule.h:23
Definition ChaosArchive.h:167
Definition Convex.h:26
Definition ErrorReporter.h:9
Definition ImplicitObject.h:111
CHAOS_API FReal SignedDistance(const FVec3 &x) const
Definition ImplicitObject.cpp:105
bool HasBoundingBox() const
Definition ImplicitObject.h:275
CHAOS_API void SerializeImp(FArchive &Ar)
Definition ImplicitObject.cpp:337
Definition Levelset.h:30
CHAOS_API bool SweepGeom(const FSphere &QueryGeom, const FRigidTransform3 &StartTM, const FVec3 &Dir, const FReal Length, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex, const FReal Thickness=0, const bool bComputeMTD=false) const
Definition Levelset.cpp:1663
FORCEINLINE void Shrink(const FReal Value)
Definition Levelset.h:64
FReal ApproximateNegativeMaterial() const
Definition Levelset.h:103
CHAOS_API void GetInteriorCells(TArray< TVec3< int32 > > &InteriorCells, const FReal InteriorThreshold) const
Definition Levelset.cpp:695
CHAOS_API bool CheckData(FErrorReporter &ErrorReporter, const FParticles &InParticles, const FTriangleMesh &Mesh, const TArray< FVec3 > &Normals)
Definition Levelset.cpp:531
const TArrayND< FReal, 3 > & GetPhiArray() const
Definition Levelset.h:56
virtual CHAOS_API Chaos::FImplicitObjectPtr CopyGeometryWithScale(const FVec3 &Scale) const override
Definition Levelset.cpp:208
virtual const FAABB3 BoundingBox() const override
Definition Levelset.h:53
bool OverlapGeomImp(const QueryGeomType &QueryGeom, const FRigidTransform3 &QueryTM, const FReal Thickness, FMTDInfo *OutMTD=nullptr) const
Definition Levelset.cpp:1743
virtual CHAOS_API Chaos::FImplicitObjectPtr CopyGeometry() const override
Definition Levelset.cpp:196
virtual CHAOS_API ~FLevelSet()
Definition Levelset.cpp:193
const TArrayND< FVec3, 3 > & GetNormalsArray() const
Definition Levelset.h:59
FLevelSet(const FLevelSet &Other)=delete
virtual uint32 GetTypeHash() const override
Definition Levelset.h:143
const TUniformGrid< FReal, 3 > & GetGrid() const
Definition Levelset.h:62
CHAOS_API FReal ComputeLevelSetError(const FParticles &InParticles, const TArray< FVec3 > &Normals, const FTriangleMesh &Mesh, FReal &AngleError, FReal &MaxDistError)
Definition Levelset.cpp:271
bool SweepGeomImp(const QueryGeomType &QueryGeom, const FRigidTransform3 &StartTM, const FVec3 &Dir, const FReal Length, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex, const FReal Thickness, const bool bComputeMTD) const
Definition Levelset.cpp:1632
FORCEINLINE void SerializeImp(FArchive &Ar)
Definition Levelset.h:77
virtual void Serialize(FChaosArchive &Ar) override
Definition Levelset.h:88
CHAOS_API FReal SignedDistance(const FVec3 &x) const
Definition Levelset.cpp:1511
CHAOS_API void OutputDebugData(FErrorReporter &ErrorReporter, const FParticles &InParticles, const TArray< FVec3 > &Normals, const FTriangleMesh &Mesh, const FString FileName)
Definition Levelset.cpp:424
CHAOS_API bool OverlapGeom(const FSphere &QueryGeom, const FRigidTransform3 &QueryTM, const FReal Thickness, FMTDInfo *OutMTD=nullptr) const
Definition Levelset.cpp:1788
virtual CHAOS_API FReal PhiWithNormal(const FVec3 &x, FVec3 &Normal) const override
Definition Levelset.cpp:1519
CHAOS_API bool ComputeMassProperties(FReal &OutVolume, FVec3 &OutCOM, FMatrix33 &OutInertia, FRotation3 &OutRotationOfMass) const
Definition Levelset.cpp:220
static FORCEINLINE constexpr EImplicitObjectType StaticType()
Definition Levelset.h:72
virtual void Serialize(FArchive &Ar) override
Definition Levelset.h:93
CHAOS_API void GetZeroIsosurfaceGridCellFaces(TArray< FVector3f > &Vertices, TArray< FIntVector > &Tris) const
Definition Levelset.cpp:615
Definition TriangleMesh.h:24
FORCEINLINE int32 Num() const
Definition ArrayND.h:161
Definition ArrayND.h:194
Definition Box.h:23
static void SerializeAsAABB(FArchive &Ar, TAABB< T, d > &AABB)
Definition Box.h:467
Definition ImplicitObjectScaled.h:447
Definition Particles.h:32
Definition Plane.h:14
const TVector< int32, d > & Counts() const
Definition UniformGrid.h:252
const TVector< T, d > & Dx() const
Definition UniformGrid.h:254
Definition UniformGrid.h:267
Definition Vector.h:1000
Definition Archive.h:1208
Definition Array.h:670
@ LevelSet
Definition ImplicitObjectType.h:19
Definition SkeletalMeshComponent.h:307
uint8 EImplicitObjectType
Definition ImplicitObjectType.h:41
FRealDouble FReal
Definition Real.h:22
U16 Index
Definition radfft.cpp:71
Definition GeometryQueries.h:27
Definition LevelSetElem.h:17