UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ParticleEmitter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3//~=============================================================================
4// ParticleEmitter
5// The base class for any particle emitter objects.
6//~=============================================================================
7
8#pragma once
9
10#include "CoreMinimal.h"
11#include "Stats/Stats.h"
13#include "UObject/Object.h"
15#include "ParticleEmitter.generated.h"
16
20class UParticleSystemComponent;
21
22enum EDetailMode : int;
23
24//~=============================================================================
25// Burst emissions
26//~=============================================================================
27UENUM()
29{
30 EPBM_Instant UMETA(DisplayName="Instant"),
31 EPBM_Interpolated UMETA(DisplayName="Interpolated"),
33};
34
35//~=============================================================================
36// SubUV-related
37//~=============================================================================
38UENUM()
40{
41 PSUVIM_None UMETA(DisplayName="None"),
42 PSUVIM_Linear UMETA(DisplayName="Linear"),
43 PSUVIM_Linear_Blend UMETA(DisplayName="Linear Blend"),
44 PSUVIM_Random UMETA(DisplayName="Random"),
45 PSUVIM_Random_Blend UMETA(DisplayName="Random Blend"),
47};
48
49//~=============================================================================
50// Cascade-related
51//~=============================================================================
52UENUM()
54{
55 ERM_Normal UMETA(DisplayName="Normal"),
56 ERM_Point UMETA(DisplayName="Point"),
57 ERM_Cross UMETA(DisplayName="Cross"),
58 ERM_LightsOnly UMETA(DisplayName = "Lights Only"),
59 ERM_None UMETA(DisplayName = "None"),
61};
62
63USTRUCT()
65{
67
68
69 UPROPERTY(EditAnywhere, Category=ParticleBurst)
71
73 UPROPERTY(EditAnywhere, Category=ParticleBurst)
74 int32 CountLow;
75
77 UPROPERTY(EditAnywhere, Category=ParticleBurst)
78 float Time;
79
80
81
83 : Count(0)
84 , CountLow(-1) // Disabled by default...
85 , Time(0.0f)
86 {
87 }
88
89};
90
95
96UCLASS(hidecategories=Object, editinlinenew, abstract, MinimalAPI)
98{
100
101 //~=============================================================================
102 // General variables
103 //~=============================================================================
105 UPROPERTY(EditAnywhere, Category=Particle)
106 FName EmitterName;
107
109 int32 SubUVDataOffset;
110
118 UPROPERTY(EditAnywhere, Category=Cascade)
119 TEnumAsByte<enum EEmitterRenderMode> EmitterRenderMode;
120
122 UPROPERTY(EditAnywhere, Category = Significance)
123 EParticleSignificanceLevel SignificanceLevel;
124
125 TEnumAsByte<EParticleAxisLock> LockAxisFlags;
126
128 UPROPERTY(EditAnywhere, Category = Particle, AdvancedDisplay)
129 uint8 bUseLegacySpawningBehavior : 1;
130
132 // Below is information udpated by calling CacheEmitterModuleInfo
133
134 uint8 bRequiresLoopNotification : 1;
135 uint8 bAxisLockEnabled : 1;
136 uint8 bMeshRotationActive : 1;
137
138 UPROPERTY()
139 uint8 ConvertedModules:1;
140
143 uint8 bIsSoloing:1;
144
150 UPROPERTY()
151 uint8 bCookedOut:1;
152
154 UPROPERTY(EditAnywhere, Category = Particle)
155 uint8 bDisabledLODsKeepEmitterAlive : 1;
156
158 UPROPERTY(EditAnywhere, Category = Significance)
159 uint8 bDisableWhenInsignficant : 1;
160
162 uint8 bRemoveHMDRollInVR : 1;
163
164#if WITH_EDITORONLY_DATA
165
167 UPROPERTY(EditAnywhere, Category=Cascade)
168 uint8 bCollapsed:1;
169
173 UPROPERTY(EditAnywhere, Category=Cascade)
175
176#endif // WITH_EDITORONLY_DATA
177 //~=============================================================================
178 // 'Private' data - not required by the editor
179 //~=============================================================================
182
183 UPROPERTY()
184 int32 PeakActiveParticles;
185
186 //~=============================================================================
187 // Performance/LOD Data
188 //~=============================================================================
189
193 UPROPERTY(EditAnywhere, Category=Particle)
194 int32 InitialAllocationCount;
195
196 UPROPERTY(EditAnywhere, Category = Particle)
197 float QualityLevelSpawnRateScale;
198
200 UPROPERTY(EditAnywhere, Category = Particle, meta = (Bitmask, BitmaskEnum = "/Script/Engine.EParticleDetailMode"))
201 uint32 DetailModeBitmask;
202
203#if WITH_EDITORONLY_DATA
204 UPROPERTY(Transient, VisibleAnywhere, Category = Particle, DisplayName="Current Detailmodes")
205 FString DetailModeDisplay;
206#endif // WITH_EDITORONLY_DATA
207
209 TMap<UParticleModule*, uint32> ModuleOffsetMap;
210
212 TMap<UParticleModule*, uint32> ModuleInstanceOffsetMap;
213
215 TMap<UParticleModule*, uint32> ModuleRandomSeedInstanceOffsetMap;
216
219
220 int32 DynamicParameterDataOffset;
221 int32 LightDataOffset;
222 float LightVolumetricScatteringIntensity;
223 int32 CameraPayloadOffset;
224 int32 ParticleSize;
225 int32 ReqInstanceBytes;
226 FVector2D PivotOffset;
227 int32 TypeDataOffset;
228 int32 TypeDataInstanceOffset;
229
230 float MinFacingCameraBlendDistance;
231 float MaxFacingCameraBlendDistance;
232
233 // Array of modules that want emitter instance data
234 TArray<UParticleModule*> ModulesNeedingInstanceData;
235
236 // Array of modules that want emitter random seed instance data
237 TArray<UParticleModule*> ModulesNeedingRandomSeedInstanceData;
238
240 class USubUVAnimation* RESTRICT SubUVAnimation;
241
243
244 //~ Begin UObject Interface
245#if WITH_EDITOR
246 virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
247
248#endif
249
250#if WITH_EDITORONLY_DATA
251 // Update the at-a-glance display for detail mode
253 {
255 DetailModeDisplay += DetailModeBitmask & (1 << EParticleDetailMode::PDM_Low) ? "Low, " : "";
256 DetailModeDisplay += DetailModeBitmask & (1 << EParticleDetailMode::PDM_Medium) ? "Medium, " : "";
257 DetailModeDisplay += DetailModeBitmask & (1 << EParticleDetailMode::PDM_High) ? "High, " : "";
258 DetailModeDisplay += DetailModeBitmask & (1 << EParticleDetailMode::PDM_Epic) ? "Epic" : "";
259 }
260#endif // WITH_EDITORONLY_DATA
261 virtual void Serialize(FArchive& Ar)override;
262 virtual void PostLoad() override;
263 virtual bool IsPostLoadThreadSafe() const override;
264 //~ End UObject Interface
265
266 // @todo document
268
269 // Sets up this emitter with sensible defaults so we can see some particles as soon as its created.
270 virtual void SetToSensibleDefaults() {}
271
272 // @todo document
273 virtual void UpdateModuleLists();
274
275 // @todo document
276 ENGINE_API void SetEmitterName(FName Name);
277
278 // @todo document
279 ENGINE_API FName& GetEmitterName();
280
281 // @todo document
282 virtual void SetLODCount(int32 LODCount);
283
284 // For Cascade
285 // @todo document
286 void AddEmitterCurvesToEditor(UInterpCurveEdSetup* EdSetup);
287
288 // @todo document
289 ENGINE_API void RemoveEmitterCurvesFromEditor(UInterpCurveEdSetup* EdSetup);
290
291 // @todo document
292 ENGINE_API void ChangeEditorColor(FColor& Color, UInterpCurveEdSetup* EdSetup);
293
294 // @todo document
295 ENGINE_API void AutoPopulateInstanceProperties(UParticleSystemComponent* PSysComp);
296
304 ENGINE_API int32 CreateLODLevel(int32 LODLevel, bool bGenerateModuleData = true);
305
314 ENGINE_API bool IsLODLevelValid(int32 LODLevel);
315
324
330 ENGINE_API void EditorUpdateCurrentLOD(FParticleEmitterInstance* Instance);
331
341 ENGINE_API UParticleLODLevel* GetLODLevel(int32 LODLevel);
342
350 virtual bool AutogenerateLowestLODLevel(bool bDuplicateHighest = false);
351
360 virtual bool CalculateMaxActiveParticleCount();
361
368 void GetParametersUtilized(TArray<FString>& ParticleSysParamList,
370
374 void Build();
375
377 void CacheEmitterModuleInfo();
378
382 float GetQualityLevelSpawnRateMult();
383
385 ENGINE_API bool HasAnyEnabledLODs() const;
386
388 STAT(mutable TStatId StatID;)
389 STAT(mutable TStatId StatIDRT;)
390
395 inline TStatId GetStatID(bool bForDeferredUse = false) const
396 {
397#if STATS
398 // this is done to avoid even registering stats for a disabled group (unless we plan on using it later)
399 if (bForDeferredUse || FThreadStats::IsCollectingData(GET_STATID(STAT_EmittersStatGroupTester)))
400 {
401 if (!StatID.IsValidStat())
402 {
403 CreateStatID();
404 }
405 return StatID;
406 }
407#endif
408 return TStatId(); // not doing stats at the moment, or ever
409 }
410
411 inline TStatId GetStatIDRT(bool bForDeferredUse = false) const
412 {
413#if STATS
414 // this is done to avoid even registering stats for a disabled group (unless we plan on using it later)
415 if (bForDeferredUse || FThreadStats::IsCollectingData(GET_STATID(STAT_EmittersRTStatGroupTester)))
416 {
417 if (!StatIDRT.IsValidStat())
418 {
419 CreateStatID();
420 }
421 return StatIDRT;
422 }
423#endif
424 return TStatId(); // not doing stats at the moment, or ever
425 }
429#if STATS
430 void CreateStatID() const;
431#endif
432
435};
436
437
virtual bool IsPostLoadThreadSafe() const override
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define RESTRICT
Definition Platform.h:706
#define GET_STATID(Stat)
Definition Stats.h:656
#define DECLARE_DWORD_COUNTER_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:682
#define DECLARE_STATS_GROUP(GroupDesc, GroupId, GroupCat)
Definition Stats.h:689
#define STAT(x)
Definition Stats.h:44
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_UCLASS_BODY(...)
Definition ObjectMacros.h:768
#define UCLASS(...)
Definition ObjectMacros.h:776
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
EEmitterRenderMode
Definition ParticleEmitter.h:54
@ UMETA
Definition ParticleEmitter.h:30
@ ERM_MAX
Definition ParticleEmitter.h:60
EParticleBurstMethod
Definition ParticleEmitter.h:29
@ EPBM_MAX
Definition ParticleEmitter.h:32
EParticleSubUVInterpMethod
Definition ParticleEmitter.h:40
@ PSUVIM_MAX
Definition ParticleEmitter.h:46
EParticleSignificanceLevel
Definition ParticleHelper.h:2398
EDetailMode
Definition SceneComponent.h:32
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition NameTypes.h:617
Definition ParticleEmitterInstanceOwner.h:29
Definition Array.h:670
Definition EnumAsByte.h:22
Definition UnrealString.h.inl:34
Definition InterpCurveEdSetup.h:105
TStatId GetStatID(bool bForDeferredUse=false) const
Definition UObjectBaseUtility.h:794
Definition Object.h:95
Definition ParticleEmitter.h:98
Definition ParticleLODLevel.h:22
Definition SubUVAnimation.h:89
int
Definition TestServer.py:515
Definition Color.h:486
Definition ParticleEmitter.h:65
Definition ParticleEmitterInstances.h:226
Definition UnrealType.h:6865
Definition LightweightStats.h:416