diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index 0497a20500..1e3390e49f 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -229,5 +229,6 @@ bool Overlay::addToScene(Overlay::Pointer overlay, std::shared_ptr scene, render::PendingChanges& pendingChanges) { pendingChanges.removeItem(_renderItemID); + _renderItemID = render::Item::INVALID_ITEM_ID; } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index e963c81144..789ca96bd8 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -208,9 +208,7 @@ unsigned int Overlays::addOverlay(Overlay::Pointer overlay) { render::ScenePointer scene = qApp->getMain3DScene(); render::PendingChanges pendingChanges; - overlay->addToScene(overlay, scene, pendingChanges); - scene->enqueuePendingChanges(pendingChanges); } } else { @@ -244,18 +242,35 @@ bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) { auto overlay3D = std::static_pointer_cast(thisOverlay); bool oldDrawOnHUD = overlay3D->getDrawOnHUD(); - thisOverlay->setProperties(properties); - bool drawOnHUD = overlay3D->getDrawOnHUD(); + render::ItemKey oldItemKey = render::payloadGetKey(thisOverlay); + thisOverlay->setProperties(properties); + + render::ScenePointer scene = qApp->getMain3DScene(); + render::PendingChanges pendingChanges; + auto itemID = thisOverlay->getRenderItemID(); + + bool drawOnHUD = overlay3D->getDrawOnHUD(); + render::ItemKey itemKey = render::payloadGetKey(thisOverlay); if (drawOnHUD != oldDrawOnHUD) { if (drawOnHUD) { _overlaysWorld.remove(id); _overlaysHUD[id] = thisOverlay; + if (itemID != render::Item::INVALID_ITEM_ID) { + thisOverlay->removeFromScene(thisOverlay, scene, pendingChanges); + } } else { _overlaysHUD.remove(id); _overlaysWorld[id] = thisOverlay; + thisOverlay->addToScene(thisOverlay, scene, pendingChanges); + } + } else if (itemKey != oldItemKey && !drawOnHUD) { + if (itemID != render::Item::INVALID_ITEM_ID) { + pendingChanges.resortItem(itemID, oldItemKey, itemKey); } } + + scene->enqueuePendingChanges(pendingChanges); } else { thisOverlay->setProperties(properties); } diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 1c4dbe1c29..74c832a0c4 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -117,7 +117,10 @@ public: bool isSmall() const { return _flags[SMALLER]; } void setSmaller(bool smaller) { (smaller ? _flags.set(SMALLER) : _flags.reset(SMALLER)); } + bool operator==(const ItemKey& key) { return (_flags == key._flags); } + bool operator!=(const ItemKey& key) { return (_flags != key._flags); } }; +using ItemKeys = std::vector; inline QDebug operator<<(QDebug debug, const ItemKey& itemKey) { debug << "[ItemKey: isOpaque:" << itemKey.isOpaque()