From eaf52673ef38b4d7a14f9fb9f258d8f1c6097401 Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Thu, 14 Jul 2011 15:40:30 +1000 Subject: Add support for a vector4d type in QML QVector4D is a value-type which is supported but was not able to be constructed using a Qt object function. This commit allows properties of vector4d type to be constructed, and adds a function to the global Qt object and adds unit tests to ensure that it behaves correctly. Task-number: QTBUG-18559 Change-Id: I96509a4f496b644d20fdb1d977d0afe430d89e13 Reviewed-on: http://codereview.qt.nokia.com/1626 Reviewed-by: Qt Sanity Bot Reviewed-by: Aaron Kennedy --- src/declarative/qml/qdeclarativecompiler.cpp | 19 +++++++++++++ src/declarative/qml/qdeclarativeinstruction.cpp | 3 ++ src/declarative/qml/qdeclarativeinstruction_p.h | 12 ++++++++ .../qml/qdeclarativestringconverters.cpp | 33 ++++++++++++++++++++++ .../qml/qdeclarativestringconverters_p.h | 2 ++ src/declarative/qml/qdeclarativevme.cpp | 10 +++++++ src/declarative/qml/v8/qv8engine.cpp | 19 +++++++++++++ src/declarative/qml/v8/qv8engine_p.h | 1 + 8 files changed, 99 insertions(+) (limited to 'src/declarative') diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index f39e1ab5f9..7cc8422ddd 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -312,6 +312,13 @@ bool QDeclarativeCompiler::testLiteralAssignment(const QMetaProperty &prop, if (!ok) COMPILE_EXCEPTION(v, tr("Invalid property assignment: 3D vector expected")); } break; + case QVariant::Vector4D: + { + bool ok; + QDeclarativeStringConverters::vector4DFromString(string, &ok); + if (!ok) COMPILE_EXCEPTION(v, tr("Invalid property assignment: 4D vector expected")); + } + break; default: { int t = prop.userType(); @@ -554,6 +561,18 @@ void QDeclarativeCompiler::genLiteralAssignment(const QMetaProperty &prop, instr.storeVector3D.vector.zp = vector.z(); } break; + case QVariant::Vector4D: + { + bool ok; + QVector4D vector = QDeclarativeStringConverters::vector4DFromString(string, &ok); + instr.setType(QDeclarativeInstruction::StoreVector4D); + instr.storeVector4D.propertyIndex = prop.propertyIndex(); + instr.storeVector4D.vector.xp = vector.x(); + instr.storeVector4D.vector.yp = vector.y(); + instr.storeVector4D.vector.zp = vector.z(); + instr.storeVector4D.vector.wp = vector.w(); + } + break; default: { int t = prop.userType(); diff --git a/src/declarative/qml/qdeclarativeinstruction.cpp b/src/declarative/qml/qdeclarativeinstruction.cpp index f99351bde5..f5bd6e915a 100644 --- a/src/declarative/qml/qdeclarativeinstruction.cpp +++ b/src/declarative/qml/qdeclarativeinstruction.cpp @@ -132,6 +132,9 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx) case QDeclarativeInstruction::StoreVector3D: qWarning().nospace() << idx << "\t\t" << "STORE_VECTOR3D\t\t" << instr->storeVector3D.propertyIndex << "\t" << instr->storeVector3D.vector.xp << "\t" << instr->storeVector3D.vector.yp << "\t" << instr->storeVector3D.vector.zp; break; + case QDeclarativeInstruction::StoreVector4D: + qWarning().nospace() << idx << "\t\t" << "STORE_VECTOR4D\t\t" << instr->storeVector4D.propertyIndex << "\t" << instr->storeVector4D.vector.xp << "\t" << instr->storeVector4D.vector.yp << "\t" << instr->storeVector4D.vector.zp << "\t" << instr->storeVector4D.vector.wp; + break; case QDeclarativeInstruction::StoreVariant: qWarning().nospace() << idx << "\t\t" << "STORE_VARIANT\t\t" << instr->storeString.propertyIndex << "\t" << instr->storeString.value << "\t\t" << primitives.at(instr->storeString.value); break; diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h index a48c44c32e..f98002766a 100644 --- a/src/declarative/qml/qdeclarativeinstruction_p.h +++ b/src/declarative/qml/qdeclarativeinstruction_p.h @@ -88,6 +88,7 @@ QT_BEGIN_NAMESPACE F(StoreRect, storeRect) \ F(StoreRectF, storeRectF) \ F(StoreVector3D, storeVector3D) \ + F(StoreVector4D, storeVector4D) \ F(StoreObject, storeObject) \ F(AssignCustomType, assignCustomType) \ F(AssignSignalObject, assignSignalObject) \ @@ -405,6 +406,16 @@ union QDeclarativeInstruction float zp; } vector; }; + struct instr_storeVector4D { + QML_INSTR_HEADER + int propertyIndex; + struct QVector4D { + float xp; + float yp; + float zp; + float wp; + } vector; + }; instr_common common; instr_init init; @@ -440,6 +451,7 @@ union QDeclarativeInstruction instr_storeRect storeRect; instr_storeRectF storeRectF; instr_storeVector3D storeVector3D; + instr_storeVector4D storeVector4D; instr_storeObject storeObject; instr_assignCustomType assignCustomType; instr_storeSignal storeSignal; diff --git a/src/declarative/qml/qdeclarativestringconverters.cpp b/src/declarative/qml/qdeclarativestringconverters.cpp index d7cfe2eca3..b949adf5ec 100644 --- a/src/declarative/qml/qdeclarativestringconverters.cpp +++ b/src/declarative/qml/qdeclarativestringconverters.cpp @@ -43,6 +43,7 @@ #include #include +#include #include #include #include @@ -93,6 +94,8 @@ QVariant QDeclarativeStringConverters::variantFromString(const QString &s) if (ok) return QVariant(sz); QVector3D v = vector3DFromString(s, &ok); if (ok) return QVariant::fromValue(v); + QVector4D v4 = vector4DFromString(s, &ok); + if (ok) return QVariant::fromValue(v4); return QVariant(s); } @@ -128,6 +131,8 @@ QVariant QDeclarativeStringConverters::variantFromString(const QString &s, int p return QVariant::fromValue(rectFFromString(s, ok).toRect()); case QMetaType::QVector3D: return QVariant::fromValue(vector3DFromString(s, ok)); + case QMetaType::QVector4D: + return QVariant::fromValue(vector4DFromString(s, ok)); default: if (ok) *ok = false; return QVariant(); @@ -275,4 +280,32 @@ QVector3D QDeclarativeStringConverters::vector3DFromString(const QString &s, boo return QVector3D(xCoord, yCoord, zCoord); } +//expects input of "x,y,z,w" +QVector4D QDeclarativeStringConverters::vector4DFromString(const QString &s, bool *ok) +{ + if (s.count(QLatin1Char(',')) != 3) { + if (ok) + *ok = false; + return QVector4D(); + } + + bool xGood, yGood, zGood, wGood; + int index = s.indexOf(QLatin1Char(',')); + int index2 = s.indexOf(QLatin1Char(','), index+1); + int index3 = s.indexOf(QLatin1Char(','), index2+1); + qreal xCoord = s.left(index).toDouble(&xGood); + qreal yCoord = s.mid(index+1, index2-index-1).toDouble(&yGood); + qreal zCoord = s.mid(index2+1, index3-index2-1).toDouble(&zGood); + qreal wCoord = s.mid(index3+1).toDouble(&wGood); + if (!xGood || !yGood || !zGood || !wGood) { + if (ok) + *ok = false; + return QVector4D(); + } + + if (ok) + *ok = true; + return QVector4D(xCoord, yCoord, zCoord, wCoord); +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/qdeclarativestringconverters_p.h b/src/declarative/qml/qdeclarativestringconverters_p.h index a8c63595fc..2f93cd72f9 100644 --- a/src/declarative/qml/qdeclarativestringconverters_p.h +++ b/src/declarative/qml/qdeclarativestringconverters_p.h @@ -67,6 +67,7 @@ class QRectF; class QString; class QByteArray; class QVector3D; +class QVector4D; // XXX - Bauhaus currently uses these methods which is why they're exported namespace QDeclarativeStringConverters @@ -84,6 +85,7 @@ namespace QDeclarativeStringConverters QSizeF Q_DECLARATIVE_PRIVATE_EXPORT sizeFFromString(const QString &, bool *ok = 0); QRectF Q_DECLARATIVE_PRIVATE_EXPORT rectFFromString(const QString &, bool *ok = 0); QVector3D Q_DECLARATIVE_PRIVATE_EXPORT vector3DFromString(const QString &, bool *ok = 0); + QVector4D Q_DECLARATIVE_PRIVATE_EXPORT vector4DFromString(const QString &, bool *ok = 0); } QT_END_NAMESPACE diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp index 45e4745c1a..6708b60834 100644 --- a/src/declarative/qml/qdeclarativevme.cpp +++ b/src/declarative/qml/qdeclarativevme.cpp @@ -586,6 +586,16 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEObjectStack &stack, instr.propertyIndex, a); QML_END_INSTR(StoreVector3D) + QML_BEGIN_INSTR(StoreVector4D) + QObject *target = stack.top(); + CLEAN_PROPERTY(target, instr.propertyIndex); + + QVector4D *v = (QVector4D *)&instr.vector; + void *a[] = { v, 0, &status, &flags }; + QMetaObject::metacall(target, QMetaObject::WriteProperty, + instr.propertyIndex, a); + QML_END_INSTR(StoreVector4D) + QML_BEGIN_INSTR(StoreObject) QObject *assignObj = stack.pop(); QObject *target = stack.top(); diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index b2f98ac2c5..db58aabb29 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -477,6 +477,7 @@ QVariant QV8Engine::toBasicVariant(v8::Handle value) #include +#include struct StaticQtMetaObject : public QObject { @@ -511,6 +512,7 @@ void QV8Engine::initializeGlobal(v8::Handle global) qt->Set(v8::String::New("point"), V8FUNCTION(point, this)); qt->Set(v8::String::New("size"), V8FUNCTION(size, this)); qt->Set(v8::String::New("vector3d"), V8FUNCTION(vector3d, this)); + qt->Set(v8::String::New("vector4d"), V8FUNCTION(vector4d, this)); qt->Set(v8::String::New("formatDate"), V8FUNCTION(formatDate, this)); qt->Set(v8::String::New("formatTime"), V8FUNCTION(formatTime, this)); @@ -845,6 +847,23 @@ v8::Handle QV8Engine::vector3d(const v8::Arguments &args) return V8ENGINE()->fromVariant(QVariant::fromValue(QVector3D(x, y, z))); } +/*! +\qmlmethod Qt::vector4d(real x, real y, real z, real w) +Returns a Vector4D with the specified \c x, \c y, \c z and \c w. +*/ +v8::Handle QV8Engine::vector4d(const v8::Arguments &args) +{ + if (args.Length() != 4) + V8THROW_ERROR("Qt.vector4d(): Invalid arguments"); + + double x = args[0]->NumberValue(); + double y = args[1]->NumberValue(); + double z = args[2]->NumberValue(); + double w = args[3]->NumberValue(); + + return V8ENGINE()->fromVariant(QVariant::fromValue(QVector4D(x, y, z, w))); +} + /*! \qmlmethod color Qt::lighter(color baseColor, real factor) Returns a color lighter than \c baseColor by the \c factor provided. diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index b3cc02321c..f493c676bc 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -435,6 +435,7 @@ protected: static v8::Handle point(const v8::Arguments &args); static v8::Handle size(const v8::Arguments &args); static v8::Handle vector3d(const v8::Arguments &args); + static v8::Handle vector4d(const v8::Arguments &args); static v8::Handle lighter(const v8::Arguments &args); static v8::Handle darker(const v8::Arguments &args); static v8::Handle tint(const v8::Arguments &args); -- cgit v1.2.3