From 6bb21b7a486608f4e7ad04f0ef0e23688e3c17f5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 22 Jun 2015 15:07:43 -0700 Subject: [PATCH 1/9] Use dynamic_pointer_cast instead of static_cast --- interface/src/ui/overlays/OverlaysPayload.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index bcfba67313..4f94d9f34b 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -35,8 +35,8 @@ namespace render { template <> const ItemKey payloadGetKey(const Overlay::Pointer& overlay) { - if (overlay->is3D() && !static_cast(overlay.get())->getDrawOnHUD()) { - if (static_cast(overlay.get())->getDrawInFront()) { + if (overlay->is3D() && !std::dynamic_pointer_cast(overlay)->getDrawOnHUD()) { + if (std::dynamic_pointer_cast(overlay)->getDrawInFront()) { return ItemKey::Builder().withTypeShape().withLayered().build(); } else { return ItemKey::Builder::opaqueShape(); @@ -47,9 +47,9 @@ namespace render { } template <> const Item::Bound payloadGetBound(const Overlay::Pointer& overlay) { if (overlay->is3D()) { - return static_cast(overlay.get())->getBounds(); + return std::dynamic_pointer_cast(overlay)->getBounds(); } else { - QRect bounds = static_cast(overlay.get())->getBounds(); + QRect bounds = std::dynamic_pointer_cast(overlay)->getBounds(); return AABox(glm::vec3(bounds.x(), bounds.y(), 0.0f), glm::vec3(bounds.width(), bounds.height(), 0.1f)); } } @@ -59,7 +59,7 @@ namespace render { const int LAYER_3D_FRONT = 1; const int LAYER_3D = 0; if (overlay->is3D()) { - return (static_cast(overlay.get())->getDrawInFront() ? LAYER_3D_FRONT : LAYER_3D); + return (std::dynamic_pointer_cast(overlay)->getDrawInFront() ? LAYER_3D_FRONT : LAYER_3D); } else { return LAYER_2D; } From e8da8e374cf17f4d603df7026d6426fead4691ad Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 22 Jun 2015 15:10:48 -0700 Subject: [PATCH 2/9] Simplify Overlays payloadGetBounds --- interface/src/ui/overlays/Overlay.h | 2 ++ interface/src/ui/overlays/OverlaysPayload.cpp | 7 +------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 0264c6e3c0..c2f94050ec 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -47,6 +47,8 @@ public: void init(QScriptEngine* scriptEngine); virtual void update(float deltatime) {} virtual void render(RenderArgs* args) = 0; + + virtual AABox getBounds() const = 0; virtual bool addToScene(Overlay::Pointer overlay, std::shared_ptr scene, render::PendingChanges& pendingChanges); virtual void removeFromScene(Overlay::Pointer overlay, std::shared_ptr scene, render::PendingChanges& pendingChanges); diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 4f94d9f34b..b7cacef80c 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -46,12 +46,7 @@ namespace render { } } template <> const Item::Bound payloadGetBound(const Overlay::Pointer& overlay) { - if (overlay->is3D()) { - return std::dynamic_pointer_cast(overlay)->getBounds(); - } else { - QRect bounds = std::dynamic_pointer_cast(overlay)->getBounds(); - return AABox(glm::vec3(bounds.x(), bounds.y(), 0.0f), glm::vec3(bounds.width(), bounds.height(), 0.1f)); - } + return overlay->getBounds(); } template <> int payloadGetLayer(const Overlay::Pointer& overlay) { // MAgic number while we are defining the layering mechanism: From c22f1aa7e100033c9ac578137bd5ff845ddeb2b2 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 22 Jun 2015 15:24:54 -0700 Subject: [PATCH 3/9] Overlay2D return correct getBounds --- interface/src/ui/overlays/Overlay2D.cpp | 7 ++++++- interface/src/ui/overlays/Overlay2D.h | 6 ++++-- interface/src/ui/overlays/Overlays.cpp | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/Overlay2D.cpp b/interface/src/ui/overlays/Overlay2D.cpp index f60d44a472..10131ab7a6 100644 --- a/interface/src/ui/overlays/Overlay2D.cpp +++ b/interface/src/ui/overlays/Overlay2D.cpp @@ -28,6 +28,11 @@ Overlay2D::Overlay2D(const Overlay2D* overlay2D) : Overlay2D::~Overlay2D() { } +AABox Overlay2D::getBounds() const { + return AABox(glm::vec3(_bounds.x(), _bounds.y(), 0.0f), + glm::vec3(_bounds.width(), _bounds.height(), 0.01f)); +} + void Overlay2D::setProperties(const QScriptValue& properties) { Overlay::setProperties(properties); @@ -40,7 +45,7 @@ void Overlay2D::setProperties(const QScriptValue& properties) { boundsRect.setHeight(bounds.property("height").toVariant().toInt()); setBounds(boundsRect); } else { - QRect oldBounds = getBounds(); + QRect oldBounds = _bounds; QRect newBounds = oldBounds; if (properties.property("x").isValid()) { diff --git a/interface/src/ui/overlays/Overlay2D.h b/interface/src/ui/overlays/Overlay2D.h index 20641206c2..51781ea468 100644 --- a/interface/src/ui/overlays/Overlay2D.h +++ b/interface/src/ui/overlays/Overlay2D.h @@ -30,6 +30,8 @@ public: Overlay2D(const Overlay2D* overlay2D); ~Overlay2D(); + virtual AABox getBounds() const; + virtual bool is3D() const { return false; } // getters @@ -37,8 +39,8 @@ public: int getY() const { return _bounds.y(); } int getWidth() const { return _bounds.width(); } int getHeight() const { return _bounds.height(); } - const QRect& getBounds() const { return _bounds; } - + const QRect& getBoundingRect() const { return _bounds; } + // setters void setX(int x) { _bounds.setX(x); } void setY(int y) { _bounds.setY(y); } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 1bb81319e4..b86f7fa8e6 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -284,7 +284,7 @@ unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { } else { Overlay2D* thisOverlay = static_cast(i.value().get()); if (thisOverlay->getVisible() && thisOverlay->isLoaded() && - thisOverlay->getBounds().contains(pointCopy.x, pointCopy.y, false)) { + thisOverlay->getBoundingRect().contains(pointCopy.x, pointCopy.y, false)) { return thisID; } } From 31a98c5b40cf36ec9b7fe5d711e375750836805a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 22 Jun 2015 15:35:49 -0700 Subject: [PATCH 4/9] Replace pos/rot by a transform in Base3DOverlay Also keep getBounds a pure virtual methods --- interface/src/ui/overlays/Base3DOverlay.cpp | 18 +++-------------- interface/src/ui/overlays/Base3DOverlay.h | 22 ++++++++++++--------- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index db252d8a04..06e26e0781 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -16,15 +16,12 @@ #include "Application.h" #include "Base3DOverlay.h" -const glm::vec3 DEFAULT_POSITION = glm::vec3(0.0f, 0.0f, 0.0f); const float DEFAULT_LINE_WIDTH = 1.0f; const bool DEFAULT_IS_SOLID = false; const bool DEFAULT_IS_DASHED_LINE = false; Base3DOverlay::Base3DOverlay() : - _position(DEFAULT_POSITION), _lineWidth(DEFAULT_LINE_WIDTH), - _rotation(), _isSolid(DEFAULT_IS_SOLID), _isDashedLine(DEFAULT_IS_DASHED_LINE), _ignoreRayIntersection(false), @@ -35,9 +32,8 @@ Base3DOverlay::Base3DOverlay() : Base3DOverlay::Base3DOverlay(const Base3DOverlay* base3DOverlay) : Overlay(base3DOverlay), - _position(base3DOverlay->_position), + _transform(base3DOverlay->_transform), _lineWidth(base3DOverlay->_lineWidth), - _rotation(base3DOverlay->_rotation), _isSolid(base3DOverlay->_isSolid), _isDashedLine(base3DOverlay->_isDashedLine), _ignoreRayIntersection(base3DOverlay->_ignoreRayIntersection), @@ -46,14 +42,6 @@ Base3DOverlay::Base3DOverlay(const Base3DOverlay* base3DOverlay) : { } -Base3DOverlay::~Base3DOverlay() { -} - -// TODO: Implement accurate getBounds() implementations -AABox Base3DOverlay::getBounds() const { - return AABox(_position, glm::vec3(1.0f)); -} - void Base3DOverlay::setProperties(const QScriptValue& properties) { Overlay::setProperties(properties); @@ -151,13 +139,13 @@ void Base3DOverlay::setProperties(const QScriptValue& properties) { QScriptValue Base3DOverlay::getProperty(const QString& property) { if (property == "position" || property == "start" || property == "p1" || property == "point") { - return vec3toScriptValue(_scriptEngine, _position); + return vec3toScriptValue(_scriptEngine, getPosition()); } if (property == "lineWidth") { return _lineWidth; } if (property == "rotation") { - return quatToScriptValue(_scriptEngine, _rotation); + return quatToScriptValue(_scriptEngine, getRotation()); } if (property == "isSolid" || property == "isFilled" || property == "solid" || property == "filed") { return _isSolid; diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index b24908a0cc..99126346bf 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -15,6 +15,7 @@ #include #include +#include #include "Overlay.h" @@ -24,32 +25,35 @@ class Base3DOverlay : public Overlay { public: Base3DOverlay(); Base3DOverlay(const Base3DOverlay* base3DOverlay); - ~Base3DOverlay(); // getters virtual bool is3D() const { return true; } - const glm::vec3& getPosition() const { return _position; } - const glm::vec3& getCenter() const { return _position; } // TODO: consider implementing registration points in this class + const glm::vec3& getPosition() const { return _transform.getTranslation(); } + const glm::quat& getRotation() const { return _transform.getRotation(); } + + // TODO: consider implementing registration points in this class + const glm::vec3& getCenter() const { return getPosition(); } + float getLineWidth() const { return _lineWidth; } bool getIsSolid() const { return _isSolid; } bool getIsDashedLine() const { return _isDashedLine; } bool getIsSolidLine() const { return !_isDashedLine; } - const glm::quat& getRotation() const { return _rotation; } bool getIgnoreRayIntersection() const { return _ignoreRayIntersection; } bool getDrawInFront() const { return _drawInFront; } bool getDrawOnHUD() const { return _drawOnHUD; } // setters - void setPosition(const glm::vec3& position) { _position = position; } + void setPosition(const glm::vec3& value) { _transform.setTranslation(value); } + void setRotation(const glm::quat& value) { _transform.setRotation(value); } + void setLineWidth(float lineWidth) { _lineWidth = lineWidth; } void setIsSolid(bool isSolid) { _isSolid = isSolid; } void setIsDashedLine(bool isDashedLine) { _isDashedLine = isDashedLine; } - void setRotation(const glm::quat& value) { _rotation = value; } void setIgnoreRayIntersection(bool value) { _ignoreRayIntersection = value; } void setDrawInFront(bool value) { _drawInFront = value; } void setDrawOnHUD(bool value) { _drawOnHUD = value; } - virtual AABox getBounds() const; + virtual AABox getBounds() const = 0; virtual void setProperties(const QScriptValue& properties); virtual QScriptValue getProperty(const QString& property); @@ -62,9 +66,9 @@ public: } protected: - glm::vec3 _position; + Transform _transform; + float _lineWidth; - glm::quat _rotation; bool _isSolid; bool _isDashedLine; bool _ignoreRayIntersection; From 233d92c315d2efdedb8a583478a083833cbce1d7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Jun 2015 11:46:22 -0700 Subject: [PATCH 5/9] Some code cleanup --- interface/src/ui/overlays/Base3DOverlay.h | 4 ---- interface/src/ui/overlays/Overlay.cpp | 7 ++++--- interface/src/ui/overlays/Overlay.h | 15 ++------------- interface/src/ui/overlays/Overlay2D.cpp | 12 +----------- interface/src/ui/overlays/Overlay2D.h | 10 +--------- interface/src/ui/overlays/Overlays.cpp | 10 ++-------- interface/src/ui/overlays/Overlays.h | 8 +++++--- 7 files changed, 15 insertions(+), 51 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 99126346bf..542b786ae2 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -11,10 +11,6 @@ #ifndef hifi_Base3DOverlay_h #define hifi_Base3DOverlay_h -#include -#include - -#include #include #include "Overlay.h" diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index 745c2b4a10..17e4ae74e1 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -8,12 +8,13 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "Overlay.h" #include +#include + +static const xColor DEFAULT_OVERLAY_COLOR = { 255, 255, 255 }; +static const float DEFAULT_ALPHA = 0.7f; Overlay::Overlay() : _renderItemID(render::Item::INVALID_ITEM_ID), diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index c2f94050ec..a96631bbcf 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -11,21 +11,11 @@ #ifndef hifi_Overlay_h #define hifi_Overlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include -#include -#include - -#include #include // for xColor -#include -#include #include -const xColor DEFAULT_OVERLAY_COLOR = { 255, 255, 255 }; -const float DEFAULT_ALPHA = 0.7f; +class QScriptEngine; +class QScriptValue; class Overlay : public QObject { Q_OBJECT @@ -37,7 +27,6 @@ public: }; typedef std::shared_ptr Pointer; - typedef render::Payload Payload; typedef std::shared_ptr PayloadPointer; diff --git a/interface/src/ui/overlays/Overlay2D.cpp b/interface/src/ui/overlays/Overlay2D.cpp index 10131ab7a6..e37e70700c 100644 --- a/interface/src/ui/overlays/Overlay2D.cpp +++ b/interface/src/ui/overlays/Overlay2D.cpp @@ -8,16 +8,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include - #include "Overlay2D.h" - -Overlay2D::Overlay2D() { -} +#include Overlay2D::Overlay2D(const Overlay2D* overlay2D) : Overlay(overlay2D), @@ -25,9 +18,6 @@ Overlay2D::Overlay2D(const Overlay2D* overlay2D) : { } -Overlay2D::~Overlay2D() { -} - AABox Overlay2D::getBounds() const { return AABox(glm::vec3(_bounds.x(), _bounds.y(), 0.0f), glm::vec3(_bounds.width(), _bounds.height(), 0.01f)); diff --git a/interface/src/ui/overlays/Overlay2D.h b/interface/src/ui/overlays/Overlay2D.h index 51781ea468..382105c047 100644 --- a/interface/src/ui/overlays/Overlay2D.h +++ b/interface/src/ui/overlays/Overlay2D.h @@ -11,14 +11,7 @@ #ifndef hifi_Overlay2D_h #define hifi_Overlay2D_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include -#include -#include - -#include // for xColor #include "Overlay.h" @@ -26,9 +19,8 @@ class Overlay2D : public Overlay { Q_OBJECT public: - Overlay2D(); + Overlay2D() {} Overlay2D(const Overlay2D* overlay2D); - ~Overlay2D(); virtual AABox getBounds() const; diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index b86f7fa8e6..dc49478f38 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -8,14 +8,13 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "Overlays.h" + #include #include -#include #include -#include -#include #include #include "BillboardOverlay.h" @@ -25,7 +24,6 @@ #include "Line3DOverlay.h" #include "LocalModelsOverlay.h" #include "ModelOverlay.h" -#include "Overlays.h" #include "Rectangle3DOverlay.h" #include "Sphere3DOverlay.h" #include "Grid3DOverlay.h" @@ -37,7 +35,6 @@ Overlays::Overlays() : _nextOverlayID(1) { } Overlays::~Overlays() { - { QWriteLocker lock(&_lock); QWriteLocker deleteLock(&_deleteLock); @@ -99,9 +96,6 @@ void Overlays::cleanupOverlaysToDelete() { void Overlays::renderHUD(RenderArgs* renderArgs) { QReadLocker lock(&_lock); - - auto lodManager = DependencyManager::get(); - foreach(Overlay::Pointer thisOverlay, _overlaysHUD) { if (thisOverlay->is3D()) { glEnable(GL_DEPTH_TEST); diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 57d8ccd509..cd5b0f1d10 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -11,13 +11,13 @@ #ifndef hifi_Overlays_h #define hifi_Overlays_h -#include +#include #include -#include -#include "Base3DOverlay.h" #include "Overlay.h" +class PickRay; + class OverlayPropertyResult { public: OverlayPropertyResult(); @@ -48,9 +48,11 @@ void RayToOverlayIntersectionResultFromScriptValue(const QScriptValue& object, R class Overlays : public QObject { Q_OBJECT + public: Overlays(); ~Overlays(); + void init(); void update(float deltatime); void renderHUD(RenderArgs* renderArgs); From 85b2771c4a3ec73a3bd6ac969524bd2f3c37d8df Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Jun 2015 16:36:57 -0700 Subject: [PATCH 6/9] Extend Extents --- libraries/shared/src/Extents.cpp | 11 ++++++++++- libraries/shared/src/Extents.h | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/Extents.cpp b/libraries/shared/src/Extents.cpp index f48ba3c99f..ad00683cf2 100644 --- a/libraries/shared/src/Extents.cpp +++ b/libraries/shared/src/Extents.cpp @@ -10,12 +10,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "Extents.h" + #include #include #include #include "AABox.h" -#include "Extents.h" +#include "Transform.h" void Extents::reset() { minimum = glm::vec3(FLT_MAX); @@ -78,3 +80,10 @@ void Extents::rotate(const glm::quat& rotation) { glm::max(topRightNearRotated, glm::max(topLeftFarRotated,topRightFarRotated))))))); } + + +void Extents::transform(const Transform& transform) { + scale(transform.getScale()); + rotate(transform.getRotation()); + shiftBy(transform.getTranslation()); +} diff --git a/libraries/shared/src/Extents.h b/libraries/shared/src/Extents.h index 647f33699a..3d5a2dbcec 100644 --- a/libraries/shared/src/Extents.h +++ b/libraries/shared/src/Extents.h @@ -20,6 +20,7 @@ #include "StreamUtils.h" class AABox; +class Transform; class Extents { public: @@ -56,6 +57,13 @@ public: /// rotate the extents around orign by rotation void rotate(const glm::quat& rotation); + + /// scale the extents around orign by scale + void scale(float scale) { minimum *= scale; maximum *= scale; } + void scale(const glm::vec3& scale) { minimum *= scale; maximum *= scale; } + + // Transform the extents with transform + void transform(const Transform& transform); glm::vec3 size() const { return maximum - minimum; } float largestDimension() const {glm::vec3 s = size(); return glm::max(s[0], s[1], s[2]); } From e3d22ef94bbcb20d07843a0eb0ecb0d00cf3a612 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Jun 2015 16:43:27 -0700 Subject: [PATCH 7/9] Fix overlays getBounds + code cleanup --- interface/src/ui/overlays/Base3DOverlay.h | 3 + .../src/ui/overlays/BillboardOverlay.cpp | 52 +++------ interface/src/ui/overlays/BillboardOverlay.h | 11 +- interface/src/ui/overlays/Circle3DOverlay.cpp | 29 ++--- interface/src/ui/overlays/Circle3DOverlay.h | 2 +- interface/src/ui/overlays/Cube3DOverlay.cpp | 6 - interface/src/ui/overlays/Cube3DOverlay.h | 4 +- interface/src/ui/overlays/Grid3DOverlay.cpp | 25 ++-- interface/src/ui/overlays/Grid3DOverlay.h | 8 +- interface/src/ui/overlays/ImageOverlay.cpp | 10 +- interface/src/ui/overlays/ImageOverlay.h | 11 +- interface/src/ui/overlays/Line3DOverlay.cpp | 23 ++-- interface/src/ui/overlays/Line3DOverlay.h | 2 +- .../src/ui/overlays/LocalModelsOverlay.cpp | 6 +- .../src/ui/overlays/LocalModelsOverlay.h | 1 - interface/src/ui/overlays/ModelOverlay.cpp | 83 ++++--------- interface/src/ui/overlays/ModelOverlay.h | 7 +- interface/src/ui/overlays/Planar3DOverlay.cpp | 34 +++--- interface/src/ui/overlays/Planar3DOverlay.h | 27 ++--- .../src/ui/overlays/Rectangle3DOverlay.cpp | 4 +- interface/src/ui/overlays/Sphere3DOverlay.cpp | 12 +- interface/src/ui/overlays/Sphere3DOverlay.h | 4 +- interface/src/ui/overlays/Text3DOverlay.cpp | 109 +++++++++--------- interface/src/ui/overlays/Text3DOverlay.h | 10 +- interface/src/ui/overlays/TextOverlay.cpp | 5 +- interface/src/ui/overlays/TextOverlay.h | 9 +- interface/src/ui/overlays/Volume3DOverlay.cpp | 70 +++++------ interface/src/ui/overlays/Volume3DOverlay.h | 30 ++--- 28 files changed, 220 insertions(+), 377 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 542b786ae2..3cb4d27021 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -26,6 +26,7 @@ public: virtual bool is3D() const { return true; } const glm::vec3& getPosition() const { return _transform.getTranslation(); } const glm::quat& getRotation() const { return _transform.getRotation(); } + const glm::vec3& getScale() const { return _transform.getScale(); } // TODO: consider implementing registration points in this class const glm::vec3& getCenter() const { return getPosition(); } @@ -41,6 +42,8 @@ public: // setters void setPosition(const glm::vec3& value) { _transform.setTranslation(value); } void setRotation(const glm::quat& value) { _transform.setRotation(value); } + void setScale(float value) { _transform.setScale(value); } + void setScale(const glm::vec3& value) { _transform.setScale(value); } void setLineWidth(float lineWidth) { _lineWidth = lineWidth; } void setIsSolid(bool isSolid) { _isSolid = isSolid; } diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index e7b043f44f..288a950bbb 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -9,26 +9,20 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "Application.h" -#include "GeometryUtil.h" -#include "PlaneShape.h" - #include "BillboardOverlay.h" -BillboardOverlay::BillboardOverlay() : - _fromImage(), - _scale(1.0f), - _isFacingAvatar(true) -{ +#include "Application.h" +#include "GeometryUtil.h" + +BillboardOverlay::BillboardOverlay() { _isLoaded = false; } BillboardOverlay::BillboardOverlay(const BillboardOverlay* billboardOverlay) : - Base3DOverlay(billboardOverlay), + Planar3DOverlay(billboardOverlay), _url(billboardOverlay->_url), _texture(billboardOverlay->_texture), _fromImage(billboardOverlay->_fromImage), - _scale(billboardOverlay->_scale), _isFacingAvatar(billboardOverlay->_isFacingAvatar) { } @@ -46,8 +40,8 @@ void BillboardOverlay::render(RenderArgs* args) { glm::quat rotation; if (_isFacingAvatar) { // rotate about vertical to face the camera - rotation = Application::getInstance()->getCamera()->getRotation(); - rotation *= glm::angleAxis(glm::pi(), glm::vec3(0.0f, 1.0f, 0.0f)); + rotation = args->_viewFrustum->getOrientation(); + rotation *= glm::angleAxis(glm::pi(), IDENTITY_UP); rotation *= getRotation(); } else { rotation = getRotation(); @@ -89,11 +83,9 @@ void BillboardOverlay::render(RenderArgs* args) { auto batch = args->_batch; if (batch) { - Transform transform; - transform.setTranslation(_position); - transform.setRotation(rotation); - transform.setScale(_scale); - + Transform transform = _transform; + transform.postScale(glm::vec3(getDimensions(), 1.0f)); + batch->setModelTransform(transform); batch->setUniformTexture(0, _texture->getGPUTexture()); @@ -111,10 +103,10 @@ void BillboardOverlay::render(RenderArgs* args) { glBindTexture(GL_TEXTURE_2D, _texture->getID()); glPushMatrix(); { - glTranslatef(_position.x, _position.y, _position.z); + glTranslatef(getPosition().x, getPosition().y, getPosition().z); glm::vec3 axis = glm::axis(rotation); glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - glScalef(_scale, _scale, _scale); + glScalef(_dimensions.x, _dimensions.y, 1.0f); DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha)); @@ -130,7 +122,7 @@ void BillboardOverlay::render(RenderArgs* args) { } void BillboardOverlay::setProperties(const QScriptValue &properties) { - Base3DOverlay::setProperties(properties); + Planar3DOverlay::setProperties(properties); QScriptValue urlValue = properties.property("url"); if (urlValue.isValid()) { @@ -171,11 +163,6 @@ void BillboardOverlay::setProperties(const QScriptValue &properties) { } } - QScriptValue scaleValue = properties.property("scale"); - if (scaleValue.isValid()) { - _scale = scaleValue.toVariant().toFloat(); - } - QScriptValue isFacingAvatarValue = properties.property("isFacingAvatar"); if (isFacingAvatarValue.isValid()) { _isFacingAvatar = isFacingAvatarValue.toVariant().toBool(); @@ -189,14 +176,11 @@ QScriptValue BillboardOverlay::getProperty(const QString& property) { if (property == "subImage") { return qRectToScriptValue(_scriptEngine, _fromImage); } - if (property == "scale") { - return _scale; - } if (property == "isFacingAvatar") { return _isFacingAvatar; } - return Base3DOverlay::getProperty(property); + return Planar3DOverlay::getProperty(property); } void BillboardOverlay::setURL(const QString& url) { @@ -212,13 +196,11 @@ bool BillboardOverlay::findRayIntersection(const glm::vec3& origin, const glm::v float& distance, BoxFace& face) { if (_texture) { - glm::quat rotation; + glm::quat rotation = getRotation(); if (_isFacingAvatar) { // rotate about vertical to face the camera rotation = Application::getInstance()->getCamera()->getRotation(); rotation *= glm::angleAxis(glm::pi(), glm::vec3(0.0f, 1.0f, 0.0f)); - } else { - rotation = _rotation; } // Produce the dimensions of the billboard based on the image's aspect ratio and the overlay's scale. @@ -226,9 +208,9 @@ bool BillboardOverlay::findRayIntersection(const glm::vec3& origin, const glm::v float width = isNull ? _texture->getWidth() : _fromImage.width(); float height = isNull ? _texture->getHeight() : _fromImage.height(); float maxSize = glm::max(width, height); - glm::vec2 dimensions = _scale * glm::vec2(width / maxSize, height / maxSize); + glm::vec2 dimensions = _dimensions * glm::vec2(width / maxSize, height / maxSize); - return findRayRectangleIntersection(origin, direction, rotation, _position, dimensions, distance); + return findRayRectangleIntersection(origin, direction, rotation, getPosition(), dimensions, distance); } return false; diff --git a/interface/src/ui/overlays/BillboardOverlay.h b/interface/src/ui/overlays/BillboardOverlay.h index a09c0c7528..15be0419a9 100644 --- a/interface/src/ui/overlays/BillboardOverlay.h +++ b/interface/src/ui/overlays/BillboardOverlay.h @@ -12,14 +12,11 @@ #ifndef hifi_BillboardOverlay_h #define hifi_BillboardOverlay_h -#include -#include - #include -#include "Base3DOverlay.h" +#include "Planar3DOverlay.h" -class BillboardOverlay : public Base3DOverlay { +class BillboardOverlay : public Planar3DOverlay { Q_OBJECT public: BillboardOverlay(); @@ -29,7 +26,6 @@ public: // setters void setURL(const QString& url); - void setScale(float scale) { _scale = scale; } void setIsFacingAvatar(bool isFacingAvatar) { _isFacingAvatar = isFacingAvatar; } virtual void setProperties(const QScriptValue& properties); @@ -48,8 +44,7 @@ private: QRect _fromImage; // where from in the image to sample - float _scale; - bool _isFacingAvatar; + bool _isFacingAvatar = true; }; #endif // hifi_BillboardOverlay_h diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 55cb7ac9d2..53f1b4ce21 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -8,16 +8,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" +#include "Circle3DOverlay.h" #include #include -#include -#include -#include +#include -#include "Circle3DOverlay.h" Circle3DOverlay::Circle3DOverlay() : _startAt(0.0f), @@ -66,9 +62,6 @@ Circle3DOverlay::Circle3DOverlay(const Circle3DOverlay* circle3DOverlay) : { } -Circle3DOverlay::~Circle3DOverlay() { -} - void Circle3DOverlay::render(RenderArgs* args) { if (!_visible) { return; // do nothing if we're not visible @@ -103,15 +96,13 @@ void Circle3DOverlay::render(RenderArgs* args) { _lastColor = colorX; auto geometryCache = DependencyManager::get(); - - Transform transform; - transform.setTranslation(getCenter()); - transform.setRotation(getRotation()); - transform.setScale(glm::vec3(getDimensions(), 0.01f) / 2.0f); - + Q_ASSERT(args->_batch); auto& batch = *args->_batch; batch._glLineWidth(_lineWidth); + + auto transform = _transform; + transform.postScale(glm::vec3(getDimensions(), 1.0f)); batch.setModelTransform(transform); DependencyManager::get()->bindSimpleProgram(batch, false, false); @@ -402,12 +393,12 @@ bool Circle3DOverlay::findRayIntersection(const glm::vec3& origin, if (intersects) { glm::vec3 hitPosition = origin + (distance * direction); - glm::vec3 localHitPosition = glm::inverse(_rotation) * (hitPosition - _position); - localHitPosition.y = localHitPosition.y * _dimensions.x / _dimensions.y; // Scale to make circular + glm::vec3 localHitPosition = glm::inverse(getRotation()) * (hitPosition - getPosition()); + localHitPosition.y = localHitPosition.y * getDimensions().x / getDimensions().y; // Scale to make circular float distanceToHit = glm::length(localHitPosition); - float innerRadius = _dimensions.x / 2.0f * _innerRadius; - float outerRadius = _dimensions.x / 2.0f * _outerRadius; + float innerRadius = getDimensions().x / 2.0f * _innerRadius; + float outerRadius = getDimensions().x / 2.0f * _outerRadius; intersects = innerRadius <= distanceToHit && distanceToHit <= outerRadius; } diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index fa9ecd0f25..c2f25c711d 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -19,7 +19,7 @@ class Circle3DOverlay : public Planar3DOverlay { public: Circle3DOverlay(); Circle3DOverlay(const Circle3DOverlay* circle3DOverlay); - ~Circle3DOverlay(); + virtual void render(RenderArgs* args); virtual void setProperties(const QScriptValue& properties); virtual QScriptValue getProperty(const QString& property); diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 37b30a5bcb..7eb9a5b414 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -19,17 +19,11 @@ #include "Application.h" #include "Cube3DOverlay.h" -Cube3DOverlay::Cube3DOverlay() : _borderSize(0) { -} - Cube3DOverlay::Cube3DOverlay(const Cube3DOverlay* cube3DOverlay) : Volume3DOverlay(cube3DOverlay) { } -Cube3DOverlay::~Cube3DOverlay() { -} - void Cube3DOverlay::render(RenderArgs* args) { if (!_visible) { return; // do nothing if we're not visible diff --git a/interface/src/ui/overlays/Cube3DOverlay.h b/interface/src/ui/overlays/Cube3DOverlay.h index 16705a9c71..397ad77a9e 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.h +++ b/interface/src/ui/overlays/Cube3DOverlay.h @@ -17,9 +17,9 @@ class Cube3DOverlay : public Volume3DOverlay { Q_OBJECT public: - Cube3DOverlay(); + Cube3DOverlay() {} Cube3DOverlay(const Cube3DOverlay* cube3DOverlay); - ~Cube3DOverlay(); + virtual void render(RenderArgs* args); virtual Cube3DOverlay* createClone() const; diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index e68e5b47f2..6316c8cd77 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -9,28 +9,29 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + +#include "Grid3DOverlay.h" + #include #include "Application.h" -#include "Grid3DOverlay.h" ProgramObject Grid3DOverlay::_gridProgram; -Grid3DOverlay::Grid3DOverlay() : Base3DOverlay(), +Grid3DOverlay::Grid3DOverlay() : _minorGridWidth(1.0), _majorGridEvery(5) { } Grid3DOverlay::Grid3DOverlay(const Grid3DOverlay* grid3DOverlay) : - Base3DOverlay(grid3DOverlay), + Planar3DOverlay(grid3DOverlay), _minorGridWidth(grid3DOverlay->_minorGridWidth), _majorGridEvery(grid3DOverlay->_majorGridEvery) { } -Grid3DOverlay::~Grid3DOverlay() { -} - void Grid3DOverlay::render(RenderArgs* args) { if (!_visible) { return; // do nothing if we're not visible @@ -41,7 +42,7 @@ void Grid3DOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; // center the grid around the camera position on the plane - glm::vec3 rotated = glm::inverse(_rotation) * Application::getInstance()->getCamera()->getPosition(); + glm::vec3 rotated = glm::inverse(getRotation()) * Application::getInstance()->getCamera()->getPosition(); float spacing = _minorGridWidth; @@ -53,7 +54,7 @@ void Grid3DOverlay::render(RenderArgs* args) { if (batch) { Transform transform; - transform.setRotation(_rotation); + transform.setRotation(getRotation()); // Minor grid @@ -61,7 +62,7 @@ void Grid3DOverlay::render(RenderArgs* args) { batch->_glLineWidth(1.0f); auto position = glm::vec3(_minorGridWidth * (floorf(rotated.x / spacing) - MINOR_GRID_DIVISIONS / 2), spacing * (floorf(rotated.y / spacing) - MINOR_GRID_DIVISIONS / 2), - _position.z); + getPosition().z); float scale = MINOR_GRID_DIVISIONS * spacing; transform.setTranslation(position); @@ -78,7 +79,7 @@ void Grid3DOverlay::render(RenderArgs* args) { spacing *= _majorGridEvery; auto position = glm::vec3(spacing * (floorf(rotated.x / spacing) - MAJOR_GRID_DIVISIONS / 2), spacing * (floorf(rotated.y / spacing) - MAJOR_GRID_DIVISIONS / 2), - _position.z); + getPosition().z); float scale = MAJOR_GRID_DIVISIONS * spacing; transform.setTranslation(position); @@ -161,7 +162,7 @@ void Grid3DOverlay::render(RenderArgs* args) { } void Grid3DOverlay::setProperties(const QScriptValue& properties) { - Base3DOverlay::setProperties(properties); + Planar3DOverlay::setProperties(properties); if (properties.property("minorGridWidth").isValid()) { _minorGridWidth = properties.property("minorGridWidth").toVariant().toFloat(); @@ -180,7 +181,7 @@ QScriptValue Grid3DOverlay::getProperty(const QString& property) { return _majorGridEvery; } - return Base3DOverlay::getProperty(property); + return Planar3DOverlay::getProperty(property); } Grid3DOverlay* Grid3DOverlay::createClone() const { diff --git a/interface/src/ui/overlays/Grid3DOverlay.h b/interface/src/ui/overlays/Grid3DOverlay.h index 451ce0a498..ac0f2834fe 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.h +++ b/interface/src/ui/overlays/Grid3DOverlay.h @@ -15,20 +15,16 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" -#include - #include -#include -#include "Base3DOverlay.h" +#include "Planar3DOverlay.h" -class Grid3DOverlay : public Base3DOverlay { +class Grid3DOverlay : public Planar3DOverlay { Q_OBJECT public: Grid3DOverlay(); Grid3DOverlay(const Grid3DOverlay* grid3DOverlay); - ~Grid3DOverlay(); virtual void render(RenderArgs* args); virtual void setProperties(const QScriptValue& properties); diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 72e47b5e3d..e84b60cc43 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -11,14 +11,11 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" -#include -#include +#include "ImageOverlay.h" #include #include -#include - -#include "ImageOverlay.h" +#include ImageOverlay::ImageOverlay() : _imageURL(), @@ -38,9 +35,6 @@ ImageOverlay::ImageOverlay(const ImageOverlay* imageOverlay) : { } -ImageOverlay::~ImageOverlay() { -} - // TODO: handle setting image multiple times, how do we manage releasing the bound texture? void ImageOverlay::setImageURL(const QUrl& url) { _imageURL = url; diff --git a/interface/src/ui/overlays/ImageOverlay.h b/interface/src/ui/overlays/ImageOverlay.h index 31c6031102..e818469643 100644 --- a/interface/src/ui/overlays/ImageOverlay.h +++ b/interface/src/ui/overlays/ImageOverlay.h @@ -11,21 +11,12 @@ #ifndef hifi_ImageOverlay_h #define hifi_ImageOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include -#include #include -#include -#include #include -#include -#include #include -#include "Overlay.h" #include "Overlay2D.h" class ImageOverlay : public Overlay2D { @@ -34,7 +25,7 @@ class ImageOverlay : public Overlay2D { public: ImageOverlay(); ImageOverlay(const ImageOverlay* imageOverlay); - ~ImageOverlay(); + virtual void render(RenderArgs* args); // getters diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 44c6ec7ef6..0bb32b9d6e 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -13,6 +13,7 @@ #include #include +#include #include "Line3DOverlay.h" @@ -33,13 +34,12 @@ Line3DOverlay::~Line3DOverlay() { } AABox Line3DOverlay::getBounds() const { - auto start = _position + _start; - auto end = _position + _end; - - auto min = glm::min(start, end); - auto max = glm::max(start, end); - - return AABox(min, max - min); + auto extents = Extents{}; + extents.addPoint(_start); + extents.addPoint(_end); + extents.transform(_transform); + + return AABox(extents); } void Line3DOverlay::render(RenderArgs* args) { @@ -55,14 +55,11 @@ void Line3DOverlay::render(RenderArgs* args) { auto batch = args->_batch; if (batch) { - Transform transform; - transform.setTranslation(_position); - transform.setRotation(_rotation); - batch->setModelTransform(transform); + batch->setModelTransform(_transform); if (getIsDashedLine()) { // TODO: add support for color to renderDashedLine() - DependencyManager::get()->renderDashedLine(*batch, _position, _end, colorv4, _geometryCacheID); + DependencyManager::get()->renderDashedLine(*batch, _start, _end, colorv4, _geometryCacheID); } else { DependencyManager::get()->renderLine(*batch, _start, _end, colorv4, _geometryCacheID); } @@ -87,7 +84,7 @@ void Line3DOverlay::render(RenderArgs* args) { if (getIsDashedLine()) { // TODO: add support for color to renderDashedLine() - DependencyManager::get()->renderDashedLine(_position, _end, colorv4, _geometryCacheID); + DependencyManager::get()->renderDashedLine(_start, _end, colorv4, _geometryCacheID); } else { DependencyManager::get()->renderLine(_start, _end, colorv4, _geometryCacheID); } diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index ac5f18d8ed..4a4d8f4d90 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -21,7 +21,7 @@ public: Line3DOverlay(const Line3DOverlay* line3DOverlay); ~Line3DOverlay(); virtual void render(RenderArgs* args); - virtual AABox getBounds() const override; + virtual AABox getBounds() const; // getters const glm::vec3& getStart() const { return _start; } diff --git a/interface/src/ui/overlays/LocalModelsOverlay.cpp b/interface/src/ui/overlays/LocalModelsOverlay.cpp index b9ce245128..912196041f 100644 --- a/interface/src/ui/overlays/LocalModelsOverlay.cpp +++ b/interface/src/ui/overlays/LocalModelsOverlay.cpp @@ -24,10 +24,6 @@ LocalModelsOverlay::LocalModelsOverlay(const LocalModelsOverlay* localModelsOver Volume3DOverlay(localModelsOverlay), _entityTreeRenderer(localModelsOverlay->_entityTreeRenderer) { - -} - -LocalModelsOverlay::~LocalModelsOverlay() { } void LocalModelsOverlay::update(float deltatime) { @@ -46,7 +42,7 @@ void LocalModelsOverlay::render(RenderArgs* args) { glPushMatrix(); { Application* app = Application::getInstance(); glm::vec3 oldTranslation = app->getViewMatrixTranslation(); - app->setViewMatrixTranslation(oldTranslation + _position); + app->setViewMatrixTranslation(oldTranslation + getPosition()); _entityTreeRenderer->render(args); Application::getInstance()->setViewMatrixTranslation(oldTranslation); } glPopMatrix(); diff --git a/interface/src/ui/overlays/LocalModelsOverlay.h b/interface/src/ui/overlays/LocalModelsOverlay.h index a82943a4a0..c311b2bc1b 100644 --- a/interface/src/ui/overlays/LocalModelsOverlay.h +++ b/interface/src/ui/overlays/LocalModelsOverlay.h @@ -21,7 +21,6 @@ class LocalModelsOverlay : public Volume3DOverlay { public: LocalModelsOverlay(EntityTreeRenderer* entityTreeRenderer); LocalModelsOverlay(const LocalModelsOverlay* localModelsOverlay); - ~LocalModelsOverlay(); virtual void update(float deltatime); virtual void render(RenderArgs* args); diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 822fff9808..4476518efe 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -9,15 +9,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "ModelOverlay.h" + #include #include -#include "ModelOverlay.h" ModelOverlay::ModelOverlay() : _model(), _modelTextures(QVariantMap()), - _scale(1.0f), _updateModel(false) { _model.init(); @@ -25,12 +25,10 @@ ModelOverlay::ModelOverlay() } ModelOverlay::ModelOverlay(const ModelOverlay* modelOverlay) : - Base3DOverlay(modelOverlay), + Volume3DOverlay(modelOverlay), _model(), _modelTextures(QVariantMap()), _url(modelOverlay->_url), - _rotation(modelOverlay->_rotation), - _scale(modelOverlay->_scale), _updateModel(false) { _model.init(); @@ -45,8 +43,9 @@ void ModelOverlay::update(float deltatime) { _updateModel = false; _model.setSnapModelToCenter(true); - _model.setRotation(_rotation); - _model.setTranslation(_position); + _model.setScale(getScale()); + _model.setRotation(getRotation()); + _model.setTranslation(getPosition()); _model.setURL(_url); _model.simulate(deltatime, true); } else { @@ -56,13 +55,13 @@ void ModelOverlay::update(float deltatime) { } bool ModelOverlay::addToScene(Overlay::Pointer overlay, std::shared_ptr scene, render::PendingChanges& pendingChanges) { - Base3DOverlay::addToScene(overlay, scene, pendingChanges); + Volume3DOverlay::addToScene(overlay, scene, pendingChanges); _model.addToScene(scene, pendingChanges); return true; } void ModelOverlay::removeFromScene(Overlay::Pointer overlay, std::shared_ptr scene, render::PendingChanges& pendingChanges) { - Base3DOverlay::removeFromScene(overlay, scene, pendingChanges); + Volume3DOverlay::removeFromScene(overlay, scene, pendingChanges); _model.removeFromScene(scene, pendingChanges); } @@ -100,54 +99,26 @@ void ModelOverlay::render(RenderArgs* args) { } void ModelOverlay::setProperties(const QScriptValue &properties) { - Base3DOverlay::setProperties(properties); + auto position = getPosition(); + auto rotation = getRotation(); + auto scale = getDimensions(); + + Volume3DOverlay::setProperties(properties); + + if (position != getPosition() || rotation != getRotation() || scale != getDimensions()) { + _model.setScaleToFit(true, getScale()); + _updateModel = true; + } QScriptValue urlValue = properties.property("url"); - if (urlValue.isValid()) { - _url = urlValue.toVariant().toString(); + if (urlValue.isValid() && urlValue.isString()) { + _url = urlValue.toString(); _updateModel = true; _isLoaded = false; } - QScriptValue scaleValue = properties.property("scale"); - if (scaleValue.isValid()) { - _scale = scaleValue.toVariant().toFloat(); - _model.setScaleToFit(true, _scale); - _updateModel = true; - } - - QScriptValue rotationValue = properties.property("rotation"); - if (rotationValue.isValid()) { - QScriptValue x = rotationValue.property("x"); - QScriptValue y = rotationValue.property("y"); - QScriptValue z = rotationValue.property("z"); - QScriptValue w = rotationValue.property("w"); - if (x.isValid() && y.isValid() && z.isValid() && w.isValid()) { - _rotation.x = x.toVariant().toFloat(); - _rotation.y = y.toVariant().toFloat(); - _rotation.z = z.toVariant().toFloat(); - _rotation.w = w.toVariant().toFloat(); - } - _updateModel = true; - } - - QScriptValue dimensionsValue = properties.property("dimensions"); - if (dimensionsValue.isValid()) { - QScriptValue x = dimensionsValue.property("x"); - QScriptValue y = dimensionsValue.property("y"); - QScriptValue z = dimensionsValue.property("z"); - if (x.isValid() && y.isValid() && z.isValid()) { - glm::vec3 dimensions; - dimensions.x = x.toVariant().toFloat(); - dimensions.y = y.toVariant().toFloat(); - dimensions.z = z.toVariant().toFloat(); - _model.setScaleToFit(true, dimensions); - } - _updateModel = true; - } - QScriptValue texturesValue = properties.property("textures"); - if (texturesValue.isValid()) { + if (texturesValue.isValid() && texturesValue.toVariant().canConvert(QVariant::Map)) { QVariantMap textureMap = texturesValue.toVariant().toMap(); foreach(const QString& key, textureMap.keys()) { @@ -161,22 +132,12 @@ void ModelOverlay::setProperties(const QScriptValue &properties) { _modelTextures[key] = newTextureURL; // Keep local track of textures for getProperty() } } - - if (properties.property("position").isValid()) { - _updateModel = true; - } } 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()); } @@ -192,7 +153,7 @@ QScriptValue ModelOverlay::getProperty(const QString& property) { } } - return Base3DOverlay::getProperty(property); + return Volume3DOverlay::getProperty(property); } bool ModelOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index a81cae530a..1c43f42909 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -14,9 +14,9 @@ #include -#include "Base3DOverlay.h" +#include "Volume3DOverlay.h" -class ModelOverlay : public Base3DOverlay { +class ModelOverlay : public Volume3DOverlay { Q_OBJECT public: ModelOverlay(); @@ -41,9 +41,6 @@ private: QVariantMap _modelTextures; QUrl _url; - glm::quat _rotation; - float _scale; - bool _updateModel; }; diff --git a/interface/src/ui/overlays/Planar3DOverlay.cpp b/interface/src/ui/overlays/Planar3DOverlay.cpp index 7ed7332f19..0ca092ba23 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.cpp +++ b/interface/src/ui/overlays/Planar3DOverlay.cpp @@ -8,32 +8,24 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include -#include -#include -#include - -#include "GeometryUtil.h" - #include "Planar3DOverlay.h" -const float DEFAULT_SIZE = 1.0f; - -Planar3DOverlay::Planar3DOverlay() : - _dimensions(glm::vec2(DEFAULT_SIZE, DEFAULT_SIZE)) -{ -} +#include +#include +#include Planar3DOverlay::Planar3DOverlay(const Planar3DOverlay* planar3DOverlay) : - Base3DOverlay(planar3DOverlay), - _dimensions(planar3DOverlay->_dimensions) + Base3DOverlay(planar3DOverlay) { } -Planar3DOverlay::~Planar3DOverlay() { +AABox Planar3DOverlay::getBounds() const { + auto halfDimensions = glm::vec3{_dimensions / 2.0f, 0.01f}; + + auto extents = Extents{-halfDimensions, halfDimensions}; + extents.transform(_transform); + + return AABox(extents); } void Planar3DOverlay::setProperties(const QScriptValue& properties) { @@ -86,7 +78,7 @@ void Planar3DOverlay::setProperties(const QScriptValue& properties) { QScriptValue Planar3DOverlay::getProperty(const QString& property) { if (property == "dimensions" || property == "scale" || property == "size") { - return vec2toScriptValue(_scriptEngine, _dimensions); + return vec2toScriptValue(_scriptEngine, getDimensions()); } return Base3DOverlay::getProperty(property); @@ -94,5 +86,5 @@ QScriptValue Planar3DOverlay::getProperty(const QString& property) { bool Planar3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) { - return findRayRectangleIntersection(origin, direction, _rotation, _position, _dimensions, distance); + return findRayRectangleIntersection(origin, direction, getRotation(), getPosition(), getDimensions(), distance); } diff --git a/interface/src/ui/overlays/Planar3DOverlay.h b/interface/src/ui/overlays/Planar3DOverlay.h index 8a02b35bd2..fe8c513efd 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.h +++ b/interface/src/ui/overlays/Planar3DOverlay.h @@ -11,37 +11,28 @@ #ifndef hifi_Planar3DOverlay_h #define hifi_Planar3DOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include - -#include - #include "Base3DOverlay.h" class Planar3DOverlay : public Base3DOverlay { Q_OBJECT public: - Planar3DOverlay(); + Planar3DOverlay() {} Planar3DOverlay(const Planar3DOverlay* planar3DOverlay); - ~Planar3DOverlay(); - - // getters - const glm::vec2& getDimensions() const { return _dimensions; } - - // setters - void setSize(float size) { _dimensions = glm::vec2(size, size); } + + AABox getBounds() const; + + glm::vec2 getDimensions() const { return _dimensions; } + void setDimensions(float value) { _dimensions = glm::vec2(value); } 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); - + protected: - glm::vec2 _dimensions; + glm::vec2 _dimensions{1.0f, 1.0f}; }; diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index dc5fdeabb2..74bbd1bca8 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -11,12 +11,12 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" +#include "Rectangle3DOverlay.h" + #include #include #include -#include "Rectangle3DOverlay.h" - Rectangle3DOverlay::Rectangle3DOverlay() : _geometryCacheID(DependencyManager::get()->allocateID()) { diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index f5fba0ed05..e129954db9 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -17,17 +17,12 @@ #include "Sphere3DOverlay.h" #include "Application.h" -Sphere3DOverlay::Sphere3DOverlay() { -} Sphere3DOverlay::Sphere3DOverlay(const Sphere3DOverlay* Sphere3DOverlay) : Volume3DOverlay(Sphere3DOverlay) { } -Sphere3DOverlay::~Sphere3DOverlay() { -} - void Sphere3DOverlay::render(RenderArgs* args) { if (!_visible) { return; // do nothing if we're not visible @@ -42,11 +37,8 @@ void Sphere3DOverlay::render(RenderArgs* args) { auto batch = args->_batch; if (batch) { - Transform transform; - transform.setTranslation(_position); - transform.setRotation(_rotation); - transform.setScale(_dimensions); - + Transform transform = _transform; + transform.postScale(getDimensions()); batch->setModelTransform(transform); DependencyManager::get()->renderSphere(*batch, 1.0f, SLICES, SLICES, sphereColor, _isSolid); } else { diff --git a/interface/src/ui/overlays/Sphere3DOverlay.h b/interface/src/ui/overlays/Sphere3DOverlay.h index 3b881e5ba6..b82dc548f1 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.h +++ b/interface/src/ui/overlays/Sphere3DOverlay.h @@ -17,9 +17,9 @@ class Sphere3DOverlay : public Volume3DOverlay { Q_OBJECT public: - Sphere3DOverlay(); + Sphere3DOverlay() {} Sphere3DOverlay(const Sphere3DOverlay* Sphere3DOverlay); - ~Sphere3DOverlay(); + virtual void render(RenderArgs* args); virtual Sphere3DOverlay* createClone() const; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 5acd10eb45..37774094de 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -11,14 +11,17 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" -#include "Application.h" #include "Text3DOverlay.h" #include +#include + +#include "Application.h" const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 }; const float DEFAULT_BACKGROUND_ALPHA = 0.7f; const float DEFAULT_MARGIN = 0.1f; +const int FIXED_FONT_POINT_SIZE = 40; const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 80.0f; // this is a ratio determined through experimentation const float LINE_SCALE_RATIO = 1.2f; @@ -32,6 +35,7 @@ Text3DOverlay::Text3DOverlay() : _bottomMargin(DEFAULT_MARGIN), _isFacingAvatar(false) { + _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); } Text3DOverlay::Text3DOverlay(const Text3DOverlay* text3DOverlay) : @@ -46,6 +50,7 @@ Text3DOverlay::Text3DOverlay(const Text3DOverlay* text3DOverlay) : _bottomMargin(text3DOverlay->_bottomMargin), _isFacingAvatar(text3DOverlay->_isFacingAvatar) { + _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); } Text3DOverlay::~Text3DOverlay() { @@ -77,58 +82,58 @@ void Text3DOverlay::render(RenderArgs* args) { return; // do nothing if we're not visible } - auto batch = args->_batch; - - if (batch) { - glm::quat rotation; - - if (_isFacingAvatar) { - // rotate about vertical to face the camera - rotation = Application::getInstance()->getCamera()->getRotation(); - } else { - rotation = getRotation(); - } - - Transform transform; - transform.setTranslation(_position); - transform.setRotation(rotation); - - batch->setModelTransform(transform); - - const float MAX_COLOR = 255.0f; - xColor backgroundColor = getBackgroundColor(); - glm::vec4 quadColor(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, - getBackgroundAlpha()); - - glm::vec2 dimensions = getDimensions(); - glm::vec2 halfDimensions = dimensions * 0.5f; - - const float SLIGHTLY_BEHIND = -0.005f; - - glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND); - glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); - DependencyManager::get()->renderQuad(*batch, topLeft, bottomRight, quadColor); - - // Same font properties as textSize() - float maxHeight = (float)_textRenderer->computeExtent("Xy").y * LINE_SCALE_RATIO; - - float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight; - - glm::vec2 clipMinimum(0.0f, 0.0f); - glm::vec2 clipDimensions((dimensions.x - (_leftMargin + _rightMargin)) / scaleFactor, - (dimensions.y - (_topMargin + _bottomMargin)) / scaleFactor); - - transform.setTranslation(_position); - transform.postTranslate(glm::vec3(-(halfDimensions.x - _leftMargin) , halfDimensions.y - _topMargin, 0.01f)); - transform.setScale(scaleFactor); - batch->setModelTransform(transform); - - glm::vec4 textColor = { _color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR, getAlpha() }; - _textRenderer->draw(*batch, 0, 0, _text, textColor); - - batch->setPipeline(DrawOverlay3D::getOpaquePipeline()); + + Q_ASSERT(args->_batch); + auto& batch = *args->_batch; + + glm::quat rotation; + + if (_isFacingAvatar) { + // rotate about vertical to face the camera + rotation = args->_viewFrustum->getOrientation(); + } else { + rotation = getRotation(); } - + + Transform transform; + transform.setTranslation(getPosition()); + transform.setRotation(rotation); + transform.setScale(getScale()); + + batch.setModelTransform(transform); + + const float MAX_COLOR = 255.0f; + xColor backgroundColor = getBackgroundColor(); + glm::vec4 quadColor(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, + getBackgroundAlpha()); + + glm::vec2 dimensions = getDimensions(); + glm::vec2 halfDimensions = dimensions * 0.5f; + + const float SLIGHTLY_BEHIND = -0.005f; + + glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND); + glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, quadColor); + + // Same font properties as textSize() + float maxHeight = (float)_textRenderer->computeExtent("Xy").y * LINE_SCALE_RATIO; + + float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight; + + glm::vec2 clipMinimum(0.0f, 0.0f); + glm::vec2 clipDimensions((dimensions.x - (_leftMargin + _rightMargin)) / scaleFactor, + (dimensions.y - (_topMargin + _bottomMargin)) / scaleFactor); + + transform.setTranslation(getPosition()); + transform.postTranslate(glm::vec3(-(halfDimensions.x - _leftMargin) , halfDimensions.y - _topMargin, 0.01f)); + transform.setScale(scaleFactor); + batch.setModelTransform(transform); + + glm::vec4 textColor = { _color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR, getAlpha() }; + _textRenderer->draw(batch, 0, 0, _text, textColor); + + batch.setPipeline(DrawOverlay3D::getOpaquePipeline()); } void Text3DOverlay::setProperties(const QScriptValue& properties) { diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index a30a720414..666b43d8b1 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -11,17 +11,11 @@ #ifndef hifi_Text3DOverlay_h #define hifi_Text3DOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include -#include -#include - #include "Planar3DOverlay.h" -const int FIXED_FONT_POINT_SIZE = 40; +class TextRenderer3D; class Text3DOverlay : public Planar3DOverlay { Q_OBJECT @@ -60,7 +54,7 @@ public: virtual Text3DOverlay* createClone() const; private: - TextRenderer3D* _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); + TextRenderer3D* _textRenderer = nullptr; QString _text; xColor _backgroundColor; diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 1a8b74dea8..ccad3bd295 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -11,11 +11,14 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" +#include "TextOverlay.h" + #include #include +#include #include +#include -#include "TextOverlay.h" TextOverlay::TextOverlay() : _backgroundColor(DEFAULT_BACKGROUND_COLOR), diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index 5a715ebfdf..b5d5dba11b 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -11,17 +11,10 @@ #ifndef hifi_TextOverlay_h #define hifi_TextOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include -#include #include #include -#include -#include "Overlay.h" #include "Overlay2D.h" const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 }; @@ -30,6 +23,8 @@ const int DEFAULT_MARGIN = 10; const int DEFAULT_FONTSIZE = 11; const int DEFAULT_FONT_WEIGHT = 50; +class TextRenderer; + class TextOverlay : public Overlay2D { Q_OBJECT diff --git a/interface/src/ui/overlays/Volume3DOverlay.cpp b/interface/src/ui/overlays/Volume3DOverlay.cpp index b0310f8155..a7c9835f5d 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.cpp +++ b/interface/src/ui/overlays/Volume3DOverlay.cpp @@ -8,32 +8,22 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include -#include - -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include -#include -#include - #include "Volume3DOverlay.h" -const float DEFAULT_SIZE = 1.0f; - -Volume3DOverlay::Volume3DOverlay() : - _dimensions(glm::vec3(DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE)) -{ -} +#include +#include Volume3DOverlay::Volume3DOverlay(const Volume3DOverlay* volume3DOverlay) : - Base3DOverlay(volume3DOverlay), - _dimensions(volume3DOverlay->_dimensions) + Base3DOverlay(volume3DOverlay) { } -Volume3DOverlay::~Volume3DOverlay() { +AABox Volume3DOverlay::getBounds() const { + auto extents = Extents{_localBoundingBox}; + extents.rotate(getRotation()); + extents.shiftBy(getPosition()); + + return AABox(extents); } void Volume3DOverlay::setProperties(const QScriptValue& properties) { @@ -58,26 +48,30 @@ void Volume3DOverlay::setProperties(const QScriptValue& properties) { QScriptValue z = dimensions.property("z"); - if (x.isValid() && y.isValid() && z.isValid()) { - newDimensions.x = x.toVariant().toFloat(); - newDimensions.y = y.toVariant().toFloat(); - newDimensions.z = z.toVariant().toFloat(); + if (x.isValid() && x.isNumber() && + y.isValid() && y.isNumber() && + z.isValid() && z.isNumber()) { + newDimensions.x = x.toNumber(); + newDimensions.y = y.toNumber(); + newDimensions.z = z.toNumber(); validDimensions = true; } else { QScriptValue width = dimensions.property("width"); QScriptValue height = dimensions.property("height"); QScriptValue depth = dimensions.property("depth"); - if (width.isValid() && height.isValid() && depth.isValid()) { - newDimensions.x = width.toVariant().toFloat(); - newDimensions.y = height.toVariant().toFloat(); - newDimensions.z = depth.toVariant().toFloat(); + if (width.isValid() && width.isNumber() && + height.isValid() && height.isNumber() && + depth.isValid() && depth.isNumber()) { + newDimensions.x = width.toNumber(); + newDimensions.y = height.toNumber(); + newDimensions.z = depth.toNumber(); validDimensions = true; } } // size, scale, dimensions is special, it might just be a single scalar, check that here if (!validDimensions && dimensions.isNumber()) { - float size = dimensions.toVariant().toFloat(); + float size = dimensions.toNumber(); newDimensions.x = size; newDimensions.y = size; newDimensions.z = size; @@ -92,7 +86,7 @@ void Volume3DOverlay::setProperties(const QScriptValue& properties) { QScriptValue Volume3DOverlay::getProperty(const QString& property) { if (property == "dimensions" || property == "scale" || property == "size") { - return vec3toScriptValue(_scriptEngine, _dimensions); + return vec3toScriptValue(_scriptEngine, getDimensions()); } return Base3DOverlay::getProperty(property); @@ -100,24 +94,14 @@ QScriptValue Volume3DOverlay::getProperty(const QString& property) { bool Volume3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) { - // extents is the entity relative, scaled, centered extents of the entity - glm::vec3 position = getPosition(); - glm::mat4 rotation = glm::mat4_cast(getRotation()); - glm::mat4 translation = glm::translate(position); - glm::mat4 entityToWorldMatrix = translation * rotation; - glm::mat4 worldToEntityMatrix = glm::inverse(entityToWorldMatrix); - - glm::vec3 dimensions = _dimensions; - glm::vec3 corner = dimensions * -0.5f; // since we're going to do the ray picking in the overlay frame of reference - AABox overlayFrameBox(corner, dimensions); + glm::mat4 worldToEntityMatrix; + _transform.getInverseMatrix(worldToEntityMatrix); + glm::vec3 overlayFrameOrigin = glm::vec3(worldToEntityMatrix * glm::vec4(origin, 1.0f)); glm::vec3 overlayFrameDirection = glm::vec3(worldToEntityMatrix * glm::vec4(direction, 0.0f)); // we can use the AABox's ray intersection by mapping our origin and direction into the overlays frame // and testing intersection there. - if (overlayFrameBox.findRayIntersection(overlayFrameOrigin, overlayFrameDirection, distance, face)) { - return true; - } - return false; + return _localBoundingBox.findRayIntersection(overlayFrameOrigin, overlayFrameDirection, distance, face); } diff --git a/interface/src/ui/overlays/Volume3DOverlay.h b/interface/src/ui/overlays/Volume3DOverlay.h index b7c59b2ace..ada485a663 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.h +++ b/interface/src/ui/overlays/Volume3DOverlay.h @@ -11,39 +11,29 @@ #ifndef hifi_Volume3DOverlay_h #define hifi_Volume3DOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include - -#include - #include "Base3DOverlay.h" class Volume3DOverlay : public Base3DOverlay { Q_OBJECT public: - Volume3DOverlay(); + Volume3DOverlay() {} Volume3DOverlay(const Volume3DOverlay* volume3DOverlay); - ~Volume3DOverlay(); - - // getters - const glm::vec3& getCenter() const { return _position; } // TODO: consider adding registration point!! - glm::vec3 getCorner() const { return _position - (_dimensions * 0.5f); } // TODO: consider adding registration point!! - const glm::vec3& getDimensions() const { return _dimensions; } - - // setters - void setSize(float size) { _dimensions = glm::vec3(size, size, size); } - void setDimensions(const glm::vec3& value) { _dimensions = value; } + + virtual AABox getBounds() const; + + const glm::vec3& getDimensions() const { return _localBoundingBox.getDimensions(); } + void setDimensions(float value) { _localBoundingBox.setBox(glm::vec3(-value / 2.0f), value); } + void setDimensions(const glm::vec3& value) { _localBoundingBox.setBox(-value / 2.0f, 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); - + protected: - glm::vec3 _dimensions; + // Centered local bounding box + AABox _localBoundingBox; }; From 55c490043fb177fb155f6c964366799897862bac Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 24 Jun 2015 14:35:03 -0700 Subject: [PATCH 8/9] Restore InterfaceConfig.h includes --- interface/src/ui/overlays/Circle3DOverlay.h | 3 +++ interface/src/ui/overlays/ImageOverlay.cpp | 3 --- interface/src/ui/overlays/ImageOverlay.h | 3 +++ interface/src/ui/overlays/Overlay.h | 3 +++ interface/src/ui/overlays/Overlay2D.h | 3 +++ interface/src/ui/overlays/Planar3DOverlay.h | 3 +++ interface/src/ui/overlays/Text3DOverlay.h | 3 +++ interface/src/ui/overlays/TextOverlay.h | 3 +++ interface/src/ui/overlays/Volume3DOverlay.h | 3 +++ 9 files changed, 24 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index c2f25c711d..0a2352148a 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -11,6 +11,9 @@ #ifndef hifi_Circle3DOverlay_h #define hifi_Circle3DOverlay_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include "Planar3DOverlay.h" class Circle3DOverlay : public Planar3DOverlay { diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index e84b60cc43..399e8a459a 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -8,9 +8,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "ImageOverlay.h" #include diff --git a/interface/src/ui/overlays/ImageOverlay.h b/interface/src/ui/overlays/ImageOverlay.h index e818469643..b7924bdb71 100644 --- a/interface/src/ui/overlays/ImageOverlay.h +++ b/interface/src/ui/overlays/ImageOverlay.h @@ -11,6 +11,9 @@ #ifndef hifi_ImageOverlay_h #define hifi_ImageOverlay_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include #include #include diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index a96631bbcf..375a1c3bb9 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -11,6 +11,9 @@ #ifndef hifi_Overlay_h #define hifi_Overlay_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include // for xColor #include diff --git a/interface/src/ui/overlays/Overlay2D.h b/interface/src/ui/overlays/Overlay2D.h index 382105c047..d91a20b070 100644 --- a/interface/src/ui/overlays/Overlay2D.h +++ b/interface/src/ui/overlays/Overlay2D.h @@ -11,6 +11,9 @@ #ifndef hifi_Overlay2D_h #define hifi_Overlay2D_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include #include "Overlay.h" diff --git a/interface/src/ui/overlays/Planar3DOverlay.h b/interface/src/ui/overlays/Planar3DOverlay.h index fe8c513efd..9683cb3357 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.h +++ b/interface/src/ui/overlays/Planar3DOverlay.h @@ -11,6 +11,9 @@ #ifndef hifi_Planar3DOverlay_h #define hifi_Planar3DOverlay_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include "Base3DOverlay.h" class Planar3DOverlay : public Base3DOverlay { diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index 666b43d8b1..93d4106708 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -11,6 +11,9 @@ #ifndef hifi_Text3DOverlay_h #define hifi_Text3DOverlay_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include #include "Planar3DOverlay.h" diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index b5d5dba11b..db89f0b73d 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -11,6 +11,9 @@ #ifndef hifi_TextOverlay_h #define hifi_TextOverlay_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include #include diff --git a/interface/src/ui/overlays/Volume3DOverlay.h b/interface/src/ui/overlays/Volume3DOverlay.h index ada485a663..51f63dc580 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.h +++ b/interface/src/ui/overlays/Volume3DOverlay.h @@ -11,6 +11,9 @@ #ifndef hifi_Volume3DOverlay_h #define hifi_Volume3DOverlay_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include "Base3DOverlay.h" class Volume3DOverlay : public Base3DOverlay { From bc1abbe9b200893e339aabf308ad51af268f8146 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 24 Jun 2015 16:45:38 -0700 Subject: [PATCH 9/9] Update scripts --- examples/acScripts/rain.js | 2 +- examples/libraries/entitySelectionTool.js | 52 ++++++++++++----------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/examples/acScripts/rain.js b/examples/acScripts/rain.js index ee8a1e19a6..3f38b8d36a 100644 --- a/examples/acScripts/rain.js +++ b/examples/acScripts/rain.js @@ -123,7 +123,7 @@ var RainSquall = function (properties) { function setUp() { if (debug) { squallCircle = Overlays.addOverlay("circle3d", { - size: { x: 2 * squallRadius, y: 2 * squallRadius }, + size: { x: squallRadius, y: squallRadius }, color: SQUALL_CIRCLE_COLOR, alpha: SQUALL_CIRCLE_ALPHA, solid: true, diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index d5e2b24f36..98a71e3b12 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -392,7 +392,8 @@ SelectionDisplay = (function () { var grabberSpotLightCircle = Overlays.addOverlay("circle3d", { color: lightOverlayColor, - isSolid: false + isSolid: false, + visible: false }); var grabberSpotLightLineT = Overlays.addOverlay("line3d", spotLightLineProperties); var grabberSpotLightLineB = Overlays.addOverlay("line3d", spotLightLineProperties); @@ -409,17 +410,20 @@ SelectionDisplay = (function () { var grabberPointLightCircleX = Overlays.addOverlay("circle3d", { rotation: Quat.fromPitchYawRollDegrees(0, 90, 0), color: lightOverlayColor, - isSolid: false + isSolid: false, + visible: false }); var grabberPointLightCircleY = Overlays.addOverlay("circle3d", { rotation: Quat.fromPitchYawRollDegrees(90, 0, 0), color: lightOverlayColor, - isSolid: false + isSolid: false, + visible: false }); var grabberPointLightCircleZ = Overlays.addOverlay("circle3d", { rotation: Quat.fromPitchYawRollDegrees(0, 0, 0), color: lightOverlayColor, - isSolid: false + isSolid: false, + visible: false }); var grabberPointLightT = Overlays.addOverlay("cube", grabberPropertiesEdge); var grabberPointLightB = Overlays.addOverlay("cube", grabberPropertiesEdge); @@ -546,7 +550,7 @@ SelectionDisplay = (function () { var rotateOverlayTarget = Overlays.addOverlay("circle3d", { position: { x:0, y: 0, z: 0}, - size: rotateOverlayTargetSize * 2, + size: rotateOverlayTargetSize, color: { red: 0, green: 0, blue: 0 }, alpha: 0.0, solid: true, @@ -1186,7 +1190,7 @@ SelectionDisplay = (function () { }); Overlays.editOverlay(grabberSpotLightCircle, { position: NEAR, - dimensions: { x: distance * 2, y: distance * 2, z: 1 }, + dimensions: { x: distance, y: distance, z: 1 }, lineWidth: 1.5, rotation: rotation, visible: true, @@ -1258,19 +1262,19 @@ SelectionDisplay = (function () { Overlays.editOverlay(grabberPointLightCircleX, { position: position, rotation: Quat.multiply(rotation, Quat.fromPitchYawRollDegrees(0, 90, 0)), - dimensions: { x: properties.dimensions.z, y: properties.dimensions.z, z: 1 }, + dimensions: { x: properties.dimensions.z / 2.0, y: properties.dimensions.z / 2.0, z: 1 }, visible: true, }); Overlays.editOverlay(grabberPointLightCircleY, { position: position, rotation: Quat.multiply(rotation, Quat.fromPitchYawRollDegrees(90, 0, 0)), - dimensions: { x: properties.dimensions.z, y: properties.dimensions.z, z: 1 }, + dimensions: { x: properties.dimensions.z / 2.0, y: properties.dimensions.z / 2.0, z: 1 }, visible: true, }); Overlays.editOverlay(grabberPointLightCircleZ, { position: position, rotation: rotation, - dimensions: { x: properties.dimensions.z, y: properties.dimensions.z, z: 1 }, + dimensions: { x: properties.dimensions.z / 2.0, y: properties.dimensions.z / 2.0, z: 1 }, visible: true, }); @@ -1966,7 +1970,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayInner, { visible: true, - size: innerRadius * 2, + size: innerRadius, innerRadius: 0.9, startAt: 0, endAt: 360, @@ -1976,7 +1980,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayOuter, { visible: true, - size: outerRadius * 2, + size: outerRadius, innerRadius: 0.9, startAt: 0, endAt: 360, @@ -1986,7 +1990,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayCurrent, { visible: true, - size: outerRadius * 2, + size: outerRadius, startAt: 0, endAt: 0, innerRadius: 0.9, @@ -2064,13 +2068,13 @@ SelectionDisplay = (function () { if (snapToInner) { Overlays.editOverlay(rotateOverlayOuter, { startAt: 0, endAt: 360 }); Overlays.editOverlay(rotateOverlayInner, { startAt: startAtRemainder, endAt: endAtRemainder }); - Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: innerRadius * 2, + Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: innerRadius, majorTickMarksAngle: innerSnapAngle, minorTickMarksAngle: 0, majorTickMarksLength: -0.25, minorTickMarksLength: 0, }); } else { Overlays.editOverlay(rotateOverlayInner, { startAt: 0, endAt: 360 }); Overlays.editOverlay(rotateOverlayOuter, { startAt: startAtRemainder, endAt: endAtRemainder }); - Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: outerRadius * 2, + Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: outerRadius, majorTickMarksAngle: 45.0, minorTickMarksAngle: 5, majorTickMarksLength: 0.25, minorTickMarksLength: 0.1, }); } @@ -2095,7 +2099,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayInner, { visible: true, - size: innerRadius * 2, + size: innerRadius, innerRadius: 0.9, startAt: 0, endAt: 360, @@ -2105,7 +2109,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayOuter, { visible: true, - size: outerRadius * 2, + size: outerRadius, innerRadius: 0.9, startAt: 0, endAt: 360, @@ -2115,7 +2119,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayCurrent, { visible: true, - size: outerRadius * 2, + size: outerRadius, startAt: 0, endAt: 0, innerRadius: 0.9, @@ -2186,13 +2190,13 @@ SelectionDisplay = (function () { if (snapToInner) { Overlays.editOverlay(rotateOverlayOuter, { startAt: 0, endAt: 360 }); Overlays.editOverlay(rotateOverlayInner, { startAt: startAtRemainder, endAt: endAtRemainder }); - Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: innerRadius * 2, + Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: innerRadius, majorTickMarksAngle: innerSnapAngle, minorTickMarksAngle: 0, majorTickMarksLength: -0.25, minorTickMarksLength: 0, }); } else { Overlays.editOverlay(rotateOverlayInner, { startAt: 0, endAt: 360 }); Overlays.editOverlay(rotateOverlayOuter, { startAt: startAtRemainder, endAt: endAtRemainder }); - Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: outerRadius * 2, + Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: outerRadius, majorTickMarksAngle: 45.0, minorTickMarksAngle: 5, majorTickMarksLength: 0.25, minorTickMarksLength: 0.1, }); } @@ -2216,7 +2220,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayInner, { visible: true, - size: innerRadius * 2, + size: innerRadius, innerRadius: 0.9, startAt: 0, endAt: 360, @@ -2226,7 +2230,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayOuter, { visible: true, - size: outerRadius * 2, + size: outerRadius, innerRadius: 0.9, startAt: 0, endAt: 360, @@ -2236,7 +2240,7 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayCurrent, { visible: true, - size: outerRadius * 2, + size: outerRadius, startAt: 0, endAt: 0, innerRadius: 0.9, @@ -2306,13 +2310,13 @@ SelectionDisplay = (function () { if (snapToInner) { Overlays.editOverlay(rotateOverlayOuter, { startAt: 0, endAt: 360 }); Overlays.editOverlay(rotateOverlayInner, { startAt: startAtRemainder, endAt: endAtRemainder }); - Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: innerRadius * 2, + Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: innerRadius, majorTickMarksAngle: innerSnapAngle, minorTickMarksAngle: 0, majorTickMarksLength: -0.25, minorTickMarksLength: 0, }); } else { Overlays.editOverlay(rotateOverlayInner, { startAt: 0, endAt: 360 }); Overlays.editOverlay(rotateOverlayOuter, { startAt: startAtRemainder, endAt: endAtRemainder }); - Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: outerRadius * 2, + Overlays.editOverlay(rotateOverlayCurrent, { startAt: startAtCurrent, endAt: endAtCurrent, size: outerRadius, majorTickMarksAngle: 45.0, minorTickMarksAngle: 5, majorTickMarksLength: 0.25, minorTickMarksLength: 0.1, }); }