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++;		//调整下一个可用索引的值 
	} 
}