Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qquickv4particledata.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <math.h>
6#include "qquickparticlesystem_p.h"//for QQuickParticleData
7#include <QDebug>
8#include <private/qv4engine_p.h>
9#include <private/qv4functionobject_p.h>
10#include <QtCore/private/qnumeric_p.h>
11
13
234namespace QV4 {
235namespace Heap {
236struct QV4ParticleData : QV4::Object::Data {
238 {
239 Object::init();
240 this->datum = datum;
241 this->particleSystem = particleSystem;
242 }
243 QQuickParticleData* datum;//TODO: Guard needed?
245};
246}
247}
248
249//### Particle data handles are not locked to within certain scopes like QQuickContext2D, but there's no way to reload either...
251{
253};
254
256
258{
259public:
261 ~QV4ParticleDataDeletable() override;
262
264};
265
267{
268 QV4::Scope scope(b);
269 QV4::Scoped<QV4ParticleData> r(scope, *thisObject);
270
271 if (!r || !r->d()->datum)
272 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object")));
273
274 r->d()->datum->lifeSpan = 0; //Don't kill(), because it could still be in the middle of being created
276}
277
279{
280 QV4::Scope scope(b);
281 QV4::Scoped<QV4ParticleData> r(scope, *thisObject);
282
283 if (!r || !r->d()->datum)
284 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object")));
285
286 RETURN_RESULT(QV4::Encode(r->d()->datum->lifeLeft(r->d()->particleSystem)));
287}
288
290{
291 QV4::Scope scope(b);
292 QV4::Scoped<QV4ParticleData> r(scope, *thisObject);
293
294 if (!r || !r->d()->datum)
295 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object")));
296
297 RETURN_RESULT(QV4::Encode(r->d()->datum->curSize(r->d()->particleSystem)));
298}
299#define COLOR_GETTER_AND_SETTER(VAR, NAME) static QV4::ReturnedValue particleData_get_ ## NAME (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int) \
300{ \
301 QV4::Scope scope(b); \
302 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
303 if (!r || !r->d()->datum) \
304 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object"))); \
305\
306 RETURN_RESULT(QV4::Encode((r->d()->datum->color. VAR )/255.0));\
307}\
308\
309static QV4::ReturnedValue particleData_set_ ## NAME (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)\
310{\
311 QV4::Scope scope(b); \
312 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
313 if (!r || !r->d()->datum)\
314 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object")));\
315\
316 double d = argc ? argv[0].toNumber() : 0; \
317 r->d()->datum->color. VAR = qMin(255, qMax(0, (int)::floor(d * 255.0)));\
318 RETURN_UNDEFINED(); \
319}
320
321
322#define SEMIBOOL_GETTER_AND_SETTER(VARIABLE) static QV4::ReturnedValue particleData_get_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int) \
323{ \
324 QV4::Scope scope(b); \
325 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
326 if (!r || !r->d()->datum) \
327 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object"))); \
328\
329 RETURN_RESULT(QV4::Encode(r->d()->datum-> VARIABLE));\
330}\
331\
332static QV4::ReturnedValue particleData_set_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)\
333{\
334 QV4::Scope scope(b); \
335 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
336 if (!r || !r->d()->datum)\
337 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object")));\
338\
339 r->d()->datum-> VARIABLE = (argc && argv[0].toBoolean()) ? 1.0 : 0.0;\
340 RETURN_UNDEFINED(); \
341}
342
343#define FLOAT_GETTER_AND_SETTER(VARIABLE) static QV4::ReturnedValue particleData_get_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int) \
344{ \
345 QV4::Scope scope(b); \
346 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
347 if (!r || !r->d()->datum) \
348 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object"))); \
349\
350 RETURN_RESULT(QV4::Encode(r->d()->datum-> VARIABLE));\
351}\
352\
353static QV4::ReturnedValue particleData_set_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)\
354{\
355 QV4::Scope scope(b); \
356 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
357 if (!r || !r->d()->datum)\
358 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object")));\
359\
360 r->d()->datum-> VARIABLE = argc ? argv[0].toNumber() : qt_qnan();\
361 RETURN_UNDEFINED(); \
362}
363
364#define FAKE_FLOAT_GETTER_AND_SETTER(VARIABLE, GETTER, SETTER) static QV4::ReturnedValue particleData_get_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int) \
365{ \
366 QV4::Scope scope(b); \
367 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
368 if (!r || !r->d()->datum) \
369 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object"))); \
370\
371 RETURN_RESULT(QV4::Encode(r->d()->datum-> GETTER (r->d()->particleSystem)));\
372}\
373\
374static QV4::ReturnedValue particleData_set_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)\
375{\
376 QV4::Scope scope(b); \
377 QV4::Scoped<QV4ParticleData> r(scope, *thisObject); \
378 if (!r || !r->d()->datum)\
379 RETURN_RESULT(scope.engine->throwError(QStringLiteral("Not a valid ParticleData object")));\
380\
381 r->d()->datum-> SETTER (argc ? argv[0].toNumber() : qt_qnan(), r->d()->particleSystem);\
382 RETURN_UNDEFINED(); \
383}
384
385#define REGISTER_ACCESSOR(PROTO, ENGINE, VARIABLE, NAME) \
386 PROTO ->defineAccessorProperty( QStringLiteral( #NAME ), particleData_get_ ## VARIABLE , particleData_set_ ## VARIABLE )
387
409FLOAT_GETTER_AND_SETTER(rotationVelocity)
411FLOAT_GETTER_AND_SETTER(frameDuration)
413FLOAT_GETTER_AND_SETTER(frameCount)
415FAKE_FLOAT_GETTER_AND_SETTER(curX, curX, setInstantaneousX)
416FAKE_FLOAT_GETTER_AND_SETTER(curVX, curVX, setInstantaneousVX)
417FAKE_FLOAT_GETTER_AND_SETTER(curAX, curAX, setInstantaneousAX)
418FAKE_FLOAT_GETTER_AND_SETTER(curY, curY, setInstantaneousY)
419FAKE_FLOAT_GETTER_AND_SETTER(curVY, curVY, setInstantaneousVY)
420FAKE_FLOAT_GETTER_AND_SETTER(curAY, curAY, setInstantaneousAY)
421
423{
424 QV4::Scope scope(v4);
425 QV4::ScopedObject p(scope, v4->newObject());
426
427 p->defineDefaultProperty(QStringLiteral("discard"), particleData_discard);
428 p->defineDefaultProperty(QStringLiteral("lifeLeft"), particleData_lifeLeft);
429 p->defineDefaultProperty(QStringLiteral("currentSize"), particleData_curSize);
430
431 REGISTER_ACCESSOR(p, v4, x, initialX);
432 REGISTER_ACCESSOR(p, v4, y, initialY);
433 REGISTER_ACCESSOR(p, v4, t, t);
434 REGISTER_ACCESSOR(p, v4, lifeSpan, lifeSpan);
435 REGISTER_ACCESSOR(p, v4, size, startSize);
436 REGISTER_ACCESSOR(p, v4, endSize, endSize);
437 REGISTER_ACCESSOR(p, v4, vx, initialVX);
438 REGISTER_ACCESSOR(p, v4, vy, initialVY);
439 REGISTER_ACCESSOR(p, v4, ax, initialAX);
440 REGISTER_ACCESSOR(p, v4, ay, initialAY);
441 REGISTER_ACCESSOR(p, v4, xx, xDeformationVectorX);
442 REGISTER_ACCESSOR(p, v4, xy, xDeformationVectorY);
443 REGISTER_ACCESSOR(p, v4, yx, yDeformationVectorX);
444 REGISTER_ACCESSOR(p, v4, yy, yDeformationVectorY);
445 REGISTER_ACCESSOR(p, v4, rotation, rotation);
446 REGISTER_ACCESSOR(p, v4, rotationVelocity, rotationVelocity);
447 REGISTER_ACCESSOR(p, v4, autoRotate, autoRotate);
448 REGISTER_ACCESSOR(p, v4, animIdx, animationIndex);
449 REGISTER_ACCESSOR(p, v4, frameDuration, frameDuration);
450 REGISTER_ACCESSOR(p, v4, frameAt, frameAt);
451 REGISTER_ACCESSOR(p, v4, frameCount, frameCount);
452 REGISTER_ACCESSOR(p, v4, animT, animationT);
453 REGISTER_ACCESSOR(p, v4, update, update);
454 REGISTER_ACCESSOR(p, v4, curX, x);
455 REGISTER_ACCESSOR(p, v4, curVX, vx);
456 REGISTER_ACCESSOR(p, v4, curAX, ax);
457 REGISTER_ACCESSOR(p, v4, curY, y);
458 REGISTER_ACCESSOR(p, v4, curVY, vy);
459 REGISTER_ACCESSOR(p, v4, curAY, ay);
460 REGISTER_ACCESSOR(p, v4, red, red);
464
465 proto = p;
466}
467
469{
470}
471
473
474
476 QQuickParticleSystem *system)
477{
478 if (!v4 || !datum)
479 return;
480
481 QV4::Scope scope(v4);
482 QV4ParticleDataDeletable *d = particleV4Data(scope.engine);
483 QV4::ScopedObject o(scope, v4->memoryManager->allocate<QV4ParticleData>(datum, system));
484 QV4::ScopedObject p(scope, d->proto.value());
485 o->setPrototypeUnchecked(p);
486 m_v4Value = o;
487}
488
490{
491}
492
494{
495 return m_v4Value.value();
496}
497
QV4::ReturnedValue v4Value() const
QQuickV4ParticleData(QV4::ExecutionEngine *, QQuickParticleData *, QQuickParticleSystem *system)
ObjectType::Data * allocate(Args &&... args)
Definition qv4mm_p.h:199
ReturnedValue value() const
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
quint64 ReturnedValue
GLboolean GLboolean GLboolean b
GLint GLint GLint GLint GLint x
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLboolean r
[2]
GLboolean GLboolean g
GLint y
GLbyte GLbyte blue
Definition qopenglext.h:385
GLdouble GLdouble t
Definition qopenglext.h:243
GLfloat GLfloat p
[1]
GLfloat GLfloat GLfloat alpha
Definition qopenglext.h:418
GLbyte green
Definition qopenglext.h:385
#define FLOAT_GETTER_AND_SETTER(VARIABLE)
static QV4::ReturnedValue particleData_curSize(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
#define FAKE_FLOAT_GETTER_AND_SETTER(VARIABLE, GETTER, SETTER)
#define REGISTER_ACCESSOR(PROTO, ENGINE, VARIABLE, NAME)
#define SEMIBOOL_GETTER_AND_SETTER(VARIABLE)
static QV4::ReturnedValue particleData_discard(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
static QV4::ReturnedValue particleData_lifeLeft(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
#define COLOR_GETTER_AND_SETTER(VAR, NAME)
#define QStringLiteral(str)
#define V4_DEFINE_EXTENSION(dataclass, datafunction)
Definition qv4engine_p.h:38
#define RETURN_RESULT(r)
#define DEFINE_OBJECT_VTABLE(classname)
#define V4_OBJECT2(DataClass, superClass)
QJSEngine engine
[0]
QGraphicsSvgItem * red
static constexpr ReturnedValue undefined()
MemoryManager * memoryManager
ReturnedValue throwError(const Value &value)
void init(QQuickParticleData *datum, QQuickParticleSystem *particleSystem)
QQuickParticleSystem * particleSystem
ExecutionEngine * engine