diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 61aa3b5d2d..e8ce812285 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1191,7 +1191,8 @@ bool EntityTreeRenderer::LayeredZones::clearDomainAndNonOwnedZones(const QUuid& auto it = c.begin(); while (it != c.end()) { - if (!(it->zone->isLocalEntity() || (it->zone->isAvatarEntity() && it->zone->getOwningAvatarID() == sessionUUID))) { + auto zone = it->zone.lock(); + if (!zone || !(zone->isLocalEntity() || (zone->isAvatarEntity() && zone->getOwningAvatarID() == sessionUUID))) { zonesChanged = true; it = c.erase(it); } else { @@ -1208,8 +1209,9 @@ bool EntityTreeRenderer::LayeredZones::clearDomainAndNonOwnedZones(const QUuid& std::pair EntityTreeRenderer::LayeredZones::getZoneInteractionProperties() const { auto it = c.cbegin(); while (it != c.cend()) { - if (it->zone && it->zone->isDomainEntity()) { - return { it->zone->getFlyingAllowed(), it->zone->getGhostingAllowed() }; + auto zone = it->zone.lock(); + if (zone && zone->isDomainEntity()) { + return { zone->getFlyingAllowed(), zone->getGhostingAllowed() }; } it++; } @@ -1219,7 +1221,7 @@ std::pair EntityTreeRenderer::LayeredZones::getZoneInteractionProper void EntityTreeRenderer::LayeredZones::remove(const std::shared_ptr& zone) { auto it = c.begin(); while (it != c.end()) { - if (it->zone == zone) { + if (it->zone.lock() == zone) { break; } it++; @@ -1262,7 +1264,7 @@ bool EntityTreeRenderer::LayeredZones::equals(const LayeredZones& other) const { void EntityTreeRenderer::LayeredZones::appendRenderIDs(render::ItemIDs& list, EntityTreeRenderer* entityTreeRenderer) const { auto it = c.cbegin(); while (it != c.cend()) { - if (it->zone) { + if (it->zone.lock()) { auto id = entityTreeRenderer->renderableIdForEntityId(it->id); if (id != render::Item::INVALID_ITEM_ID) { list.push_back(id); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index f7f5ae9f22..f4284078a3 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -213,11 +213,11 @@ private: LayeredZone(std::shared_ptr zone) : zone(zone), id(zone->getID()), volume(zone->getVolumeEstimate()) {} bool operator>(const LayeredZone& r) const { return volume > r.volume; } - bool operator==(const LayeredZone& r) const { return zone.get() == r.zone.get(); } + bool operator==(const LayeredZone& r) const { return zone.lock() == r.zone.lock(); } bool operator!=(const LayeredZone& r) const { return !(*this == r); } bool operator>=(const LayeredZone& r) const { return (*this > r) || (*this == r); } - std::shared_ptr zone; + std::weak_ptr zone; QUuid id; float volume; }; diff --git a/libraries/render-utils/src/ZoneRenderer.cpp b/libraries/render-utils/src/ZoneRenderer.cpp index 8403d87868..e1606ba9f8 100644 --- a/libraries/render-utils/src/ZoneRenderer.cpp +++ b/libraries/render-utils/src/ZoneRenderer.cpp @@ -43,6 +43,8 @@ const Selection::Name ZoneRendererTask::ZONES_SELECTION { "RankedZones" }; void ZoneRendererTask::build(JobModel& task, const Varying& input, Varying& output) { // Filter out the sorted list of zones + // FIXME: the zones in the selection are already sorted, but we're doing another sort here to pick the selected items + // out of `input`, which means we're also looping over the inItems an extra time. const auto zoneItems = task.addJob("FilterZones", input, ZONES_SELECTION); // just setup the current zone env diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index ff848aa464..3fd52d5fa2 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -277,9 +277,6 @@ void Scene::processTransactionFrame(const Transaction& transaction) { // removes removeItems(transaction._removedItems); - // handle selections - resetSelections(transaction._resetSelections); - // add transitions transitionItems(transaction._addedTransitions); reApplyTransitions(transaction._reAppliedTransitions); @@ -290,6 +287,8 @@ void Scene::processTransactionFrame(const Transaction& transaction) { _numAllocatedItems.exchange(maxID); } + resetSelections(transaction._resetSelections); + resetHighlights(transaction._highlightResets); removeHighlights(transaction._highlightRemoves); queryHighlights(transaction._highlightQueries);