UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ParticleModule.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3
4#pragma once
5
6#include "CoreMinimal.h"
8#include "UObject/Object.h"
9#include "ParticleHelper.h"
10#include "ParticleModule.generated.h"
11
12class UDistribution;
19class UParticleSystemComponent;
20struct FCurveEdEntry;
22
29UENUM()
31{
33 EPMT_General UMETA(DisplayName="General"),
35 EPMT_TypeData UMETA(DisplayName="Type Data"),
37 EPMT_Beam UMETA(DisplayName="Beam"),
39 EPMT_Trail UMETA(DisplayName="Trail"),
41 EPMT_Spawn UMETA(DisplayName="Spawn"),
43 EPMT_Required UMETA(DisplayName="Required"),
45 EPMT_Event UMETA(DisplayName="Event"),
47 EPMT_Light UMETA(DisplayName="Light"),
49 EPMT_SubUV UMETA(DisplayName = "SubUV"),
51};
52
57UENUM()
59{
61 EPSSM_Random UMETA(DisplayName="Random"),
63 EPSSM_Sequential UMETA(DisplayName="Sequential"),
65};
66
67USTRUCT()
69{
71
72 UPROPERTY()
73 FString CurveName;
74
75 UPROPERTY()
76 TObjectPtr<class UObject> CurveObject;
77
78
80 : CurveObject(NULL)
81 {
82 }
83
84};
85
86USTRUCT()
88{
90
91
92 UPROPERTY(EditAnywhere, Category=ParticleRandomSeedInfo)
93 FName ParameterName;
94
100 UPROPERTY(EditAnywhere, Category=ParticleRandomSeedInfo)
101 uint8 bGetSeedFromInstance:1;
102
107 UPROPERTY(EditAnywhere, Category=ParticleRandomSeedInfo)
108 uint8 bInstanceSeedIsIndex:1;
109
115 UPROPERTY(EditAnywhere, Category=ParticleRandomSeedInfo)
116 uint8 bResetSeedOnEmitterLooping:1;
117
121 UPROPERTY(EditAnywhere, Category = ParticleRandomSeedInfo)
122 uint8 bRandomlySelectSeedArray:1;
123
128 UPROPERTY(EditAnywhere, Category=ParticleRandomSeedInfo)
129 TArray<int32> RandomSeeds;
130
131
132
134 : bGetSeedFromInstance(false)
135 , bInstanceSeedIsIndex(false)
136 , bResetSeedOnEmitterLooping(true)
137 , bRandomlySelectSeedArray(false)
138 {
139 }
141 {
142 return ((RandomSeeds.Num() > 0) ? sizeof(FParticleRandomSeedInstancePayload) : 0);
143 }
144
145};
146
147UCLASS(editinlinenew, hidecategories=Object, abstract, Within=ParticleSystem, MinimalAPI)
149{
151
152
153 UPROPERTY()
154 uint8 bSpawnModule:1;
155
157 UPROPERTY()
158 uint8 bUpdateModule:1;
159
161 UPROPERTY()
162 uint8 bFinalUpdateModule:1;
163
165 UPROPERTY()
166 uint8 bUpdateForGPUEmitter:1;
167
169 UPROPERTY()
170 uint8 bCurvesAsColor:1;
171
173 UPROPERTY(EditAnywhere, Category=Cascade)
174 uint8 b3DDrawMode:1;
175
177 UPROPERTY()
178 uint8 bSupported3DDrawMode:1;
179
181 UPROPERTY()
182 uint8 bEnabled:1;
183
185 UPROPERTY()
186 uint8 bEditable:1;
187
193 UPROPERTY()
194 uint8 LODDuplicate:1;
195
197 UPROPERTY()
198 uint8 bSupportsRandomSeed:1;
199
201 UPROPERTY()
202 uint8 bRequiresLoopingNotification:1;
203
211 UPROPERTY()
212 uint8 LODValidity;
213
214#if WITH_EDITORONLY_DATA
218 UPROPERTY(EditAnywhere, Category=Cascade)
220
221#endif // WITH_EDITORONLY_DATA
222
223 //~ Begin UObject Interface
224 ENGINE_API virtual bool IsPostLoadThreadSafe() const override;
225#if WITH_EDITOR
226 ENGINE_API virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
227#endif // WITH_EDITOR
228 //~ End UObject Interface
229
234 ENGINE_API virtual void CompileModule( struct FParticleEmitterBuildInfo& EmitterInfo );
235
236 struct FContext
237 {
239 const FTransform& GetTransform() const;
240 UObject* GetDistributionData() const;
241 FString GetTemplateName() const;
242 FString GetInstanceName() const;
243 FContext(FParticleEmitterInstance& Ow) : Owner(Ow) {}
244 };
245
253 struct FSpawnContext : FContext
254 {
256 float SpawnTime;
257 FBaseParticle* ParticleBase;
258 FSpawnContext(FParticleEmitterInstance& Ow, int32 Of, float St, FBaseParticle* Pb) : FContext(Ow), Offset(Of), SpawnTime(St), ParticleBase(Pb) {}
259 };
260 ENGINE_API virtual void Spawn(const FSpawnContext& Context);
261
269 struct FUpdateContext : FContext
270 {
272 float DeltaTime;
273 FUpdateContext(FParticleEmitterInstance& Ow, int32 Of, float Dt) : FContext(Ow), Offset(Of), DeltaTime(Dt) {}
274 };
275 ENGINE_API virtual void Update(const FUpdateContext& Context);
284 ENGINE_API virtual void FinalUpdate(const FUpdateContext& Context);
285
299 ENGINE_API virtual uint32 RequiredBytesPerInstance();
300
307 ENGINE_API virtual uint32 PrepPerInstanceBlock(FParticleEmitterInstance* Owner, void* InstData);
308
309 // For Cascade
316 ENGINE_API virtual void SetToSensibleDefaults(UParticleEmitter* Owner);
317
323 ENGINE_API virtual void GetCurveObjects(TArray<FParticleCurvePair>& OutCurves);
338 ENGINE_API void RemoveModuleCurvesFromEditor(UInterpCurveEdSetup* EdSetup);
344 ENGINE_API bool ModuleHasCurves();
352 ENGINE_API bool IsDisplayedInCurveEd(UInterpCurveEdSetup* EdSetup);
359 ENGINE_API void ChangeEditorColor(FColor& Color, UInterpCurveEdSetup* EdSetup);
360
368 struct FPreviewContext : FContext
369 {
370 const FSceneView* View;
372 FPreviewContext(FParticleEmitterInstance& Ow, const FSceneView* Vi, FPrimitiveDrawInterface* Pd) : FContext(Ow), View(Vi), PDI(Pd) {}
373 };
374 virtual void Render3DPreview(const FPreviewContext& Context) {}
375
381 virtual EModuleType GetModuleType() const { return EPMT_General; }
382
389 ENGINE_API virtual void AutoPopulateInstanceProperties(UParticleSystemComponent* PSysComp);
390
402 ENGINE_API virtual bool GenerateLODModuleValues(UParticleModule* SourceModule, float Percentage, UParticleLODLevel* LODLevel);
403
413 ENGINE_API virtual bool ConvertFloatDistribution(UDistributionFloat* FloatDist, UDistributionFloat* SourceFloatDist, float Percentage);
423 ENGINE_API virtual bool ConvertVectorDistribution(UDistributionVector* VectorDist, UDistributionVector* SourceVectorDist, float Percentage);
430 virtual bool IsSizeMultiplyLife() { return false; };
431
437 bool SupportsRandomSeed() const
438 {
439 return bSupportsRandomSeed;
440 }
441
447 bool RequiresLoopingNotification() const
448 {
449 return bRequiresLoopingNotification;
450 }
451
457 virtual void EmitterLoopingNotify(FParticleEmitterInstance* Owner)
458 {
459 }
460
473
485 virtual bool WillGeneratedModuleBeIdentical(UParticleLODLevel* SourceLODLevel, UParticleLODLevel* DestLODLevel, float Percentage)
486 {
487 // The assumption is that at 100%, ANY module will be identical...
488 // (Although this is virtual to allow over-riding that assumption on a case-by-case basis!)
489
490 if (Percentage != 100.0f)
491 {
492 return LODDuplicate;
493 }
494
495 return true;
496 }
497
505 ENGINE_API virtual bool IsUsedInLODLevel(int32 SourceLODIndex) const;
506
512 ENGINE_API virtual void GetParticleSysParamsUtilized(TArray<FString>& ParticleSysParamList);
513
519 ENGINE_API virtual void GetParticleParametersUtilized(TArray<FString>& ParticleParameterList);
520
524 virtual void RefreshModule(UInterpCurveEdSetup* EdSetup, UParticleEmitter* InEmitter, int32 InLODLevel) {}
525
530 virtual bool TouchesMeshRotation() const { return false; }
531
542
548 virtual FParticleRandomSeedInfo* GetRandomSeedInfo()
549 {
550 return NULL;
551 }
552
561 ENGINE_API virtual bool SetRandomSeedEntry(int32 InIndex, int32 InRandomSeed);
562
564 virtual bool CanTickInAnyThread()
565 {
566 return true;
567 }
568
570 ENGINE_API bool IsUsedInGPUEmitter()const;
571
579 ENGINE_API FRandomStream& GetRandomStream(const FContext& Context);
580
581#if WITH_EDITOR
582 ENGINE_API virtual void PostLoadSubobjects( FObjectInstancingGraph* OuterInstanceGraph ) override;
583
592 virtual int32 GetNumberOfCustomMenuOptions() const { return 0; }
593
602 virtual bool GetCustomMenuEntryDisplayString(int32 InEntryIndex, FString& OutDisplayString) const { return false; }
603
611 virtual bool PerformCustomMenuEntry(int32 InEntryIndex) { return false; }
612
614 virtual bool IsValidForLODLevel(UParticleLODLevel* LODLevel, FString& OutErrorString)
615 {
616 return true;
617 }
618
623
630 static ENGINE_API bool IsDistributionAllowedOnGPU(const UDistribution* Distribution);
631
639 static ENGINE_API FText GetDistributionNotAllowedOnGPUText(const FString& ModuleName, const FString& PropertyName);
640
645#endif
646};
647
648
649
#define NULL
Definition oodle2base.h:134
virtual bool IsPostLoadThreadSafe() const override
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
return true
Definition ExternalRpcRegistry.cpp:601
#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
EModuleType
Definition ParticleModule.h:31
@ EPMT_MAX
Definition ParticleModule.h:50
EParticleSourceSelectionMethod
Definition ParticleModule.h:59
@ UMETA
Definition ParticleModule.h:33
@ EPSSM_MAX
Definition ParticleModule.h:64
@ Percentage
uint32 Offset
Definition VulkanMemory.cpp:4033
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
Definition PrimitiveDrawInterface.h:19
Definition SceneView.h:1425
Definition Text.h:385
Definition Array.h:670
Definition DistributionFloat.h:103
Definition DistributionVector.h:148
Definition Distribution.h:66
Definition InterpCurveEdSetup.h:105
Definition Object.h:95
Definition ParticleEmitter.h:98
Definition ParticleLODLevel.h:22
Definition ParticleModuleTypeDataBase.h:18
Definition ParticleModule.h:149
@ false
Definition radaudio_common.h:23
Definition ParticleHelper.h:181
Definition Color.h:486
Definition InterpCurveEdSetup.h:15
Definition Class.h:4941
Definition ParticleModule.h:69
Definition ParticleEmitterInstances.h:78
Definition ParticleEmitterInstances.h:226
uint8 bEnabled
Definition ParticleEmitterInstances.h:265
Definition ParticleModule.h:88
int32 GetInstancePayloadSize() const
Definition ParticleModule.h:140
Definition ParticleHelper.h:1036
Definition UnrealType.h:6865
Definition RandomStream.h:20
Definition ObjectPtr.h:488