give particle trails a nice smooth path between frames

This commit is contained in:
Thijs Wenker 2016-02-20 22:46:19 +01:00
parent 9066fb0622
commit 58539171a3
2 changed files with 8 additions and 5 deletions

View file

@ -103,6 +103,7 @@ EntityItemPointer ParticleEffectEntityItem::factory(const EntityItemID& entityID
// our non-pure virtual subclass for now... // our non-pure virtual subclass for now...
ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityItemID) : ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityItemID) :
EntityItem(entityItemID), EntityItem(entityItemID),
_previousPosition(getPosition()),
_lastSimulated(usecTimestampNow()) _lastSimulated(usecTimestampNow())
{ {
_type = EntityTypes::ParticleEffect; _type = EntityTypes::ParticleEffect;
@ -623,7 +624,8 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) {
} }
// emit a new particle at tail index. // emit a new particle at tail index.
_particles.push_back(createParticle()); _particles.push_back(createParticle(glm::mix(_previousPosition, getPosition(),
(deltaTime - timeLeftInFrame) / deltaTime)));
auto particle = _particles.back(); auto particle = _particles.back();
particle.lifetime += timeLeftInFrame; particle.lifetime += timeLeftInFrame;
@ -637,15 +639,16 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) {
_timeUntilNextEmit -= timeLeftInFrame; _timeUntilNextEmit -= timeLeftInFrame;
} }
_previousPosition = getPosition();
} }
ParticleEffectEntityItem::Particle ParticleEffectEntityItem::createParticle() { ParticleEffectEntityItem::Particle ParticleEffectEntityItem::createParticle(const glm::vec3& position) {
Particle particle; Particle particle;
particle.seed = randFloatInRange(-1.0f, 1.0f); particle.seed = randFloatInRange(-1.0f, 1.0f);
if (getEmitterShouldTrail()) { if (getEmitterShouldTrail()) {
particle.position = getPosition(); particle.position = position;
} }
// Position, velocity, and acceleration // Position, velocity, and acceleration
if (_polarStart == 0.0f && _polarFinish == 0.0f && _emitDimensions.z == 0.0f) { if (_polarStart == 0.0f && _polarFinish == 0.0f && _emitDimensions.z == 0.0f) {

View file

@ -227,7 +227,7 @@ protected:
bool isAnimatingSomething() const; bool isAnimatingSomething() const;
Particle createParticle(); Particle createParticle(const glm::vec3& position);
void stepSimulation(float deltaTime); void stepSimulation(float deltaTime);
void integrateParticle(Particle& particle, float deltaTime); void integrateParticle(Particle& particle, float deltaTime);
@ -275,7 +275,7 @@ protected:
float _azimuthStart = DEFAULT_AZIMUTH_START; float _azimuthStart = DEFAULT_AZIMUTH_START;
float _azimuthFinish = DEFAULT_AZIMUTH_FINISH; float _azimuthFinish = DEFAULT_AZIMUTH_FINISH;
glm::vec3 _previousPosition;
quint64 _lastSimulated { 0 }; quint64 _lastSimulated { 0 };
bool _isEmitting { true }; bool _isEmitting { true };