From 3472ec661307afd686e3ba700e876d78b19c262a Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 27 Sep 2016 18:32:21 +0200 Subject: [PATCH] Revert CParticle::CheckChannel changes I misinterpreted this as being a bug, while actually it seems to be an explicit CParticle design choice (maybe not the best one, but whatever). We DO need better docs for some old code like this :/ Fixes #806 This reverts commit 99a831a03be068dd0c40ee3a7ca162cdcfb5e85d. --- src/graphics/engine/particle.cpp | 56 +++++++++++++++++--------------- src/graphics/engine/particle.h | 13 +++----- src/object/old_object.cpp | 6 ++-- src/object/old_object.h | 6 ++-- 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/src/graphics/engine/particle.cpp b/src/graphics/engine/particle.cpp index 5f8b1601..5aaf45fa 100644 --- a/src/graphics/engine/particle.cpp +++ b/src/graphics/engine/particle.cpp @@ -581,7 +581,7 @@ int CParticle::CreateTrack(Math::Vector pos, Math::Vector speed, Math::Point dim if (!m_track[i].used) // free? { int rank = channel; - GetRankFromChannel(rank); + if (!CheckChannel(rank)) return -1; m_particle[rank].trackRank = i; m_track[i].used = true; @@ -636,27 +636,28 @@ void CParticle::CreateWheelTrace(const Math::Vector &p1, const Math::Vector &p2, -void CParticle::GetRankFromChannel(int &channel) +/** Adapts the channel so it can be used as an offset in m_particle */ +bool CParticle::CheckChannel(int &channel) { int uniqueStamp = (channel>>16)&0xffff; channel &= 0xffff; - if (channel < 0 || channel >= MAXPARTICULE*MAXPARTITYPE) throw std::runtime_error("Tried to access invalid particle channel (invalid ID)"); - if (!m_particle[channel].used) throw std::runtime_error("Tried to access invalid particle channel (used=false)"); - if (m_particle[channel].uniqueStamp != uniqueStamp) throw std::runtime_error("Tried to access invalid particle channel (uniqueStamp changed)"); -} + if (channel < 0) return false; + if (channel >= MAXPARTICULE*MAXPARTITYPE) return false; -bool CParticle::ParticleExists(int channel) -{ - try - { - GetRankFromChannel(channel); - return true; - } - catch (const std::runtime_error& e) + if (!m_particle[channel].used) { + GetLogger()->Trace("Particle %d:%d doesn't exist anymore (used=false)\n", channel, uniqueStamp); return false; } + + if (m_particle[channel].uniqueStamp != uniqueStamp) + { + GetLogger()->Trace("Particle %d:%d doesn't exist anymore (uniqueStamp changed)\n", channel, uniqueStamp); + return false; + } + + return true; } void CParticle::DeleteRank(int rank) @@ -684,7 +685,7 @@ void CParticle::DeleteParticle(ParticleType type) void CParticle::DeleteParticle(int channel) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; if (m_totalInterface[channel/MAXPARTICULE][m_particle[channel].sheet] > 0 ) m_totalInterface[channel/MAXPARTICULE][m_particle[channel].sheet]--; @@ -698,50 +699,50 @@ void CParticle::DeleteParticle(int channel) void CParticle::SetObjectLink(int channel, CObject *object) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].objLink = object; } void CParticle::SetObjectFather(int channel, CObject *object) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].objFather = object; } void CParticle::SetPosition(int channel, Math::Vector pos) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].pos = pos; } void CParticle::SetDimension(int channel, Math::Point dim) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].dim = dim; } void CParticle::SetZoom(int channel, float zoom) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].zoom = zoom; } void CParticle::SetAngle(int channel, float angle) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].angle = angle; } void CParticle::SetIntensity(int channel, float intensity) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].intensity = intensity; } void CParticle::SetParam(int channel, Math::Vector pos, Math::Point dim, float zoom, float angle, float intensity) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].pos = pos; m_particle[channel].dim = dim; m_particle[channel].zoom = zoom; @@ -751,16 +752,17 @@ void CParticle::SetParam(int channel, Math::Vector pos, Math::Point dim, float z void CParticle::SetPhase(int channel, ParticlePhase phase, float duration) { - GetRankFromChannel(channel); + if (!CheckChannel(channel)) return; m_particle[channel].phase = phase; m_particle[channel].duration = duration; m_particle[channel].phaseTime = m_particle[channel].time; } -Math::Vector CParticle::GetPosition(int channel) +bool CParticle::GetPosition(int channel, Math::Vector &pos) { - GetRankFromChannel(channel); - return m_particle[channel].pos; + if (!CheckChannel(channel)) return false; + pos = m_particle[channel].pos; + return true; } void CParticle::SetFrameUpdate(int sheet, bool update) diff --git a/src/graphics/engine/particle.h b/src/graphics/engine/particle.h index ec8d8820..03707a9c 100644 --- a/src/graphics/engine/particle.h +++ b/src/graphics/engine/particle.h @@ -162,9 +162,9 @@ enum ParticlePhase struct Particle { - bool used = false; //!< true if this channel is used, false if not + bool used = false; // TRUE -> particle used bool ray = false; // TRUE -> ray with goal - unsigned short uniqueStamp = 0; //!< unique marker added to particle channel ID to make sure this is still the same particle + unsigned short uniqueStamp = 0; // unique mark short sheet = 0; // sheet (0..n) ParticleType type = {}; // type PARTI* ParticlePhase phase = {}; // phase PARPH* @@ -279,7 +279,7 @@ public: void SetPhase(int channel, ParticlePhase phase, float duration); //! Returns the position of the particle - Math::Vector GetPosition(int channel); + bool GetPosition(int channel, Math::Vector &pos); //! Returns the color if you're in the fog or black if you're not Color GetFogColor(Math::Vector pos); @@ -291,18 +291,15 @@ public: //! Draws all the particles void DrawParticle(int sheet); - //! Checks if given particle channel still exists - bool ParticleExists(int channel); - protected: //! Removes a particle of given rank void DeleteRank(int rank); /** * \brief Adapts the channel so it can be used as an offset in m_particle * \param channel Channel number to process, will be modified to be index of particle in m_particle - * \throw std::runtime_error if this particle does not exist any more + * \return true if success, false if particle doesn't exist anymore **/ - void GetRankFromChannel(int &channel); + bool CheckChannel(int &channel); //! Draws a triangular particle void DrawParticleTriangle(int i); //! Draw a normal particle diff --git a/src/object/old_object.cpp b/src/object/old_object.cpp index 32861cca..c8937423 100644 --- a/src/object/old_object.cpp +++ b/src/object/old_object.cpp @@ -2185,17 +2185,15 @@ void COldObject::PartiFrame(float rTime) channel = m_objectPart[i].masterParti; if ( channel == -1 ) continue; - if ( !m_particle->ParticleExists(channel) ) + if ( !m_particle->GetPosition(channel, pos) ) { m_objectPart[i].masterParti = -1; // particle no longer exists! continue; } - pos = m_particle->GetPosition(channel); - SetPartPosition(i, pos); - // Each part rotates differently + // Each song spins differently. switch( i%5 ) { case 0: factor = Math::Vector( 0.5f, 0.3f, 0.6f); break; diff --git a/src/object/old_object.h b/src/object/old_object.h index 60e8e8fa..5b85c286 100644 --- a/src/object/old_object.h +++ b/src/object/old_object.h @@ -55,9 +55,9 @@ const int OBJECTMAXPART = 40; struct ObjectPart { bool bUsed = false; - int object = -1; //!< identifier of the object in Gfx::CEngine - int parentPart = -1; //!< identifier of parent part - int masterParti = -1; //!< particle channel this part is connected to after explosion + int object = -1; // number of the object in CEngine + int parentPart = -1; // number of father part + int masterParti = -1; // master canal of the particle Math::Vector position; Math::Vector angle; Math::Vector zoom;