diff --git a/Source/Engine/Particles/ParticleEffect.cpp b/Source/Engine/Particles/ParticleEffect.cpp index f30f6a495..6e94594b0 100644 --- a/Source/Engine/Particles/ParticleEffect.cpp +++ b/Source/Engine/Particles/ParticleEffect.cpp @@ -543,6 +543,9 @@ void ParticleEffect::ApplyModifiedParameters() void ParticleEffect::OnAssetChanged(Asset* asset, void* caller) { +#if USE_EDITOR + OnParticleEmittersClear(); +#endif Instance.ClearState(); _parameters.Resize(0); _parametersVersion = 0; @@ -553,19 +556,30 @@ void ParticleEffect::OnAssetLoaded(Asset* asset, void* caller) ApplyModifiedParameters(); #if USE_EDITOR // When one of the emitters gets edited, cached parameters need to be applied - auto& emitters = ParticleSystem.Get()->Emitters; - for (auto& emitter : emitters) - { - emitter.Loaded.BindUnique(this); - } + OnParticleEmittersClear(); + _cachedEmitters = ParticleSystem.Get()->Emitters; + for (auto& emitter : _cachedEmitters) + emitter.Loaded.Bind(this); + #endif } +#if USE_EDITOR + +void ParticleEffect::OnParticleEmittersClear() +{ + for (auto& emitter : _cachedEmitters) + emitter.Loaded.Unbind(this); + _cachedEmitters.Clear(); +} + void ParticleEffect::OnParticleEmitterLoaded() { ApplyModifiedParameters(); } +#endif + void ParticleEffect::OnAssetUnloaded(Asset* asset, void* caller) { } @@ -807,6 +821,9 @@ void ParticleEffect::Deserialize(DeserializeStream& stream, ISerializeModifier* void ParticleEffect::EndPlay() { +#if USE_EDITOR + OnParticleEmittersClear(); +#endif CacheModifiedParameters(); Particles::OnEffectDestroy(this); Instance.ClearState(); diff --git a/Source/Engine/Particles/ParticleEffect.h b/Source/Engine/Particles/ParticleEffect.h index c54fa5639..4de88f1d5 100644 --- a/Source/Engine/Particles/ParticleEffect.h +++ b/Source/Engine/Particles/ParticleEffect.h @@ -170,6 +170,9 @@ private: Array _parametersOverrides; // Cached parameter modifications to be applied to the parameters bool _isPlaying = false; bool _isStopped = false; +#if USE_EDITOR + Array> _cachedEmitters; +#endif public: /// @@ -392,9 +395,10 @@ private: #endif void CacheModifiedParameters(); void ApplyModifiedParameters(); - void OnParticleSystemModified(); - void OnParticleSystemLoaded(); +#if USE_EDITOR + void OnParticleEmittersClear(); void OnParticleEmitterLoaded(); +#endif // [IAssetReference] void OnAssetChanged(Asset* asset, void* caller) override;