mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-11 04:31:35 -10:00
This is similar to the script I wrote a few years ago but unlike that one, this solution doesn't kill the performance.
68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
#include "particle/particle.h"
|
|
#include "particle/ParticleEffect.h"
|
|
#include "particle/ParticleSource.h"
|
|
#include "particle/effects/SingleParticleEffect.h"
|
|
|
|
#include "bmpman/bmpman.h"
|
|
|
|
/**
|
|
* @defgroup particleEffects Particle Effects
|
|
*
|
|
* @ingroup particleSystems
|
|
*/
|
|
|
|
namespace particle {
|
|
namespace effects {
|
|
SingleParticleEffect::SingleParticleEffect(const SCP_string& name)
|
|
: ParticleEffect(name) {}
|
|
|
|
bool SingleParticleEffect::processSource(const ParticleSource* source) {
|
|
if (!m_timing.continueProcessing(source)) {
|
|
return false;
|
|
}
|
|
|
|
particle_info info;
|
|
memset(&info, 0, sizeof(info));
|
|
|
|
source->getOrigin()->applyToParticleInfo(info);
|
|
info.vel = vmd_zero_vector;
|
|
|
|
m_particleProperties.createParticle(info);
|
|
|
|
// Continue processing this source
|
|
return true;
|
|
}
|
|
|
|
void SingleParticleEffect::parseValues(bool nocreate) {
|
|
m_particleProperties.parse(nocreate);
|
|
|
|
m_timing = util::EffectTiming::parseTiming();
|
|
}
|
|
|
|
void SingleParticleEffect::pageIn() {
|
|
m_particleProperties.pageIn();
|
|
}
|
|
|
|
void SingleParticleEffect::initializeSource(ParticleSource& source) {
|
|
m_timing.applyToSource(&source);
|
|
}
|
|
|
|
SingleParticleEffect* SingleParticleEffect::createInstance(int effectID, float minSize, float maxSize,
|
|
float lifetime) {
|
|
Assertion(bm_is_valid(effectID), "Invalid effect id %d passed!", effectID);
|
|
Assertion(minSize <= maxSize, "Maximum size %f is more than minimum size %f!", maxSize, minSize);
|
|
Assertion(minSize >= 0.0f, "Minimum size may not be less than zero, got %f!", minSize);
|
|
|
|
auto effectPtr = new SingleParticleEffect("");
|
|
effectPtr->m_particleProperties.m_bitmap = effectID;
|
|
effectPtr->m_particleProperties.m_radius = util::UniformFloatRange(minSize, maxSize);
|
|
|
|
if (lifetime > 0.0f) {
|
|
effectPtr->m_particleProperties.m_hasLifetime = true;
|
|
effectPtr->m_particleProperties.m_lifetime = util::UniformFloatRange(lifetime);
|
|
}
|
|
|
|
return effectPtr;
|
|
}
|
|
}
|
|
} |