Plasma Engine  2.0
Loading...
Searching...
No Matches
ParticleWorldModule.h
1#pragma once
2
3#include <Core/ResourceManager/ResourceHandle.h>
4#include <Core/World/WorldModule.h>
5#include <Foundation/Containers/IdTable.h>
6#include <ParticlePlugin/Effect/ParticleEffectInstance.h>
7#include <ParticlePlugin/Events/ParticleEvent.h>
8#include <ParticlePlugin/ParticlePluginDLL.h>
9
12struct plResourceEvent;
13class plTaskGroupID;
16
23class PL_PARTICLEPLUGIN_DLL plParticleWorldModule final : public plWorldModule
24{
25 PL_DECLARE_WORLD_MODULE();
26 PL_ADD_DYNAMIC_REFLECTION(plParticleWorldModule, plWorldModule);
27
28public:
31
32 virtual void Initialize() override;
33 virtual void Deinitialize() override;
34
35 plParticleEffectHandle CreateEffectInstance(const plParticleEffectResourceHandle& hResource, plUInt64 uiRandomSeed, const char* szSharedName /*= nullptr*/, const void*& inout_pSharedInstanceOwner, plArrayPtr<plParticleEffectFloatParam> floatParams, plArrayPtr<plParticleEffectColorParam> colorParams);
36
38 void DestroyEffectInstance(const plParticleEffectHandle& hEffect, bool bInterruptImmediately, const void* pSharedInstanceOwner);
39
40 bool TryGetEffectInstance(const plParticleEffectHandle& hEffect, plParticleEffectInstance*& out_pEffect);
41 bool TryGetEffectInstance(const plParticleEffectHandle& hEffect, const plParticleEffectInstance*& out_pEffect) const;
42
44 void ExtractEffectRenderData(const plParticleEffectInstance* pEffect, plMsgExtractRenderData& ref_msg, const plTransform& systemTransform) const;
45
46 plParticleSystemInstance* CreateSystemInstance(plUInt32 uiMaxParticles, plWorld* pWorld, plParticleEffectInstance* pOwnerEffect, float fSpawnMultiplier);
47 void DestroySystemInstance(plParticleSystemInstance* pInstance);
48
49 plParticleStream* CreateStreamDefaultInitializer(plParticleSystemInstance* pOwner, const char* szFullStreamName) const;
50
53 plWorldModule* GetCachedWorldModule(const plRTTI* pRtti) const;
54
56 template <class T>
58 {
59 CacheWorldModule(plGetStaticRTTI<T>());
60 }
61
63 void CacheWorldModule(const plRTTI* pRtti);
64
65private:
66 virtual void WorldClear() override;
67
68 void UpdateEffects(const plWorldModule::UpdateContext& context);
69 void EnsureUpdatesFinished(const plWorldModule::UpdateContext& context);
70
71 void DestroyFinishedEffects();
72 void CreateFinisherComponent(plParticleEffectInstance* pEffect);
73 void ResourceEventHandler(const plResourceEvent& e);
74 void ReconfigureEffects();
75 plParticleEffectHandle InternalCreateSharedEffectInstance(const char* szSharedName, const plParticleEffectResourceHandle& hResource, plUInt64 uiRandomSeed, const void* pSharedInstanceOwner);
76 plParticleEffectHandle InternalCreateEffectInstance(const plParticleEffectResourceHandle& hResource, plUInt64 uiRandomSeed, bool bIsShared, plArrayPtr<plParticleEffectFloatParam> floatParams, plArrayPtr<plParticleEffectColorParam> colorParams);
77
78 void ConfigureParticleStreamFactories();
79 void ClearParticleStreamFactories();
80
81 mutable plMutex m_Mutex;
82 plDeque<plParticleEffectInstance> m_ParticleEffects;
84 plDynamicArray<plParticleEffectInstance*> m_NeedFinisherComponent;
85 plDynamicArray<plParticleEffectInstance*> m_EffectsToReconfigure;
86 plDynamicArray<plParticleEffectInstance*> m_ParticleEffectsFreeList;
89 plDeque<plParticleSystemInstance> m_ParticleSystems;
90 plDynamicArray<plParticleSystemInstance*> m_ParticleSystemFreeList;
91 plTaskGroupID m_EffectUpdateTaskGroup;
94};
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
Definition Deque.h:270
Definition DynamicArray.h:81
Definition HashTable.h:333
Definition IdTable.h:171
Definition Map.h:408
Provides a simple mechanism for mutual exclusion to prevent multiple threads from accessing a shared ...
Definition Mutex.h:13
A handle to a particle effect.
Definition Declarations.h:39
Definition ParticleEffectInstance.h:25
Base class for all particle stream factories.
Definition ParticleStream.h:14
Base class for all particle streams.
Definition ParticleStream.h:36
A particle system stores all data for one 'layer' of a running particle effect.
Definition ParticleSystemInstance.h:15
This world module stores all particle effect data that is active in a given plWorld instance.
Definition ParticleWorldModule.h:24
void CacheWorldModule()
Should be called by plParticleModule::RequestRequiredWorldModulesForCache() to cache a pointer to a w...
Definition ParticleWorldModule.h:57
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
Given out by plTaskSystem::CreateTaskGroup to identify a task group.
Definition TaskSystemDeclarations.h:103
A world encapsulates a scene graph of game objects and various component managers and their component...
Definition World.h:22
Definition WorldModule.h:10
virtual void Initialize()
This method is called after the constructor. A derived type can override this method to do initializa...
Definition WorldModule.h:98
virtual void Deinitialize()
This method is called before the destructor. A derived type can override this method to do deinitiali...
Definition WorldModule.h:101
virtual void WorldClear()
Called by plWorld::Clear(). Can be used to clear cached data when a world is completely cleared of ob...
Definition WorldModule.h:108
Definition RenderData.h:116
These events may be sent by a specific plResource or by the plResourceManager.
Definition Declarations.h:22
Definition WorldModule.h:33