UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ViewDebug.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Misc/ScopeRWLock.h"
10#include "GameFramework/Actor.h"
11
12#if !UE_BUILD_SHIPPING // TODO: Decide whether or not the struct should be entirely stripped out of shipping
13
15class FScene;
16class FViewInfo;
17class FViewCommands;
18
20
25{
27
28private:
29
31
33
34public:
35
40 static inline FViewDebugInfo& Get()
41 {
42 return Instance;
43 }
44
49 {
55 FString Name;
60
61 bool operator<(const FPrimitiveInfo& Other) const
62 {
63 // Sort by name to group similar assets together, then by exact primitives so we can ignore duplicates
64 const int32 NameCompare = Name.Compare(Other.Name);
65 if (NameCompare != 0)
66 {
67 return NameCompare < 0;
68 }
69
70 return PrimitiveSceneInfo < Other.PrimitiveSceneInfo;
71 }
72
73 bool IsPrimitiveValid() const
74 {
75 bool bValid = true;
76 bValid &= Owner.IsValid();
77 bValid &= ComponentInterface != nullptr;
78 if (bValid)
79 {
80 bValid &= ComponentUObject.IsValid();
81 if (bValid)
82 {
84 }
85 }
86 return bValid;
87 }
88
89 inline bool HasLODs() const
90 {
91 return !Stats.LODStats.IsEmpty();
92 }
93
94 inline bool IsLODIndexValid(int32 LOD) const
95 {
96 return LOD >= 0 && LOD < Stats.LODStats.Num();
97 }
98
100
102 {
103 int32 LOD = ComputeCurrentLODIndex(PlayerIndex, ViewIndex);
104 if (!IsLODIndexValid(LOD)) LOD = LODAtLastCapture;
105 return IsLODIndexValid(LOD) ? &Stats.LODStats[LOD] : nullptr;
106 }
107
108 inline const FPrimitiveLODStats* GetCurrentLOD(int32 PlayerIndex = 0, int32 ViewIndex = 0) const
109 {
110 int32 LOD = ComputeCurrentLODIndex(PlayerIndex, ViewIndex);
111 if (!IsLODIndexValid(LOD)) LOD = LODAtLastCapture;
112 return IsLODIndexValid(LOD) ? &Stats.LODStats[LOD] : nullptr;
113 }
114
116 {
117 return IsLODIndexValid(LOD) ? &Stats.LODStats[LOD] : nullptr;
118 }
119
120 inline const FPrimitiveLODStats* GetLOD(int32 LOD) const
121 {
122 return IsLODIndexValid(LOD) ? &Stats.LODStats[LOD] : nullptr;
123 }
124
126 {
127 return Index < Materials.Num() ? Materials[Index].Get() : nullptr;
128 }
129
130 inline int32 GetNumLODs() const
131 {
132 return Stats.LODStats.Num();
133 }
134
135 inline FString GetOwnerName() const
136 {
137 if (const AActor* Actor = Cast<AActor>(Owner))
138 {
139 return Actor->GetHumanReadableName();
140 }
142 }
143
145 {
147 }
148 };
149
150private:
151
152 bool bHasEverUpdated;
153 bool bIsOutdated;
154 bool bShouldUpdate;
155 bool bShouldCaptureSingleFrame;
156 bool bShouldClearCapturedData;
157
158 FOnUpdateViewDebugInfo OnUpdate;
159
160 mutable FRWLock Lock;
161
163
164 RENDERER_API void ProcessPrimitive(FPrimitiveSceneInfo* PrimitiveSceneInfo, const FViewInfo& View, FScene* Scene, IPrimitiveComponent* DebugComponent);
165
166 RENDERER_API void CaptureNextFrame();
167
168 RENDERER_API void EnableLiveCapture();
169
170 RENDERER_API void DisableLiveCapture();
171
172 RENDERER_API void ClearCaptureData();
173
174public:
175 RENDERER_API void ProcessPrimitives(FScene* Scene, const FViewInfo& View, const FViewCommands& ViewCommands);
176
182
187 RENDERER_API void DumpToCSV() const;
188
193 template <typename CallableT>
194 void ForEachPrimitive(CallableT Action) const
195 {
198 for (const auto& [PrimitiveId, Primitive] : Primitives)
199 {
200 if (Primitive.PrimitiveSceneInfo != LastPrimitiveSceneInfo)
201 {
202 Invoke(Action, Primitive);
203 LastPrimitiveSceneInfo = Primitive.PrimitiveSceneInfo;
204 }
205 }
206 }
207
212 RENDERER_API bool HasEverUpdated() const;
213
218 RENDERER_API bool IsOutOfDate() const;
219
220 template <typename UserClass>
221 FDelegateHandle AddUpdateHandler(UserClass* UserObject, void (UserClass::*Func)())
222 {
223 return OnUpdate.AddRaw(UserObject, Func);
224 }
225
227 {
228 return OnUpdate.AddStatic(Func);
229 }
230
232 {
233 OnUpdate.Remove(Handle);
234 }
235};
236#endif
PlayerIndex
Definition AppleControllerInterface.h:24
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType &&Func, ArgTypes &&... Args) -> decltype(((FuncType &&) Func)((ArgTypes &&) Args...))
Definition Invoke.h:44
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_MULTICAST_DELEGATE(DelegateName)
Definition DelegateCombinations.h:23
@ SLT_ReadOnly
Definition ScopeRWLock.h:138
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint16_t uint16
Definition binka_ue_file_header.h:7
Definition Actor.h:257
Definition IDelegateInstance.h:14
Definition PrimitiveComponentId.h:12
Definition PrimitiveSceneInfo.h:266
Definition ScopeRWLock.h:199
Definition ScenePrivate.h:2875
Definition SceneVisibility.h:16
Definition SceneRendering.h:1132
Definition ComponentInterfaces.h:59
virtual bool IsUnreachable() const =0
virtual FString GetOwnerName() const =0
virtual FTransform GetTransform() const =0
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
Definition UnrealString.h.inl:34
Definition CriticalSection.h:14
Definition MaterialInterface.h:296
U16 Index
Definition radfft.cpp:71
Definition ComponentInterfaces.h:18
Definition ComponentInterfaces.h:48
TArray< FPrimitiveLODStats > LODStats
Definition ComponentInterfaces.h:49
Definition ViewDebug.h:49
bool IsLODIndexValid(int32 LOD) const
Definition ViewDebug.h:94
TWeakObjectPtr< UObject > Owner
Definition ViewDebug.h:50
FVector GetPrimitiveLocation() const
Definition ViewDebug.h:144
FPrimitiveSceneInfo * PrimitiveSceneInfo
Definition ViewDebug.h:54
int32 GetNumLODs() const
Definition ViewDebug.h:130
bool IsPrimitiveValid() const
Definition ViewDebug.h:73
TWeakObjectPtr< UMaterialInterface > OverlayMaterial
Definition ViewDebug.h:58
IPrimitiveComponent * ComponentInterface
Definition ViewDebug.h:52
TArray< TWeakObjectPtr< UMaterialInterface > > Materials
Definition ViewDebug.h:57
FPrimitiveComponentId ComponentId
Definition ViewDebug.h:51
const FPrimitiveLODStats * GetCurrentLOD(int32 PlayerIndex=0, int32 ViewIndex=0) const
Definition ViewDebug.h:108
FPrimitiveStats Stats
Definition ViewDebug.h:56
TWeakObjectPtr< UObject > ComponentUObject
Definition ViewDebug.h:53
bool operator<(const FPrimitiveInfo &Other) const
Definition ViewDebug.h:61
FPrimitiveLODStats * GetCurrentLOD(int32 PlayerIndex=0, int32 ViewIndex=0)
Definition ViewDebug.h:101
const FPrimitiveLODStats * GetLOD(int32 LOD) const
Definition ViewDebug.h:120
FPrimitiveLODStats * GetLOD(int32 LOD)
Definition ViewDebug.h:115
bool HasLODs() const
Definition ViewDebug.h:89
FString Name
Definition ViewDebug.h:55
FString GetOwnerName() const
Definition ViewDebug.h:135
UMaterialInterface * GetMaterial(uint16 Index) const
Definition ViewDebug.h:125
int32 LODAtLastCapture
Definition ViewDebug.h:59
RENDERER_API int32 ComputeCurrentLODIndex(int32 PlayerIndex=0, int32 ViewIndex=0) const
Definition ViewDebug.cpp:52
Definition ViewDebug.h:25
RENDERER_API void DumpToCSV() const
Definition ViewDebug.cpp:151
RENDERER_API bool IsOutOfDate() const
Definition ViewDebug.cpp:255
FDelegateHandle AddUpdateHandler(UserClass *UserObject, void(UserClass::*Func)())
Definition ViewDebug.h:221
FDelegateHandle AddUpdateHandler(void(*Func)())
Definition ViewDebug.h:226
RENDERER_API bool HasEverUpdated() const
Definition ViewDebug.cpp:249
RENDERER_API void ProcessPrimitives(FScene *Scene, const FViewInfo &View, const FViewCommands &ViewCommands)
Definition ViewDebug.cpp:261
friend class FDrawPrimitiveDebuggerModule
Definition ViewDebug.h:26
static FViewDebugInfo & Get()
Definition ViewDebug.h:40
RENDERER_API void DumpDrawCallsToCSV()
Definition ViewDebug.cpp:314
void RemoveUpdateHandler(const FDelegateHandle &Handle)
Definition ViewDebug.h:231
void ForEachPrimitive(CallableT Action) const
Definition ViewDebug.h:194
Definition WeakObjectPtrTemplates.h:25
FORCEINLINE bool IsValid(bool bEvenIfPendingKill, bool bThreadsafeTest=false) const
Definition WeakObjectPtrTemplates.h:232
UE_FORCEINLINE_HINT TVector< T > GetLocation() const
Definition TransformNonVectorized.h:571