From fea9d6047c30aade4d6b38c0083cb40bea3ef6e2 Mon Sep 17 00:00:00 2001 From: Scott Peter Date: Wed, 17 Jul 2019 11:08:00 +0200 Subject: [PATCH] !B (Wavicle) (CE-21243) Fixed order of emitter refs cleared on level exit. !B (Wavicle) (CE-18869) When editing an effect, adding or enabling a component now updates inactive emitters. !B (Particles) Fixed declarations of particle stats, so Screens stats are again displayed. Copied from Perforce Change: 2002210 --- .../Cry3DEngine/ParticleSystem/ParticleEmitter.cpp | 16 +++++++--------- .../Cry3DEngine/ParticleSystem/ParticleEmitter.h | 1 + .../Cry3DEngine/ParticleSystem/ParticleSystem.cpp | 7 +++++-- Code/CryEngine/CryCommon/CryParticleSystem/IParticles.h | 4 ++-- .../CryCommon/CryParticleSystem/IParticlesPfx2.h | 2 +- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.cpp b/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.cpp index a2db418b1..b75b34b6c 100644 --- a/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.cpp +++ b/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.cpp @@ -166,9 +166,6 @@ void CParticleEmitter::Render(const struct SRendParams& rParam, const SRendering void CParticleEmitter::CheckUpdated() { - if (!m_active) - return; - CRY_PFX2_PROFILE_DETAIL; if (gEnv->IsEditing() && m_effectEditVersion != m_pEffectOriginal->GetEditVersion() + m_emitterEditVersion) @@ -176,10 +173,6 @@ void CParticleEmitter::CheckUpdated() m_attributeInstance.Reset(m_pEffectOriginal->GetAttributeTable()); UpdateRuntimes(); } - if (m_runtimesFor.empty()) - { - UpdateRuntimes(); - } } bool CParticleEmitter::UpdateState() @@ -463,7 +456,10 @@ void CParticleEmitter::Activate(bool activate) m_effectEditVersion = -1; // Force creation of Runtimes next Update if (!isNew) - CheckUpdated(); + { + if (!HasRuntimes()) + UpdateRuntimes(); + } } else { @@ -748,7 +744,7 @@ void CParticleEmitter::UpdateRuntimes() m_reRegister = true; m_effectEditVersion = m_pEffectOriginal->GetEditVersion() + m_emitterEditVersion; - m_alive = true; + m_alive = m_active = true; const STimingParams timings = GetMaxTimings(); m_timeStable = m_timeCreated + timings.m_equilibriumTime; @@ -850,6 +846,8 @@ void CParticleEmitter::Clear() Unregister(); m_runtimes.clear(); m_runtimesFor.clear(); + m_runtimesPreUpdate.clear(); + m_runtimesDeferred.clear(); } bool CParticleEmitter::HasParticles() const diff --git a/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.h b/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.h index 1cc08f55c..1c8c900ba 100644 --- a/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.h +++ b/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleEmitter.h @@ -88,6 +88,7 @@ public: const TRuntimes& GetRuntimesPreUpdate() const { return m_runtimesPreUpdate; } const TRuntimes& GetRuntimesDeferred() const { return m_runtimesDeferred; } CParticleComponentRuntime*GetRuntimeFor(const CParticleComponent* pComponent) { return m_runtimesFor[pComponent->GetComponentId()]; } + bool HasRuntimes() const { return !m_runtimesFor.empty(); } const CParticleEffect* GetCEffect() const { return m_pEffect; } CParticleEffect* GetCEffect() { return m_pEffect; } void Register(); diff --git a/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleSystem.cpp b/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleSystem.cpp index 6845cbef6..f4f3426b9 100644 --- a/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleSystem.cpp +++ b/Code/CryEngine/Cry3DEngine/ParticleSystem/ParticleSystem.cpp @@ -138,7 +138,8 @@ void CParticleSystem::Update() m_emitters.append(m_newEmitters); for (auto& pEmitter : m_newEmitters) { - pEmitter->CheckUpdated(); + if (pEmitter->IsActive() && !pEmitter->HasRuntimes()) + pEmitter->UpdateRuntimes(); if (pEmitter->GetRuntimesPreUpdate().size()) m_emittersPreUpdate.push_back(pEmitter); } @@ -329,6 +330,9 @@ void CParticleSystem::DisplayStats(Vec2& location, float lineHeight) void CParticleSystem::ClearRenderResources() { CRY_PROFILE_FUNCTION(PROFILE_PARTICLE); + + m_emittersPreUpdate.clear(); + #if !defined(_RELEASE) // All external references need to be released before this point to prevent leaks for (const auto& pEmitter : m_emitters) @@ -339,7 +343,6 @@ void CParticleSystem::ClearRenderResources() m_emitters.clear(); m_newEmitters.clear(); - m_emittersPreUpdate.clear(); for (auto it = m_effects.begin(); it != m_effects.end(); ) { diff --git a/Code/CryEngine/CryCommon/CryParticleSystem/IParticles.h b/Code/CryEngine/CryCommon/CryParticleSystem/IParticles.h index 91e3f1a5c..43a5e987c 100644 --- a/Code/CryEngine/CryCommon/CryParticleSystem/IParticles.h +++ b/Code/CryEngine/CryCommon/CryParticleSystem/IParticles.h @@ -613,14 +613,14 @@ struct TContainerCountsBase template struct TContainerCounts - : INumberVector> + : INumberVector> , TContainerCountsBase { }; template struct TParticleCounts - : INumberVector> + : INumberVector> , TContainerCountsBase { TElementCounts emitters; diff --git a/Code/CryEngine/CryCommon/CryParticleSystem/IParticlesPfx2.h b/Code/CryEngine/CryCommon/CryParticleSystem/IParticlesPfx2.h index beae13760..748ad718d 100644 --- a/Code/CryEngine/CryCommon/CryParticleSystem/IParticlesPfx2.h +++ b/Code/CryEngine/CryCommon/CryParticleSystem/IParticlesPfx2.h @@ -18,7 +18,7 @@ typedef Serialization::IArchive IArchive; template struct TParticleStats - : INumberVector> + : INumberVector> { TElementCounts emitters; TElementCounts components; -- 2.11.4.GIT