UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CollisionAnalyzerCapture.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Collision.h"
6
7#if ENABLE_COLLISION_ANALYZER
8
9#include "ICollisionAnalyzer.h"
10#include "CollisionAnalyzerModule.h"
11#include "Engine/HitResult.h"
14
15#include "Chaos/Capsule.h"
16#include "Chaos/Sphere.h"
17
18extern bool bSkipCapture;
20
23{
24 OutQueryShape = ECAQueryShape::Capsule;
25 OutDims = FVector(0, 0, 0);
26
27 switch (GeomCollection.GetType())
28 {
30 {
31 OutQueryShape = ECAQueryShape::Capsule;
32 const auto& CapsuleGeom = GeomCollection.GetCapsuleGeometry();
33 OutDims = FVector(CapsuleGeom.GetRadiusf(), CapsuleGeom.GetRadiusf(), CapsuleGeom.GetHeightf() * 0.5f + CapsuleGeom.GetRadiusf());
34 break;
35 }
36
38 {
39 OutQueryShape = ECAQueryShape::Sphere;
40 const auto& SphereGeom = GeomCollection.GetSphereGeometry();
41 OutDims = FVector(SphereGeom.GetRadiusf());
42 break;
43 }
44
46 {
47 OutQueryShape = ECAQueryShape::Box;
48 const auto& BoxGeom = GeomCollection.GetBoxGeometry();
49 OutDims = FVector(BoxGeom.Extents() * 0.5f);
50 break;
51 }
52
54 {
55 OutQueryShape = ECAQueryShape::Convex;
56 break;
57 }
58
59 default:
60 UE_LOG(LogCollision, Warning, TEXT("CaptureGeomSweep: Unknown geom type."));
61 }
62}
63
64inline bool CollisionShapeToAnalyzerType(const FCollisionShape& InShape, ECAQueryShape::Type& OutType, FVector& OutDims)
65{
66 switch(InShape.ShapeType)
67 {
69 {
70 OutType = ECAQueryShape::Sphere;
71 OutDims = FVector(InShape.GetSphereRadius());
72 return true;
73 }
75 {
76 OutType = ECAQueryShape::Capsule;
77 const float CapsuleRadius = InShape.GetCapsuleRadius();
78 OutDims = FVector(CapsuleRadius, CapsuleRadius, InShape.GetCapsuleHalfHeight() + CapsuleRadius);
79 return true;
80 }
82 {
83 OutType = ECAQueryShape::Box;
84 OutDims = InShape.GetBox();
85 return true;
86 }
87 default:
88 break;
89 }
90
91 UE_LOG(LogCollision, Warning, TEXT("CaptureGeomSweep: Unknown geom type."));
92 return false;
93}
94
96inline void CaptureGeomSweep(const UWorld* World, const FVector& Start, const FVector& End, const FQuat& Rot, ECAQueryMode::Type QueryMode, const FCollisionShape& PGeom, ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams, const TArray<FHitResult>& Results, double CPUTime)
97{
99 {
100 return;
101 }
102
103 // Convert from PhysX to Unreal types
104 ECAQueryShape::Type QueryShape;
105 FVector Dims(0, 0, 0);
107
108 // Do a touch all query to find things we _didn't_ hit
109 bSkipCapture = true;
112
113 bSkipCapture = false;
114
115 // Now tell analyzer
116 FCollisionAnalyzerModule::Get()->CaptureQuery(Start, End, Rot, ECAQueryType::GeomSweep, QueryShape, QueryMode, Dims, TraceChannel, Params, ResponseParams, ObjectParams, Results, TouchAllResults, CPUTime);
117}
118
120inline void CaptureGeomSweep(const UWorld* World, const FVector& Start, const FVector& End, const FQuat& GeomRot, ECAQueryMode::Type QueryMode, const FPhysicsGeometryCollection& GeomCollection, ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams, const TArray<FHitResult>& Results, double CPUTime)
121{
123 {
124 return;
125 }
126
127 // Convert from PhysX to Unreal types
128 ECAQueryShape::Type QueryShape = ECAQueryShape::Sphere;
129 FVector Dims(0, 0, 0);
130 FQuat UseRot = GeomRot;
132
133 // Do a touch all query to find things we _didn't_ hit
134 bSkipCapture = true;
137
138 bSkipCapture = false;
139
140 // Now tell analyzer
141 FCollisionAnalyzerModule::Get()->CaptureQuery(Start, End, UseRot, ECAQueryType::GeomSweep, QueryShape, QueryMode, Dims, TraceChannel, Params, ResponseParams, ObjectParams, Results, TouchAllResults, CPUTime);
142}
143
145inline void CaptureRaycast(const UWorld* World, const FVector& Start, const FVector& End, ECAQueryMode::Type QueryMode, ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams, const TArray<FHitResult>& Results, double CPUTime)
146{
148 {
149 return;
150 }
151
152 // Do a touch all query to find things we _didn't_ hit
153 bSkipCapture = true;
156 bSkipCapture = false;
157
158 FCollisionAnalyzerModule::Get()->CaptureQuery(Start, End, FQuat::Identity, ECAQueryType::Raycast, ECAQueryShape::Sphere, QueryMode, FVector(0, 0, 0), TraceChannel, Params, ResponseParams, ObjectParams, Results, TouchAllResults, CPUTime);
159}
160
161void CaptureOverlap(const UWorld* World, const FPhysicsGeometryCollection& PGeom, const FTransform& InGeomTransform, ECAQueryMode::Type QueryMode, ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams, TArray<FOverlapResult>& Results, double CPUTime);
162
163void CaptureOverlap(const UWorld* World, const FCollisionShape& PGeom, const FTransform& InGeomTransform, ECAQueryMode::Type QueryMode, ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams, TArray<FOverlapResult>& Results, double CPUTime);
164
165#define STARTQUERYTIMER() double StartTime = FPlatformTime::Seconds()
166#define CAPTUREGEOMSWEEP(World, Start, End, Rot, QueryMode, PGeom, TraceChannel, Params, ResponseParam, ObjectParam, Results) if (GCollisionAnalyzerIsRecording && IsInGameThread()) { CaptureGeomSweep(World, Start, End, Rot, QueryMode, PGeom, TraceChannel, Params, ResponseParam, ObjectParam, Results, FPlatformTime::Seconds() - StartTime); }
167#define CAPTURERAYCAST(World, Start, End, QueryMode, TraceChannel, Params, ResponseParam, ObjectParam, Results) if (GCollisionAnalyzerIsRecording && IsInGameThread()) { CaptureRaycast(World, Start, End, QueryMode, TraceChannel, Params, ResponseParam, ObjectParam, Results, FPlatformTime::Seconds() - StartTime); }
168#define CAPTUREGEOMOVERLAP(World, PGeom, PGeomPose, QueryMode, TraceChannel, Params, ResponseParams, ObjectParams, Results) if (GCollisionAnalyzerIsRecording && IsInGameThread()) { CaptureOverlap(World, PGeom, PGeomPose, QueryMode, TraceChannel, Params, ResponseParams, ObjectParams, Results, FPlatformTime::Seconds() - StartTime); }
169
170
171#else
172
173#define STARTQUERYTIMER()
174#define CAPTUREGEOMSWEEP(...)
175#define CAPTURERAYCAST(...)
176#define CAPTUREGEOMOVERLAP(...)
177
178#endif // ENABLE_COLLISION_ANALYZER
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
ECollisionChannel
Definition EngineTypes.h:1088
#define FVector
Definition IOSSystemIncludes.h:8
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
CORE_API bool IsInGameThread()
Definition ThreadingBase.cpp:185
ECollisionChannel DefaultCollisionChannel
Definition WorldCollision.cpp:54
Definition Array.h:670
Definition World.h:918
@ Sphere
Definition CollisionShape.h:14
@ Box
Definition CollisionShape.h:13
@ Capsule
Definition CollisionShape.h:15
Definition CollisionQueryParams.h:430
@ AllObjects
Definition CollisionQueryParams.h:433
Definition CollisionQueryParams.h:43
Definition CollisionQueryParams.h:324
Definition CollisionShape.h:21
static bool GeomSweepMulti(const UWorld *World, const GeomWrapper &InGeom, const FQuat &InGeomRot, TArray< FHitResult > &OutHits, FVector Start, FVector End, ECollisionChannel TraceChannel, const FCollisionQueryParams &Params, const FCollisionResponseParams &ResponseParams, const FCollisionObjectQueryParams &ObjectParams=FCollisionObjectQueryParams::DefaultObjectQueryParam)
static ENGINE_API bool RaycastMulti(const UWorld *World, TArray< struct FHitResult > &OutHits, const FVector &Start, const FVector &End, ECollisionChannel TraceChannel, const FCollisionQueryParams &Params, const FCollisionResponseParams &ResponseParams, const FCollisionObjectQueryParams &ObjectParams=FCollisionObjectQueryParams::DefaultObjectQueryParam)
Definition SceneQuery.cpp:975
Definition ChaosEngineInterface.h:304
static CORE_API const TQuat< double > Identity
Definition Quat.h:63