summaryrefslogtreecommitdiffstats
path: root/src/imports/particles/trailsemitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/imports/particles/trailsemitter.cpp')
-rw-r--r--src/imports/particles/trailsemitter.cpp79
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;