📄 glparticle.cpp
字号:
/*
glparticle.cpp - Particle system
Copyright (c) HalfLucifer, 2002.3.1
*/
#include "glparticle.h"
GLparticle::GLparticle()
{
m_NumParticle = 2000;
m_Size = 50.0f;
m_Radius = 0.1f;
m_Gravity = 5.0f;
m_Bounce = 0.4f;
m_EnergyDrop = 0.01f;
m_BirthVelocity = 25.0f;
}
GLparticle::~GLparticle()
{
delete [] m_ParticlePool;
}
bool GLparticle::Initialize()
{
srand(GetTickCount());
m_Color = GLvector((float)(rand()%256)/255, (float)(rand()%256)/255, (float)(rand()%256)/255);
m_Texture.LoadJPG("particle.jpg");
m_ParticlePool = new Particle[m_NumParticle];
if (!m_ParticlePool)
return false;
return true;
}
void GLparticle::Update()
{
for (int i=0; i<m_NumParticle; i++)
{
m_ParticlePool[i].position += m_ParticlePool[i].velocity;
m_ParticlePool[i].energy -= m_EnergyDrop;
if (m_ParticlePool[i].position[1] > m_Radius)
m_ParticlePool[i].position[1] -= m_Gravity;
else
{
m_ParticlePool[i].position[1] = m_Radius;
m_ParticlePool[i].velocity[1] = -m_ParticlePool[i].velocity[1];
m_ParticlePool[i].velocity *= m_Bounce;
}
if (m_ParticlePool[i].energy <= 0)
{
m_ParticlePool[i].position = m_Position;
m_ParticlePool[i].energy = 1.0f;
float alpha = 2 * (float)GLPi * rand()/RAND_MAX;
float beta = (float)GLPi * ((float)rand()/RAND_MAX - 0.5f);
m_ParticlePool[i].velocity[0] = (float)(m_BirthVelocity * cos(beta) * sin(alpha));
m_ParticlePool[i].velocity[1] = (float)(m_BirthVelocity * sin(beta));
m_ParticlePool[i].velocity[2] = (float)(m_BirthVelocity * cos(beta) * cos(alpha));
}
}
}
void GLparticle::Render()
{
GLvector v;
GLvector up = camera.GetUpVector();
GLvector right = camera.GetRightVector();
glBlendFunc(GL_ONE, GL_ONE);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D, m_Texture.ID());
for (int i=0; i<m_NumParticle; i++)
{
v = m_Color * m_ParticlePool[i].energy;
glColor3fv(v);
glPushMatrix();
glTranslatef(m_ParticlePool[i].position[0], m_ParticlePool[i].position[1], m_ParticlePool[i].position[2]);
if (g_billboard)
{
glBegin(GL_TRIANGLES);
v = up*(-m_Size/2) + right*(-m_Size);
glTexCoord2f(0.0f, 0.0f);
glVertex3fv(v);
v = up*(-m_Size/2) + right*m_Size;
glTexCoord2f(1.0f, 0.0f);
glVertex3fv(v);
v = up*m_Size/2;
glTexCoord2f(0.5f, 0.75f);
glVertex3fv(v);
glEnd();
}
else
{
glBegin(GL_TRIANGLES);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-m_Size, -m_Size/2, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(m_Size, -m_Size/2, 0.0f);
glTexCoord2f(0.5f, 0.75f);
glVertex3f(0.0f, m_Size/2, 0.0f);
glEnd();
}
glPopMatrix();
}
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glColor3f(1.0f, 1.0f, 1.0f);
}
void GLparticle::SetEmitterPos(GLvector &pos)
{
m_Position = pos;
m_Target = pos;
}
void GLparticle::MoveEmitterPos(GLvector &pos)
{
m_Target = pos;
}
void GLparticle::SetColor(GLvector &color)
{
m_Color = color;
}
void GLparticle::SetNum(int num)
{
if (num > 0)
{
delete [] m_ParticlePool;
m_NumParticle = num;
m_ParticlePool = new Particle[m_NumParticle];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -