From ab2fa16be3f2f600b36803d61d7752877e119546 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 21 Nov 2014 12:06:46 -0800 Subject: [PATCH 1/9] Update edit entities moveUp arrow position --- examples/libraries/entitySelectionTool.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index e760fb0463..b0fc68b60c 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -260,6 +260,7 @@ SelectionDisplay = (function () { var grabberColorFace = { red: 120, green: 120, blue: 120 }; var grabberLineWidth = 0.5; var grabberSolid = true; + var grabberMoveUpPosition = { x: 0, y: 0, z: 0 }; var grabberPropertiesCorner = { position: { x:0, y: 0, z: 0}, @@ -1093,7 +1094,8 @@ SelectionDisplay = (function () { Overlays.editOverlay(grabberEdgeFL, { visible: stretchHandlesVisible, rotation: rotation, position: EdgeFL }); var grabberMoveUpOffset = 0.1; - Overlays.editOverlay(grabberMoveUp, { visible: activeTool == null || mode == "TRANSLATE_UP_DOWN", position: { x: position.x, y: position.y + worldTop + grabberMoveUpOffset, z: position.z } }); + grabberMoveUpPosition = { x: position.x, y: position.y + worldTop + grabberMoveUpOffset, z: position.z } + Overlays.editOverlay(grabberMoveUp, { visible: activeTool == null || mode == "TRANSLATE_UP_DOWN" }); }; that.setOverlaysVisible = function(isVisible) { @@ -2297,8 +2299,10 @@ SelectionDisplay = (function () { Overlays.editOverlay(rollHandle, { scale: handleSize, }); + var pos = Vec3.sum(grabberMoveUpPosition, { x: 0, y: Vec3.length(diff) * GRABBER_DISTANCE_TO_SIZE_RATIO * 3, z: 0 }); Overlays.editOverlay(grabberMoveUp, { - scale: handleSize, + position: pos, + scale: handleSize / 2, }); } } From 1b1482bab3c28e78e871a67584062b2e59ea0bb2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 24 Nov 2014 21:00:04 -0800 Subject: [PATCH 2/9] Adjust size of stretch overlays to be smaller --- examples/libraries/entitySelectionTool.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index b0fc68b60c..08ac077a34 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -205,7 +205,7 @@ SelectionDisplay = (function () { var MINIMUM_DIMENSION = 0.001; - var GRABBER_DISTANCE_TO_SIZE_RATIO = 0.015; + var GRABBER_DISTANCE_TO_SIZE_RATIO = 0.0075; var spaceMode = SPACE_LOCAL; var mode = "UNKNOWN"; From 1d865ace9d41bd5336cee93d4a16f014df6c6772 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 24 Nov 2014 21:16:29 -0800 Subject: [PATCH 3/9] Add drawInFront property to Base3DOverlay --- interface/src/ui/overlays/Base3DOverlay.cpp | 16 +++++++++++++++- interface/src/ui/overlays/Base3DOverlay.h | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 5a5bfcd937..5c6af97bf1 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -27,7 +27,8 @@ Base3DOverlay::Base3DOverlay() : _rotation(), _isSolid(DEFAULT_IS_SOLID), _isDashedLine(DEFAULT_IS_DASHED_LINE), - _ignoreRayIntersection(false) + _ignoreRayIntersection(false), + _drawInFront(false) { } @@ -45,9 +46,22 @@ Base3DOverlay::Base3DOverlay(const Base3DOverlay* base3DOverlay) : Base3DOverlay::~Base3DOverlay() { } +void Base3DOverlay::setDrawInFront(bool value) { + _drawInFront = value; + emit drawInFrontUpdated(value); +} + void Base3DOverlay::setProperties(const QScriptValue& properties) { Overlay::setProperties(properties); + QScriptValue drawInFront = properties.property("drawInFront"); + + if (drawInFront.isValid()) { + bool value = drawInFront.toVariant().toBool(); + setDrawInFront(value); + _drawInFront = value; + } + QScriptValue position = properties.property("position"); // if "position" property was not there, check to see if they included aliases: start, point, p1 diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 8304883e3c..46d99cf3de 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -36,6 +36,7 @@ public: bool getIsSolidLine() const { return !_isDashedLine; } const glm::quat& getRotation() const { return _rotation; } bool getIgnoreRayIntersection() const { return _ignoreRayIntersection; } + bool getDrawInFront() const { return _drawInFront; } // setters void setPosition(const glm::vec3& position) { _position = position; } @@ -44,6 +45,7 @@ public: void setIsDashedLine(bool isDashedLine) { _isDashedLine = isDashedLine; } void setRotation(const glm::quat& value) { _rotation = value; } void setIgnoreRayIntersection(bool value) { _ignoreRayIntersection = value; } + void setDrawInFront(bool value); virtual void setProperties(const QScriptValue& properties); virtual QScriptValue getProperty(const QString& property); @@ -55,6 +57,9 @@ public: return findRayIntersection(origin, direction, distance, face); } +signals: + void drawInFrontUpdated(bool newValue); + protected: void drawDashedLine(const glm::vec3& start, const glm::vec3& end); @@ -64,6 +69,7 @@ protected: bool _isSolid; bool _isDashedLine; bool _ignoreRayIntersection; + bool _drawInFront; }; #endif // hifi_Base3DOverlay_h From 0b46e35f31df467faf1c698adc429a3156025b89 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 24 Nov 2014 23:19:13 -0800 Subject: [PATCH 4/9] Add support for separate list of 3d overlays to be drawn in front --- interface/src/ui/overlays/Base3DOverlay.cpp | 7 +- interface/src/ui/overlays/Overlays.cpp | 99 ++++++++++++++++----- interface/src/ui/overlays/Overlays.h | 12 +++ 3 files changed, 92 insertions(+), 26 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 5c6af97bf1..b3dc377282 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -47,8 +47,10 @@ Base3DOverlay::~Base3DOverlay() { } void Base3DOverlay::setDrawInFront(bool value) { - _drawInFront = value; - emit drawInFrontUpdated(value); + if (value != _drawInFront) { + _drawInFront = value; + emit drawInFrontUpdated(value); + } } void Base3DOverlay::setProperties(const QScriptValue& properties) { @@ -59,7 +61,6 @@ void Base3DOverlay::setProperties(const QScriptValue& properties) { if (drawInFront.isValid()) { bool value = drawInFront.toVariant().toBool(); setDrawInFront(value); - _drawInFront = value; } QScriptValue position = properties.property("position"); diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index d6dbb0861e..5de410c1d9 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -29,7 +29,8 @@ #include "TextOverlay.h" #include "Text3DOverlay.h" -Overlays::Overlays() : _nextOverlayID(1) { +Overlays::Overlays() : _nextOverlayID(1), _overlaySignalMapper() { + connect(&_overlaySignalMapper, SIGNAL(mapped(int)), this, SLOT(handleOverlayDrawInFrontUpdated(unsigned int))); } Overlays::~Overlays() { @@ -70,6 +71,9 @@ void Overlays::update(float deltatime) { foreach(Overlay* thisOverlay, _overlays3D) { thisOverlay->update(deltatime); } + foreach(Overlay* thisOverlay, _overlays3DFront) { + thisOverlay->update(deltatime); + } } if (!_overlaysToDelete.isEmpty()) { @@ -94,8 +98,16 @@ void Overlays::render2D() { } void Overlays::render3D(RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { + render3DOverlays(_overlays3D, renderMode, renderSide); +} + +void Overlays::render3DFront(RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { + render3DOverlays(_overlays3DFront, renderMode, renderSide); +} + +void Overlays::render3DOverlays(QMap& overlays, RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { QReadLocker lock(&_lock); - if (_overlays3D.size() == 0) { + if (overlays.size() == 0) { return; } bool myAvatarComputed = false; @@ -111,7 +123,7 @@ void Overlays::render3D(RenderArgs::RenderMode renderMode, RenderArgs::RenderSid renderMode, renderSide, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - foreach(Overlay* thisOverlay, _overlays3D) { + foreach(Overlay* thisOverlay, overlays) { glPushMatrix(); switch (thisOverlay->getAnchor()) { case Overlay::MY_AVATAR: @@ -188,7 +200,15 @@ unsigned int Overlays::addOverlay(Overlay* overlay) { unsigned int thisID = _nextOverlayID; _nextOverlayID++; if (overlay->is3D()) { - _overlays3D[thisID] = overlay; + Base3DOverlay* overlay3D = static_cast(overlay); + if (overlay3D->getDrawInFront()) { + _overlays3DFront[thisID] = overlay; + } else { + _overlays3D[thisID] = overlay; + } + + _overlaySignalMapper.setMapping(overlay3D, thisID); + connect(overlay3D, SIGNAL(drawInFrontUpdated(bool)), &_overlaySignalMapper, SLOT(map())); } else { _overlays2D[thisID] = overlay; } @@ -213,6 +233,8 @@ bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) { thisOverlay = _overlays2D[id]; } else if (_overlays3D.contains(id)) { thisOverlay = _overlays3D[id]; + } else if (_overlays3DFront.contains(id)) { + thisOverlay = _overlays3DFront[id]; } if (thisOverlay) { thisOverlay->setProperties(properties); @@ -230,6 +252,8 @@ void Overlays::deleteOverlay(unsigned int id) { overlayToDelete = _overlays2D.take(id); } else if (_overlays3D.contains(id)) { overlayToDelete = _overlays3D.take(id); + } else if (_overlays3DFront.contains(id)) { + overlayToDelete = _overlays3DFront.take(id); } else { return; } @@ -239,6 +263,22 @@ void Overlays::deleteOverlay(unsigned int id) { _overlaysToDelete.push_back(overlayToDelete); } +void Overlays::handleOverlayDrawInFrontUpdated(int overlayID) { + if (_overlays3D.contains(overlayID)) { + Base3DOverlay* overlay = static_cast(_overlays3D[overlayID]); + if (overlay->getDrawInFront()) { + _overlays3D.remove(overlayID); + _overlays3DFront[overlayID] = overlay; + } + } else if (_overlays3DFront.contains(overlayID)) { + Base3DOverlay* overlay = static_cast(_overlays3DFront[overlayID]); + if (!overlay->getDrawInFront()) { + _overlays3DFront.remove(overlayID); + _overlays3D[overlayID] = overlay; + } + } +} + unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { QReadLocker lock(&_lock); QMapIterator i(_overlays2D); @@ -262,6 +302,8 @@ OverlayPropertyResult Overlays::getProperty(unsigned int id, const QString& prop thisOverlay = _overlays2D[id]; } else if (_overlays3D.contains(id)) { thisOverlay = _overlays3D[id]; + } else if (_overlays3DFront.contains(id)) { + thisOverlay = _overlays3DFront[id]; } if (thisOverlay) { result.value = thisOverlay->getProperty(property); @@ -300,30 +342,39 @@ void OverlayPropertyResultFromScriptValue(const QScriptValue& value, OverlayProp } RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray) { + QMap overlayMaps[] = { _overlays3DFront, _overlays3D }; + float bestDistance = std::numeric_limits::max(); RayToOverlayIntersectionResult result; - QMapIterator i(_overlays3D); - i.toBack(); - while (i.hasPrevious()) { - i.previous(); - unsigned int thisID = i.key(); - Base3DOverlay* thisOverlay = static_cast(i.value()); - if (thisOverlay->getVisible() && !thisOverlay->getIgnoreRayIntersection() && thisOverlay->isLoaded()) { - float thisDistance; - BoxFace thisFace; - QString thisExtraInfo; - if (thisOverlay->findRayIntersectionExtraInfo(ray.origin, ray.direction, thisDistance, thisFace, thisExtraInfo)) { - if (thisDistance < bestDistance) { - bestDistance = thisDistance; - result.intersects = true; - result.distance = thisDistance; - result.face = thisFace; - result.overlayID = thisID; - result.intersection = ray.origin + (ray.direction * thisDistance); - result.extraInfo = thisExtraInfo; + for (int idx = 0; idx < 2; idx++) { + QMapIterator i(overlayMaps[idx]); + i.toBack(); + while (i.hasPrevious()) { + i.previous(); + unsigned int thisID = i.key(); + Base3DOverlay* thisOverlay = static_cast(i.value()); + if (thisOverlay->getVisible() && !thisOverlay->getIgnoreRayIntersection() && thisOverlay->isLoaded()) { + float thisDistance; + BoxFace thisFace; + QString thisExtraInfo; + if (thisOverlay->findRayIntersectionExtraInfo(ray.origin, ray.direction, thisDistance, thisFace, thisExtraInfo)) { + if (thisDistance < bestDistance) { + bestDistance = thisDistance; + result.intersects = true; + result.distance = thisDistance; + result.face = thisFace; + result.overlayID = thisID; + result.intersection = ray.origin + (ray.direction * thisDistance); + result.extraInfo = thisExtraInfo; + } } } } + if (result.intersects) { + // We first check the front overlays - if one has been intersected, prefer + // it over any other overlays and return it immediately. + break; + } } return result; } @@ -412,6 +463,8 @@ bool Overlays::isLoaded(unsigned int id) { thisOverlay = _overlays2D[id]; } else if (_overlays3D.contains(id)) { thisOverlay = _overlays3D[id]; + } else if (_overlays3DFront.contains(id)) { + thisOverlay = _overlays3DFront[id]; } else { return false; // not found } diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 2cd80041cd..c46d9474da 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -13,6 +13,7 @@ #include #include +#include #include "Overlay.h" @@ -53,6 +54,8 @@ public: void update(float deltatime); void render3D(RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::RenderSide renderSide = RenderArgs::MONO); + void render3DFront(RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, + RenderArgs::RenderSide renderSide = RenderArgs::MONO); void render2D(); public slots: @@ -88,10 +91,19 @@ public slots: /// overlay; in meters if it is a 3D text overlay float textWidth(unsigned int id, const QString& text) const; +protected: + void render3DOverlays(QMap& overlays, RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide); + +private slots: + /// QSignalMapper unfortunately does not work with unsigned integers. + void handleOverlayDrawInFrontUpdated(int overlayID); + private: QMap _overlays2D; QMap _overlays3D; + QMap _overlays3DFront; QList _overlaysToDelete; + QSignalMapper _overlaySignalMapper; unsigned int _nextOverlayID; QGLWidget* _parent; QReadWriteLock _lock; From 8b982872c2d59370e7de9cd22abbea7d53da8467 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 24 Nov 2014 23:19:53 -0800 Subject: [PATCH 5/9] Add calls to Overlays::render3DFront() --- interface/src/Application.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4e8b95862a..8d1e77ed25 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2839,6 +2839,11 @@ void Application::updateShadowMap() { _overlays.render3D(RenderArgs::SHADOW_RENDER_MODE); } + { + PerformanceTimer perfTimer("3dOverlaysFront"); + _overlays.render3DFront(RenderArgs::SHADOW_RENDER_MODE); + } + glDisable(GL_POLYGON_OFFSET_FILL); glPopMatrix(); @@ -3135,6 +3140,13 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly, RenderAr if (Menu::getInstance()->isOptionChecked(MenuOption::Wireframe)) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } + + // Render 3D overlays that should be drawn in front + { + PerformanceTimer perfTimer("3dOverlaysFront"); + glClear(GL_DEPTH_BUFFER_BIT); + _overlays.render3DFront(); + } } void Application::updateUntranslatedViewMatrix(const glm::vec3& viewMatrixTranslation) { From 925c2a8f6c10bcd568e4131b3b76f5d67716874e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 25 Nov 2014 08:34:44 -0800 Subject: [PATCH 6/9] Update array to use pointers --- interface/src/ui/overlays/Overlays.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 5de410c1d9..2d4edca781 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -342,12 +342,12 @@ void OverlayPropertyResultFromScriptValue(const QScriptValue& value, OverlayProp } RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray) { - QMap overlayMaps[] = { _overlays3DFront, _overlays3D }; + QMap* overlayMaps[] = { &_overlays3DFront, &_overlays3D }; float bestDistance = std::numeric_limits::max(); RayToOverlayIntersectionResult result; for (int idx = 0; idx < 2; idx++) { - QMapIterator i(overlayMaps[idx]); + QMapIterator i(*overlayMaps[idx]); i.toBack(); while (i.hasPrevious()) { i.previous(); From 4febc45b6a04d2e9cd2fe3fc7091802de8f30666 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 25 Nov 2014 08:44:38 -0800 Subject: [PATCH 7/9] Add drawInFront to Base3DOverlay::getProperty --- interface/src/ui/overlays/Base3DOverlay.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index b3dc377282..1c80b62782 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -166,6 +166,9 @@ QScriptValue Base3DOverlay::getProperty(const QString& property) { if (property == "ignoreRayIntersection") { return _ignoreRayIntersection; } + if (property == "drawInFront") { + return _drawInFront; + } return Overlay::getProperty(property); } From 649ae4a4485398843842d35c33ecdb4118a6aebf Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 25 Nov 2014 09:49:10 -0800 Subject: [PATCH 8/9] Update 3D overlays to only use one list --- interface/src/Application.cpp | 8 +- interface/src/ui/overlays/Base3DOverlay.cpp | 7 -- interface/src/ui/overlays/Base3DOverlay.h | 5 +- interface/src/ui/overlays/Overlays.cpp | 108 ++++++-------------- interface/src/ui/overlays/Overlays.h | 13 +-- 5 files changed, 37 insertions(+), 104 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8d1e77ed25..de889c7f61 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2836,12 +2836,12 @@ void Application::updateShadowMap() { // render JS/scriptable overlays { PerformanceTimer perfTimer("3dOverlays"); - _overlays.render3D(RenderArgs::SHADOW_RENDER_MODE); + _overlays.render3D(false, RenderArgs::SHADOW_RENDER_MODE); } { PerformanceTimer perfTimer("3dOverlaysFront"); - _overlays.render3DFront(RenderArgs::SHADOW_RENDER_MODE); + _overlays.render3D(true, RenderArgs::SHADOW_RENDER_MODE); } glDisable(GL_POLYGON_OFFSET_FILL); @@ -3056,7 +3056,7 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly, RenderAr // render JS/scriptable overlays { PerformanceTimer perfTimer("3dOverlays"); - _overlays.render3D(); + _overlays.render3D(false); } // render the ambient occlusion effect if enabled @@ -3145,7 +3145,7 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly, RenderAr { PerformanceTimer perfTimer("3dOverlaysFront"); glClear(GL_DEPTH_BUFFER_BIT); - _overlays.render3DFront(); + _overlays.render3D(true); } } diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 1c80b62782..55b4c88812 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -46,13 +46,6 @@ Base3DOverlay::Base3DOverlay(const Base3DOverlay* base3DOverlay) : Base3DOverlay::~Base3DOverlay() { } -void Base3DOverlay::setDrawInFront(bool value) { - if (value != _drawInFront) { - _drawInFront = value; - emit drawInFrontUpdated(value); - } -} - void Base3DOverlay::setProperties(const QScriptValue& properties) { Overlay::setProperties(properties); diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 46d99cf3de..d57f9731c4 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -45,7 +45,7 @@ public: void setIsDashedLine(bool isDashedLine) { _isDashedLine = isDashedLine; } void setRotation(const glm::quat& value) { _rotation = value; } void setIgnoreRayIntersection(bool value) { _ignoreRayIntersection = value; } - void setDrawInFront(bool value); + void setDrawInFront(bool value) { _drawInFront = value; } virtual void setProperties(const QScriptValue& properties); virtual QScriptValue getProperty(const QString& property); @@ -57,9 +57,6 @@ public: return findRayIntersection(origin, direction, distance, face); } -signals: - void drawInFrontUpdated(bool newValue); - protected: void drawDashedLine(const glm::vec3& start, const glm::vec3& end); diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 2d4edca781..151e3c3ba7 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -29,8 +29,7 @@ #include "TextOverlay.h" #include "Text3DOverlay.h" -Overlays::Overlays() : _nextOverlayID(1), _overlaySignalMapper() { - connect(&_overlaySignalMapper, SIGNAL(mapped(int)), this, SLOT(handleOverlayDrawInFrontUpdated(unsigned int))); +Overlays::Overlays() : _nextOverlayID(1) { } Overlays::~Overlays() { @@ -71,9 +70,6 @@ void Overlays::update(float deltatime) { foreach(Overlay* thisOverlay, _overlays3D) { thisOverlay->update(deltatime); } - foreach(Overlay* thisOverlay, _overlays3DFront) { - thisOverlay->update(deltatime); - } } if (!_overlaysToDelete.isEmpty()) { @@ -97,17 +93,9 @@ void Overlays::render2D() { } } -void Overlays::render3D(RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { - render3DOverlays(_overlays3D, renderMode, renderSide); -} - -void Overlays::render3DFront(RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { - render3DOverlays(_overlays3DFront, renderMode, renderSide); -} - -void Overlays::render3DOverlays(QMap& overlays, RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { +void Overlays::render3D(bool drawFront, RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { QReadLocker lock(&_lock); - if (overlays.size() == 0) { + if (_overlays3D.size() == 0) { return; } bool myAvatarComputed = false; @@ -123,7 +111,11 @@ void Overlays::render3DOverlays(QMap& overlays, RenderAr renderMode, renderSide, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - foreach(Overlay* thisOverlay, overlays) { + foreach(Overlay* thisOverlay, _overlays3D) { + Base3DOverlay* overlay3D = static_cast(thisOverlay); + if (overlay3D->getDrawInFront() != drawFront) { + continue; + } glPushMatrix(); switch (thisOverlay->getAnchor()) { case Overlay::MY_AVATAR: @@ -200,15 +192,7 @@ unsigned int Overlays::addOverlay(Overlay* overlay) { unsigned int thisID = _nextOverlayID; _nextOverlayID++; if (overlay->is3D()) { - Base3DOverlay* overlay3D = static_cast(overlay); - if (overlay3D->getDrawInFront()) { - _overlays3DFront[thisID] = overlay; - } else { - _overlays3D[thisID] = overlay; - } - - _overlaySignalMapper.setMapping(overlay3D, thisID); - connect(overlay3D, SIGNAL(drawInFrontUpdated(bool)), &_overlaySignalMapper, SLOT(map())); + _overlays3D[thisID] = overlay; } else { _overlays2D[thisID] = overlay; } @@ -233,8 +217,6 @@ bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) { thisOverlay = _overlays2D[id]; } else if (_overlays3D.contains(id)) { thisOverlay = _overlays3D[id]; - } else if (_overlays3DFront.contains(id)) { - thisOverlay = _overlays3DFront[id]; } if (thisOverlay) { thisOverlay->setProperties(properties); @@ -252,8 +234,6 @@ void Overlays::deleteOverlay(unsigned int id) { overlayToDelete = _overlays2D.take(id); } else if (_overlays3D.contains(id)) { overlayToDelete = _overlays3D.take(id); - } else if (_overlays3DFront.contains(id)) { - overlayToDelete = _overlays3DFront.take(id); } else { return; } @@ -263,22 +243,6 @@ void Overlays::deleteOverlay(unsigned int id) { _overlaysToDelete.push_back(overlayToDelete); } -void Overlays::handleOverlayDrawInFrontUpdated(int overlayID) { - if (_overlays3D.contains(overlayID)) { - Base3DOverlay* overlay = static_cast(_overlays3D[overlayID]); - if (overlay->getDrawInFront()) { - _overlays3D.remove(overlayID); - _overlays3DFront[overlayID] = overlay; - } - } else if (_overlays3DFront.contains(overlayID)) { - Base3DOverlay* overlay = static_cast(_overlays3DFront[overlayID]); - if (!overlay->getDrawInFront()) { - _overlays3DFront.remove(overlayID); - _overlays3D[overlayID] = overlay; - } - } -} - unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { QReadLocker lock(&_lock); QMapIterator i(_overlays2D); @@ -302,8 +266,6 @@ OverlayPropertyResult Overlays::getProperty(unsigned int id, const QString& prop thisOverlay = _overlays2D[id]; } else if (_overlays3D.contains(id)) { thisOverlay = _overlays3D[id]; - } else if (_overlays3DFront.contains(id)) { - thisOverlay = _overlays3DFront[id]; } if (thisOverlay) { result.value = thisOverlay->getProperty(property); @@ -342,39 +304,33 @@ void OverlayPropertyResultFromScriptValue(const QScriptValue& value, OverlayProp } RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray) { - QMap* overlayMaps[] = { &_overlays3DFront, &_overlays3D }; - float bestDistance = std::numeric_limits::max(); + float bestIsFront = false; RayToOverlayIntersectionResult result; - for (int idx = 0; idx < 2; idx++) { - QMapIterator i(*overlayMaps[idx]); - i.toBack(); - while (i.hasPrevious()) { - i.previous(); - unsigned int thisID = i.key(); - Base3DOverlay* thisOverlay = static_cast(i.value()); - if (thisOverlay->getVisible() && !thisOverlay->getIgnoreRayIntersection() && thisOverlay->isLoaded()) { - float thisDistance; - BoxFace thisFace; - QString thisExtraInfo; - if (thisOverlay->findRayIntersectionExtraInfo(ray.origin, ray.direction, thisDistance, thisFace, thisExtraInfo)) { - if (thisDistance < bestDistance) { - bestDistance = thisDistance; - result.intersects = true; - result.distance = thisDistance; - result.face = thisFace; - result.overlayID = thisID; - result.intersection = ray.origin + (ray.direction * thisDistance); - result.extraInfo = thisExtraInfo; - } + QMapIterator i(_overlays3D); + i.toBack(); + while (i.hasPrevious()) { + i.previous(); + unsigned int thisID = i.key(); + Base3DOverlay* thisOverlay = static_cast(i.value()); + if (thisOverlay->getVisible() && !thisOverlay->getIgnoreRayIntersection() && thisOverlay->isLoaded()) { + float thisDistance; + BoxFace thisFace; + QString thisExtraInfo; + if (thisOverlay->findRayIntersectionExtraInfo(ray.origin, ray.direction, thisDistance, thisFace, thisExtraInfo)) { + bool isDrawInFront = thisOverlay->getDrawInFront(); + if (thisDistance < bestDistance && (!bestIsFront || isDrawInFront)) { + bestIsFront = isDrawInFront; + bestDistance = thisDistance; + result.intersects = true; + result.distance = thisDistance; + result.face = thisFace; + result.overlayID = thisID; + result.intersection = ray.origin + (ray.direction * thisDistance); + result.extraInfo = thisExtraInfo; } } } - if (result.intersects) { - // We first check the front overlays - if one has been intersected, prefer - // it over any other overlays and return it immediately. - break; - } } return result; } @@ -463,8 +419,6 @@ bool Overlays::isLoaded(unsigned int id) { thisOverlay = _overlays2D[id]; } else if (_overlays3D.contains(id)) { thisOverlay = _overlays3D[id]; - } else if (_overlays3DFront.contains(id)) { - thisOverlay = _overlays3DFront[id]; } else { return false; // not found } diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index c46d9474da..7acc2c7878 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -52,9 +52,7 @@ public: ~Overlays(); void init(QGLWidget* parent); void update(float deltatime); - void render3D(RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, - RenderArgs::RenderSide renderSide = RenderArgs::MONO); - void render3DFront(RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, + void render3D(bool drawFront, RenderArgs::RenderMode renderMode = RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::RenderSide renderSide = RenderArgs::MONO); void render2D(); @@ -91,19 +89,10 @@ public slots: /// overlay; in meters if it is a 3D text overlay float textWidth(unsigned int id, const QString& text) const; -protected: - void render3DOverlays(QMap& overlays, RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide); - -private slots: - /// QSignalMapper unfortunately does not work with unsigned integers. - void handleOverlayDrawInFrontUpdated(int overlayID); - private: QMap _overlays2D; QMap _overlays3D; - QMap _overlays3DFront; QList _overlaysToDelete; - QSignalMapper _overlaySignalMapper; unsigned int _nextOverlayID; QGLWidget* _parent; QReadWriteLock _lock; From f8c8ed868e2a652459c6a2646493bc8b842ef25b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 25 Nov 2014 12:08:48 -0800 Subject: [PATCH 9/9] Update float that should be bool --- interface/src/ui/overlays/Overlays.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 151e3c3ba7..455b73fb80 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -305,7 +305,7 @@ void OverlayPropertyResultFromScriptValue(const QScriptValue& value, OverlayProp RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray) { float bestDistance = std::numeric_limits::max(); - float bestIsFront = false; + bool bestIsFront = false; RayToOverlayIntersectionResult result; QMapIterator i(_overlays3D); i.toBack();