diff options
Diffstat (limited to 'src/imports/particles/trailsemitter.cpp')
-rw-r--r-- | src/imports/particles/trailsemitter.cpp | 79 |
1 files changed, 64 insertions, 15 deletions
diff --git a/src/imports/particles/trailsemitter.cpp b/src/imports/particles/trailsemitter.cpp index a727da8541..2355670801 100644 --- a/src/imports/particles/trailsemitter.cpp +++ b/src/imports/particles/trailsemitter.cpp @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Declarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "trailsemitter.h" #include "particlesystem.h" #include "particle.h" @@ -9,7 +50,7 @@ TrailsEmitter::TrailsEmitter(QSGItem* parent) , m_particle_count(0) , m_reset_last(true) , m_last_timestamp(0) - , m_last_particle(0) + , m_last_emission(0) { // setFlag(ItemHasContents); } @@ -31,7 +72,7 @@ void TrailsEmitter::emitWindow(int timeStamp) { if (m_system == 0) return; - if(!m_emitting && !m_burstLeft){ + if((!m_emitting || !m_particlesPerSecond)&& !m_burstLeft && !m_emitLeft){ m_reset_last = true; return; } @@ -39,24 +80,22 @@ void TrailsEmitter::emitWindow(int timeStamp) if (m_reset_last) { m_last_emitter = m_last_last_emitter = QPointF(x(), y()); m_last_timestamp = timeStamp/1000.; - m_last_particle = ceil(m_last_timestamp * m_particlesPerSecond); + m_last_emission = m_last_timestamp; m_reset_last = false; } - m_particle_count = m_particlesPerSecond * (m_particleDuration / 1000.); - if(m_burstLeft){ m_burstLeft -= timeStamp - m_last_timestamp * 1000.; if(m_burstLeft < 0){ - timeStamp += m_burstLeft; + if(!m_emitting) + timeStamp += m_burstLeft; m_burstLeft = 0; } } qreal time = timeStamp / 1000.; - qreal particleRatio = 1. / m_particlesPerSecond; - qreal pt = m_last_particle * particleRatio; + qreal pt = m_last_emission; qreal opt = pt; // original particle time qreal dt = time - m_last_timestamp; // timestamp delta... @@ -74,12 +113,19 @@ void TrailsEmitter::emitWindow(int timeStamp) qreal by = m_last_emitter.y(); qreal cy = (y() + m_last_emitter.y()) / 2; - float sizeAtEnd = m_particleEndSize >= 0 ? m_particleEndSize : m_particleSize; + qreal sizeAtEnd = m_particleEndSize >= 0 ? m_particleEndSize : m_particleSize; qreal emitter_x_offset = m_last_emitter.x() - x(); qreal emitter_y_offset = m_last_emitter.y() - y(); - while (pt < time) { + while (pt < time || m_emitLeft) { //int pos = m_last_particle % m_particle_count; ParticleData* datum = m_system->newDatum(m_system->m_groupIds[m_particle]); + if(!datum){//skip this emission + if(!m_emitLeft) + pt += particleRatio; + else + --m_emitLeft; + continue; + } datum->e = this;//###useful? ParticleVertex &p = datum->pv; qreal t = 1 - (pt - opt) / dt; @@ -95,7 +141,7 @@ void TrailsEmitter::emitWindow(int timeStamp) // Particle timestamp p.t = pt; - p.lifeSpan = //Promote to base class? + p.lifeSpan = //TODO:Promote to base class? (m_particleDuration + ((rand() % ((m_particleDurationVariation*2) + 1)) - m_particleDurationVariation)) / 1000.0; @@ -123,17 +169,20 @@ void TrailsEmitter::emitWindow(int timeStamp) float sizeVariation = -m_particleSizeVariation + rand() / float(RAND_MAX) * m_particleSizeVariation * 2; - float size = m_particleSize + sizeVariation; - float endSize = sizeAtEnd + sizeVariation; + float size = qMax((qreal)0.0 , m_particleSize + sizeVariation); + float endSize = qMax((qreal)0.0 , sizeAtEnd + sizeVariation); p.size = size;// * float(m_emitting); p.endSize = endSize;// * float(m_emitting); - ++m_last_particle; - pt = m_last_particle * particleRatio; + if(!m_emitLeft) + pt += particleRatio; + else + --m_emitLeft; m_system->emitParticle(datum); } + m_last_emission = pt; m_last_last_last_emitter = m_last_last_emitter; m_last_last_emitter = m_last_emitter; |