diff --git a/Horde3D/Source/Horde3DEngine/egParticle.cpp b/Horde3D/Source/Horde3DEngine/egParticle.cpp index 7d94e8a..e9298f0 100644 --- a/Horde3D/Source/Horde3DEngine/egParticle.cpp +++ b/Horde3D/Source/Horde3DEngine/egParticle.cpp @@ -303,6 +303,7 @@ EmitterNode::EmitterNode( const EmitterNodeTpl &emitterTpl ) : _timeDelta = 0; _emissionAccum = 0; + _lastAbsTrans = _absTrans; _particles = 0x0; _parPositions = 0x0; @@ -557,11 +558,35 @@ void EmitterNode::onPostUpdate() _emissionAccum += _emissionRate * _timeDelta; else _delay -= _timeDelta; + + float couldCreateNumParticles = 0; + for( uint32 i = 0; i < _particleCount; ++i ) + { + ParticleData &p = _particles[i]; + if( p.life <= 0 && ((int)p.respawnCounter < _respawnCount || _respawnCount < 0) ) + { + couldCreateNumParticles += 1.0f; + if( couldCreateNumParticles >= _emissionAccum ) + { + break; + } + } + } + + float relMoveX = ( _lastAbsTrans.c[3][0] - _absTrans.c[3][0] ) * 1.3f; // 1.3f improves visual result by overlapping the particle groups + float relMoveY = ( _lastAbsTrans.c[3][1] - _absTrans.c[3][1] ) * 1.3f; + float relMoveZ = ( _lastAbsTrans.c[3][2] - _absTrans.c[3][2] ) * 1.3f; + float relMoveFactorStep = 0.0f; + float relMoveFactor = 0.0f; + if ( couldCreateNumParticles >= 1.0f ) + { + relMoveFactorStep = 1.0 / floor( couldCreateNumParticles ); + } for( uint32 i = 0; i < _particleCount; ++i ) { ParticleData &p = _particles[i]; - + // Create particle if( p.life <= 0 && ((int)p.respawnCounter < _respawnCount || _respawnCount < 0) ) { @@ -587,9 +612,10 @@ void EmitterNode::onPostUpdate() p.a0 = randomF( _effectRes->_colA.startMin, _effectRes->_colA.startMax ); // Update arrays - _parPositions[i * 3 + 0] = _absTrans.c[3][0]; - _parPositions[i * 3 + 1] = _absTrans.c[3][1]; - _parPositions[i * 3 + 2] = _absTrans.c[3][2]; + _parPositions[i * 3 + 0] = _absTrans.c[3][0] + relMoveX * relMoveFactor; + _parPositions[i * 3 + 1] = _absTrans.c[3][1] + relMoveY * relMoveFactor; + _parPositions[i * 3 + 2] = _absTrans.c[3][2] + relMoveZ * relMoveFactor; + relMoveFactor += relMoveFactorStep; _parSizesANDRotations[i * 2 + 0] = p.size0; _parSizesANDRotations[i * 2 + 1] = randomF( 0, 360 ); _parColors[i * 4 + 0] = p.r0; @@ -652,4 +678,5 @@ void EmitterNode::onPostUpdate() _bBox.max = bBMax; _timeDelta = 0; + _lastAbsTrans = _absTrans; } diff --git a/Horde3D/Source/Horde3DEngine/egParticle.h b/Horde3D/Source/Horde3DEngine/egParticle.h index ccee78c..bc6350f 100644 --- a/Horde3D/Source/Horde3DEngine/egParticle.h +++ b/Horde3D/Source/Horde3DEngine/egParticle.h @@ -155,6 +155,7 @@ protected: // Emitter data float _timeDelta; float _emissionAccum; + Matrix4f _lastAbsTrans; // Emitter params PMaterialResource _materialRes;