From b4f15304baa3ab495d9e902e719dde23d5340e11 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 13 May 2015 13:12:47 -0700 Subject: [PATCH] standardize COPY_PROPERTY_FROM_QSCRIPTVALUE for vec3, quat, and color --- .../entities/src/AtmospherePropertyGroup.cpp | 4 +- .../entities/src/EntityItemProperties.cpp | 28 +-- .../entities/src/EntityItemPropertiesMacros.h | 203 +++++++----------- .../entities/src/SkyboxPropertyGroup.cpp | 2 +- 4 files changed, 91 insertions(+), 146 deletions(-) diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp index acbb23afbd..364612d4db 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.cpp +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -43,12 +43,12 @@ void AtmospherePropertyGroup::copyToScriptValue(QScriptValue& properties, QScrip } void AtmospherePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_VEC3(atmosphere, center, setCenter); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(atmosphere, center, glmVec3, setCenter); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(atmosphere, innerRadius, float, setInnerRadius); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(atmosphere, outerRadius, float, setOuterRadius); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(atmosphere, mieScattering, float, setMieScattering); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(atmosphere, rayleighScattering, float, setRayleighScattering); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_VEC3(atmosphere, scatteringWavelengths, setScatteringWavelengths); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(atmosphere, scatteringWavelengths, glmVec3, setScatteringWavelengths); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(atmosphere, hasStars, bool, setHasStars); } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index e839ce5590..878643b4f9 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -456,21 +456,21 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { setType(typeScriptValue.toVariant().toString()); } - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(position, setPosition); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(dimensions, setDimensions); - COPY_PROPERTY_FROM_QSCRIPTVALUE_QUAT(rotation, setRotation); + COPY_PROPERTY_FROM_QSCRIPTVALUE(position, glmVec3, setPosition); + COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, glmVec3, setDimensions); + COPY_PROPERTY_FROM_QSCRIPTVALUE(rotation, glmQuat, setRotation); COPY_PROPERTY_FROM_QSCRIPTVALUE(density, float, setDensity); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(velocity, setVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(gravity, setGravity); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(acceleration, setAcceleration); + COPY_PROPERTY_FROM_QSCRIPTVALUE(velocity, glmVec3, setVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, glmVec3, setGravity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, glmVec3, setAcceleration); COPY_PROPERTY_FROM_QSCRIPTVALUE(damping, float, setDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifetime, float, setLifetime); COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(registrationPoint, setRegistrationPoint); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(angularVelocity, setAngularVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, glmVec3, setRegistrationPoint); + COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, glmVec3, setAngularVelocity); COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); - COPY_PROPERTY_FROM_QSCRIPTVALUE_COLOR(color, setColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(color, xColor, setColor); COPY_PROPERTY_FROM_QSCRIPTVALUE(modelURL, QString, setModelURL); COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL); COPY_PROPERTY_FROM_QSCRIPTVALUE(animationURL, QString, setAnimationURL); @@ -492,23 +492,23 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { COPY_PROPERTY_FROM_QSCRIPTVALUE(simulatorID, QUuid, setSimulatorID); COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText); COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight); - COPY_PROPERTY_FROM_QSCRIPTVALUE_COLOR(textColor, setTextColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE_COLOR(backgroundColor, setBackgroundColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, xColor, setTextColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, xColor, setBackgroundColor); COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(shapeType, ShapeType); COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, float, setMaxParticles); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRate, float, setEmitRate); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(emitDirection, setEmitDirection); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDirection, glmVec3, setEmitDirection); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitStrength, float, setEmitStrength); COPY_PROPERTY_FROM_QSCRIPTVALUE(localGravity, float, setLocalGravity); COPY_PROPERTY_FROM_QSCRIPTVALUE(particleRadius, float, setParticleRadius); COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID); COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName); - COPY_PROPERTY_FROM_QSCRIPTVALUE_COLOR(keyLightColor, setKeyLightColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(keyLightColor, xColor, setKeyLightColor); COPY_PROPERTY_FROM_QSCRIPTVALUE(keyLightIntensity, float, setKeyLightIntensity); COPY_PROPERTY_FROM_QSCRIPTVALUE(keyLightAmbientIntensity, float, setKeyLightAmbientIntensity); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(keyLightDirection, setKeyLightDirection); + COPY_PROPERTY_FROM_QSCRIPTVALUE(keyLightDirection, glmVec3, setKeyLightDirection); COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(backgroundMode, BackgroundMode); _stage.copyFromScriptValue(object, _defaultSettings); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 0b0de44d39..8c4f329cc9 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -121,21 +121,80 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const QScriptValue& v) properties.setProperty(#P, V); \ } - -inline float float_convertFromScriptValue(const QScriptValue& v) { return v.toVariant().toFloat(); } -inline uint16_t uint16_t_convertFromScriptValue(const QScriptValue& v) { return v.toVariant().toInt(); } -inline int int_convertFromScriptValue(const QScriptValue& v) { return v.toVariant().toInt(); } -inline bool bool_convertFromScriptValue(const QScriptValue& v) { return v.toVariant().toBool(); } -inline QString QString_convertFromScriptValue(const QScriptValue& v) { return v.toVariant().toString().trimmed(); } -inline QUuid QUuid_convertFromScriptValue(const QScriptValue& v) { return v.toVariant().toUuid(); } +typedef glm::vec3 glmVec3; +typedef glm::quat glmQuat; +inline float float_convertFromScriptValue(const QScriptValue& v, bool& isValid) { return v.toVariant().toFloat(&isValid); } +inline uint16_t uint16_t_convertFromScriptValue(const QScriptValue& v, bool& isValid) { return v.toVariant().toInt(&isValid); } +inline int int_convertFromScriptValue(const QScriptValue& v, bool& isValid) { return v.toVariant().toInt(&isValid); } +inline bool bool_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; return v.toVariant().toBool(); } +inline QString QString_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; return v.toVariant().toString().trimmed(); } +inline QUuid QUuid_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; return v.toVariant().toUuid(); } +inline glmVec3 glmVec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + isValid = false; /// assume it can't be converted + QScriptValue x = v.property("x"); + QScriptValue y = v.property("y"); + QScriptValue z = v.property("z"); + if (x.isValid() && y.isValid() && z.isValid()) { + glm::vec3 newValue(0); + newValue.x = x.toVariant().toFloat(); + newValue.y = y.toVariant().toFloat(); + newValue.z = z.toVariant().toFloat(); + isValid = !glm::isnan(newValue.x) && + !glm::isnan(newValue.y) && + !glm::isnan(newValue.z); + if (isValid) { + return newValue; + } + } + return glm::vec3(0); +} + +inline glmQuat glmQuat_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + isValid = false; /// assume it can't be converted + QScriptValue x = v.property("x"); + QScriptValue y = v.property("y"); + QScriptValue z = v.property("z"); + QScriptValue w = v.property("w"); + if (x.isValid() && y.isValid() && z.isValid() && w.isValid()) { + glm::quat newValue; + newValue.x = x.toVariant().toFloat(); + newValue.y = y.toVariant().toFloat(); + newValue.z = z.toVariant().toFloat(); + newValue.w = w.toVariant().toFloat(); + isValid = !glm::isnan(newValue.x) && + !glm::isnan(newValue.y) && + !glm::isnan(newValue.z) && + !glm::isnan(newValue.w); + if (isValid) { + return newValue; + } + } + return glm::quat(); +} + +inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + xColor newValue; + isValid = false; /// assume it can't be converted + QScriptValue r = v.property("red"); + QScriptValue g = v.property("green"); + QScriptValue b = v.property("blue"); + if (r.isValid() && g.isValid() && b.isValid()) { + newValue.red = r.toVariant().toInt(); + newValue.green = g.toVariant().toInt(); + newValue.blue = b.toVariant().toInt(); + isValid = true; + } + return newValue; +} #define COPY_PROPERTY_FROM_QSCRIPTVALUE(P, T, S) \ { \ QScriptValue V = object.property(#P); \ if (V.isValid()) { \ - T newValue = T##_convertFromScriptValue(V); \ - if (_defaultSettings || newValue != _##P) { \ + bool isValid = false; \ + T newValue = T##_convertFromScriptValue(V, isValid); \ + if (isValid && (_defaultSettings || newValue != _##P)) { \ S(newValue); \ } \ } \ @@ -145,8 +204,9 @@ inline QUuid QUuid_convertFromScriptValue(const QScriptValue& v) { return v.toVa { \ QScriptValue V = object.property(#P); \ if (V.isValid()) { \ - T newValue = T##_convertFromScriptValue(V); \ - if (_defaultSettings || newValue != G()) { \ + bool isValid = false; \ + T newValue = T##_convertFromScriptValue(V, isValid); \ + if (isValid && (_defaultSettings || newValue != G())) { \ S(newValue); \ } \ }\ @@ -158,130 +218,15 @@ inline QUuid QUuid_convertFromScriptValue(const QScriptValue& v) { return v.toVa if (G.isValid()) { \ QScriptValue V = G.property(#P); \ if (V.isValid()) { \ - T newValue = T##_convertFromScriptValue(V); \ - if (_defaultSettings || newValue != _##P) { \ + bool isValid = false; \ + T newValue = T##_convertFromScriptValue(V, isValid); \ + if (isValid && (_defaultSettings || newValue != _##P)) { \ S(newValue); \ } \ } \ } \ } -#define COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(P, S) \ - QScriptValue P = object.property(#P); \ - if (P.isValid()) { \ - QScriptValue x = P.property("x"); \ - QScriptValue y = P.property("y"); \ - QScriptValue z = P.property("z"); \ - if (x.isValid() && y.isValid() && z.isValid()) { \ - glm::vec3 newValue; \ - newValue.x = x.toVariant().toFloat(); \ - newValue.y = y.toVariant().toFloat(); \ - newValue.z = z.toVariant().toFloat(); \ - bool isValid = !glm::isnan(newValue.x) && \ - !glm::isnan(newValue.y) && \ - !glm::isnan(newValue.z); \ - if (isValid && \ - (_defaultSettings || newValue != _##P)) { \ - S(newValue); \ - } \ - } \ - } - -#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_VEC3(G, P, S) \ - { \ - QScriptValue G = object.property(#G); \ - if (G.isValid()) { \ - QScriptValue P = G.property(#P); \ - if (P.isValid()) { \ - QScriptValue x = P.property("x"); \ - QScriptValue y = P.property("y"); \ - QScriptValue z = P.property("z"); \ - if (x.isValid() && y.isValid() && z.isValid()) { \ - glm::vec3 newValue; \ - newValue.x = x.toVariant().toFloat(); \ - newValue.y = y.toVariant().toFloat(); \ - newValue.z = z.toVariant().toFloat(); \ - bool isValid = !glm::isnan(newValue.x) && \ - !glm::isnan(newValue.y) && \ - !glm::isnan(newValue.z); \ - if (isValid && \ - (_defaultSettings || newValue != _##P)) { \ - S(newValue); \ - } \ - } \ - } \ - } \ - } - -#define COPY_PROPERTY_FROM_QSCRIPTVALUE_QUAT(P, S) \ - QScriptValue P = object.property(#P); \ - if (P.isValid()) { \ - QScriptValue x = P.property("x"); \ - QScriptValue y = P.property("y"); \ - QScriptValue z = P.property("z"); \ - QScriptValue w = P.property("w"); \ - if (x.isValid() && y.isValid() && z.isValid() && w.isValid()) { \ - glm::quat newValue; \ - newValue.x = x.toVariant().toFloat(); \ - newValue.y = y.toVariant().toFloat(); \ - newValue.z = z.toVariant().toFloat(); \ - newValue.w = w.toVariant().toFloat(); \ - bool isValid = !glm::isnan(newValue.x) && \ - !glm::isnan(newValue.y) && \ - !glm::isnan(newValue.z) && \ - !glm::isnan(newValue.w); \ - if (isValid && \ - (_defaultSettings || newValue != _##P)) { \ - S(newValue); \ - } \ - } \ - } - -#define COPY_PROPERTY_FROM_QSCRIPTVALUE_COLOR(P, S) \ - QScriptValue P = object.property(#P); \ - if (P.isValid()) { \ - QScriptValue r = P.property("red"); \ - QScriptValue g = P.property("green"); \ - QScriptValue b = P.property("blue"); \ - if (r.isValid() && g.isValid() && b.isValid()) {\ - xColor newColor; \ - newColor.red = r.toVariant().toInt(); \ - newColor.green = g.toVariant().toInt(); \ - newColor.blue = b.toVariant().toInt(); \ - if (_defaultSettings || \ - (newColor.red != _color.red || \ - newColor.green != _color.green || \ - newColor.blue != _color.blue)) { \ - S(newColor); \ - } \ - } \ - } - -#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_COLOR(G, P, S) \ - { \ - QScriptValue G = object.property(#G); \ - if (G.isValid()) { \ - QScriptValue P = G.property(#P); \ - if (P.isValid()) { \ - QScriptValue r = P.property("red"); \ - QScriptValue g = P.property("green"); \ - QScriptValue b = P.property("blue"); \ - if (r.isValid() && g.isValid() && b.isValid()) {\ - xColor newColor; \ - newColor.red = r.toVariant().toInt(); \ - newColor.green = g.toVariant().toInt(); \ - newColor.blue = b.toVariant().toInt(); \ - if (_defaultSettings || \ - (newColor.red != _color.red || \ - newColor.green != _color.green || \ - newColor.blue != _color.blue)) { \ - S(newColor); \ - } \ - } \ - } \ - } \ - } - #define COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(P, S) \ QScriptValue P = object.property(#P); \ if (P.isValid()) { \ diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index ff0b0242f8..5be7c1eb49 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -26,7 +26,7 @@ void SkyboxPropertyGroup::copyToScriptValue(QScriptValue& properties, QScriptEng } void SkyboxPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_COLOR(skybox, color, setColor); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, color, xColor, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, url, QString, setURL); }