diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-06-12 12:36:08 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2013-06-12 14:35:21 +0200 |
commit | c8a6cb67f09d5f714a4d388cd8710423fb0176fc (patch) | |
tree | 86c25c222c085f3201724c9db3c04556fa2a18e0 /src/particles | |
parent | 9cd19964bb364f6dbd10b491cabd8304bdd0bc23 (diff) |
Port ParticleData to V4
Change-Id: Ifc48b73a2fbfda22d3c4419cb34dd5307107f688
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/particles')
-rw-r--r-- | src/particles/particles.pri | 4 | ||||
-rw-r--r-- | src/particles/qquickparticlesystem.cpp | 4 | ||||
-rw-r--r-- | src/particles/qquickparticlesystem_p.h | 4 | ||||
-rw-r--r-- | src/particles/qquickv4particledata.cpp (renamed from src/particles/qquickv8particledata.cpp) | 203 | ||||
-rw-r--r-- | src/particles/qquickv4particledata_p.h (renamed from src/particles/qquickv8particledata_p.h) | 6 |
5 files changed, 118 insertions, 103 deletions
diff --git a/src/particles/particles.pri b/src/particles/particles.pri index 3e083ab291..9b41a30d6b 100644 --- a/src/particles/particles.pri +++ b/src/particles/particles.pri @@ -25,7 +25,7 @@ HEADERS += \ $$PWD/qquickturbulence_p.h \ $$PWD/qquickwander_p.h \ $$PWD/qquickcumulativedirection_p.h \ - $$PWD/qquickv8particledata_p.h \ + $$PWD/qquickv4particledata_p.h \ $$PWD/qquickrectangleextruder_p.h \ $$PWD/qquickparticlegroup_p.h \ $$PWD/qquickgroupgoal_p.h \ @@ -58,7 +58,7 @@ SOURCES += \ $$PWD/qquickturbulence.cpp \ $$PWD/qquickwander.cpp \ $$PWD/qquickcumulativedirection.cpp \ - $$PWD/qquickv8particledata.cpp \ + $$PWD/qquickv4particledata.cpp \ $$PWD/qquickrectangleextruder.cpp \ $$PWD/qquickparticlegroup.cpp \ $$PWD/qquickgroupgoal.cpp diff --git a/src/particles/qquickparticlesystem.cpp b/src/particles/qquickparticlesystem.cpp index 47761994e0..b13020fc7d 100644 --- a/src/particles/qquickparticlesystem.cpp +++ b/src/particles/qquickparticlesystem.cpp @@ -46,7 +46,7 @@ #include "qquickparticlepainter_p.h" #include <private/qquickspriteengine_p.h> #include <private/qquicksprite_p.h> -#include "qquickv8particledata_p.h" +#include "qquickv4particledata_p.h" #include "qquickparticlegroup_p.h" #include "qquicktrailemitter_p.h"//###For auto-follow on states, perhaps should be in emitter? @@ -530,7 +530,7 @@ void QQuickParticleData::clone(const QQuickParticleData& other) QQmlV4Handle QQuickParticleData::v4Value() { if (!v8Datum) - v8Datum = new QQuickV8ParticleData(QQmlEnginePrivate::getV8Engine(qmlEngine(system)), this); + v8Datum = new QQuickV4ParticleData(QQmlEnginePrivate::getV8Engine(qmlEngine(system)), this); return v8Datum->v4Value(); } //sets the x accleration without affecting the instantaneous x velocity or position diff --git a/src/particles/qquickparticlesystem_p.h b/src/particles/qquickparticlesystem_p.h index 1eb26a27fb..df57cd2cc7 100644 --- a/src/particles/qquickparticlesystem_p.h +++ b/src/particles/qquickparticlesystem_p.h @@ -63,7 +63,7 @@ class QQuickParticleData; class QQuickParticleSystemAnimation; class QQuickStochasticEngine; class QQuickSprite; -class QQuickV8ParticleData; +class QQuickV4ParticleData; class QQuickParticleGroup; class QQuickImageParticle; @@ -231,7 +231,7 @@ public: QQmlV4Handle v4Value(); void extendLife(float time); private: - QQuickV8ParticleData* v8Datum; + QQuickV4ParticleData* v8Datum; }; class Q_AUTOTEST_EXPORT QQuickParticleSystem : public QQuickItem diff --git a/src/particles/qquickv8particledata.cpp b/src/particles/qquickv4particledata.cpp index a4a0298497..a5ec20aabb 100644 --- a/src/particles/qquickv8particledata.cpp +++ b/src/particles/qquickv4particledata.cpp @@ -40,14 +40,12 @@ ****************************************************************************/ #include <math.h> -#include "qquickv8particledata_p.h" +#include "qquickv4particledata_p.h" #include "qquickparticlesystem_p.h"//for QQuickParticleData #include <QDebug> #include <private/qv4engine_p.h> #include <private/qv4functionobject_p.h> -#include <private/qv8objectresource_p.h> - QT_BEGIN_NAMESPACE /*! @@ -273,125 +271,140 @@ QT_BEGIN_NAMESPACE //### Particle data handles are not locked to within certain scopes like QQuickContext2D, but there's no way to reload either... -class QV8ParticleDataResource : public QV8ObjectResource +struct QV4ParticleData : public QV4::Object { - V8_RESOURCE_TYPE(ParticleDataType) -public: - QV8ParticleDataResource(QV8Engine *e) : QV8ObjectResource(e) {} + Q_MANAGED + QV4ParticleData(QV4::ExecutionEngine *engine, QQuickParticleData *datum) + : Object(engine) + { + vtbl = &static_vtbl; + this->datum = datum; + } + QQuickParticleData* datum;//TODO: Guard needed? + + static void destroy(Managed *that) + { that->as<QV4ParticleData>()->~QV4ParticleData(); } }; +DEFINE_MANAGED_VTABLE(QV4ParticleData); + class QV8ParticleDataDeletable : public QV8Engine::Deletable { public: QV8ParticleDataDeletable(QV8Engine *engine); ~QV8ParticleDataDeletable(); - QV4::PersistentValue constructor; + QV4::PersistentValue proto; }; -static QV4::Value particleData_discard(const v8::Arguments &args) +static QV4::Value particleData_discard(QV4::SimpleCallContext *ctx) { - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(args.This()); + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); if (!r || !r->datum) - V4THROW_ERROR("Not a valid ParticleData object"); + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); r->datum->lifeSpan = 0; //Don't kill(), because it could still be in the middle of being created return QV4::Value::undefinedValue(); } -static QV4::Value particleData_lifeLeft(const v8::Arguments &args) +static QV4::Value particleData_lifeLeft(QV4::SimpleCallContext *ctx) { - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(args.This()); + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); if (!r || !r->datum) - V4THROW_ERROR("Not a valid ParticleData object"); + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); return QV4::Value::fromDouble(r->datum->lifeLeft()); } -static QV4::Value particleData_curSize(const v8::Arguments &args) +static QV4::Value particleData_curSize(QV4::SimpleCallContext *ctx) { - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(args.This()); + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); if (!r || !r->datum) - V4THROW_ERROR("Not a valid ParticleData object"); + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); return QV4::Value::fromDouble(r->datum->curSize()); } -#define COLOR_GETTER_AND_SETTER(VAR, NAME) static v8::Handle<v8::Value> particleData_get_ ## NAME (v8::Handle<v8::String>, const v8::AccessorInfo &info) \ +#define COLOR_GETTER_AND_SETTER(VAR, NAME) static QV4::Value particleData_get_ ## NAME (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ return QV4::Value::fromDouble((r->datum->color. VAR )/255.0);\ }\ \ -static void particleData_set_ ## NAME (v8::Handle<v8::String>, v8::Handle<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## NAME (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum->color. VAR = qMin(255, qMax(0, (int)floor(value->NumberValue() * 255.0)));\ + r->datum->color. VAR = qMin(255, qMax(0, (int)floor(ctx->argument(0).toNumber() * 255.0)));\ + return QV4::Value::undefinedValue(); \ } -#define SEMIBOOL_GETTER_AND_SETTER(VARIABLE) static v8::Handle<v8::Value> particleData_get_ ## VARIABLE (v8::Handle<v8::String>, const v8::AccessorInfo &info) \ +#define SEMIBOOL_GETTER_AND_SETTER(VARIABLE) static QV4::Value particleData_get_ ## VARIABLE (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ return QV4::Value::fromBoolean(r->datum-> VARIABLE);\ }\ \ -static void particleData_set_ ## VARIABLE (v8::Handle<v8::String>, v8::Handle<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## VARIABLE (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum-> VARIABLE = value->BooleanValue() ? 1.0 : 0.0;\ + r->datum-> VARIABLE = ctx->argument(0).toBoolean() ? 1.0 : 0.0;\ + return QV4::Value::undefinedValue(); \ } -#define FLOAT_GETTER_AND_SETTER(VARIABLE) static v8::Handle<v8::Value> particleData_get_ ## VARIABLE (v8::Handle<v8::String>, const v8::AccessorInfo &info) \ +#define FLOAT_GETTER_AND_SETTER(VARIABLE) static QV4::Value particleData_get_ ## VARIABLE (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ return QV4::Value::fromDouble(r->datum-> VARIABLE);\ }\ \ -static void particleData_set_ ## VARIABLE (v8::Handle<v8::String>, v8::Handle<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## VARIABLE (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum-> VARIABLE = value->NumberValue();\ + r->datum-> VARIABLE = ctx->argument(0).toNumber();\ + return QV4::Value::undefinedValue(); \ } -#define FAKE_FLOAT_GETTER_AND_SETTER(VARIABLE, GETTER, SETTER) static v8::Handle<v8::Value> particleData_get_ ## VARIABLE (v8::Handle<v8::String>, const v8::AccessorInfo &info) \ +#define FAKE_FLOAT_GETTER_AND_SETTER(VARIABLE, GETTER, SETTER) static QV4::Value particleData_get_ ## VARIABLE (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ return QV4::Value::fromDouble(r->datum-> GETTER ());\ }\ \ -static void particleData_set_ ## VARIABLE (v8::Handle<v8::String>, v8::Handle<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## VARIABLE (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum-> SETTER ( value->NumberValue() );\ + r->datum-> SETTER ( ctx->argument(0).toNumber() );\ + return QV4::Value::undefinedValue(); \ } -#define REGISTER_ACCESSOR(FT, ENGINE, VARIABLE, NAME) FT ->PrototypeTemplate()->SetAccessor( v8::String::New( #NAME ), particleData_get_ ## VARIABLE , particleData_set_ ## VARIABLE , v8::External::New(ENGINE)) +#define REGISTER_ACCESSOR(PROTO, ENGINE, VARIABLE, NAME) \ + PROTO ->defineAccessorProperty( ENGINE, QStringLiteral( #NAME ), particleData_get_ ## VARIABLE , particleData_set_ ## VARIABLE ) COLOR_GETTER_AND_SETTER(r, red) COLOR_GETTER_AND_SETTER(g, green) @@ -430,47 +443,49 @@ FAKE_FLOAT_GETTER_AND_SETTER(curAY, curAY, setInstantaneousAY) QV8ParticleDataDeletable::QV8ParticleDataDeletable(QV8Engine *engine) { - v8::Handle<v8::FunctionTemplate> ft = v8::FunctionTemplate::New(); - ft->InstanceTemplate()->SetHasExternalResource(true); - ft->PrototypeTemplate()->Set(v8::String::New("discard"), V8FUNCTION(particleData_discard, engine)); - ft->PrototypeTemplate()->Set(v8::String::New("lifeLeft"), V8FUNCTION(particleData_lifeLeft, engine)); - ft->PrototypeTemplate()->Set(v8::String::New("currentSize"), V8FUNCTION(particleData_curSize, engine)); - REGISTER_ACCESSOR(ft, engine, x, initialX); - REGISTER_ACCESSOR(ft, engine, y, initialY); - REGISTER_ACCESSOR(ft, engine, t, t); - REGISTER_ACCESSOR(ft, engine, lifeSpan, lifeSpan); - REGISTER_ACCESSOR(ft, engine, size, startSize); - REGISTER_ACCESSOR(ft, engine, endSize, endSize); - REGISTER_ACCESSOR(ft, engine, vx, initialVX); - REGISTER_ACCESSOR(ft, engine, vy, initialVY); - REGISTER_ACCESSOR(ft, engine, ax, initialAX); - REGISTER_ACCESSOR(ft, engine, ay, initialAY); - REGISTER_ACCESSOR(ft, engine, xx, xDeformationVectorX); - REGISTER_ACCESSOR(ft, engine, xy, xDeformationVectorY); - REGISTER_ACCESSOR(ft, engine, yx, yDeformationVectorX); - REGISTER_ACCESSOR(ft, engine, yy, yDeformationVectorY); - REGISTER_ACCESSOR(ft, engine, rotation, rotation); - REGISTER_ACCESSOR(ft, engine, rotationVelocity, rotationVelocity); - REGISTER_ACCESSOR(ft, engine, autoRotate, autoRotate); - REGISTER_ACCESSOR(ft, engine, animIdx, animationIndex); - REGISTER_ACCESSOR(ft, engine, frameDuration, frameDuration); - REGISTER_ACCESSOR(ft, engine, frameAt, frameAt); - REGISTER_ACCESSOR(ft, engine, frameCount, frameCount); - REGISTER_ACCESSOR(ft, engine, animT, animationT); - REGISTER_ACCESSOR(ft, engine, r, r); - REGISTER_ACCESSOR(ft, engine, update, update); - REGISTER_ACCESSOR(ft, engine, curX, x); - REGISTER_ACCESSOR(ft, engine, curVX, vx); - REGISTER_ACCESSOR(ft, engine, curAX, ax); - REGISTER_ACCESSOR(ft, engine, curY, y); - REGISTER_ACCESSOR(ft, engine, curVY, vy); - REGISTER_ACCESSOR(ft, engine, curAY, ay); - REGISTER_ACCESSOR(ft, engine, red, red); - REGISTER_ACCESSOR(ft, engine, green, green); - REGISTER_ACCESSOR(ft, engine, blue, blue); - REGISTER_ACCESSOR(ft, engine, alpha, alpha); - - constructor = ft->GetFunction()->v4Value(); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); + QV4::Object *p = v4->newObject(); + + p->defineDefaultProperty(v4, QStringLiteral("discard"), particleData_discard); + p->defineDefaultProperty(v4, QStringLiteral("lifeLeft"), particleData_lifeLeft); + p->defineDefaultProperty(v4, QStringLiteral("currentSize"), particleData_curSize); + + REGISTER_ACCESSOR(p, v4, x, initialX); + REGISTER_ACCESSOR(p, v4, y, initialY); + REGISTER_ACCESSOR(p, v4, t, t); + REGISTER_ACCESSOR(p, v4, lifeSpan, lifeSpan); + REGISTER_ACCESSOR(p, v4, size, startSize); + REGISTER_ACCESSOR(p, v4, endSize, endSize); + REGISTER_ACCESSOR(p, v4, vx, initialVX); + REGISTER_ACCESSOR(p, v4, vy, initialVY); + REGISTER_ACCESSOR(p, v4, ax, initialAX); + REGISTER_ACCESSOR(p, v4, ay, initialAY); + REGISTER_ACCESSOR(p, v4, xx, xDeformationVectorX); + REGISTER_ACCESSOR(p, v4, xy, xDeformationVectorY); + REGISTER_ACCESSOR(p, v4, yx, yDeformationVectorX); + REGISTER_ACCESSOR(p, v4, yy, yDeformationVectorY); + REGISTER_ACCESSOR(p, v4, rotation, rotation); + REGISTER_ACCESSOR(p, v4, rotationVelocity, rotationVelocity); + REGISTER_ACCESSOR(p, v4, autoRotate, autoRotate); + REGISTER_ACCESSOR(p, v4, animIdx, animationIndex); + REGISTER_ACCESSOR(p, v4, frameDuration, frameDuration); + REGISTER_ACCESSOR(p, v4, frameAt, frameAt); + REGISTER_ACCESSOR(p, v4, frameCount, frameCount); + REGISTER_ACCESSOR(p, v4, animT, animationT); + REGISTER_ACCESSOR(p, v4, r, r); + REGISTER_ACCESSOR(p, v4, update, update); + REGISTER_ACCESSOR(p, v4, curX, x); + REGISTER_ACCESSOR(p, v4, curVX, vx); + REGISTER_ACCESSOR(p, v4, curAX, ax); + REGISTER_ACCESSOR(p, v4, curY, y); + REGISTER_ACCESSOR(p, v4, curVY, vy); + REGISTER_ACCESSOR(p, v4, curAY, ay); + REGISTER_ACCESSOR(p, v4, red, red); + REGISTER_ACCESSOR(p, v4, green, green); + REGISTER_ACCESSOR(p, v4, blue, blue); + REGISTER_ACCESSOR(p, v4, alpha, alpha); + + proto = QV4::Value::fromObject(p); } QV8ParticleDataDeletable::~QV8ParticleDataDeletable() @@ -480,23 +495,23 @@ QV8ParticleDataDeletable::~QV8ParticleDataDeletable() V8_DEFINE_EXTENSION(QV8ParticleDataDeletable, particleV8Data); -QQuickV8ParticleData::QQuickV8ParticleData(QV8Engine* engine, QQuickParticleData* datum) +QQuickV4ParticleData::QQuickV4ParticleData(QV8Engine* engine, QQuickParticleData* datum) { if (!engine || !datum) return; QV8ParticleDataDeletable *d = particleV8Data(engine); - m_v4Value = d->constructor.value().asFunctionObject()->newInstance(); - QV8ParticleDataResource *r = new QV8ParticleDataResource(engine); - r->datum = datum; - v8::Handle<v8::Object>(m_v4Value)->SetExternalResource(r); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); + QV4::Object *o = new (v4->memoryManager) QV4ParticleData(v4, datum); + o->prototype = d->proto.value().asObject(); + m_v4Value = QV4::Value::fromObject(o); } -QQuickV8ParticleData::~QQuickV8ParticleData() +QQuickV4ParticleData::~QQuickV4ParticleData() { } -QQmlV4Handle QQuickV8ParticleData::v4Value() +QQmlV4Handle QQuickV4ParticleData::v4Value() { return QQmlV4Handle(m_v4Value); } diff --git a/src/particles/qquickv8particledata_p.h b/src/particles/qquickv4particledata_p.h index 11cca70b12..b3614f94ff 100644 --- a/src/particles/qquickv8particledata_p.h +++ b/src/particles/qquickv4particledata_p.h @@ -49,10 +49,10 @@ QT_BEGIN_NAMESPACE class QQuickParticleData; -class QQuickV8ParticleData { +class QQuickV4ParticleData { public: - QQuickV8ParticleData(QV8Engine*,QQuickParticleData*); - ~QQuickV8ParticleData(); + QQuickV4ParticleData(QV8Engine*,QQuickParticleData*); + ~QQuickV4ParticleData(); QQmlV4Handle v4Value(); private: QV4::PersistentValue m_v4Value; |