www.pudn.com > WaveSimulation.rar > Particle.cpp
// Particle.cpp: implementation of the CParticle class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Particle.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CParticle::CParticle()
{
m_iNextParticle = 0;
memset(m_ParticalPool,0,sizeof(FoamPartical) * (PARTICLE_NUMBER_PER_WAVE + 1));
}
CParticle::~CParticle()
{
}
FoamPartical* CParticle::GenerateFoam()
{
FoamPartical *pParticleResult = NULL;
if(m_iNextParticle >= PARTICLE_NUMBER_PER_WAVE)
pParticleResult = NULL;
else
{
pParticleResult = &m_ParticalPool[m_iNextParticle];
m_iNextParticle++;
}
return pParticleResult;
}
void CParticle::DrawFoam()
{
for(int i = 0; i < m_iNextParticle; i++)
{
//rendering foam;
if(m_ParticalPool[i].life > 0)
{
glPointSize(m_ParticalPool[i].size);
glBegin(GL_POINTS);
glVertex3f(m_ParticalPool[i].x,m_ParticalPool[i].y,m_ParticalPool[i].z);
glEnd();
glPointSize(1);
}
}
}
void CParticle::Refresh()
{
if(m_iNextParticle != 0)
{
m_iNextParticle--; //指向第一个非空元素
for(int i = 0; i <= m_iNextParticle; i++)
{
while(i <= m_iNextParticle && m_ParticalPool[i].life > 0)
i++;
while(m_iNextParticle > i && m_ParticalPool[m_iNextParticle].life <= 0 )
m_iNextParticle--;
if(m_iNextParticle > i && m_iNextParticle != PARTICLE_NUMBER_PER_WAVE)
{
memcpy(&m_ParticalPool[i],&m_ParticalPool[m_iNextParticle],sizeof(FoamPartical) );
m_ParticalPool[m_iNextParticle].life = 0.0f;
m_iNextParticle--;
i++;
}
}
m_iNextParticle++; //调整下一个可用索引的值
}
}