Fixed CParticle::CheckChannel "errors"

Not really errors, but I fixed them anyway
master
krzys-h 2016-05-28 00:26:56 +02:00
parent 5ab99429d4
commit 99a831a03b
4 changed files with 42 additions and 39 deletions

View File

@ -581,7 +581,7 @@ int CParticle::CreateTrack(Math::Vector pos, Math::Vector speed, Math::Point dim
if (!m_track[i].used) // free? if (!m_track[i].used) // free?
{ {
int rank = channel; int rank = channel;
if (!CheckChannel(rank)) return -1; GetRankFromChannel(rank);
m_particle[rank].trackRank = i; m_particle[rank].trackRank = i;
m_track[i].used = true; m_track[i].used = true;
@ -636,27 +636,26 @@ void CParticle::CreateWheelTrace(const Math::Vector &p1, const Math::Vector &p2,
/** Adapts the channel so it can be used as an offset in m_particle */ void CParticle::GetRankFromChannel(int &channel)
bool CParticle::CheckChannel(int &channel)
{ {
int uniqueStamp = (channel>>16)&0xffff; int uniqueStamp = (channel>>16)&0xffff;
channel &= 0xffff; channel &= 0xffff;
if (channel < 0) return false; assert(channel >= 0 && channel < MAXPARTICULE*MAXPARTITYPE);
if (channel >= MAXPARTICULE*MAXPARTITYPE) return false;
if (!m_particle[channel].used) if (!m_particle[channel].used) assert(!!"Tried to access invalid particle channel (used=false) !\n");
{ if (m_particle[channel].uniqueStamp != uniqueStamp) assert(!!"Tried to access invalid particle channel (uniqueStamp changed) !\n");
GetLogger()->Error("CParticle::CheckChannel used=false !\n");
return false;
} }
if (m_particle[channel].uniqueStamp != uniqueStamp) bool CParticle::ParticleExists(int channel)
{ {
GetLogger()->Error("CParticle::CheckChannel uniqueStamp !\n"); int uniqueStamp = (channel>>16)&0xffff;
return false; channel &= 0xffff;
}
assert(channel >= 0 && channel < MAXPARTICULE*MAXPARTITYPE);
if (!m_particle[channel].used) return false;
if (m_particle[channel].uniqueStamp != uniqueStamp) return false;
return true; return true;
} }
@ -685,7 +684,7 @@ void CParticle::DeleteParticle(ParticleType type)
void CParticle::DeleteParticle(int channel) void CParticle::DeleteParticle(int channel)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
if (m_totalInterface[channel/MAXPARTICULE][m_particle[channel].sheet] > 0 ) if (m_totalInterface[channel/MAXPARTICULE][m_particle[channel].sheet] > 0 )
m_totalInterface[channel/MAXPARTICULE][m_particle[channel].sheet]--; m_totalInterface[channel/MAXPARTICULE][m_particle[channel].sheet]--;
@ -699,50 +698,50 @@ void CParticle::DeleteParticle(int channel)
void CParticle::SetObjectLink(int channel, CObject *object) void CParticle::SetObjectLink(int channel, CObject *object)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].objLink = object; m_particle[channel].objLink = object;
} }
void CParticle::SetObjectFather(int channel, CObject *object) void CParticle::SetObjectFather(int channel, CObject *object)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].objFather = object; m_particle[channel].objFather = object;
} }
void CParticle::SetPosition(int channel, Math::Vector pos) void CParticle::SetPosition(int channel, Math::Vector pos)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].pos = pos; m_particle[channel].pos = pos;
} }
void CParticle::SetDimension(int channel, Math::Point dim) void CParticle::SetDimension(int channel, Math::Point dim)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].dim = dim; m_particle[channel].dim = dim;
} }
void CParticle::SetZoom(int channel, float zoom) void CParticle::SetZoom(int channel, float zoom)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].zoom = zoom; m_particle[channel].zoom = zoom;
} }
void CParticle::SetAngle(int channel, float angle) void CParticle::SetAngle(int channel, float angle)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].angle = angle; m_particle[channel].angle = angle;
} }
void CParticle::SetIntensity(int channel, float intensity) void CParticle::SetIntensity(int channel, float intensity)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].intensity = intensity; m_particle[channel].intensity = intensity;
} }
void CParticle::SetParam(int channel, Math::Vector pos, Math::Point dim, float zoom, void CParticle::SetParam(int channel, Math::Vector pos, Math::Point dim, float zoom,
float angle, float intensity) float angle, float intensity)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].pos = pos; m_particle[channel].pos = pos;
m_particle[channel].dim = dim; m_particle[channel].dim = dim;
m_particle[channel].zoom = zoom; m_particle[channel].zoom = zoom;
@ -752,17 +751,16 @@ void CParticle::SetParam(int channel, Math::Vector pos, Math::Point dim, float z
void CParticle::SetPhase(int channel, ParticlePhase phase, float duration) void CParticle::SetPhase(int channel, ParticlePhase phase, float duration)
{ {
if (!CheckChannel(channel)) return; GetRankFromChannel(channel);
m_particle[channel].phase = phase; m_particle[channel].phase = phase;
m_particle[channel].duration = duration; m_particle[channel].duration = duration;
m_particle[channel].phaseTime = m_particle[channel].time; m_particle[channel].phaseTime = m_particle[channel].time;
} }
bool CParticle::GetPosition(int channel, Math::Vector &pos) Math::Vector CParticle::GetPosition(int channel)
{ {
if (!CheckChannel(channel)) return false; GetRankFromChannel(channel);
pos = m_particle[channel].pos; return m_particle[channel].pos;
return true;
} }
void CParticle::SetFrameUpdate(int sheet, bool update) void CParticle::SetFrameUpdate(int sheet, bool update)

View File

@ -162,9 +162,9 @@ enum ParticlePhase
struct Particle struct Particle
{ {
bool used = false; // TRUE -> particle used bool used = false; //!< true if this channel is used, false if not
bool ray = false; // TRUE -> ray with goal bool ray = false; // TRUE -> ray with goal
unsigned short uniqueStamp = 0; // unique mark unsigned short uniqueStamp = 0; //!< unique marker added to particle channel ID to make sure this is still the same particle
short sheet = 0; // sheet (0..n) short sheet = 0; // sheet (0..n)
ParticleType type = {}; // type PARTI* ParticleType type = {}; // type PARTI*
ParticlePhase phase = {}; // phase PARPH* ParticlePhase phase = {}; // phase PARPH*
@ -279,7 +279,7 @@ public:
void SetPhase(int channel, ParticlePhase phase, float duration); void SetPhase(int channel, ParticlePhase phase, float duration);
//! Returns the position of the particle //! Returns the position of the particle
bool GetPosition(int channel, Math::Vector &pos); Math::Vector GetPosition(int channel);
//! Returns the color if you're in the fog or black if you're not //! Returns the color if you're in the fog or black if you're not
Color GetFogColor(Math::Vector pos); Color GetFogColor(Math::Vector pos);
@ -291,11 +291,14 @@ public:
//! Draws all the particles //! Draws all the particles
void DrawParticle(int sheet); void DrawParticle(int sheet);
//! Checks if given particle channel still exists
bool ParticleExists(int channel);
protected: protected:
//! Removes a particle of given rank //! Removes a particle of given rank
void DeleteRank(int rank); void DeleteRank(int rank);
//! Check a channel number //! Adapts the channel so it can be used as an offset in m_particle
bool CheckChannel(int &channel); void GetRankFromChannel(int &channel);
//! Draws a triangular particle //! Draws a triangular particle
void DrawParticleTriangle(int i); void DrawParticleTriangle(int i);
//! Draw a normal particle //! Draw a normal particle

View File

@ -2187,15 +2187,17 @@ void COldObject::PartiFrame(float rTime)
channel = m_objectPart[i].masterParti; channel = m_objectPart[i].masterParti;
if ( channel == -1 ) continue; if ( channel == -1 ) continue;
if ( !m_particle->GetPosition(channel, pos) ) if ( !m_particle->ParticleExists(channel) )
{ {
m_objectPart[i].masterParti = -1; // particle no longer exists! m_objectPart[i].masterParti = -1; // particle no longer exists!
continue; continue;
} }
pos = m_particle->GetPosition(channel);
SetPartPosition(i, pos); SetPartPosition(i, pos);
// Each song spins differently. // Each part rotates differently
switch( i%5 ) switch( i%5 )
{ {
case 0: factor = Math::Vector( 0.5f, 0.3f, 0.6f); break; case 0: factor = Math::Vector( 0.5f, 0.3f, 0.6f); break;

View File

@ -55,9 +55,9 @@ const int OBJECTMAXPART = 40;
struct ObjectPart struct ObjectPart
{ {
bool bUsed = false; bool bUsed = false;
int object = -1; // number of the object in CEngine int object = -1; //!< identifier of the object in Gfx::CEngine
int parentPart = -1; // number of father part int parentPart = -1; //!< identifier of parent part
int masterParti = -1; // master canal of the particle int masterParti = -1; //!< particle channel this part is connected to after explosion
Math::Vector position; Math::Vector position;
Math::Vector angle; Math::Vector angle;
Math::Vector zoom; Math::Vector zoom;