UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
FXSystemPrivate.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 FXSystemPrivate.h: Internal effects system interface.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "FXSystem.h"
11#include "VectorField.h"
12#include "ParticleSortingGPU.h"
13#include "GPUSortManager.h"
15
16class FCanvas;
22class UParticleSystemComponent;
26
27/*-----------------------------------------------------------------------------
28 Forward declarations.
29-----------------------------------------------------------------------------*/
30
35
37{
38 enum Type
39 {
45
46 /**********************************************************************/
47
52 };
53};
54
61
64
69
70/*-----------------------------------------------------------------------------
71Injecting particles in to the GPU for simulation.
72-----------------------------------------------------------------------------*/
73
108
109
114{
116
117public:
122
139
149
153 virtual void InitRHI(FRHICommandListBase& RHICmdList) override;
154 virtual bool RendersPrimitivesAsCameraFacingSprites() const override { return true; }
155
163
168
173
178};
179
180/*-----------------------------------------------------------------------------
181 FX system declaration.
182-----------------------------------------------------------------------------*/
183
188{
189public:
190
193
195 virtual ~FFXSystem();
196
197 static const FName Name;
198 virtual FFXSystemInterface* GetInterface(const FName& InName) override;
199
200 // Begin FFXSystemInterface.
201 virtual void Tick(UWorld* World, float DeltaSeconds) override;
202 virtual void OnMarkPendingKill() override;
203#if WITH_EDITOR
204 virtual void Suspend() override;
205 virtual void Resume() override;
206#endif // #if WITH_EDITOR
207 virtual void DrawDebug(FCanvas* Canvas) override;
208 virtual void AddVectorField(UVectorFieldComponent* VectorFieldComponent) override;
209 virtual void RemoveVectorField(UVectorFieldComponent* VectorFieldComponent) override;
210 virtual void UpdateVectorField(UVectorFieldComponent* VectorFieldComponent) override;
212 virtual void PreInitViews(class FRDGBuilder& GraphBuilder, bool bAllowGPUParticleUpdate, const TArrayView<const FSceneViewFamily*>& ViewFamilies, const FSceneViewFamily* CurrentFamily) override;
213 virtual void PostInitViews(FRDGBuilder& GraphBuilder, TConstStridedView<FSceneView> Views, bool bAllowGPUParticleUpdate) override;
214 virtual bool UsesGlobalDistanceField() const override;
215 virtual bool UsesDepthBuffer() const override;
216 virtual bool RequiresEarlyViewUniformBuffer() const override;
217 virtual bool RequiresRayTracingScene() const override;
218 virtual void PreRender(FRDGBuilder& GraphBuilder, TConstStridedView<FSceneView> Views, FSceneUniformBuffer &SceneUniformBuffer, bool bAllowGPUParticleUpdate) override;
219 virtual void PostRenderOpaque(FRDGBuilder& GraphBuilder, TConstStridedView<FSceneView> Views, FSceneUniformBuffer &SceneUniformBuffer, bool bAllowGPUParticleUpdate) override;
220 // End FFXSystemInterface.
221
222 /*--------------------------------------------------------------------------
223 Internal interface for GPU simulation.
224 --------------------------------------------------------------------------*/
228 ERHIFeatureLevel::Type GetFeatureLevel() const { return FeatureLevel; }
229
234
240
246
252
257 {
258 return ParticleSimulationResources;
259 }
260
271 bool AddSortedGPUSimulation(FRHICommandListBase& RHICmdList, FParticleSimulationGPU* Simulation, const FVector& ViewOrigin, bool bIsTranslucent, FGPUSortManager::FAllocationInfo& OutInfo);
272
275
277 virtual FGPUSortManager* GetGPUSortManager() const override;
278
280
281private:
282
301 void GenerateSortKeys(FRHICommandListImmediate& RHICmdList, int32 BatchId, int32 NumElementsInBatch, EGPUSortFlags Flags, FRHIUnorderedAccessView* KeysUAV, FRHIUnorderedAccessView* ValuesUAV);
302
303 /*--------------------------------------------------------------------------
304 Private interface for GPU simulations.
305 --------------------------------------------------------------------------*/
306
310 void InitGPUSimulation();
311
315 virtual void DestroyGPUSimulation();
316
320 void InitGPUResources();
321
325 void ReleaseGPUResources();
326
330 void AdvanceGPUParticleFrame(FRHICommandListImmediate& RHICmdList, bool bAllowGPUParticleUpdate);
331
332 bool UsesGlobalDistanceFieldInternal() const;
333 bool UsesDepthBufferInternal() const;
334 bool RequiresEarlyViewUniformBufferInternal() const;
335 bool RequiresRayTracingSceneInternal() const;
336
340 void UpdateMultiGPUResources(FRHICommandListImmediate& RHICmdList);
341
347 void SimulateGPUParticles(
348 FRHICommandListImmediate& RHICmdList,
352 );
353
358 void VisualizeGPUParticles(FCanvas* Canvas);
359
360private:
361
362 template<typename TVectorFieldUniformParametersType>
363 void SimulateGPUParticles_Internal(
364 FRHICommandListImmediate& RHICmdList,
368 FRHITexture* SceneDepthTexture,
370 );
371
372 /*-------------------------------------------------------------------------
373 GPU simulation state.
374 -------------------------------------------------------------------------*/
375
377 FVectorFieldInstanceList VectorFields;
381 int32 NumGPUSimulations[EParticleSimulatePhase::Last + 1] = {};
383 FParticleSimulationResources* ParticleSimulationResources;
385 ERHIFeatureLevel::Type FeatureLevel;
386
388 TRefCountPtr<FGPUSortManager> GPUSortManager;
390 TArray<FParticleSimulationSortInfo> SimulationsToSort;
391
393 TArray<FNewParticle> LastFrameNewParticles;
394
395 UE::FMutex AddSortedGPUSimulationMutex;
396
397#if WITH_EDITOR
399 bool bSuspended;
400#endif // #if WITH_EDITOR
401
402#if WITH_MGPU
405#endif
406
407 TUniformBufferRef<FSceneTextureUniformParameters> SceneTexturesUniformParams;
408};
409
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
EParticleCollisionShaderMode
Definition FXSystemPrivate.h:56
@ PCM_DepthBuffer
Definition FXSystemPrivate.h:58
@ PCM_None
Definition FXSystemPrivate.h:57
@ PCM_DistanceField
Definition FXSystemPrivate.h:59
bool IsParticleCollisionModeSupported(EShaderPlatform InPlatform, EParticleCollisionShaderMode InCollisionShaderMode)
Definition FXSystem.cpp:27
EParticleSimulatePhase::Type GetLastParticleSimulationPhase(EShaderPlatform InPlatform)
Definition FXSystemPrivate.h:65
EGPUSortFlags
Definition GPUSortManager.h:95
@ Num
Definition MetalRHIPrivate.h:234
@ PVFT_MAX
Definition ParticleVertexFactory.h:24
#define GShaderPlatformForFeatureLevel
Definition RHIGlobals.h:915
EShaderPlatform
Definition RHIShaderPlatform.h:11
#define DECLARE_VERTEX_FACTORY_TYPE(FactoryClass)
Definition VertexFactory.h:548
EVertexInputStreamType
Definition VertexFactory.h:128
Definition CanvasTypes.h:211
Definition FXSystem.h:131
Definition FXSystemPrivate.h:188
virtual bool UsesDepthBuffer() const override
Definition FXSystem.cpp:477
static const FName Name
Definition FXSystemPrivate.h:197
void OnSimulationPhaseChanged(const FParticleSimulationGPU *Simulation, EParticleSimulatePhase::Type PrevPhase)
Definition ParticleGpuSimulation.cpp:5176
FParticleEmitterInstance * CreateGPUSpriteEmitterInstance(IParticleEmitterInstanceOwner &InComponent, FGPUSpriteEmitterInfo &EmitterInfo)
Definition ParticleGpuSimulation.cpp:5265
virtual void RemoveVectorField(UVectorFieldComponent *VectorFieldComponent) override
Definition FXSystem.cpp:374
void RemoveGPUSimulation(FParticleSimulationGPU *Simulation)
Definition ParticleGpuSimulation.cpp:4601
virtual void PostInitViews(FRDGBuilder &GraphBuilder, TConstStridedView< FSceneView > Views, bool bAllowGPUParticleUpdate) override
Definition FXSystem.cpp:462
virtual FFXSystemInterface * GetInterface(const FName &InName) override
Definition FXSystem.cpp:273
virtual void OnMarkPendingKill() override
Definition FXSystem.cpp:299
bool AddSortedGPUSimulation(FRHICommandListBase &RHICmdList, FParticleSimulationGPU *Simulation, const FVector &ViewOrigin, bool bIsTranslucent, FGPUSortManager::FAllocationInfo &OutInfo)
Definition ParticleGpuSimulation.cpp:4620
void FinalizeGPUSimulation(FRHICommandListImmediate &RHICmdList)
Definition ParticleGpuSimulation.cpp:4772
virtual void SetSceneTexturesUniformBuffer(const TUniformBufferRef< FSceneTextureUniformParameters > &InSceneTexturesUniformParams) override
Definition FXSystemPrivate.h:279
void AddGPUSimulation(FParticleSimulationGPU *Simulation)
Definition ParticleGpuSimulation.cpp:4579
virtual bool UsesGlobalDistanceField() const override
Definition FXSystem.cpp:467
void PrepareGPUSimulation(FRHICommandListImmediate &RHICmdList)
Definition ParticleGpuSimulation.cpp:4760
virtual void DrawDebug(FCanvas *Canvas) override
Definition FXSystem.cpp:441
virtual void AddVectorField(UVectorFieldComponent *VectorFieldComponent) override
Definition FXSystem.cpp:345
virtual ~FFXSystem()
Definition FXSystem.cpp:265
EShaderPlatform GetShaderPlatform() const
Definition FXSystemPrivate.h:233
FParticleSimulationResources * GetParticleSimulationResources()
Definition FXSystemPrivate.h:256
virtual void UpdateVectorField(UVectorFieldComponent *VectorFieldComponent) override
Definition FXSystem.cpp:400
virtual bool RequiresEarlyViewUniformBuffer() const override
Definition FXSystem.cpp:487
virtual void PostRenderOpaque(FRDGBuilder &GraphBuilder, TConstStridedView< FSceneView > Views, FSceneUniformBuffer &SceneUniformBuffer, bool bAllowGPUParticleUpdate) override
Definition FXSystem.cpp:549
ERHIFeatureLevel::Type GetFeatureLevel() const
Definition FXSystemPrivate.h:228
virtual void PreInitViews(class FRDGBuilder &GraphBuilder, bool bAllowGPUParticleUpdate, const TArrayView< const FSceneViewFamily * > &ViewFamilies, const FSceneViewFamily *CurrentFamily) override
Definition FXSystem.cpp:452
virtual void PreRender(FRDGBuilder &GraphBuilder, TConstStridedView< FSceneView > Views, FSceneUniformBuffer &SceneUniformBuffer, bool bAllowGPUParticleUpdate) override
Definition FXSystem.cpp:510
virtual bool RequiresRayTracingScene() const override
Definition FXSystem.cpp:497
virtual FGPUSortManager * GetGPUSortManager() const override
Definition FXSystem.cpp:573
Definition GPUSortManager.h:167
Definition FXSystemPrivate.h:114
static void ModifyCompilationEnvironment(const FVertexFactoryShaderPermutationParameters &Parameters, FShaderCompilerEnvironment &OutEnvironment)
Definition ParticleGpuSimulation.cpp:933
void SetUnsortedParticleIndicesSRV(FRHIShaderResourceView *VertexBuffer)
Definition FXSystemPrivate.h:159
static void GetPSOPrecacheVertexFetchElements(EVertexInputStreamType VertexInputStreamType, FVertexDeclarationElementList &Elements)
Definition ParticleGpuSimulation.cpp:897
FGPUSpriteVertexFactory()
Definition FXSystemPrivate.h:140
FUniformBufferRHIRef EmitterDynamicUniformBuffer
Definition FXSystemPrivate.h:126
virtual bool RendersPrimitivesAsCameraFacingSprites() const override
Definition FXSystemPrivate.h:154
FVector3f LWCTile
Definition FXSystemPrivate.h:136
FRHITexture * PositionTextureRHI
Definition FXSystemPrivate.h:130
FRHIUniformBuffer * EmitterUniformBuffer
Definition FXSystemPrivate.h:124
virtual void InitRHI(FRHICommandListBase &RHICmdList) override
Definition ParticleGpuSimulation.cpp:905
FGPUSpriteVertexFactory(ERHIFeatureLevel::Type InFeatureLevel)
Definition FXSystemPrivate.h:118
FRHIShaderResourceView * UnsortedParticleIndicesSRV
Definition FXSystemPrivate.h:128
FVector3f TilePageScale
Definition FXSystemPrivate.h:138
static bool ShouldCompilePermutation(const FVertexFactoryShaderPermutationParameters &Parameters)
Definition ParticleGpuSimulation.cpp:925
FRHITexture * AttributesTextureRHI
Definition FXSystemPrivate.h:134
FRHITexture * VelocityTextureRHI
Definition FXSystemPrivate.h:132
Definition GlobalDistanceFieldParameters.h:18
Definition NameTypes.h:617
Definition ParticleGpuSimulation.cpp:2544
Definition ParticleGpuSimulation.cpp:513
Definition ParticleVertexFactory.h:31
Definition RenderGraphBuilder.h:49
Definition RHICommandList.h:455
Definition RHICommandList.h:4626
Definition RHIResources.h:3304
Definition RHIResources.h:2153
Definition RHIResources.h:1232
Definition RHIResources.h:3294
Definition SceneUniformBuffer.h:137
Definition SceneView.h:2212
Definition ParticleEmitterInstanceOwner.h:29
Definition ArrayView.h:139
Definition ShaderParameterMacros.h:136
Definition Mutex.h:18
Definition VectorFieldComponent.h:19
Definition World.h:918
Definition FXSystemPrivate.h:37
Type
Definition FXSystemPrivate.h:39
@ Last
Definition FXSystemPrivate.h:51
@ CollisionDistanceField
Definition FXSystemPrivate.h:42
@ First
Definition FXSystemPrivate.h:49
@ Main
Definition FXSystemPrivate.h:41
@ CollisionDepthBuffer
Definition FXSystemPrivate.h:44
Definition SceneComponent.h:24
Type
Definition RHIFeatureLevel.h:20
Definition GPUSortManager.h:172
Definition ParticleModuleTypeDataGpu.h:95
Definition FXSystemPrivate.h:78
FVector3f Position
Definition FXSystemPrivate.h:80
float VectorFieldScale
Definition FXSystemPrivate.h:96
FVector3f Velocity
Definition FXSystemPrivate.h:84
float RelativeTime
Definition FXSystemPrivate.h:82
FVector2f Size
Definition FXSystemPrivate.h:88
float Rotation
Definition FXSystemPrivate.h:90
int32 AllocatedTileIndex
Definition FXSystemPrivate.h:101
FVector3f Offset
Definition FXSystemPrivate.h:106
float Resilience
Definition FXSystemPrivate.h:100
union FNewParticle::@1087 ResilienceAndTileIndex
float DragCoefficient
Definition FXSystemPrivate.h:94
float RelativeRotationRate
Definition FXSystemPrivate.h:92
float TimeScale
Definition FXSystemPrivate.h:86
float RandomOrbit
Definition FXSystemPrivate.h:104
Definition ParticleEmitterInstances.h:226
Definition ShaderCore.h:544
Definition MeshMaterialShader.h:44