From 74f11d2fd2be2ea6fea25843531495bf21646cfb Mon Sep 17 00:00:00 2001 From: Vladislav Belov Date: Sun, 28 Jun 2026 14:30:44 +0200 Subject: [PATCH] Adds const to particle emitter type Emitter type must not be changed during any emitter update. --- source/graphics/ParticleEmitterType.cpp | 41 +++++++++++++------------ source/graphics/ParticleEmitterType.h | 6 ++-- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/source/graphics/ParticleEmitterType.cpp b/source/graphics/ParticleEmitterType.cpp index e9e5dfa5ab..1f41083acf 100644 --- a/source/graphics/ParticleEmitterType.cpp +++ b/source/graphics/ParticleEmitterType.cpp @@ -74,16 +74,16 @@ public: * Returns the minimum value that Evaluate might ever return, * for computing bounds. */ - virtual float Min(CParticleEmitterType& type) = 0; + virtual float Min(const CParticleEmitterType& type) = 0; /** * Returns the maximum value that Evaluate might ever return, * for computing bounds. */ - virtual float Max(CParticleEmitterType& type) = 0; + virtual float Max(const CParticleEmitterType& type) = 0; protected: - virtual float Compute(CParticleEmitterType& type, CParticleEmitter& emitter) = 0; + virtual float Compute(const CParticleEmitterType& type, const CParticleEmitter& emitter) = 0; private: float m_LastValue; @@ -100,17 +100,17 @@ public: { } - float Compute(CParticleEmitterType&, CParticleEmitter&) override + float Compute(const CParticleEmitterType&, const CParticleEmitter&) override { return m_Value; } - float Min(CParticleEmitterType&) override + float Min(const CParticleEmitterType&) override { return m_Value; } - float Max(CParticleEmitterType&) override + float Max(const CParticleEmitterType&) override { return m_Value; } @@ -130,17 +130,17 @@ public: { } - float Compute(CParticleEmitterType& type, CParticleEmitter&) override + float Compute(const CParticleEmitterType& type, const CParticleEmitter&) override { return std::uniform_real_distribution(m_Min, m_Max)(type.m_Manager.m_RNG); } - float Min(CParticleEmitterType&) override + float Min(const CParticleEmitterType&) override { return m_Min; } - float Max(CParticleEmitterType&) override + float Max(const CParticleEmitterType&) override { return m_Max; } @@ -162,17 +162,17 @@ public: { } - float Compute(CParticleEmitterType& type, CParticleEmitter&) override + float Compute(const CParticleEmitterType& type, const CParticleEmitter&) override { return type.m_Variables[m_From]->LastValue(); } - float Min(CParticleEmitterType& type) override + float Min(const CParticleEmitterType& type) override { return type.m_Variables[m_From]->Min(type); } - float Max(CParticleEmitterType& type) override + float Max(const CParticleEmitterType& type) override { return type.m_Variables[m_From]->Max(type); } @@ -193,17 +193,20 @@ public: { } - float Compute(CParticleEmitterType&, CParticleEmitter& emitter) override + float Compute(const CParticleEmitterType&, const CParticleEmitter& emitter) override { - return std::min(m_Max, emitter.m_EntityVariables[m_From] * m_Mul); + float value{0.0f}; + if (auto it{emitter.m_EntityVariables.find(m_From)}; it != emitter.m_EntityVariables.end()) + value = it->second; + return std::min(m_Max, value * m_Mul); } - float Min(CParticleEmitterType&) override + float Min(const CParticleEmitterType&) override { return 0.f; } - float Max(CParticleEmitterType&) override + float Max(const CParticleEmitterType&) override { return m_Max; } @@ -550,7 +553,7 @@ bool CParticleEmitterType::LoadXML(const VfsPath& path) return true; } -void CParticleEmitterType::UpdateEmitter(CParticleEmitter& emitter, float dt) +void CParticleEmitterType::UpdateEmitter(CParticleEmitter& emitter, float dt) const { // If dt is very large, we should do the update in multiple small // steps to prevent all the particles getting clumped together at @@ -571,7 +574,7 @@ void CParticleEmitterType::UpdateEmitter(CParticleEmitter& emitter, float dt) UpdateEmitterStep(emitter, dt); } -void CParticleEmitterType::UpdateEmitterStep(CParticleEmitter& emitter, float dt) +void CParticleEmitterType::UpdateEmitterStep(CParticleEmitter& emitter, float dt) const { ENSURE(emitter.m_Type.get() == this); @@ -678,7 +681,7 @@ void CParticleEmitterType::UpdateEmitterStep(CParticleEmitter& emitter, float dt } } -CBoundingBoxAligned CParticleEmitterType::CalculateBounds(CVector3D emitterPos, CBoundingBoxAligned emittedBounds) +CBoundingBoxAligned CParticleEmitterType::CalculateBounds(CVector3D emitterPos, CBoundingBoxAligned emittedBounds) const { CBoundingBoxAligned bounds = m_MaxBounds; bounds[0] += emitterPos; diff --git a/source/graphics/ParticleEmitterType.h b/source/graphics/ParticleEmitterType.h index 668b4eb2ed..d65abf6dea 100644 --- a/source/graphics/ParticleEmitterType.h +++ b/source/graphics/ParticleEmitterType.h @@ -102,15 +102,15 @@ private: /** * Update the state of an emitter's particles, by a potentially long time @p dt. */ - void UpdateEmitter(CParticleEmitter& emitter, float dt); + void UpdateEmitter(CParticleEmitter& emitter, float dt) const; /** * Update the state of an emitter's particles, by a short time @p dt that can * be computed in a single step. */ - void UpdateEmitterStep(CParticleEmitter& emitter, float dt); + void UpdateEmitterStep(CParticleEmitter& emitter, float dt) const; - CBoundingBoxAligned CalculateBounds(CVector3D emitterPos, CBoundingBoxAligned emittedBounds); + CBoundingBoxAligned CalculateBounds(CVector3D emitterPos, CBoundingBoxAligned emittedBounds) const; CTexturePtr m_Texture;