GPUParticles: Refactoring

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14891 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj 2014-01-02 18:07:11 +00:00
parent d63b5af530
commit d8302dcaee

View File

@ -272,13 +272,34 @@ ParticleSystemProxy::~ParticleSystemProxy()
void ParticleSystemProxy::setAlphaAdditive(bool val) { m_alpha_additive = val; }
static
void generateLifetimeSizeDirection(scene::IParticleEmitter *emitter, float &lifetime, float &size, float &dirX, float &dirY, float &dirZ)
{
float sizeMin = emitter->getMinStartSize().Height;
float sizeMax = emitter->getMaxStartSize().Height;
float lifetime_range = emitter->getMaxLifeTime() - emitter->getMinLifeTime();
lifetime = os::Randomizer::frand() * lifetime_range;
lifetime += emitter->getMinLifeTime();
size = os::Randomizer::frand();
size *= (sizeMax - sizeMin);
size += sizeMin;
core::vector3df particledir = emitter->getDirection();
particledir.rotateXYBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateYZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateXZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
dirX = particledir.X / size;
dirY = particledir.Y / size;
dirZ = particledir.Z / size;
}
void ParticleSystemProxy::generateParticlesFromPointEmitter(scene::IParticlePointEmitter *emitter)
{
float *particles = new float[COMPONENTCOUNT * count], *initialvalue = new float[COMPONENTCOUNT * count];
unsigned lifetime_range = emitter->getMaxLifeTime() - emitter->getMinLifeTime();
float sizeMin = emitter->getMinStartSize().Height;
float sizeMax = emitter->getMaxStartSize().Height;
for (unsigned i = 0; i < count; i++) {
particles[COMPONENTCOUNT * i] = 0;
@ -290,28 +311,10 @@ void ParticleSystemProxy::generateParticlesFromPointEmitter(scene::IParticlePoin
initialvalue[COMPONENTCOUNT * i] = 0.;
initialvalue[COMPONENTCOUNT * i + 1] = 0.;
initialvalue[COMPONENTCOUNT * i + 2] = 0.;
initialvalue[COMPONENTCOUNT * i + 3] = rand() % lifetime_range;
initialvalue[COMPONENTCOUNT * i + 3] += emitter->getMinLifeTime();
core::vector3df particledir = emitter->getDirection();
particledir.rotateXYBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateYZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateXZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
float size = rand();
size /= RAND_MAX;
size *= (sizeMax - sizeMin);
size += sizeMin;
initialvalue[COMPONENTCOUNT * i + 7] = size;
particles[COMPONENTCOUNT * i + 4] = particledir.X / size;
particles[COMPONENTCOUNT * i + 5] = particledir.Y / size;
particles[COMPONENTCOUNT * i + 6] = particledir.Z / size;
initialvalue[COMPONENTCOUNT * i + 4] = particledir.X / size;
initialvalue[COMPONENTCOUNT * i + 5] = particledir.Y / size;
initialvalue[COMPONENTCOUNT * i + 6] = particledir.Z / size;
generateLifetimeSizeDirection(emitter, initialvalue[COMPONENTCOUNT * i + 3], initialvalue[COMPONENTCOUNT * i + 7],
initialvalue[COMPONENTCOUNT * i + 4], initialvalue[COMPONENTCOUNT * i + 5], initialvalue[COMPONENTCOUNT * i + 6]);
memcpy(&particles[COMPONENTCOUNT * i + 4], &initialvalue[COMPONENTCOUNT * i + 4], 4 * sizeof(float));
}
glBindBuffer(GL_ARRAY_BUFFER, initial_values_buffer);
@ -344,27 +347,10 @@ void ParticleSystemProxy::generateParticlesFromBoxEmitter(scene::IParticleBoxEmi
initialvalue[COMPONENTCOUNT * i] = particles[COMPONENTCOUNT * i];
initialvalue[COMPONENTCOUNT * i + 1] = particles[COMPONENTCOUNT * i + 1];
initialvalue[COMPONENTCOUNT * i + 2] = particles[COMPONENTCOUNT * i + 2];
initialvalue[COMPONENTCOUNT * i + 3] = (lifetime_range > 0) ? rand() % lifetime_range : 0;
initialvalue[COMPONENTCOUNT * i + 3] += emitter->getMinLifeTime();
core::vector3df particledir = emitter->getDirection();
particledir.rotateXYBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateYZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateXZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
float size = rand();
size /= RAND_MAX;
size *= (sizeMax - sizeMin);
size += sizeMin;
initialvalue[COMPONENTCOUNT * i + 7] = size;
particles[COMPONENTCOUNT * i + 4] = particledir.X / size;
particles[COMPONENTCOUNT * i + 5] = particledir.Y / size;
particles[COMPONENTCOUNT * i + 6] = particledir.Z / size;
initialvalue[COMPONENTCOUNT * i + 4] = particledir.X / size;
initialvalue[COMPONENTCOUNT * i + 5] = particledir.Y / size;
initialvalue[COMPONENTCOUNT * i + 6] = particledir.Z / size;
generateLifetimeSizeDirection(emitter, initialvalue[COMPONENTCOUNT * i + 3], initialvalue[COMPONENTCOUNT * i + 7],
initialvalue[COMPONENTCOUNT * i + 4], initialvalue[COMPONENTCOUNT * i + 5], initialvalue[COMPONENTCOUNT * i + 6]);
memcpy(&particles[COMPONENTCOUNT * i + 4], &initialvalue[COMPONENTCOUNT * i + 4], 4 * sizeof(float));
}
glBindBuffer(GL_ARRAY_BUFFER, initial_values_buffer);
glBufferData(GL_ARRAY_BUFFER, COMPONENTCOUNT * count * sizeof(float), initialvalue, GL_STREAM_DRAW);
@ -403,27 +389,10 @@ void ParticleSystemProxy::generateParticlesFromSphereEmitter(scene::IParticleSph
initialvalue[COMPONENTCOUNT * i] = particles[COMPONENTCOUNT * i];
initialvalue[COMPONENTCOUNT * i + 1] = particles[COMPONENTCOUNT * i + 1];
initialvalue[COMPONENTCOUNT * i + 2] = particles[COMPONENTCOUNT * i + 2];
initialvalue[COMPONENTCOUNT * i + 3] = (lifetime_range > 0) ? rand() % lifetime_range : 0;
initialvalue[COMPONENTCOUNT * i + 3] += emitter->getMinLifeTime();
core::vector3df particledir = emitter->getDirection();
particledir.rotateXYBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateYZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
particledir.rotateXZBy(os::Randomizer::frand() * emitter->getMaxAngleDegrees());
float size = rand();
size /= RAND_MAX;
size *= (sizeMax - sizeMin);
size += sizeMin;
initialvalue[COMPONENTCOUNT * i + 7] = size;
particles[COMPONENTCOUNT * i + 4] = particledir.X / size;
particles[COMPONENTCOUNT * i + 5] = particledir.Y / size;
particles[COMPONENTCOUNT * i + 6] = particledir.Z / size;
initialvalue[COMPONENTCOUNT * i + 4] = particledir.X / size;
initialvalue[COMPONENTCOUNT * i + 5] = particledir.Y / size;
initialvalue[COMPONENTCOUNT * i + 6] = particledir.Z / size;
generateLifetimeSizeDirection(emitter, initialvalue[COMPONENTCOUNT * i + 3], initialvalue[COMPONENTCOUNT * i + 7],
initialvalue[COMPONENTCOUNT * i + 4], initialvalue[COMPONENTCOUNT * i + 5], initialvalue[COMPONENTCOUNT * i + 6]);
memcpy(&particles[COMPONENTCOUNT * i + 4], &initialvalue[COMPONENTCOUNT * i + 4], 4 * sizeof(float));
}
glBindBuffer(GL_ARRAY_BUFFER, initial_values_buffer);
glBufferData(GL_ARRAY_BUFFER, COMPONENTCOUNT * count * sizeof(float), initialvalue, GL_STREAM_DRAW);