www.pudn.com > 林海血原源代码.zip > Particle.cpp
// Particle.cpp: implementation of the CParticle class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Particle.h"
#include "Texture.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
unsigned int *CParticle::m_pTexResource=NULL;
CParticle::CParticle()
{
particle=NULL;
maxnum=100;
Type=-1;
}
bool CParticle::InitParticle(int type,VERTEX startPos,unsigned int *texResource)
{
if(m_pTexResource==NULL)m_pTexResource=texResource;
if(Type<0)Type=type;
switch(Type)
{
case RIFLE_P:
maxnum=40;
break;
case EXPLOSION_P:
maxnum=100;
break;
case ROCKET_P:
maxnum=50;
break;
case SMOKE_P:
maxnum=60;
break;
}
if(particle==NULL)
{
particle=new PARTICLE[maxnum];
}
switch(Type)
{
case RIFLE_P:
InitShotParticle();
break;
case EXPLOSION_P:
InitExpParticle();
break;
case ROCKET_P:
InitBulletParticle( startPos);
break;
case SMOKE_P:
InitSmokeParticle( );
break;
}
return true;
}
void CParticle::DrawParticles(VERTEX startPos)
{
switch(Type)
{
case RIFLE_P:
DrawShotParticles();
break;
case EXPLOSION_P:
DrawExpParticles( );
break;
case ROCKET_P:
DrawBulletParticles( startPos);
break;
case SMOKE_P:
DrawSmokeParticles();
break;
}
}
bool CParticle::InitShotParticle()
{
smokenum=30;
for(int i=0 ;i 0 && particle[i].pos.ypos>0)
{
particle[i].pos.xpos += particle[i].normal.nx;
particle[i].pos.ypos += particle[i].normal.ny;
particle[i].pos.zpos += particle[i].normal.nz;
particle[i].normal.ny -= 0.02f; // cheap simulated gravity
particle[i].normal.nx *= 0.9f;
particle[i].normal.ny *= 0.99f;
particle[i].normal.nz *= 0.9f;
particle[i].life -= particle[i].fade;
// if(particle[i].rotate>0)
particle[i].rotate +=4.0f;
// else
// particle[i].rotate -=4.0f;
/* glPushMatrix();
glTranslatef(particle[i].pos.xpos, particle[i].pos.ypos, particle[i].pos.zpos);
glRotated(particle[i].rotate,1,1,1);
glTranslatef(-particle[i].pos.xpos, -particle[i].pos.ypos, -particle[i].pos.zpos);
*/
// glColor4d(srccolor[26][0],srccolor[26][1],srccolor[26][2],particle[i].life);
glColor4f(0,0,0,particle[i].life);
glBegin(GL_QUADS);
glTexCoord2d(1,1);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glTexCoord2d(1,0);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,0);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,1);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glEnd();
// glPopMatrix();
}
}
//////////////draw smoke
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_pTexResource[2] );
glDisable(GL_DEPTH_TEST);
// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
// glBlendFunc(GL_SRC_ALPHA,GL_ONE);
for( i=0;i(smokenum-10))glBlendFunc(GL_SRC_ALPHA,GL_ONE);
else glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
if (particle[i].life > 0 && particle[i].pos.ypos>0)
{
particle[i].pos.xpos += particle[i].normal.nx;
particle[i].pos.ypos += particle[i].normal.ny;
particle[i].pos.zpos += particle[i].normal.nz;
particle[i].normal.ny -= 0.005f; // cheap simulated gravity
particle[i].normal.nx *= 0.9f;
particle[i].normal.ny *= 0.9f;
particle[i].normal.nz *= 0.9f;
particle[i].life -= particle[i].fade;
glColor4d(0.2f,0.13f,0.0f,particle[i].life);
// glColor4d(0.95f,0.75f,0.25f,particle[i].life);
// glColor4d(srccolor[26][0],srccolor[26][1],srccolor[26][2],particle[i].life);
glBegin(GL_QUADS);
glTexCoord2d(1,1);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glTexCoord2d(1,0);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,0);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,1);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glEnd();
}
}
glDisable(GL_ALPHA_TEST);
glColor4d(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
}
bool CParticle::InitExpParticle()
{
smokenum=30;
rocknum=70;
for(int i=0 ;i20)
{
particle[i].normal.nx = float((rand()%50)-25)*0.002f;
particle[i].normal.ny = float((rand()%50)-0)*0.04f+0.1f;
particle[i].fade =float(rand()%100)*0.00001f + 0.01f;
}
else
{
particle[i].normal.nx = float((rand()%50)-25)*0.01f;
particle[i].normal.ny = float((rand()%50)-0)*0.08f;
particle[i].fade =float(rand()%100)*0.00001f + 0.001f;
}
particle[i].normal.nz = 0;//float((rand()%50)-25)*0.006f;
particle[i].size =float((rand()%40)*0.1f+12);
}
else if(i 0)
{
if(particle[i].life > 0.4)
glDisable(GL_BLEND);
else glEnable(GL_BLEND);
particle[i].pos.xpos += particle[i].normal.nx;
particle[i].pos.ypos += particle[i].normal.ny;
particle[i].pos.zpos += particle[i].normal.nz;
particle[i].normal.ny -= 0.08f; // cheap simulated gravity
particle[i].normal.nx *= 0.99f;
particle[i].normal.ny *= 0.99f;
particle[i].normal.nz *= 0.99f;
particle[i].life -= particle[i].fade;
particle[i].rotate +=6.0f;
glPushMatrix();
glTranslatef(particle[i].pos.xpos, particle[i].pos.ypos, particle[i].pos.zpos);
glRotated(particle[i].rotate,1.f,0,0);
glTranslatef(-particle[i].pos.xpos, -particle[i].pos.ypos, -particle[i].pos.zpos);
glColor4d(1,1,1,1);//particle[i].life);
//glColor4d(srccolor[26][0],srccolor[26][1],srccolor[26][2],particle[i].life);
/////////// rock
if(i20)glBlendFunc(GL_SRC_ALPHA,GL_ONE);
else glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
if (particle[i].life > 0 && particle[i].pos.ypos>0)
{
particle[i].pos.xpos += particle[i].normal.nx;
particle[i].pos.ypos += particle[i].normal.ny;
particle[i].pos.zpos += particle[i].normal.nz;
particle[i].normal.ny -= 0.03f; // cheap simulated gravity
particle[i].normal.nx *= 0.9f;
particle[i].normal.ny *= 0.9f;
particle[i].normal.nz *= 0.9f;
particle[i].life -= particle[i].fade;
// glColor4d(0.28f,0.27f,0.25f,particle[i].life);
glColor4d(0.6f,0.45f,0.2f,particle[i].life);
// glColor4d(srccolor[26][0],srccolor[26][1],srccolor[26][2],particle[i].life);
glBegin(GL_QUADS);
glTexCoord2d(1,1);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glTexCoord2d(1,0);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,0);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,1);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glEnd();
}
}
glColor4d(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
}
/////////////////////////////////////////////////////////
bool CParticle::InitBulletParticle(VERTEX startPos)
{
smokenum=maxnum;
for(int i=0 ;i 0)
{
particle[i].pos.xpos += particle[i].normal.nx;
particle[i].pos.ypos += particle[i].normal.ny;
particle[i].pos.zpos += particle[i].normal.nz;
particle[i].normal.ny -= 0.001f; // cheap simulated gravity
particle[i].normal.nx *= 0.9f;
particle[i].normal.ny *= 0.9f;
particle[i].normal.nz *= 0.9f;
particle[i].life -= particle[i].fade;
particle[i].rotate +=6.0f;
// glColor4d(particle[i].color.r,particle[i].color.g,particle[i].color.b,particle[i].life);
glColor4d(srccolor[26][0],srccolor[26][1],srccolor[26][2],particle[i].life);
glBegin(GL_QUADS);
glTexCoord2d(1,1);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glTexCoord2d(1,0);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,0);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,1);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glEnd();
}
else ResetParticle(i,startPos);
}
//////////////draw smoke
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_pTexResource[2] );
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
for( i=0;i 0)
{
particle[i].pos.xpos += particle[i].normal.nx;
particle[i].pos.ypos += particle[i].normal.ny;
particle[i].pos.zpos += particle[i].normal.nz;
particle[i].normal.ny += 0.006f; // cheap simulated gravity
particle[i].normal.nx *= 0.9f;
particle[i].normal.ny *= 0.9f;
particle[i].normal.nz *= 0.9f;
particle[i].life -= particle[i].fade;
// glColor4d(0.1f,0.1f,0.1f,particle[i].life);
glColor4d(0.2f,0.5f,0.6f,particle[i].life);
// glColor4d(0.3f,0.23f,0.0f,particle[i].life);
glBegin(GL_QUADS);
glTexCoord2d(1,1);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glTexCoord2d(1,0);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,0);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,1);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glEnd();
}
else ResetParticle(i,startPos);
}
glColor4d(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
}
void CParticle::ResetParticle(int num,VERTEX startPos)
{
if(num>(maxnum-1))return;
particle[num].size =float(rand()%80)*0.01f+0.1f;
particle[num].pos.xpos = startPos.xpos+float((rand()%4)-2)*particle[num].size;// /75.f;
particle[num].pos.ypos = startPos.ypos+float((rand()%4)-2)*particle[num].size;
particle[num].pos.zpos = startPos.zpos+float((rand()%4)-2)*particle[num].size;
particle[num].rotate = float(num);
if(num20)glBlendFunc(GL_SRC_ALPHA,GL_ONE);
// else
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
if (particle[i].life > 0)
{
particle[i].pos.xpos += particle[i].normal.nx;
particle[i].pos.ypos += particle[i].normal.ny;
// particle[i].pos.zpos += particle[i].normal.nz;
// particle[i].normal.ny += 0.003f; // cheap simulated gravity
particle[i].normal.nx *= 1.01f;
particle[i].normal.ny *= 0.96f;
// particle[i].normal.nz *= 0.9f;
particle[i].size *=1.02f;
particle[i].life -= particle[i].fade;
glColor4d(0.5f,0.5f,0.5f,particle[i].life);
glBegin(GL_QUADS);
glTexCoord2d(1,1);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glTexCoord2d(1,0);
glVertex3d( particle[i].pos.xpos+particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,0);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos-particle[i].size,particle[i].pos.zpos);
glTexCoord2d(0,1);
glVertex3d(particle[i].pos.xpos-particle[i].size,particle[i].pos.ypos+ particle[i].size,particle[i].pos.zpos);
glEnd();
}
else ResetSmokeParticle(i);
}
glColor4d(1,1,1,1);
glDisable(GL_BLEND);
}
void CParticle::ResetSmokeParticle(int num)
{
if(num>(maxnum-1))return;
particle[num].size =float(rand()%100)*0.01f+2;
particle[num].pos.xpos = 0;// /75.f;
particle[num].pos.ypos = 0;
particle[num].pos.zpos = float(num-maxnum/2)*0.1f;
particle[num].normal.nx =-float((rand()%50)-0)*0.004f;
particle[num].normal.ny = float((rand()%50)-0)*0.04f+0.2f;
particle[num].fade =float(rand()%100)*0.0001f + 0.01f;
particle[num].life = 1;
}
CParticle::~CParticle()
{
if(particle!=NULL)
delete [] particle;
}