/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/EnginePlugins/ParticlePlugin/System/ParticleSystemInstance.h
113 строк
4 KB
C-Core
Particle fixes and improvements (#1931)
05 май 2026, 13:36
Не верифицирован
05 май 2026, 13:36
3e4c257
Код
Авторство
О чём код?
#pragma once #include <Foundation/DataProcessing/Stream/ProcessingStream.h> #include <Foundation/DataProcessing/Stream/ProcessingStreamGroup.h> #include <Foundation/Math/BoundingBoxSphere.h> #include <Foundation/Math/Random.h> #include <ParticlePlugin/Declarations.h> #include <ParticlePlugin/Events/ParticleEvent.h> #include <ParticlePlugin/ParticlePluginDLL.h> struct ezMsgExtractRenderData; /// \brief A particle system stores all data for one 'layer' of a running particle effect class EZ_PARTICLEPLUGIN_DLL ezParticleSystemInstance { public: ezParticleSystemInstance(); void Construct(ezUInt32 uiMaxParticles, ezWorld* pWorld, ezParticleEffectInstance* pOwnerEffect, float fSpawnCountMultiplier); void Destruct(); bool IsVisible() const { return m_bVisible; } void SetEmitterEnabled(bool bEnable) { m_bEmitterEnabled = bEnable; } bool GetEmitterEnabled() const { return m_bEmitterEnabled; } bool HasActiveParticles() const; void ConfigureFromTemplate(const ezParticleSystemDescriptor* pTemplate); void Finalize(); void ReinitializeStreamProcessors(const ezParticleSystemDescriptor* pTemplate); void CreateStreamProcessors(const ezParticleSystemDescriptor* pTemplate); void SetupOptionalStreams(); void SetTransform(const ezTransform& transform, const ezVec3& vParticleStartVelocity); const ezTransform& GetTransform() const { return m_Transform; } const ezVec3& GetParticleStartVelocity() const { return m_vParticleStartVelocity; } ezParticleSystemState::Enum Update(const ezTime& diff); ezWorld* GetWorld() const { return m_pWorld; } ezUInt64 GetMaxParticles() const { return m_StreamGroup.GetNumElements(); } ezUInt64 GetNumActiveParticles() const { return m_StreamGroup.GetNumActiveElements(); } /// \brief Returns the desired stream, if it already exists, nullptr otherwise. ezProcessingStream* QueryStream(ezTempHashedString sName, ezProcessingStream::DataType type) const; /// \brief Returns the desired stream, if it already exists, creates it otherwise. void CreateStream(ezStringView sName, ezProcessingStream::DataType type, ezProcessingStream** pStream, ezParticleStreamBinding& ref_binding, bool bExpectInitializedValue); void ProcessEventQueue(ezParticleEventQueue queue); ezParticleEffectInstance* GetOwnerEffect() const { return m_pOwnerEffect; } ezParticleWorldModule* GetOwnerWorldModule() const; void ExtractSystemRenderData(ezMsgExtractRenderData& ref_msg, const ezTransform& instanceTransform) const; using ParticleDeathHandler = ezEvent<const ezStreamGroupElementRemovedEvent&>::Handler; void AddParticleDeathEventHandler(ParticleDeathHandler handler); void RemoveParticleDeathEventHandler(ParticleDeathHandler handler); void SetBoundingVolume(const ezBoundingBoxSphere& volume, float fMaxParticleSize); const ezBoundingBoxSphere& GetBoundingVolume() const { return m_BoundingVolume; } bool IsContinuous() const; float GetSpawnCountMultiplier() const { return m_fSpawnCountMultiplier; } private: bool IsEmitterConfigEqual(const ezParticleSystemDescriptor* pTemplate) const; bool IsInitializerConfigEqual(const ezParticleSystemDescriptor* pTemplate) const; bool IsBehaviorConfigEqual(const ezParticleSystemDescriptor* pTemplate) const; bool IsTypeConfigEqual(const ezParticleSystemDescriptor* pTemplate) const; bool IsFinalizerConfigEqual(const ezParticleSystemDescriptor* pTemplate) const; void CreateStreamZeroInitializers(); ezSmallArray<ezParticleEmitter*, 2> m_Emitters; ezSmallArray<ezParticleInitializer*, 6> m_Initializers; ezSmallArray<ezParticleBehavior*, 6> m_Behaviors; ezSmallArray<ezParticleFinalizer*, 2> m_Finalizers; ezSmallArray<ezParticleType*, 2> m_Types; bool m_bVisible; // typically used in editor to hide a system bool m_bEmitterEnabled; ezParticleEffectInstance* m_pOwnerEffect; ezWorld* m_pWorld; ezTransform m_Transform; ezVec3 m_vParticleStartVelocity; float m_fSpawnCountMultiplier = 1.0f; ezProcessingStreamGroup m_StreamGroup; struct StreamInfo { ezHashedString m_sName; bool m_bGetsInitialized = false; bool m_bInUse = false; ezProcessingStreamProcessor* m_pDefaultInitializer = nullptr; }; ezSmallArray<StreamInfo, 16> m_StreamInfo; // culling data ezBoundingBoxSphere m_BoundingVolume; };