UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SceneExtensions.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 "RendererInterface.h"
7#include "Tasks/Task.h"
8
9class FScene;
11class FRDGBuilder;
18struct FEngineShowFlags;
21
24{
25public:
26 // default fallback static method that can be overridden in child classes to predicate the creation of the extension
27 static bool ShouldCreateExtension(FScene& Scene) { return true; }
28
30 virtual ~ISceneExtension() {}
31
35 virtual void InitExtension(FScene& InScene) { };
36 virtual ISceneExtensionUpdater* CreateUpdater() { return nullptr; }
37 virtual ISceneExtensionRenderer* CreateRenderer(FSceneRendererBase& InSceneRenderer, const FEngineShowFlags& EngineShowFlags) { return nullptr; }
38
39protected:
41};
42
45{
46public:
48
49 virtual void Begin(FScene& InScene) {}
50 virtual void End() {}
51
57
58 // Some care and caution is needed when using the SceneUniforms passed in here.
59 // These passes run outside of the context of the renderer so certain changes may not persist.
60 // Additionally - particularly in the pre-scene update - only certain fields of the SceneUniforms will be populated (GPUScene notably).
61 virtual void PreSceneUpdate(FRDGBuilder& GraphBuilder, const FScenePreUpdateChangeSet& ChangeSet, FSceneUniformBuffer& SceneUniforms) {}
62
63 virtual void PostSceneUpdate(FRDGBuilder& GraphBuilder, const FScenePostUpdateChangeSet& ChangeSet) {}
64 virtual void PostGPUSceneUpdate(FRDGBuilder& GraphBuilder, FSceneUniformBuffer& SceneUniforms) {}
65};
66
69{
70public:
73
75 virtual void End() {}
76
80 virtual void PreInitViews(FRDGBuilder& GraphBuilder) {}
81
86 virtual void UpdateViewData(FRDGBuilder& GraphBuilder, const FRendererViewDataManager& ViewDataManager) {}
87
88 // See the note in ISceneExtensionUpdater about the SceneUniforms.
89 virtual void UpdateSceneUniformBuffer(FRDGBuilder& GraphBuilder, FSceneUniformBuffer& SceneUniforms) {}
90
94 virtual void PreRender(FRDGBuilder& GraphBuilder) {}
95
99 virtual void PostRender(FRDGBuilder& GraphBuilder) {}
100
101protected:
102 FSceneRendererBase& GetSceneRenderer() { return SceneRendererInternal;}
103
104private:
105 FSceneRendererBase& SceneRendererInternal;
106};
107
110{
112
113public:
116
117 const int32 GetExtensionID() const { return ExtensionID; }
118
119private:
120 int32 ExtensionID = INDEX_NONE;
121};
122
125{
126public:
128 {
129 InitRegistry();
130 return *GlobalRegistry;
131 }
132
133 int32 GetMaxRegistrationID() const { return Factories.Num() - 1; }
136
137private:
138 RENDERER_API static void InitRegistry();
139
141
142 RENDERER_API static FSceneExtensionRegistry* GlobalRegistry;
143};
144
147{
148public:
151
153
154 void Init(FScene& Scene);
155 void Reset();
158
159 template<typename TDerivedExtension>
161 {
162 const int32 Index = TDerivedExtension::GetExtensionID();
163 if (Extensions.IsValidIndex(Index))
164 {
165 return static_cast<TDerivedExtension*>(Extensions[Index]);
166 }
167 return nullptr;
168 }
169
170 template<typename TDerivedExtension>
172 {
173 return const_cast<FSceneExtensions*>(this)->GetExtensionPtr<TDerivedExtension>();
174 }
175
176 template<typename TDerivedExtension>
178 {
180 check(Extension != nullptr);
181 return *Extension;
182 }
183
184 template<typename TDerivedExtension>
186 {
187 return const_cast<FSceneExtensions*>(this)->GetExtension<TDerivedExtension>();
188 }
189
190 template<typename TFunc>
192 {
193 for(auto Ext : Extensions)
194 {
195 F(Ext);
196 }
197 }
198
199private:
201};
202
205{
206 friend class FSceneExtensions;
207
208public:
212
213 void Begin(FScene& InScene);
214 void End();
215 bool IsUpdating() const { return Scene != nullptr; }
216
217 template<typename TUpdater>
219 {
220 const int32 Index = TUpdater::FExtension::GetExtensionID();
221 return Updaters.IsValidIndex(Index) ? static_cast<TUpdater*>(Updaters[Index]) : nullptr;
222 }
223 template<typename TUpdater>
224 const TUpdater* GetUpdaterPtr() const { return const_cast<FSceneExtensionsUpdaters*>(this)->GetUpdaterPtr<TUpdater>(); }
225 template<typename TUpdater>
227 {
229 check(Updater != nullptr);
230 return *Updater;
231 }
232 template<typename TUpdater>
233 const TUpdater& GetUpdater() const { return const_cast<FSceneExtensionsUpdaters*>(this)->GetUpdater<TUpdater>(); }
234
235
237 {
238 for (auto Updater : Updaters) { Updater->PreLightsUpdate(GraphBuilder, LightSceneChangeSet); }
239 }
240
242 {
243 for (auto Updater : Updaters) { Updater->PostLightsUpdate(GraphBuilder, LightSceneChangeSet); }
244 }
245
247 {
248 for (auto Updater : Updaters) { Updater->PreSceneUpdate(GraphBuilder, ChangeSet, SceneUniforms); }
249 }
250
252 {
253 for (auto Updater : Updaters) { Updater->PostSceneUpdate(GraphBuilder, ChangeSet); }
254 }
255
256 void PostGPUSceneUpdate(FRDGBuilder& GraphBuilder, FSceneUniformBuffer& SceneUniforms)
257 {
258 for (auto Updater : Updaters) { Updater->PostGPUSceneUpdate(GraphBuilder, SceneUniforms); }
259 }
260
261private:
262 FScene* Scene = nullptr;
264};
265
268{
269 friend class FSceneExtensions;
270
271public:
274
276 void End();
277 bool IsRendering() const { return SceneRenderer != nullptr; }
278
279 template<typename TRenderer>
281 {
282 const int32 Index = TRenderer::FExtension::GetExtensionID();
283 return Renderers.IsValidIndex(Index) ? static_cast<TRenderer*>(Renderers[Index]) : nullptr;
284 }
285 template<typename TRenderer>
286 const TRenderer* GetRendererPtr() const { return const_cast<FSceneExtensionsRenderers*>(this)->GetRendererPtr<TRenderer>(); }
287 template<typename TRenderer>
289 {
291 check(Renderer != nullptr);
292 return *Renderer;
293 }
294 template<typename TRenderer>
295 const TRenderer& GetRenderer() const { return const_cast<FSceneExtensionsRenderers*>(this)->GetRenderer<TRenderer>(); }
296
300 void PreInitViews(FRDGBuilder& GraphBuilder)
301 {
302 ValidateAdvanceCallbackStage(ECallbackStage::PreInitViews);
303 for (auto Renderer : Renderers) { Renderer->PreInitViews(GraphBuilder); }
304 }
305
306 void UpdateViewData(FRDGBuilder& GraphBuilder, const FRendererViewDataManager& ViewDataManager)
307 {
308 ValidateAdvanceCallbackStage(ECallbackStage::UpdateViewData);
309 for (auto Renderer : Renderers)
310 {
311 Renderer->UpdateViewData(GraphBuilder, ViewDataManager);
312 }
313 }
314
315 void UpdateSceneUniformBuffer(FRDGBuilder& GraphBuilder, FSceneUniformBuffer& SceneUniforms)
316 {
317 ValidateAdvanceCallbackStage(ECallbackStage::UpdateSceneUniformBuffer);
318 for (auto Renderer : Renderers) { Renderer->UpdateSceneUniformBuffer(GraphBuilder, SceneUniforms); }
319 }
320
321 void PreRender(FRDGBuilder& GraphBuilder)
322 {
323 ValidateAdvanceCallbackStage(ECallbackStage::PreRender);
324 for (auto Renderer : Renderers) { Renderer->PreRender(GraphBuilder); }
325 }
326
327 void PostRender(FRDGBuilder& GraphBuilder)
328 {
329 ValidateAdvanceCallbackStage(ECallbackStage::PostRender);
330 for (auto Renderer : Renderers) { Renderer->PostRender(GraphBuilder); }
331 }
332
333private:
334
335 // true if the callback order should be validated.
336 bool bValidateCallbacks = false;
337 // Just used to validate that the stages happen in the expected order and none are skipped.
338 enum class ECallbackStage : int32
339 {
340 Begin,
341 PreInitViews,
342 UpdateViewData,
343 UpdateSceneUniformBuffer,
344 PreRender,
345 PostRender,
346 End
347 };
348 ECallbackStage CurrentCallbackStage = ECallbackStage::Begin;
349
350 void ValidateAdvanceCallbackStage(ECallbackStage InCallbackStage)
351 {
352 check(!bValidateCallbacks || InCallbackStage == CurrentCallbackStage);
353 // Reset using the provided (called) stage as the subsequent stages might be ok.
354 CurrentCallbackStage = static_cast<ECallbackStage>(static_cast<int32>(InCallbackStage) + 1);
355 }
356
357 FSceneRendererBase* SceneRenderer = nullptr;
359};
360
362template<typename TDerivedExtension>
364{
365public:
370
372
374 {
375 if (!TDerivedExtension::ShouldCreateExtension(Scene))
376 {
377 return nullptr;
378 }
379 return new TDerivedExtension(Scene);
380 }
381};
382
384#define DECLARE_SCENE_EXTENSION(ModuleExport, ClassName) \
385 public: \
386 ModuleExport static int32 GetExtensionID() { return ExtensionRegistration.GetExtensionID(); } \
387 private: \
388 ModuleExport static TSceneExtensionRegistration<ClassName> ExtensionRegistration
389
390#define DECLARE_SCENE_EXTENSION_UPDATER(ClassName, SceneExtensionClassName) \
391 public: \
392 using FExtension = SceneExtensionClassName
393
394#define DECLARE_SCENE_EXTENSION_RENDERER(ClassName, SceneExtensionClassName) \
395 public: \
396 using FExtension = SceneExtensionClassName
397
399#define IMPLEMENT_SCENE_EXTENSION(ClassName) \
400 TSceneExtensionRegistration<ClassName> ClassName::ExtensionRegistration
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
void Init()
Definition LockFreeList.h:4
Definition RenderGraphBuilder.h:49
Definition ViewData.h:64
Definition SceneExtensions.h:125
int32 GetMaxRegistrationID() const
Definition SceneExtensions.h:133
static FSceneExtensionRegistry & Get()
Definition SceneExtensions.h:127
RENDERER_API void Register(ISceneExtensionFactory &Factory)
Definition SceneExtensions.cpp:19
TSparseArray< ISceneExtension * > CreateExtensions(FScene &Scene)
Definition SceneExtensions.cpp:25
Definition SceneExtensions.h:268
void End()
Definition SceneExtensions.cpp:132
TRenderer * GetRendererPtr()
Definition SceneExtensions.h:280
~FSceneExtensionsRenderers()
Definition SceneExtensions.h:273
void UpdateViewData(FRDGBuilder &GraphBuilder, const FRendererViewDataManager &ViewDataManager)
Definition SceneExtensions.h:306
bool IsRendering() const
Definition SceneExtensions.h:277
void PreRender(FRDGBuilder &GraphBuilder)
Definition SceneExtensions.h:321
TRenderer & GetRenderer()
Definition SceneExtensions.h:288
const TRenderer & GetRenderer() const
Definition SceneExtensions.h:295
const TRenderer * GetRendererPtr() const
Definition SceneExtensions.h:286
void PreInitViews(FRDGBuilder &GraphBuilder)
Definition SceneExtensions.h:300
FSceneExtensionsRenderers()
Definition SceneExtensions.h:272
void PostRender(FRDGBuilder &GraphBuilder)
Definition SceneExtensions.h:327
void UpdateSceneUniformBuffer(FRDGBuilder &GraphBuilder, FSceneUniformBuffer &SceneUniforms)
Definition SceneExtensions.h:315
Definition SceneExtensions.h:205
TUpdater & GetUpdater()
Definition SceneExtensions.h:226
TUpdater * GetUpdaterPtr()
Definition SceneExtensions.h:218
void PostSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePostUpdateChangeSet &ChangeSet)
Definition SceneExtensions.h:251
FSceneExtensionsUpdaters(FScene &InScene)
Definition SceneExtensions.h:210
bool IsUpdating() const
Definition SceneExtensions.h:215
FSceneExtensionsUpdaters()
Definition SceneExtensions.h:209
const TUpdater & GetUpdater() const
Definition SceneExtensions.h:233
void PostGPUSceneUpdate(FRDGBuilder &GraphBuilder, FSceneUniformBuffer &SceneUniforms)
Definition SceneExtensions.h:256
void End()
Definition SceneExtensions.cpp:104
void PreSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePreUpdateChangeSet &ChangeSet, FSceneUniformBuffer &SceneUniforms)
Definition SceneExtensions.h:246
void PostLightsUpdate(FRDGBuilder &GraphBuilder, const FLightSceneChangeSet &LightSceneChangeSet)
Definition SceneExtensions.h:241
~FSceneExtensionsUpdaters()
Definition SceneExtensions.h:211
const TUpdater * GetUpdaterPtr() const
Definition SceneExtensions.h:224
void PreLightsUpdate(FRDGBuilder &GraphBuilder, const FLightSceneChangeSet &LightSceneChangeSet)
Definition SceneExtensions.h:236
Definition SceneExtensions.h:147
TDerivedExtension * GetExtensionPtr()
Definition SceneExtensions.h:160
~FSceneExtensions()
Definition SceneExtensions.h:152
void ForEachExtension(const TFunc &F)
Definition SceneExtensions.h:191
TSparseArray< ISceneExtensionUpdater *, SceneRenderingSparseArrayAllocator > FUpdaterList
Definition SceneExtensions.h:149
TDerivedExtension & GetExtension()
Definition SceneExtensions.h:177
TSparseArray< ISceneExtensionRenderer *, SceneRenderingSparseArrayAllocator > FRendererList
Definition SceneExtensions.h:150
void CreateRenderers(FSceneRendererBase &InSceneRenderer, const FEngineShowFlags &EngineShowFlags, FRendererList &OutRenderers)
Definition SceneExtensions.cpp:77
const TDerivedExtension * GetExtensionPtr() const
Definition SceneExtensions.h:171
void Reset()
Definition SceneExtensions.cpp:54
const TDerivedExtension & GetExtension() const
Definition SceneExtensions.h:185
void CreateUpdaters(FUpdaterList &OutUpdaters)
Definition SceneExtensions.cpp:63
Definition ScenePrimitiveUpdates.h:129
Definition ScenePrimitiveUpdates.h:116
Definition SceneRendering.h:2023
Definition SceneUniformBuffer.h:137
Definition ScenePrivate.h:2875
Definition SceneExtensions.h:110
virtual ~ISceneExtensionFactory()
Definition SceneExtensions.h:114
const int32 GetExtensionID() const
Definition SceneExtensions.h:117
virtual ISceneExtension * CreateInstance(FScene &Scene)=0
Definition SceneExtensions.h:69
virtual void UpdateSceneUniformBuffer(FRDGBuilder &GraphBuilder, FSceneUniformBuffer &SceneUniforms)
Definition SceneExtensions.h:89
ISceneExtensionRenderer(FSceneRendererBase &InSceneRenderer)
Definition SceneExtensions.h:71
virtual void UpdateViewData(FRDGBuilder &GraphBuilder, const FRendererViewDataManager &ViewDataManager)
Definition SceneExtensions.h:86
FSceneRendererBase & GetSceneRenderer()
Definition SceneExtensions.h:102
virtual void PreInitViews(FRDGBuilder &GraphBuilder)
Definition SceneExtensions.h:80
virtual void PostRender(FRDGBuilder &GraphBuilder)
Definition SceneExtensions.h:99
virtual void Begin(FSceneRendererBase *InRenderer)
Definition SceneExtensions.h:74
virtual void PreRender(FRDGBuilder &GraphBuilder)
Definition SceneExtensions.h:94
virtual ~ISceneExtensionRenderer()
Definition SceneExtensions.h:72
virtual void End()
Definition SceneExtensions.h:75
Definition SceneExtensions.h:45
virtual void PostSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePostUpdateChangeSet &ChangeSet)
Definition SceneExtensions.h:63
virtual void PostLightsUpdate(FRDGBuilder &GraphBuilder, const FLightSceneChangeSet &LightSceneChangeSet)
Definition SceneExtensions.h:55
virtual void End()
Definition SceneExtensions.h:50
virtual void PreSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePreUpdateChangeSet &ChangeSet, FSceneUniformBuffer &SceneUniforms)
Definition SceneExtensions.h:61
virtual void PostGPUSceneUpdate(FRDGBuilder &GraphBuilder, FSceneUniformBuffer &SceneUniforms)
Definition SceneExtensions.h:64
virtual ~ISceneExtensionUpdater()
Definition SceneExtensions.h:47
virtual void PreLightsUpdate(FRDGBuilder &GraphBuilder, const FLightSceneChangeSet &LightSceneChangeSet)
Definition SceneExtensions.h:56
virtual void Begin(FScene &InScene)
Definition SceneExtensions.h:49
Definition SceneExtensions.h:24
static bool ShouldCreateExtension(FScene &Scene)
Definition SceneExtensions.h:27
virtual ~ISceneExtension()
Definition SceneExtensions.h:30
virtual ISceneExtensionUpdater * CreateUpdater()
Definition SceneExtensions.h:36
virtual void InitExtension(FScene &InScene)
Definition SceneExtensions.h:35
ISceneExtension(FScene &InScene)
Definition SceneExtensions.h:29
FScene & Scene
Definition SceneExtensions.h:40
virtual ISceneExtensionRenderer * CreateRenderer(FSceneRendererBase &InSceneRenderer, const FEngineShowFlags &EngineShowFlags)
Definition SceneExtensions.h:37
Definition Renderer.Build.cs:6
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition SceneExtensions.h:364
virtual ISceneExtension * CreateInstance(FScene &Scene) override
Definition SceneExtensions.h:373
virtual ~TSceneExtensionRegistration()
Definition SceneExtensions.h:371
TSceneExtensionRegistration()
Definition SceneExtensions.h:366
bool IsValidIndex(int32 Index) const
Definition SparseArray.h:481
Definition SparseArray.h:524
U16 Index
Definition radfft.cpp:71
Definition ShowFlags.h:56
Definition ScenePrivate.h:2850