From 56f335bb65a072e1e0740d5a01100f9638ab8b5d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 29 Jul 2014 11:51:24 -0700 Subject: [PATCH 1/5] Make sure models are in range before adding them --- examples/sit.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/sit.js b/examples/sit.js index c157d4854d..793a1b1d67 100644 --- a/examples/sit.js +++ b/examples/sit.js @@ -274,7 +274,10 @@ function update(deltaTime){ for (var i = 0; i < foundModels.length; ++i) { var model = foundModels[i]; if (typeof(models[model.id]) == "undefined") { - addIndicators(model); + model.properties = Models.getModelProperties(model); + if (Vec3.distance(model.properties.position, MyAvatar.position) < SEARCH_RADIUS) { + addIndicators(model); + } } } @@ -285,7 +288,6 @@ function update(deltaTime){ } function addIndicators(modelID) { - modelID.properties = Models.getModelProperties(modelID); if (modelID.properties.sittingPoints.length > 0) { for (var i = 0; i < modelID.properties.sittingPoints.length; ++i) { modelID.properties.sittingPoints[i].indicator = new SeatIndicator(modelID.properties, i); From 6c21c44beb11587d582b566ad7ffa4433e09ef8f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 29 Jul 2014 11:52:25 -0700 Subject: [PATCH 2/5] Bumped up the search radius to 50 --- examples/sit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sit.js b/examples/sit.js index 793a1b1d67..f8436a0fc8 100644 --- a/examples/sit.js +++ b/examples/sit.js @@ -261,7 +261,7 @@ function update(deltaTime){ MyAvatar.position.z != avatarOldPosition.z) { avatarOldPosition = MyAvatar.position; - var SEARCH_RADIUS = 10; + var SEARCH_RADIUS = 50; var foundModels = Models.findModels(MyAvatar.position, SEARCH_RADIUS); // Let's remove indicator that got out of radius for (model in models) { From f2dbaaf65c9fa48752836b03a7c837ca91005a98 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 29 Jul 2014 13:13:16 -0700 Subject: [PATCH 3/5] Clean sitting targets when changing domain --- examples/sit.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/examples/sit.js b/examples/sit.js index f8436a0fc8..3d41ebf64d 100644 --- a/examples/sit.js +++ b/examples/sit.js @@ -285,7 +285,16 @@ function update(deltaTime){ showIndicators(true); } } + + if (location.hostname != oldHost) { + print("Changed domain"); + for (model in models) { + removeIndicators(models[model]); + } + oldHost = location.hostname; + } } +var oldHost = location.hostname; function addIndicators(modelID) { if (modelID.properties.sittingPoints.length > 0) { From 28d4efbad6da71700113a55f30298fe34f837602 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 29 Jul 2014 13:13:35 -0700 Subject: [PATCH 4/5] Don't display anything if overlays not loaded --- interface/src/ui/overlays/BillboardOverlay.cpp | 14 ++++---------- interface/src/ui/overlays/ImageOverlay.cpp | 5 ++++- interface/src/ui/overlays/ModelOverlay.cpp | 6 +++++- interface/src/ui/overlays/Overlay.cpp | 1 + interface/src/ui/overlays/Overlay.h | 2 ++ 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index e7d5cef3be..7d85d54fef 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -17,10 +17,11 @@ BillboardOverlay::BillboardOverlay() : _fromImage(-1,-1,-1,-1), _scale(1.0f), _isFacingAvatar(true) { + _isLoaded = false; } void BillboardOverlay::render() { - if (!_visible) { + if (!_visible || !_isLoaded) { return; } @@ -85,16 +86,7 @@ void BillboardOverlay::render() { ((float)_fromImage.y() + (float)_fromImage.height()) / (float)_size.height()); glVertex2f(-x, y); } glEnd(); - } else { - glColor4f(0.5f, 0.5f, 0.5f, 1.0f); - glBegin(GL_QUADS); { - glVertex2f(-1.0f, -1.0f); - glVertex2f(1.0f, -1.0f); - glVertex2f(1.0f, 1.0f); - glVertex2f(-1.0f, 1.0f); - } glEnd(); } - } glPopMatrix(); glDisable(GL_TEXTURE_2D); @@ -167,6 +159,7 @@ void BillboardOverlay::setProperties(const QScriptValue &properties) { } void BillboardOverlay::setBillboardURL(const QUrl url) { + _isLoaded = false; QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(url)); connect(reply, &QNetworkReply::finished, this, &BillboardOverlay::replyFinished); } @@ -175,4 +168,5 @@ void BillboardOverlay::replyFinished() { // replace our byte array with the downloaded data QNetworkReply* reply = static_cast(sender()); _billboard = reply->readAll(); + _isLoaded = true; } diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index aeea781eb6..7104b3aced 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -24,6 +24,7 @@ ImageOverlay::ImageOverlay() : _textureBound(false), _wantClipFromImage(false) { + _isLoaded = false; } ImageOverlay::~ImageOverlay() { @@ -35,6 +36,7 @@ ImageOverlay::~ImageOverlay() { // TODO: handle setting image multiple times, how do we manage releasing the bound texture? void ImageOverlay::setImageURL(const QUrl& url) { + _isLoaded = false; NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); connect(reply, &QNetworkReply::finished, this, &ImageOverlay::replyFinished); @@ -47,10 +49,11 @@ void ImageOverlay::replyFinished() { QByteArray rawData = reply->readAll(); _textureImage.loadFromData(rawData); _renderImage = true; + _isLoaded = true; } void ImageOverlay::render() { - if (!_visible) { + if (!_visible || !_isLoaded) { return; // do nothing if we're not visible } if (_renderImage && !_textureBound) { diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 57f098aee3..b1d55de12a 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -15,8 +15,10 @@ ModelOverlay::ModelOverlay() : _model(), _scale(1.0f), - _updateModel(false) { + _updateModel(false) +{ _model.init(); + _isLoaded = false; } void ModelOverlay::update(float deltatime) { @@ -32,6 +34,7 @@ void ModelOverlay::update(float deltatime) { } else { _model.simulate(deltatime); } + _isLoaded = _model.isActive(); } void ModelOverlay::render() { @@ -90,6 +93,7 @@ void ModelOverlay::setProperties(const QScriptValue &properties) { if (urlValue.isValid()) { _url = urlValue.toVariant().toString(); _updateModel = true; + _isLoaded = false; } QScriptValue scaleValue = properties.property("scale"); diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index bc7096c471..9d492c6e50 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -21,6 +21,7 @@ Overlay::Overlay() : _parent(NULL), + _isLoaded(true), _alpha(DEFAULT_ALPHA), _color(DEFAULT_OVERLAY_COLOR), _visible(true), diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index f8d6400bf6..c5329688ff 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -40,6 +40,7 @@ public: virtual void render() = 0; // getters + bool isLoaded() { return _isLoaded; } bool getVisible() const { return _visible; } const xColor& getColor() const { return _color; } float getAlpha() const { return _alpha; } @@ -55,6 +56,7 @@ public: protected: QGLWidget* _parent; + bool _isLoaded; float _alpha; xColor _color; bool _visible; // should the overlay be drawn at all From 0bad10b09c0f52373ddc174d98292bc076223d7e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 29 Jul 2014 13:25:34 -0700 Subject: [PATCH 5/5] Add isLoaded to Overlays --- examples/sit.js | 25 ++++++++++++++----------- interface/src/ui/overlays/Overlays.cpp | 14 +++++++++++++- interface/src/ui/overlays/Overlays.h | 3 +++ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/examples/sit.js b/examples/sit.js index 3d41ebf64d..0f4b199855 100644 --- a/examples/sit.js +++ b/examples/sit.js @@ -255,10 +255,21 @@ function update(deltaTime){ } frame++; } + + var locationChanged = false; + if (location.hostname != oldHost) { + print("Changed domain"); + for (model in models) { + removeIndicators(models[model]); + } + oldHost = location.hostname; + locationChanged = true; + } - if (MyAvatar.position.x != avatarOldPosition.x && - MyAvatar.position.y != avatarOldPosition.y && - MyAvatar.position.z != avatarOldPosition.z) { + if (MyAvatar.position.x != avatarOldPosition.x || + MyAvatar.position.y != avatarOldPosition.y || + MyAvatar.position.z != avatarOldPosition.z || + locationChanged) { avatarOldPosition = MyAvatar.position; var SEARCH_RADIUS = 50; @@ -285,14 +296,6 @@ function update(deltaTime){ showIndicators(true); } } - - if (location.hostname != oldHost) { - print("Changed domain"); - for (model in models) { - removeIndicators(models[model]); - } - oldHost = location.hostname; - } } var oldHost = location.hostname; diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 581947c074..5d16bd78e5 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -227,11 +227,23 @@ unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { i.previous(); unsigned int thisID = i.key(); Overlay2D* thisOverlay = static_cast(i.value()); - if (thisOverlay->getVisible() && thisOverlay->getBounds().contains(point.x, point.y, false)) { + if (thisOverlay->getVisible() && thisOverlay->isLoaded() && thisOverlay->getBounds().contains(point.x, point.y, false)) { return thisID; } } return 0; // not found } +bool Overlays::isLoaded(unsigned int id) { + QReadLocker lock(&_lock); + Overlay* overlay = _overlays2D.value(id); + if (!overlay) { + _overlays3D.value(id); + } + if (!overlay) { + return false; // not found + } + + return overlay->isLoaded(); +} diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 2fbdb993f4..8bd8224f82 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -38,6 +38,9 @@ public slots: /// returns the top most overlay at the screen point, or 0 if not overlay at that point unsigned int getOverlayAtPoint(const glm::vec2& point); + + /// returns whether the overlay's assets are loaded or not + bool isLoaded(unsigned int id); private: QMap _overlays2D;