aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/particles/qsgparticleemitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/particles/qsgparticleemitter.cpp')
-rw-r--r--src/declarative/particles/qsgparticleemitter.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/declarative/particles/qsgparticleemitter.cpp b/src/declarative/particles/qsgparticleemitter.cpp
index f10bf1edd7..e1a7ef28a9 100644
--- a/src/declarative/particles/qsgparticleemitter.cpp
+++ b/src/declarative/particles/qsgparticleemitter.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qsgparticleemitter_p.h"
+#include <private/qdeclarativeengine_p.h>
QT_BEGIN_NAMESPACE
@@ -183,12 +184,12 @@ QT_BEGIN_NAMESPACE
Default value is 0.
*/
-//TODO: Document particle 'type'
+
/*!
- \qmlsignal QtQuick.Particles2::Emitter::onEmitParticle(Particle particle)
+ \qmlsignal QtQuick.Particles2::Emitter::onEmitParticles(Array particles)
- This handler is called when a particle is emitted. You can modify particle
- attributes from within the handler.
+ This handler is called when particles are emitted. particles is a javascript
+ array of Particle objects. You can modify particle attributes directly within the handler.
Note that JS is slower to execute, so it is not recommended to use this in
high-volume particle systems.
@@ -252,7 +253,7 @@ QSGParticleEmitter::~QSGParticleEmitter()
bool QSGParticleEmitter::isEmitConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("emitParticle(QDeclarativeV8Handle)");
+ static int idx = QObjectPrivate::get(this)->signalIndex("emitParticles(QDeclarativeV8Handle)");
return QObjectPrivate::get(this)->isSignalConnected(idx);
}
@@ -396,6 +397,9 @@ void QSGParticleEmitter::emitWindow(int timeStamp)
qreal emitter_y_offset = m_last_emitter.y() - y();
if (!m_burstQueue.isEmpty() && !m_burstLeft && !m_enabled)//'outside time' emissions only
pt = time;
+
+ QList<QSGParticleData*> toEmit;
+
while ((pt < time && m_emitCap) || !m_burstQueue.isEmpty()) {
//int pos = m_last_particle % m_particle_count;
QSGParticleData* datum = m_system->newDatum(m_system->m_groupIds[m_group], !m_overwrite);
@@ -459,9 +463,7 @@ void QSGParticleEmitter::emitWindow(int timeStamp)
datum->size = size;// * float(m_emitting);
datum->endSize = endSize;// * float(m_emitting);
- if (isEmitConnected())
- emitParticle(datum->v8Value());//A chance for arbitrary JS changes
- m_system->emitParticle(datum);
+ toEmit << datum;
}
if (m_burstQueue.isEmpty()){
pt += particleRatio;
@@ -471,6 +473,19 @@ void QSGParticleEmitter::emitWindow(int timeStamp)
m_burstQueue.pop_front();
}
}
+
+ if (isEmitConnected()) {
+ v8::HandleScope handle_scope;
+ v8::Context::Scope scope(QDeclarativeEnginePrivate::getV8Engine(qmlEngine(this))->context());
+ v8::Handle<v8::Array> array = v8::Array::New(toEmit.size());
+ for (int i=0; i<toEmit.size(); i++)
+ array->Set(i, toEmit[i]->v8Value().toHandle());
+
+ emitParticles(QDeclarativeV8Handle::fromHandle(array));//A chance for arbitrary JS changes
+ }
+ foreach (QSGParticleData* d, toEmit)
+ m_system->emitParticle(d);
+
m_last_emission = pt;
m_last_last_last_emitter = m_last_last_emitter;