From 4fa5447c85a10a9a67623c7a66bf3f12cd63cbb8 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 12 Nov 2014 12:13:57 -0800 Subject: [PATCH 1/5] Add overlay getProperty() for text overlay "text" property --- examples/overlaysExample.js | 3 +++ interface/src/ui/overlays/Overlay.cpp | 4 ++++ interface/src/ui/overlays/Overlay.h | 1 + interface/src/ui/overlays/Overlay2D.cpp | 4 ++++ interface/src/ui/overlays/Overlay2D.h | 1 + interface/src/ui/overlays/Overlays.cpp | 14 ++++++++++++++ interface/src/ui/overlays/Overlays.h | 3 +++ interface/src/ui/overlays/TextOverlay.cpp | 9 +++++++++ interface/src/ui/overlays/TextOverlay.h | 1 + 9 files changed, 40 insertions(+) diff --git a/examples/overlaysExample.js b/examples/overlaysExample.js index fef502c761..e087bd3e3a 100644 --- a/examples/overlaysExample.js +++ b/examples/overlaysExample.js @@ -166,6 +166,9 @@ var clipboardPreview = Overlays.addOverlay("clipboard", { visible: true }); +// Demonstrate retrieving overlay properties +print("Text overlay text property value =\n" + Overlays.getProperty(text, "text")); +print("Text overlay unknown property vale =\n" + Overlays.getProperty(text, "unknown")); // value = undefined // When our script shuts down, we should clean up all of our overlays function scriptEnding() { diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index 215119374e..762cf28dfd 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -104,6 +104,10 @@ void Overlay::setProperties(const QScriptValue& properties) { } } +QScriptValue Overlay::getProperty(const QString& property) { + return QScriptValue(); +} + xColor Overlay::getColor() { if (_colorPulse == 0.0f) { return _color; diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 81ddaf1a91..4752b33a4e 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -77,6 +77,7 @@ public: void setAlphaPulse(float value) { _alphaPulse = value; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); protected: float updatePulse(); diff --git a/interface/src/ui/overlays/Overlay2D.cpp b/interface/src/ui/overlays/Overlay2D.cpp index 0bdb8790cc..5a42a4fc2b 100644 --- a/interface/src/ui/overlays/Overlay2D.cpp +++ b/interface/src/ui/overlays/Overlay2D.cpp @@ -64,3 +64,7 @@ void Overlay2D::setProperties(const QScriptValue& properties) { //qDebug() << "set bounds to " << getBounds(); } } + +QScriptValue Overlay2D::getProperty(const QString& property) { + return Overlay::getProperty(property); +} diff --git a/interface/src/ui/overlays/Overlay2D.h b/interface/src/ui/overlays/Overlay2D.h index 283e7b7b23..d0d75c9397 100644 --- a/interface/src/ui/overlays/Overlay2D.h +++ b/interface/src/ui/overlays/Overlay2D.h @@ -47,6 +47,7 @@ public: void setBounds(const QRect& bounds) { _bounds = bounds; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); protected: QRect _bounds; // where on the screen to draw diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 0192f9c216..5315a37f5d 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -241,6 +241,20 @@ unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { return 0; // not found } +QScriptValue Overlays::getProperty(unsigned int id, const QString& property) { + Overlay* thisOverlay = NULL; + QReadLocker lock(&_lock); + if (_overlays2D.contains(id)) { + thisOverlay = _overlays2D[id]; + } else if (_overlays3D.contains(id)) { + thisOverlay = _overlays3D[id]; + } + if (thisOverlay) { + return thisOverlay->getProperty(property); + } + return QScriptValue(); +} + RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray) { float bestDistance = std::numeric_limits::max(); RayToOverlayIntersectionResult result; diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 686b998267..9c1efe3a64 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -59,6 +59,9 @@ public slots: /// returns the top most 2D overlay at the screen point, or 0 if not overlay at that point unsigned int getOverlayAtPoint(const glm::vec2& point); + /// returns the value of specified property, or null if there is no such property + QScriptValue getProperty(unsigned int id, const QString& property); + /// returns details about the closest 3D Overlay hit by the pick ray RayToOverlayIntersectionResult findRayIntersection(const PickRay& ray); diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 530b30a856..3bbdd70388 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -126,3 +126,12 @@ void TextOverlay::setProperties(const QScriptValue& properties) { } +QScriptValue TextOverlay::getProperty(const QString& property) { + if (property == "text") { + return _text; + } + + return Overlay::getProperty(property); +} + + diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index f7ff83e542..d43c701582 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -52,6 +52,7 @@ public: void setFontSize(int fontSize) { _fontSize = fontSize; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); private: From 8c3bedae9d1443b6c4737351642af5a958bf27f4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 12 Nov 2014 14:33:52 -0800 Subject: [PATCH 2/5] Add position vector and color object script value examples OverlayPropertyResult type is needed to successfully move QScriptValue objects from QScriptEngine in Overlays to QScriptEngine in script. --- examples/overlaysExample.js | 13 +++++++ interface/src/Application.cpp | 4 +- interface/src/ui/overlays/Base3DOverlay.cpp | 7 ++++ interface/src/ui/overlays/Base3DOverlay.h | 1 + interface/src/ui/overlays/Overlay.cpp | 6 ++- interface/src/ui/overlays/Overlay.h | 5 ++- interface/src/ui/overlays/Overlays.cpp | 41 +++++++++++++++++++-- interface/src/ui/overlays/Overlays.h | 15 +++++++- 8 files changed, 84 insertions(+), 8 deletions(-) diff --git a/examples/overlaysExample.js b/examples/overlaysExample.js index e087bd3e3a..1dcb088d78 100644 --- a/examples/overlaysExample.js +++ b/examples/overlaysExample.js @@ -169,6 +169,19 @@ var clipboardPreview = Overlays.addOverlay("clipboard", { // Demonstrate retrieving overlay properties print("Text overlay text property value =\n" + Overlays.getProperty(text, "text")); print("Text overlay unknown property vale =\n" + Overlays.getProperty(text, "unknown")); // value = undefined +var cubePosition = Overlays.getProperty(cube, "position"); +print("Cube overlay position =\n" + + "x: " + cubePosition.x + "\n" + + "y: " + cubePosition.y + "\n" + + "z: " + cubePosition.z + ); +var cubeColor = Overlays.getProperty(cube, "color"); +print("Cube overlay color =\n" + + "red: " + cubeColor.red + "\n" + + "green: " + cubeColor.green + "\n" + + "blue: " + cubeColor.blue + ); +print("Unknown overlay property =\n" + Overlays.getProperty(1000, "text")); // value = undefined // When our script shuts down, we should clean up all of our overlays function scriptEnding() { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index bb19ce3ca5..cf64bd55d6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3888,7 +3888,9 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri connect(scriptEngine, SIGNAL(loadScript(const QString&, bool)), this, SLOT(loadScript(const QString&, bool))); scriptEngine->registerGlobalObject("Overlays", &_overlays); - qScriptRegisterMetaType(scriptEngine, RayToOverlayIntersectionResultToScriptValue, RayToOverlayIntersectionResultFromScriptValue); + qScriptRegisterMetaType(scriptEngine, OverlayPropertyResultToScriptValue, OverlayPropertyResultFromScriptValue); + qScriptRegisterMetaType(scriptEngine, RayToOverlayIntersectionResultToScriptValue, + RayToOverlayIntersectionResultFromScriptValue); QScriptValue windowValue = scriptEngine->registerGlobalObject("Window", WindowScriptingInterface::getInstance()); scriptEngine->registerGetterSetter("location", LocationScriptingInterface::locationGetter, diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 89dd4d4b01..8c26bc1493 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -118,6 +118,13 @@ void Base3DOverlay::setProperties(const QScriptValue& properties) { } } +QScriptValue Base3DOverlay::getProperty(const QString& property) { + if (property == "position") { + return vec3toScriptValue(_scriptEngine, _position); + } + return Overlay::getProperty(property); +} + bool Base3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const { return false; diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 75ce6b303d..7b7fa1a8f4 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -45,6 +45,7 @@ public: void setIgnoreRayIntersection(bool value) { _ignoreRayIntersection = value; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const; diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index 762cf28dfd..ba7269c5dc 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -39,8 +39,9 @@ Overlay::Overlay() : { } -void Overlay::init(QGLWidget* parent) { +void Overlay::init(QGLWidget* parent, QScriptEngine* scriptEngine) { _parent = parent; + _scriptEngine = scriptEngine; } @@ -105,6 +106,9 @@ void Overlay::setProperties(const QScriptValue& properties) { } QScriptValue Overlay::getProperty(const QString& property) { + if (property == "color") { + return xColorToScriptValue(_scriptEngine, _color); + } return QScriptValue(); } diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 4752b33a4e..192bb5fd40 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -19,6 +19,7 @@ #include #include +#include #include // for xColor #include @@ -36,7 +37,7 @@ public: Overlay(); ~Overlay(); - void init(QGLWidget* parent); + void init(QGLWidget* parent, QScriptEngine* scriptEngine); virtual void update(float deltatime) {} virtual void render(RenderArgs* args) = 0; @@ -101,6 +102,8 @@ protected: xColor _color; bool _visible; // should the overlay be drawn at all Anchor _anchor; + + QScriptEngine* _scriptEngine; }; diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 5315a37f5d..6fdd4e75d2 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "BillboardOverlay.h" #include "Circle3DOverlay.h" @@ -55,6 +56,7 @@ Overlays::~Overlays() { void Overlays::init(QGLWidget* parent) { _parent = parent; + _scriptEngine = new QScriptEngine(); } void Overlays::update(float deltatime) { @@ -179,7 +181,7 @@ unsigned int Overlays::addOverlay(const QString& type, const QScriptValue& prope } unsigned int Overlays::addOverlay(Overlay* overlay) { - overlay->init(_parent); + overlay->init(_parent, _scriptEngine); QWriteLocker lock(&_lock); unsigned int thisID = _nextOverlayID; @@ -241,7 +243,8 @@ unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { return 0; // not found } -QScriptValue Overlays::getProperty(unsigned int id, const QString& property) { +OverlayPropertyResult Overlays::getProperty(unsigned int id, const QString& property) { + OverlayPropertyResult result; Overlay* thisOverlay = NULL; QReadLocker lock(&_lock); if (_overlays2D.contains(id)) { @@ -250,9 +253,39 @@ QScriptValue Overlays::getProperty(unsigned int id, const QString& property) { thisOverlay = _overlays3D[id]; } if (thisOverlay) { - return thisOverlay->getProperty(property); + result.value = thisOverlay->getProperty(property); } - return QScriptValue(); + return result; +} + +OverlayPropertyResult::OverlayPropertyResult() : + value(QScriptValue()) +{ +} + +QScriptValue OverlayPropertyResultToScriptValue(QScriptEngine* engine, const OverlayPropertyResult& result) +{ + if (!result.value.isValid()) { + return QScriptValue::UndefinedValue; + } + + QScriptValue object = engine->newObject(); + if (result.value.isObject()) { + QScriptValueIterator it(result.value); + while (it.hasNext()) { + it.next(); + object.setProperty(it.name(), QScriptValue(it.value().toString())); + } + + } else { + object = result.value; + } + return object; +} + +void OverlayPropertyResultFromScriptValue(const QScriptValue& value, OverlayPropertyResult& result) +{ + result.value = value; } RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray) { diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 9c1efe3a64..ae48428bca 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -16,6 +16,17 @@ #include "Overlay.h" +class OverlayPropertyResult { +public: + OverlayPropertyResult(); + QScriptValue value; +}; + +Q_DECLARE_METATYPE(OverlayPropertyResult); + +QScriptValue OverlayPropertyResultToScriptValue(QScriptEngine* engine, const OverlayPropertyResult& value); +void OverlayPropertyResultFromScriptValue(const QScriptValue& object, OverlayPropertyResult& value); + class RayToOverlayIntersectionResult { public: RayToOverlayIntersectionResult(); @@ -27,6 +38,7 @@ public: QString extraInfo; }; + Q_DECLARE_METATYPE(RayToOverlayIntersectionResult); QScriptValue RayToOverlayIntersectionResultToScriptValue(QScriptEngine* engine, const RayToOverlayIntersectionResult& value); @@ -60,7 +72,7 @@ public slots: unsigned int getOverlayAtPoint(const glm::vec2& point); /// returns the value of specified property, or null if there is no such property - QScriptValue getProperty(unsigned int id, const QString& property); + OverlayPropertyResult getProperty(unsigned int id, const QString& property); /// returns details about the closest 3D Overlay hit by the pick ray RayToOverlayIntersectionResult findRayIntersection(const PickRay& ray); @@ -76,6 +88,7 @@ private: QGLWidget* _parent; QReadWriteLock _lock; QReadWriteLock _deleteLock; + QScriptEngine* _scriptEngine; }; From 725d56d41f23dbe8a7af73e3dc79e778e90971a2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 12 Nov 2014 16:50:13 -0800 Subject: [PATCH 3/5] Add property getting for all 2D overlays --- examples/overlaysExample.js | 14 +++++++++- interface/src/ui/overlays/ImageOverlay.cpp | 14 ++++++++++ interface/src/ui/overlays/ImageOverlay.h | 1 + interface/src/ui/overlays/Overlay.cpp | 31 ++++++++++++++++++++++ interface/src/ui/overlays/Overlay2D.cpp | 21 +++++++++++++++ interface/src/ui/overlays/TextOverlay.cpp | 17 ++++++++++-- 6 files changed, 95 insertions(+), 3 deletions(-) diff --git a/examples/overlaysExample.js b/examples/overlaysExample.js index 1dcb088d78..d64a29046a 100644 --- a/examples/overlaysExample.js +++ b/examples/overlaysExample.js @@ -168,7 +168,19 @@ var clipboardPreview = Overlays.addOverlay("clipboard", { // Demonstrate retrieving overlay properties print("Text overlay text property value =\n" + Overlays.getProperty(text, "text")); -print("Text overlay unknown property vale =\n" + Overlays.getProperty(text, "unknown")); // value = undefined +print("Text overlay alpha =\n" + Overlays.getProperty(text, "alpha")); +print("Text overlay visible =\n" + Overlays.getProperty(text, "visible")); +print("Text overlay font size =\n" + Overlays.getProperty(text, "font").size); +print("Text overlay anchor =\n" + Overlays.getProperty(text, "anchor")); +print("Text overlay unknown property value =\n" + Overlays.getProperty(text, "unknown")); // value = undefined +var sliderBounds = Overlays.getProperty(slider, "bounds"); +print("Slider overlay bounds =\n" + + "x: " + sliderBounds.x + "\n" + + "y: " + sliderBounds.y + "\n" + + "width: " + sliderBounds.width + "\n" + + "height: " + sliderBounds.height + ); + var cubePosition = Overlays.getProperty(cube, "position"); print("Cube overlay position =\n" + "x: " + cubePosition.x + "\n" diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 3b9d95af2e..f2e93c2e0e 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -151,4 +151,18 @@ void ImageOverlay::setProperties(const QScriptValue& properties) { } } +QScriptValue ImageOverlay::getProperty(const QString& property) { + if (property == "subImage") { + QScriptValue subImage = _scriptEngine->newObject(); + subImage.setProperty("x", _fromImage.x()); + subImage.setProperty("y", _fromImage.y()); + subImage.setProperty("width", _fromImage.width()); + subImage.setProperty("height", _fromImage.height()); + return subImage; + } + if (property == "imageURL") { + return _imageURL.toString(); + } + return Overlay2D::getProperty(property); +} diff --git a/interface/src/ui/overlays/ImageOverlay.h b/interface/src/ui/overlays/ImageOverlay.h index ef1ead8c02..bf4f2860ad 100644 --- a/interface/src/ui/overlays/ImageOverlay.h +++ b/interface/src/ui/overlays/ImageOverlay.h @@ -44,6 +44,7 @@ public: void setClipFromSource(const QRect& bounds) { _fromImage = bounds; _wantClipFromImage = true; } void setImageURL(const QUrl& url); virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); private slots: void replyFinished(); // we actually want to hide this... diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index ba7269c5dc..a7c38946b7 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -109,6 +109,37 @@ QScriptValue Overlay::getProperty(const QString& property) { if (property == "color") { return xColorToScriptValue(_scriptEngine, _color); } + if (property == "alpha") { + return _alpha; + } + if (property == "glowLevel") { + return _glowLevel; + } + if (property == "pulseMax") { + return _pulseMax; + } + if (property == "pulseMin") { + return _pulseMin; + } + if (property == "pulsePeriod") { + return _pulsePeriod; + } + if (property == "glowLevelPulse") { + return _glowLevelPulse; + } + if (property == "alphaPulse") { + return _alphaPulse; + } + if (property == "colorPulse") { + return _colorPulse; + } + if (property == "visible") { + return _visible; + } + if (property == "anchor") { + return _anchor == MY_AVATAR ? "MyAvatar" : ""; + } + return QScriptValue(); } diff --git a/interface/src/ui/overlays/Overlay2D.cpp b/interface/src/ui/overlays/Overlay2D.cpp index 5a42a4fc2b..d71f8cac05 100644 --- a/interface/src/ui/overlays/Overlay2D.cpp +++ b/interface/src/ui/overlays/Overlay2D.cpp @@ -66,5 +66,26 @@ void Overlay2D::setProperties(const QScriptValue& properties) { } QScriptValue Overlay2D::getProperty(const QString& property) { + if (property == "bounds") { + QScriptValue bounds = _scriptEngine->newObject(); + bounds.setProperty("x", _bounds.x()); + bounds.setProperty("y", _bounds.y()); + bounds.setProperty("width", _bounds.width()); + bounds.setProperty("height", _bounds.height()); + return bounds; + } + if (property == "x") { + return _bounds.x(); + } + if (property == "y") { + return _bounds.y(); + } + if (property == "width") { + return _bounds.width(); + } + if (property == "height") { + return _bounds.height(); + } + return Overlay::getProperty(property); } diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 3bbdd70388..a17d381a85 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -125,13 +125,26 @@ void TextOverlay::setProperties(const QScriptValue& properties) { } } - QScriptValue TextOverlay::getProperty(const QString& property) { + if (property == "font") { + QScriptValue font = _scriptEngine->newObject(); + font.setProperty("size", _fontSize); + return font; + } if (property == "text") { return _text; } + if (property == "backgroundColor") { + return xColorToScriptValue(_scriptEngine, _backgroundColor); + } + if (property == "leftMargin") { + return _leftMargin; + } + if (property == "topMargin") { + return _topMargin; + } - return Overlay::getProperty(property); + return Overlay2D::getProperty(property); } From 9e19641a1d8987fef54eb907a3710e0e1365d561 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 12 Nov 2014 21:05:44 -0800 Subject: [PATCH 4/5] Add property getting for all 3D overlays --- examples/overlaysExample.js | 14 +++++++ interface/src/ui/overlays/Base3DOverlay.cpp | 21 +++++++++- .../src/ui/overlays/BillboardOverlay.cpp | 22 +++++++++++ interface/src/ui/overlays/BillboardOverlay.h | 1 + interface/src/ui/overlays/Circle3DOverlay.cpp | 39 +++++++++++++++++++ interface/src/ui/overlays/Circle3DOverlay.h | 1 + interface/src/ui/overlays/Grid3DOverlay.cpp | 11 ++++++ interface/src/ui/overlays/Grid3DOverlay.h | 1 + interface/src/ui/overlays/Line3DOverlay.cpp | 8 ++++ interface/src/ui/overlays/Line3DOverlay.h | 1 + .../src/ui/overlays/LocalVoxelsOverlay.cpp | 11 ++++++ .../src/ui/overlays/LocalVoxelsOverlay.h | 3 +- interface/src/ui/overlays/ModelOverlay.cpp | 31 +++++++++++++++ interface/src/ui/overlays/ModelOverlay.h | 2 + interface/src/ui/overlays/Planar3DOverlay.cpp | 8 ++++ interface/src/ui/overlays/Planar3DOverlay.h | 1 + interface/src/ui/overlays/Text3DOverlay.cpp | 27 +++++++++++++ interface/src/ui/overlays/Text3DOverlay.h | 1 + interface/src/ui/overlays/Volume3DOverlay.cpp | 8 ++++ interface/src/ui/overlays/Volume3DOverlay.h | 1 + 20 files changed, 210 insertions(+), 2 deletions(-) diff --git a/examples/overlaysExample.js b/examples/overlaysExample.js index d64a29046a..5c7793185b 100644 --- a/examples/overlaysExample.js +++ b/examples/overlaysExample.js @@ -193,6 +193,20 @@ print("Cube overlay color =\n" + "green: " + cubeColor.green + "\n" + "blue: " + cubeColor.blue ); +var modelOverlayProperties = { + textures: { + filename1: "http://url1", + filename2: "http://url2" + } +} +var modelOverlay = Overlays.addOverlay("model", modelOverlayProperties); +var textures = Overlays.getProperty(modelOverlay, "textures"); +var textureValues = ""; +for (key in textures) { + textureValues += "\n" + key + ": " + textures[key]; +} +print("Model overlay textures =" + textureValues); +Overlays.deleteOverlay(modelOverlay); print("Unknown overlay property =\n" + Overlays.getProperty(1000, "text")); // value = undefined // When our script shuts down, we should clean up all of our overlays diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 8c26bc1493..a83772d01b 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -119,9 +119,28 @@ void Base3DOverlay::setProperties(const QScriptValue& properties) { } QScriptValue Base3DOverlay::getProperty(const QString& property) { - if (property == "position") { + if (property == "position" || property == "start" || property == "p1" || property == "point") { return vec3toScriptValue(_scriptEngine, _position); } + if (property == "lineWidth") { + return _lineWidth; + } + if (property == "rotation") { + return quatToScriptValue(_scriptEngine, _rotation); + } + if (property == "isSolid" || property == "isFilled" || property == "solid" || property == "filed") { + return _isSolid; + } + if (property == "isWire" || property == "wire") { + return !_isSolid; + } + if (property == "isDashedLine" || property == "dashed") { + return _isDashedLine; + } + if (property == "ignoreRayIntersection") { + return _ignoreRayIntersection; + } + return Overlay::getProperty(property); } diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index c8d4877bb5..87b6dcc1c8 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -157,6 +157,28 @@ void BillboardOverlay::setProperties(const QScriptValue &properties) { } } +QScriptValue BillboardOverlay::getProperty(const QString& property) { + if (property == "url") { + return _url; + } + if (property == "subImage") { + QScriptValue subImage = _scriptEngine->newObject(); + subImage.setProperty("x", _fromImage.x()); + subImage.setProperty("y", _fromImage.y()); + subImage.setProperty("width", _fromImage.width()); + subImage.setProperty("height", _fromImage.height()); + return subImage; + } + if (property == "scale") { + return _scale; + } + if (property == "isFacingAvatar") { + return _isFacingAvatar; + } + + return Base3DOverlay::getProperty(property); +} + void BillboardOverlay::setURL(const QString& url) { setBillboardURL(url); } diff --git a/interface/src/ui/overlays/BillboardOverlay.h b/interface/src/ui/overlays/BillboardOverlay.h index 018ca5f5cf..3a22a247f0 100644 --- a/interface/src/ui/overlays/BillboardOverlay.h +++ b/interface/src/ui/overlays/BillboardOverlay.h @@ -32,6 +32,7 @@ public: virtual void setProperties(const QScriptValue& properties); void setClipFromSource(const QRect& bounds) { _fromImage = bounds; } + virtual QScriptValue getProperty(const QString& property); virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const; diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 144119c450..986088cebb 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -299,6 +299,45 @@ void Circle3DOverlay::setProperties(const QScriptValue &properties) { } } +QScriptValue Circle3DOverlay::getProperty(const QString& property) { + if (property == "startAt") { + return _startAt; + } + if (property == "endAt") { + return _endAt; + } + if (property == "outerRadius") { + return _outerRadius; + } + if (property == "innerRadius") { + return _innerRadius; + } + if (property == "hasTickMarks") { + return _hasTickMarks; + } + if (property == "majorTickMarksAngle") { + return _majorTickMarksAngle; + } + if (property == "minorTickMarksAngle") { + return _minorTickMarksAngle; + } + if (property == "majorTickMarksLength") { + return _majorTickMarksLength; + } + if (property == "minorTickMarksLength") { + return _minorTickMarksLength; + } + if (property == "majorTickMarksColor") { + return xColorToScriptValue(_scriptEngine, _majorTickMarksColor); + } + if (property == "minorTickMarksColor") { + return xColorToScriptValue(_scriptEngine, _minorTickMarksColor); + } + + return Planar3DOverlay::getProperty(property); +} + + bool Circle3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const { diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index 191a0d3100..816ed280f9 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -21,6 +21,7 @@ public: ~Circle3DOverlay(); virtual void render(RenderArgs* args); virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); float getStartAt() const { return _startAt; } float getEndAt() const { return _endAt; } diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index c628199fe3..dee5d5d60a 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -116,3 +116,14 @@ void Grid3DOverlay::setProperties(const QScriptValue& properties) { _majorGridEvery = properties.property("majorGridEvery").toVariant().toInt(); } } + +QScriptValue Grid3DOverlay::getProperty(const QString& property) { + if (property == "minorGridWidth") { + return _minorGridWidth; + } + if (property == "majorGridEvery") { + return _majorGridEvery; + } + + return Base3DOverlay::getProperty(property); +} diff --git a/interface/src/ui/overlays/Grid3DOverlay.h b/interface/src/ui/overlays/Grid3DOverlay.h index b1675f15d7..3e6a235d54 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.h +++ b/interface/src/ui/overlays/Grid3DOverlay.h @@ -33,6 +33,7 @@ public: virtual void render(RenderArgs* args); virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); private: float _minorGridWidth; diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 18671ea074..896ebd1e68 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -79,3 +79,11 @@ void Line3DOverlay::setProperties(const QScriptValue& properties) { } } } + +QScriptValue Line3DOverlay::getProperty(const QString& property) { + if (property == "end" || property == "endPoint" || property == "p2") { + return vec3toScriptValue(_scriptEngine, _end); + } + + return Base3DOverlay::getProperty(property); +} diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index f9c4e0d6d6..0148648c35 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -28,6 +28,7 @@ public: void setEnd(const glm::vec3& end) { _end = end; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); protected: glm::vec3 _end; diff --git a/interface/src/ui/overlays/LocalVoxelsOverlay.cpp b/interface/src/ui/overlays/LocalVoxelsOverlay.cpp index dcfc79f3b4..3ca79d548c 100644 --- a/interface/src/ui/overlays/LocalVoxelsOverlay.cpp +++ b/interface/src/ui/overlays/LocalVoxelsOverlay.cpp @@ -103,3 +103,14 @@ void LocalVoxelsOverlay::setProperties(const QScriptValue &properties) { } } +QScriptValue LocalVoxelsOverlay::getProperty(const QString& property) { + if (property == "scale") { + return vec3toScriptValue(_scriptEngine, getDimensions()); + } + if (property == "name") { + return _treeName; + } + + return Volume3DOverlay::getProperty(property); +} + diff --git a/interface/src/ui/overlays/LocalVoxelsOverlay.h b/interface/src/ui/overlays/LocalVoxelsOverlay.h index 46a88407af..25ad4738b9 100644 --- a/interface/src/ui/overlays/LocalVoxelsOverlay.h +++ b/interface/src/ui/overlays/LocalVoxelsOverlay.h @@ -38,7 +38,8 @@ public: virtual void render(RenderArgs* args); virtual void setProperties(const QScriptValue& properties); - + virtual QScriptValue getProperty(const QString& property); + private: static QMap _voxelSystemMap; // treeName/voxelSystem diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 150d40f15a..a2abfe77b1 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -14,6 +14,7 @@ ModelOverlay::ModelOverlay() : _model(), + _modelTextures(QVariantMap()), _scale(1.0f), _updateModel(false) { @@ -114,6 +115,8 @@ void ModelOverlay::setProperties(const QScriptValue &properties) { QMetaObject::invokeMethod(&_model, "setTextureWithNameToURL", Qt::AutoConnection, Q_ARG(const QString&, key), Q_ARG(const QUrl&, newTextureURL)); + + _modelTextures[key] = newTextureURL; // Keep local track of textures for getProperty() } } @@ -122,6 +125,34 @@ void ModelOverlay::setProperties(const QScriptValue &properties) { } } +QScriptValue ModelOverlay::getProperty(const QString& property) { + if (property == "url") { + return _url.toString(); + } + if (property == "scale") { + return _scale; + } + if (property == "rotation") { + return quatToScriptValue(_scriptEngine, _rotation); + } + if (property == "dimensions") { + return vec3toScriptValue(_scriptEngine, _model.getScaleToFitDimensions()); + } + if (property == "textures") { + if (_modelTextures.size() > 0) { + QScriptValue textures = _scriptEngine->newObject(); + foreach(const QString& key, _modelTextures.keys()) { + textures.setProperty(key, _modelTextures[key].toString()); + } + return textures; + } else { + return QScriptValue(); + } + } + + return Base3DOverlay::getProperty(property); +} + bool ModelOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const { diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index 26471a79e1..c9f6799e8c 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -24,6 +24,7 @@ public: virtual void update(float deltatime); virtual void render(RenderArgs* args); virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const; virtual bool findRayIntersectionExtraInfo(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, QString& extraInfo) const; @@ -31,6 +32,7 @@ public: private: Model _model; + QVariantMap _modelTextures; QUrl _url; glm::quat _rotation; diff --git a/interface/src/ui/overlays/Planar3DOverlay.cpp b/interface/src/ui/overlays/Planar3DOverlay.cpp index 91a3a023f7..b2de7bdaad 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.cpp +++ b/interface/src/ui/overlays/Planar3DOverlay.cpp @@ -77,6 +77,14 @@ void Planar3DOverlay::setProperties(const QScriptValue& properties) { } } +QScriptValue Planar3DOverlay::getProperty(const QString& property) { + if (property == "dimensions" || property == "scale" || property == "size") { + return vec2toScriptValue(_scriptEngine, _dimensions); + } + + Base3DOverlay::getProperty(property); +} + bool Planar3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const { diff --git a/interface/src/ui/overlays/Planar3DOverlay.h b/interface/src/ui/overlays/Planar3DOverlay.h index ee4bb3e05a..fe73cfbe08 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.h +++ b/interface/src/ui/overlays/Planar3DOverlay.h @@ -36,6 +36,7 @@ public: void setDimensions(const glm::vec2& value) { _dimensions = value; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index d8febbf0eb..ae21e4a8d4 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -179,4 +179,31 @@ void Text3DOverlay::setProperties(const QScriptValue& properties) { } +QScriptValue Text3DOverlay::getProperty(const QString& property) { + if (property == "text") { + return _text; + } + if (property == "backgroundColor") { + return xColorToScriptValue(_scriptEngine, _backgroundColor); + } + if (property == "lineHeight") { + return _lineHeight; + } + if (property == "leftMargin") { + return _leftMargin; + } + if (property == "topMargin") { + return _topMargin; + } + if (property == "rightMargin") { + return _rightMargin; + } + if (property == "bottomMargin") { + return _bottomMargin; + } + if (property == "isFacingAvatar") { + return _isFacingAvatar; + } + return Planar3DOverlay::getProperty(property); +} diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index 45e311c554..ff5575c20c 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -47,6 +47,7 @@ public: void setIsFacingAvatar(bool isFacingAvatar) { _isFacingAvatar = isFacingAvatar; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); private: void enableClipPlane(GLenum plane, float x, float y, float z, float w); diff --git a/interface/src/ui/overlays/Volume3DOverlay.cpp b/interface/src/ui/overlays/Volume3DOverlay.cpp index cc12d41e2e..0940caea04 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.cpp +++ b/interface/src/ui/overlays/Volume3DOverlay.cpp @@ -85,6 +85,14 @@ void Volume3DOverlay::setProperties(const QScriptValue& properties) { } } +QScriptValue Volume3DOverlay::getProperty(const QString& property) { + if (property == "dimensions" || property == "scale" || property == "size") { + return vec3toScriptValue(_scriptEngine, _dimensions); + } + + return Base3DOverlay::getProperty(property); +} + bool Volume3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const { diff --git a/interface/src/ui/overlays/Volume3DOverlay.h b/interface/src/ui/overlays/Volume3DOverlay.h index 7cde169c30..8787759022 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.h +++ b/interface/src/ui/overlays/Volume3DOverlay.h @@ -38,6 +38,7 @@ public: void setDimensions(const glm::vec3& value) { _dimensions = value; } virtual void setProperties(const QScriptValue& properties); + virtual QScriptValue getProperty(const QString& property); virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) const; From fac6b6b4267717c53b2270138bcfe2a715c4c532 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 12 Nov 2014 21:32:55 -0800 Subject: [PATCH 5/5] Refactor QRect conversion to QScriptValue --- interface/src/ui/overlays/BillboardOverlay.cpp | 7 +------ interface/src/ui/overlays/ImageOverlay.cpp | 7 +------ interface/src/ui/overlays/Overlay2D.cpp | 7 +------ libraries/shared/src/RegisteredMetaTypes.cpp | 18 ++++++++++++++++++ libraries/shared/src/RegisteredMetaTypes.h | 3 +++ 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index 87b6dcc1c8..b36202cb04 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -162,12 +162,7 @@ QScriptValue BillboardOverlay::getProperty(const QString& property) { return _url; } if (property == "subImage") { - QScriptValue subImage = _scriptEngine->newObject(); - subImage.setProperty("x", _fromImage.x()); - subImage.setProperty("y", _fromImage.y()); - subImage.setProperty("width", _fromImage.width()); - subImage.setProperty("height", _fromImage.height()); - return subImage; + return qRectToScriptValue(_scriptEngine, _fromImage); } if (property == "scale") { return _scale; diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index f2e93c2e0e..615872e6ef 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -153,12 +153,7 @@ void ImageOverlay::setProperties(const QScriptValue& properties) { QScriptValue ImageOverlay::getProperty(const QString& property) { if (property == "subImage") { - QScriptValue subImage = _scriptEngine->newObject(); - subImage.setProperty("x", _fromImage.x()); - subImage.setProperty("y", _fromImage.y()); - subImage.setProperty("width", _fromImage.width()); - subImage.setProperty("height", _fromImage.height()); - return subImage; + return qRectToScriptValue(_scriptEngine, _fromImage); } if (property == "imageURL") { return _imageURL.toString(); diff --git a/interface/src/ui/overlays/Overlay2D.cpp b/interface/src/ui/overlays/Overlay2D.cpp index d71f8cac05..b7c0a3a3e4 100644 --- a/interface/src/ui/overlays/Overlay2D.cpp +++ b/interface/src/ui/overlays/Overlay2D.cpp @@ -67,12 +67,7 @@ void Overlay2D::setProperties(const QScriptValue& properties) { QScriptValue Overlay2D::getProperty(const QString& property) { if (property == "bounds") { - QScriptValue bounds = _scriptEngine->newObject(); - bounds.setProperty("x", _bounds.x()); - bounds.setProperty("y", _bounds.y()); - bounds.setProperty("width", _bounds.width()); - bounds.setProperty("height", _bounds.height()); - return bounds; + return qRectToScriptValue(_scriptEngine, _bounds); } if (property == "x") { return _bounds.x(); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 5867e2ef43..02b9d5c927 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -30,6 +31,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, vec3toScriptValue, vec3FromScriptValue); qScriptRegisterMetaType(engine, vec2toScriptValue, vec2FromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); + qScriptRegisterMetaType(engine, qRectToScriptValue, qRectFromScriptValue); qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue); qScriptRegisterMetaType(engine, qColorToScriptValue, qColorFromScriptValue); qScriptRegisterMetaType(engine, qURLToScriptValue, qURLFromScriptValue); @@ -96,6 +98,22 @@ void quatFromScriptValue(const QScriptValue &object, glm::quat& quat) { quat.w = object.property("w").toVariant().toFloat(); } +QScriptValue qRectToScriptValue(QScriptEngine* engine, const QRect& rect) { + QScriptValue obj = engine->newObject(); + obj.setProperty("x", rect.x()); + obj.setProperty("y", rect.y()); + obj.setProperty("width", rect.width()); + obj.setProperty("height", rect.height()); + return obj; +} + +void qRectFromScriptValue(const QScriptValue &object, QRect& rect) { + rect.setX(object.property("x").toVariant().toInt()); + rect.setY(object.property("y").toVariant().toInt()); + rect.setWidth(object.property("width").toVariant().toInt()); + rect.setHeight(object.property("height").toVariant().toInt()); +} + QScriptValue xColorToScriptValue(QScriptEngine *engine, const xColor& color) { QScriptValue obj = engine->newObject(); obj.setProperty("red", color.red); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index b8884be845..0fd3138b06 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -42,6 +42,9 @@ void vec2FromScriptValue(const QScriptValue &object, glm::vec2 &vec2); QScriptValue quatToScriptValue(QScriptEngine* engine, const glm::quat& quat); void quatFromScriptValue(const QScriptValue &object, glm::quat& quat); +QScriptValue qRectToScriptValue(QScriptEngine* engine, const QRect& rect); +void qRectFromScriptValue(const QScriptValue& object, QRect& rect); + QScriptValue xColorToScriptValue(QScriptEngine* engine, const xColor& color); void xColorFromScriptValue(const QScriptValue &object, xColor& color);