Fix crash regression from #3588 when editing active particle emitters

This commit is contained in:
Wojtek Figat
2025-09-04 22:05:31 +02:00
parent 3b19e1b40c
commit c5d06b2c8b
2 changed files with 28 additions and 7 deletions

View File

@@ -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<ParticleEffect, &ParticleEffect::OnParticleEmitterLoaded>(this);
}
OnParticleEmittersClear();
_cachedEmitters = ParticleSystem.Get()->Emitters;
for (auto& emitter : _cachedEmitters)
emitter.Loaded.Bind<ParticleEffect, &ParticleEffect::OnParticleEmitterLoaded>(this);
#endif
}
#if USE_EDITOR
void ParticleEffect::OnParticleEmittersClear()
{
for (auto& emitter : _cachedEmitters)
emitter.Loaded.Unbind<ParticleEffect, &ParticleEffect::OnParticleEmitterLoaded>(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();

View File

@@ -170,6 +170,9 @@ private:
Array<ParameterOverride> _parametersOverrides; // Cached parameter modifications to be applied to the parameters
bool _isPlaying = false;
bool _isStopped = false;
#if USE_EDITOR
Array<AssetReference<ParticleEmitter>> _cachedEmitters;
#endif
public:
/// <summary>
@@ -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;