UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SQTypes.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Chaos/Declares.h"
8#include "Containers/Array.h"
10#include "CoreMinimal.h"
12#include "HAL/PlatformCrt.h"
13#include "Math/UnrealMathSSE.h"
14#include "Math/Vector.h"
15
16#include <type_traits>
17
18namespace Chaos
19{
20 class FChaosArchive;
21 class FPerShapeData;
22}
23
24namespace ChaosInterface
25{
33
39
40 struct FQueryHit : public FActorShape
41 {
43
48 int32 FaceIndex; // Signed int to match TArray's size type, and so INDEX_NONE/-1 doesn't underflow.
50
51 int32 ElementIndex; // Currently used to indicate which shape was hit for a particle with multiple shapes.
52
54 };
55
61
62 struct FLocationHit : public FQueryHit
63 {
67 float Distance; // LWC_TODO: Should be FVector::FReal, but that causes precision issues resulting in collision failures. Investigate!
68
70
71 bool operator<(const FLocationHit& Other) const { return Distance < Other.Distance; }
72 };
73
79
80 struct FRaycastHit : public FLocationHit
81 {
82 float U;
83 float V;
84
86
87 };
88
94
95 struct FOverlapHit : public FQueryHit
96 {
97 };
98
104
105 struct FSweepHit : public FLocationHit
106 {
107 };
108
110 {
112 return Ar;
113 }
114
120
122 {
127 int32 FaceIndex = -1; // Signed int to match TArray's size type, and so INDEX_NONE/-1 doesn't underflow.
129
130 int32 ElementIndex = -1; // Currently used to indicate which shape was hit for a particle with multiple shapes.
131 };
132
134 {
138 float Distance; // LWC_TODO: Should be FVector::FReal, but that causes precision issues resulting in collision failures. Investigate!
139
140 bool operator<(const FPTLocationHit& Other) const { return Distance < Other.Distance; }
141 };
142
144 {
145 float U;
146 float V;
147 };
148
150 {
151 };
152
154 {
155 };
156
157 template<Chaos::EThreadContext Id>
158 using TThreadQueryHit = std::conditional_t<Id == Chaos::EThreadContext::External, FQueryHit, FPTQueryHit>;
159
160 template<Chaos::EThreadContext Id>
161 using TThreadRaycastHit = std::conditional_t<Id == Chaos::EThreadContext::External, FRaycastHit, FPTRaycastHit>;
162
163 template<Chaos::EThreadContext Id>
164 using TThreadOverlapHit = std::conditional_t<Id == Chaos::EThreadContext::External, FOverlapHit, FPTOverlapHit>;
165
166 template<Chaos::EThreadContext Id>
167 using TThreadSweepHit = std::conditional_t<Id == Chaos::EThreadContext::External, FSweepHit, FPTSweepHit>;
168
169#ifndef CHAOS_HIT_BUFFER_SIZE
170#define CHAOS_HIT_BUFFER_SIZE 128 // Preallocated hit buffer size for traces and sweeps.
171#endif // CHAOS_HIT_BUFFER_SIZE
172 static_assert(CHAOS_HIT_BUFFER_SIZE > 0, "Invalid Chaos hit buffer size.");
173
174
175 inline void FinishQueryHelper(TArray<FOverlapHit, TInlineAllocator<CHAOS_HIT_BUFFER_SIZE>>& Hits, const FOverlapHit& BlockingHit, bool bHasBlockingHit)
176 {
177 if (bHasBlockingHit)
178 {
179 Hits.Add(BlockingHit);
180 }
181 }
182
183 inline void FinishQueryHelper(TArray<FPTOverlapHit, TInlineAllocator<CHAOS_HIT_BUFFER_SIZE>>& Hits, const FPTOverlapHit& BlockingHit, bool bHasBlockingHit)
184 {
185 if (bHasBlockingHit)
186 {
187 Hits.Add(BlockingHit);
188 }
189 }
190
191 template <typename HitType>
192 void FinishQueryHelper(TArray<HitType, TInlineAllocator<CHAOS_HIT_BUFFER_SIZE>>& Hits, const HitType& BlockingHit, bool bHasBlockingHit)
193 {
194 Hits.Sort();
195 if (bHasBlockingHit)
196 {
197 int32 FinalNum = Hits.Num() + 1;
198 for (int32 HitIdx = Hits.Num() - 1; HitIdx >= 0; --HitIdx)
199 {
200 if (Hits[HitIdx].Distance >= BlockingHit.Distance)
201 {
202 --FinalNum;
203 }
204 else
205 {
206 break;
207 }
208 }
209 Hits.SetNum(FinalNum);
210 Hits[FinalNum - 1] = BlockingHit;
211 }
212 }
213
218 template<typename HitType>
220 {
221 public:
222 FSQHitBuffer(bool bSingle = false)
223 : AcceleratorDepth(0)
224 , bHasBlockingHit(false)
225 , bSingleResult(bSingle)
226 {
227 // The Hits array is preallocated through its InlineAllocator, no need to reserve.
228 }
229
230 virtual ~FSQHitBuffer() {}
231
232 //Called
234 {
235 ++AcceleratorDepth;
236 }
237
239 {
240 --AcceleratorDepth;
241 if (AcceleratorDepth == 0)
242 {
243 FinishQuery();
244 }
245 }
246
247 bool HasHit() const { return GetNumHits(); }
248 int32 GetNumHits() const { return Hits.Num(); }
249 HitType* GetHits() { return Hits.GetData(); }
250 const HitType* GetHits() const { return Hits.GetData(); }
251
252 HitType* GetBlock() { return HasBlockingHit() ? &Hits.Last() : nullptr; }
253 const HitType* GetBlock() const { return HasBlockingHit() ? &Hits.Last() : nullptr; }
254
255 bool HasBlockingHit() const { return bHasBlockingHit; }
256
257 void SetBlockingHit(const HitType& InBlockingHit)
258 {
259 CurrentBlockingHit = InBlockingHit;
260 bHasBlockingHit = true;
261 }
262
263 void AddTouchingHit(const HitType& InTouchingHit)
264 {
265 Hits.Add(InTouchingHit);
266 }
267
268 const HitType* GetCurrentHit() const { return bHasBlockingHit ? &CurrentBlockingHit : nullptr; }
269
271 void InsertHit(const HitType& Hit, bool bBlocking)
272 {
273 // Useful place to break when debugging, but breakpoints can't be set here, as
274 // this gets inlined even in a debug build.
275 //__debugbreak();
276 if (bBlocking)
277 {
278 SetBlockingHit(Hit);
279 }
280 else
281 {
282 AddTouchingHit(Hit);
283 }
284 }
285
286 bool WantsSingleResult() const { return bSingleResult; }
287
288 private:
289
290 void FinishQuery()
291 {
292 FinishQueryHelper(Hits, CurrentBlockingHit, bHasBlockingHit);
293 }
294
295 HitType CurrentBlockingHit;
296 int32 AcceleratorDepth;
297 bool bHasBlockingHit;
298 bool bSingleResult;
299
301 };
302
303 template<typename HitType>
304 class FSQSingleHitBuffer : public FSQHitBuffer<HitType>
305 {
306 public:
308 : FSQHitBuffer<HitType>(/*bSingle=*/ true)
309 {}
310 };
311
312}
@ ForceInitToZero
Definition CoreMiscDefines.h:156
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
#define CHAOS_HIT_BUFFER_SIZE
Definition SQTypes.h:170
Definition SQTypes.h:220
void SetBlockingHit(const HitType &InBlockingHit)
Definition SQTypes.h:257
int32 GetNumHits() const
Definition SQTypes.h:248
const HitType * GetBlock() const
Definition SQTypes.h:253
const HitType * GetCurrentHit() const
Definition SQTypes.h:268
void IncFlushCount()
Definition SQTypes.h:233
HitType * GetHits()
Definition SQTypes.h:249
FSQHitBuffer(bool bSingle=false)
Definition SQTypes.h:222
void DecFlushCount()
Definition SQTypes.h:238
void InsertHit(const HitType &Hit, bool bBlocking)
Definition SQTypes.h:271
virtual ~FSQHitBuffer()
Definition SQTypes.h:230
const HitType * GetHits() const
Definition SQTypes.h:250
HitType * GetBlock()
Definition SQTypes.h:252
bool HasBlockingHit() const
Definition SQTypes.h:255
void AddTouchingHit(const HitType &InTouchingHit)
Definition SQTypes.h:263
bool WantsSingleResult() const
Definition SQTypes.h:286
bool HasHit() const
Definition SQTypes.h:247
Definition SQTypes.h:305
FSQSingleHitBuffer()
Definition SQTypes.h:307
Definition ChaosArchive.h:167
Definition ShapeInstance.h:36
Definition ParticleHandle.h:436
Definition ParticleHandle.h:2739
virtual void Serialize(void *V, int64 Length) override
Definition ArchiveProxy.h:97
Definition Array.h:670
Definition ContainerAllocationPolicies.h:894
Definition ChaosInterfaceUtils.cpp:28
std::conditional_t< Id==Chaos::EThreadContext::External, FOverlapHit, FPTOverlapHit > TThreadOverlapHit
Definition SQTypes.h:164
std::conditional_t< Id==Chaos::EThreadContext::External, FRaycastHit, FPTRaycastHit > TThreadRaycastHit
Definition SQTypes.h:161
std::conditional_t< Id==Chaos::EThreadContext::External, FSweepHit, FPTSweepHit > TThreadSweepHit
Definition SQTypes.h:167
Chaos::FChaosArchive & operator<<(Chaos::FChaosArchive &Ar, FActorShape &ActorShape)
Definition SQTypes.h:34
std::conditional_t< Id==Chaos::EThreadContext::External, FQueryHit, FPTQueryHit > TThreadQueryHit
Definition SQTypes.h:158
void FinishQueryHelper(TArray< FOverlapHit, TInlineAllocator< CHAOS_HIT_BUFFER_SIZE > > &Hits, const FOverlapHit &BlockingHit, bool bHasBlockingHit)
Definition SQTypes.h:175
Definition SkeletalMeshComponent.h:307
@ false
Definition radaudio_common.h:23
Definition SQTypes.h:27
const Chaos::FPerShapeData * Shape
Definition SQTypes.h:29
Chaos::FGeometryParticle * Actor
Definition SQTypes.h:28
Definition SQTypes.h:63
bool operator<(const FLocationHit &Other) const
Definition SQTypes.h:71
FVector WorldPosition
Definition SQTypes.h:65
FVector WorldNormal
Definition SQTypes.h:66
float Distance
Definition SQTypes.h:67
FHitFlags Flags
Definition SQTypes.h:64
Definition SQTypes.h:96
Definition SQTypes.h:116
const Chaos::FPerShapeData * Shape
Definition SQTypes.h:118
Chaos::FGeometryParticleHandle * Actor
Definition SQTypes.h:117
Definition SQTypes.h:134
FHitFlags Flags
Definition SQTypes.h:135
float Distance
Definition SQTypes.h:138
bool operator<(const FPTLocationHit &Other) const
Definition SQTypes.h:140
FVector WorldNormal
Definition SQTypes.h:137
FVector WorldPosition
Definition SQTypes.h:136
Definition SQTypes.h:150
Definition SQTypes.h:122
int32 FaceIndex
Definition SQTypes.h:127
int32 ElementIndex
Definition SQTypes.h:130
FVector FaceNormal
Definition SQTypes.h:128
Definition SQTypes.h:144
float V
Definition SQTypes.h:146
float U
Definition SQTypes.h:145
Definition SQTypes.h:154
Definition SQTypes.h:41
int32 FaceIndex
Definition SQTypes.h:48
int32 ElementIndex
Definition SQTypes.h:51
FVector FaceNormal
Definition SQTypes.h:49
FQueryHit()
Definition SQTypes.h:42
Definition SQTypes.h:81
float V
Definition SQTypes.h:83
float U
Definition SQTypes.h:82
Definition SQTypes.h:106
Definition PhysicsInterfaceWrapperShared.h:86