diff --git a/interface/resources/icons/statusIconAtlas.svg b/interface/resources/icons/statusIconAtlas.svg index 027102cc69..1ad83aa3b8 100644 --- a/interface/resources/icons/statusIconAtlas.svg +++ b/interface/resources/icons/statusIconAtlas.svg @@ -1,52 +1,171 @@ - - - - \ No newline at end of file diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index f153f66799..bb8b7ba7f4 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -597,7 +597,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar avatar->fadeOut(transaction, removalReason); workload::SpacePointer space = _space; - transaction.transitionFinishedOperator(avatar->getRenderItemID(), [space, avatar]() { + transaction.setTransitionFinishedOperator(avatar->getRenderItemID(), [space, avatar]() { if (avatar->getLastFadeRequested() != render::Transition::Type::USER_LEAVE_DOMAIN) { // The avatar is using another transition besides the fade-out transition, which means it is still in use. // Deleting the avatar now could cause state issues, so abort deletion and show message. diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 78481fdc2e..fb7eddd582 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -684,10 +684,10 @@ void Avatar::fadeOut(render::Transaction& transaction, KillAvatarReason reason) } void Avatar::fade(render::Transaction& transaction, render::Transition::Type type) { - transaction.addTransitionToItem(_renderItemID, type); + transaction.resetTransitionOnItem(_renderItemID, type); for (auto& attachmentModel : _attachmentModels) { for (auto itemId : attachmentModel->fetchRenderItemIDs()) { - transaction.addTransitionToItem(itemId, type, _renderItemID); + transaction.resetTransitionOnItem(itemId, type, _renderItemID); } } _lastFadeRequested = type; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index ae8473e544..1ecbcb0c8b 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1056,7 +1056,7 @@ void EntityTreeRenderer::fadeOutRenderable(const EntityRendererPointer& renderab render::Transaction transaction; auto scene = _viewState->getMain3DScene(); - transaction.transitionFinishedOperator(renderable->getRenderItemID(), [scene, renderable]() { + transaction.setTransitionFinishedOperator(renderable->getRenderItemID(), [scene, renderable]() { render::Transaction transaction; renderable->removeFromScene(scene, transaction); scene->enqueueTransaction(transaction); diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 183d2881f3..adf0a2d162 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -1653,7 +1653,7 @@ void PolyVoxEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& s #ifdef POLYVOX_ENTITY_USE_FADE_EFFECT if (!_hasTransitioned) { - transaction.addTransitionToItem(_renderItemID, render::Transition::ELEMENT_ENTER_DOMAIN); + transaction.resetTransitionOnItem(_renderItemID, render::Transition::ELEMENT_ENTER_DOMAIN); _hasTransitioned = true; } #endif diff --git a/libraries/render-utils/src/FadeEffectJobs.cpp b/libraries/render-utils/src/FadeEffectJobs.cpp index 1e2ea2bc15..43206e77fa 100644 --- a/libraries/render-utils/src/FadeEffectJobs.cpp +++ b/libraries/render-utils/src/FadeEffectJobs.cpp @@ -69,7 +69,7 @@ void FadeEditJob::run(const render::RenderContextPointer& renderContext, const F if (transition == nullptr || transition->isFinished || transition->eventType != transitionType) { // Relaunch transition render::Transaction transaction; - transaction.addTransitionToItem(id, transitionType); + transaction.resetTransitionOnItem(id, transitionType); scene->enqueueTransaction(transaction); } }); diff --git a/libraries/render/src/render/DrawStatus.cpp b/libraries/render/src/render/DrawStatus.cpp index 0484c0c125..d010929e7a 100644 --- a/libraries/render/src/render/DrawStatus.cpp +++ b/libraries/render/src/render/DrawStatus.cpp @@ -17,6 +17,8 @@ #include #include +#include "TransitionStage.h" + #include #include @@ -142,11 +144,43 @@ void DrawStatus::run(const RenderContextPointer& renderContext, const Input& inp auto& value = (vec4Num == 0 ? itemStatus[nbItems].first : itemStatus[nbItems].second); Item::Status::Value status; - status.setColor(Item::Status::Value::CYAN); - status.setIcon((unsigned char)Item::Status::Icon::SIMULATION_OWNER); - if (itemScene.getTransitionId() != INVALID_INDEX) { + auto transitionID = itemScene.getTransitionId(); + if (transitionID != INVALID_INDEX) { // We have a transition. Show this icon. status.setScale(1.0f); + // Is this a valid transition ID according to FadeJob? + auto transitionStage = scene->getStage(TransitionStage::getName()); + if (transitionStage) { + if (transitionStage->isTransitionUsed(transitionID)) { + // Valid, active transition + status.setColor(Item::Status::Value::CYAN); + } else { + // Render item has a defined transition ID, but it's unallocated and isn't being processed + status.setColor(Item::Status::Value::RED); + } + // Set icon based on transition type + auto& transition = transitionStage->getTransition(transitionID); + switch (transition.eventType) { + case Transition::Type::USER_ENTER_DOMAIN: + status.setIcon((unsigned char)Item::Status::Icon::USER_TRANSITION_IN); + break; + case Transition::Type::USER_LEAVE_DOMAIN: + status.setIcon((unsigned char)Item::Status::Icon::USER_TRANSITION_OUT); + break; + case Transition::ELEMENT_ENTER_DOMAIN: + status.setIcon((unsigned char)Item::Status::Icon::GENERIC_TRANSITION_IN); + break; + case Transition::ELEMENT_LEAVE_DOMAIN: + status.setIcon((unsigned char)Item::Status::Icon::GENERIC_TRANSITION_OUT); + break; + default: + status.setIcon((unsigned char)Item::Status::Icon::GENERIC_TRANSITION); + break; + } + } else { + // No way to determine transition + status.setScale(0.0f); + } } else { status.setScale(0.0f); } diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index d5d3e6942a..4736359832 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -363,6 +363,11 @@ public: HAS_ACTIONS = 4, OTHER_SIMULATION_OWNER = 5, ENTITY_HOST_TYPE = 6, + GENERIC_TRANSITION = 7, + GENERIC_TRANSITION_OUT = 8, + GENERIC_TRANSITION_IN = 9, + USER_TRANSITION_OUT = 10, + USER_TRANSITION_IN = 11, NONE = 255 }; diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 3fd52d5fa2..c516a833de 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -31,23 +31,19 @@ void Transaction::removeItem(ItemID id) { _removedItems.emplace_back(id); } -void Transaction::addTransitionToItem(ItemID id, Transition::Type transition, ItemID boundId) { - _addedTransitions.emplace_back(id, transition, boundId); +void Transaction::resetTransitionOnItem(ItemID id, Transition::Type transition, ItemID boundId) { + _resetTransitions.emplace_back(id, transition, boundId); } void Transaction::removeTransitionFromItem(ItemID id) { - _addedTransitions.emplace_back(id, Transition::NONE, render::Item::INVALID_ITEM_ID); -} - -void Transaction::reApplyTransitionToItem(ItemID id) { - _reAppliedTransitions.emplace_back(id); + _removeTransitions.emplace_back(id); } void Transaction::queryTransitionOnItem(ItemID id, TransitionQueryFunc func) { _queriedTransitions.emplace_back(id, func); } -void Transaction::transitionFinishedOperator(ItemID id, TransitionFinishedFunc func) { +void Transaction::setTransitionFinishedOperator(ItemID id, TransitionFinishedFunc func) { _transitionFinishedOperators.emplace_back(id, func); } @@ -76,9 +72,9 @@ void Transaction::reserve(const std::vector& transactionContainer) size_t removedItemsCount = 0; size_t updatedItemsCount = 0; size_t resetSelectionsCount = 0; - size_t addedTransitionsCount = 0; + size_t resetTransitionsCount = 0; + size_t removeTransitionsCount = 0; size_t queriedTransitionsCount = 0; - size_t reAppliedTransitionsCount = 0; size_t transitionFinishedOperatorsCount = 0; size_t highlightResetsCount = 0; size_t highlightRemovesCount = 0; @@ -89,10 +85,10 @@ void Transaction::reserve(const std::vector& transactionContainer) removedItemsCount += transaction._removedItems.size(); updatedItemsCount += transaction._updatedItems.size(); resetSelectionsCount += transaction._resetSelections.size(); - addedTransitionsCount += transaction._addedTransitions.size(); - transitionFinishedOperatorsCount += transaction._transitionFinishedOperators.size(); + resetTransitionsCount += transaction._resetTransitions.size(); + removeTransitionsCount += transaction._removeTransitions.size(); queriedTransitionsCount += transaction._queriedTransitions.size(); - reAppliedTransitionsCount += transaction._reAppliedTransitions.size(); + transitionFinishedOperatorsCount += transaction._transitionFinishedOperators.size(); highlightResetsCount += transaction._highlightResets.size(); highlightRemovesCount += transaction._highlightRemoves.size(); highlightQueriesCount += transaction._highlightQueries.size(); @@ -102,9 +98,9 @@ void Transaction::reserve(const std::vector& transactionContainer) _removedItems.reserve(removedItemsCount); _updatedItems.reserve(updatedItemsCount); _resetSelections.reserve(resetSelectionsCount); - _addedTransitions.reserve(addedTransitionsCount); + _resetTransitions.reserve(resetTransitionsCount); + _removeTransitions.reserve(removeTransitionsCount); _queriedTransitions.reserve(queriedTransitionsCount); - _reAppliedTransitions.reserve(reAppliedTransitionsCount); _transitionFinishedOperators.reserve(transitionFinishedOperatorsCount); _highlightResets.reserve(highlightResetsCount); _highlightRemoves.reserve(highlightRemovesCount); @@ -147,10 +143,10 @@ void Transaction::merge(Transaction&& transaction) { moveElements(_removedItems, transaction._removedItems); moveElements(_updatedItems, transaction._updatedItems); moveElements(_resetSelections, transaction._resetSelections); - moveElements(_addedTransitions, transaction._addedTransitions); + moveElements(_resetTransitions, transaction._resetTransitions); + moveElements(_removeTransitions, transaction._removeTransitions); moveElements(_queriedTransitions, transaction._queriedTransitions); moveElements(_transitionFinishedOperators, transaction._transitionFinishedOperators); - moveElements(_reAppliedTransitions, transaction._reAppliedTransitions); moveElements(_highlightResets, transaction._highlightResets); moveElements(_highlightRemoves, transaction._highlightRemoves); moveElements(_highlightQueries, transaction._highlightQueries); @@ -161,9 +157,9 @@ void Transaction::merge(const Transaction& transaction) { copyElements(_removedItems, transaction._removedItems); copyElements(_updatedItems, transaction._updatedItems); copyElements(_resetSelections, transaction._resetSelections); - copyElements(_addedTransitions, transaction._addedTransitions); + copyElements(_resetTransitions, transaction._resetTransitions); + copyElements(_removeTransitions, transaction._removeTransitions); copyElements(_queriedTransitions, transaction._queriedTransitions); - copyElements(_reAppliedTransitions, transaction._reAppliedTransitions); copyElements(_transitionFinishedOperators, transaction._transitionFinishedOperators); copyElements(_highlightResets, transaction._highlightResets); copyElements(_highlightRemoves, transaction._highlightRemoves); @@ -175,10 +171,10 @@ void Transaction::clear() { _removedItems.clear(); _updatedItems.clear(); _resetSelections.clear(); - _addedTransitions.clear(); + _resetTransitions.clear(); + _removeTransitions.clear(); _queriedTransitions.clear(); _transitionFinishedOperators.clear(); - _reAppliedTransitions.clear(); _highlightResets.clear(); _highlightRemoves.clear(); _highlightQueries.clear(); @@ -278,8 +274,8 @@ void Scene::processTransactionFrame(const Transaction& transaction) { removeItems(transaction._removedItems); // add transitions - transitionItems(transaction._addedTransitions); - reApplyTransitions(transaction._reAppliedTransitions); + resetTransitionItems(transaction._resetTransitions); + removeTransitionItems(transaction._removeTransitions); queryTransitionItems(transaction._queriedTransitions); resetTransitionFinishedOperator(transaction._transitionFinishedOperators); @@ -332,7 +328,7 @@ void Scene::removeItems(const Transaction::Removes& transactions) { } // Remove the transition to prevent updating it for nothing - resetItemTransition(removedID); + removeItemTransition(removedID); // Kill it item.kill(); @@ -384,7 +380,7 @@ void Scene::updateItems(const Transaction::Updates& transactions) { } } -void Scene::transitionItems(const Transaction::TransitionAdds& transactions) { +void Scene::resetTransitionItems(const Transaction::TransitionResets& transactions) { auto transitionStage = getStage(TransitionStage::getName()); if (!transitionStage) { @@ -401,12 +397,7 @@ void Scene::transitionItems(const Transaction::TransitionAdds& transactions) { // Remove pre-existing transition, if need be if (!TransitionStage::isIndexInvalid(transitionId)) { - // Only remove if: - // transitioning to something other than none or we're transitioning to none from ELEMENT_LEAVE_DOMAIN or USER_LEAVE_DOMAIN - const auto& oldTransitionType = transitionStage->getTransition(transitionId).eventType; - if (transitionType != oldTransitionType) { - resetItemTransition(itemId); - } + removeItemTransition(itemId); } // Add a new one. @@ -420,12 +411,15 @@ void Scene::transitionItems(const Transaction::TransitionAdds& transactions) { } } -void Scene::reApplyTransitions(const Transaction::TransitionReApplies& transactions) { - for (auto itemId : transactions) { +void Scene::removeTransitionItems(const Transaction::TransitionRemoves& transactions) { + for (auto& itemId : transactions) { // Access the true item const auto& item = _items[itemId]; auto transitionId = item.getTransitionId(); - setItemTransition(itemId, transitionId); + + if (!TransitionStage::isIndexInvalid(transitionId)) { + removeItemTransition(itemId); + } } } @@ -555,7 +549,7 @@ void Scene::setItemTransition(ItemID itemId, Index transitionId) { } } -void Scene::resetItemTransition(ItemID itemId) { +void Scene::removeItemTransition(ItemID itemId) { auto transitionStage = getStage(TransitionStage::getName()); if (!transitionStage) { return; diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 5f4a209b66..1bc282646b 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -50,20 +50,18 @@ public: void resetItem(ItemID id, const PayloadPointer& payload); void removeItem(ItemID id); bool hasRemovedItems() const { return !_removedItems.empty(); } - - void addTransitionToItem(ItemID id, Transition::Type transition, ItemID boundId = render::Item::INVALID_ITEM_ID); - void removeTransitionFromItem(ItemID id); - void reApplyTransitionToItem(ItemID id); - void queryTransitionOnItem(ItemID id, TransitionQueryFunc func); - void transitionFinishedOperator(ItemID id, TransitionFinishedFunc func); - template void updateItem(ItemID id, std::function func) { updateItem(id, std::make_shared>(func)); } - void updateItem(ItemID id, const UpdateFunctorPointer& functor); void updateItem(ItemID id) { updateItem(id, nullptr); } + // Transition (applied to an item) transactions + void resetTransitionOnItem(ItemID id, Transition::Type transition, ItemID boundId = render::Item::INVALID_ITEM_ID); + void removeTransitionFromItem(ItemID id); + void setTransitionFinishedOperator(ItemID id, TransitionFinishedFunc func); + void queryTransitionOnItem(ItemID id, TransitionQueryFunc func); + // Selection transactions void resetSelection(const Selection& selection); @@ -83,11 +81,14 @@ protected: using Reset = std::tuple; using Remove = ItemID; using Update = std::tuple; - using TransitionAdd = std::tuple; - using TransitionQuery = std::tuple; + + using TransitionReset = std::tuple; + using TransitionRemove = ItemID; using TransitionFinishedOperator = std::tuple; - using TransitionReApply = ItemID; + using TransitionQuery = std::tuple; + using SelectionReset = Selection; + using HighlightReset = std::tuple; using HighlightRemove = std::string; using HighlightQuery = std::tuple; @@ -95,11 +96,14 @@ protected: using Resets = std::vector; using Removes = std::vector; using Updates = std::vector; - using TransitionAdds = std::vector; - using TransitionQueries = std::vector; + + using TransitionResets = std::vector; + using TransitionRemoves = std::vector; using TransitionFinishedOperators = std::vector; - using TransitionReApplies = std::vector; + using TransitionQueries = std::vector; + using SelectionResets = std::vector; + using HighlightResets = std::vector; using HighlightRemoves = std::vector; using HighlightQueries = std::vector; @@ -107,11 +111,14 @@ protected: Resets _resetItems; Removes _removedItems; Updates _updatedItems; - TransitionAdds _addedTransitions; - TransitionQueries _queriedTransitions; - TransitionReApplies _reAppliedTransitions; + + TransitionResets _resetTransitions; + TransitionRemoves _removeTransitions; TransitionFinishedOperators _transitionFinishedOperators; + TransitionQueries _queriedTransitions; + SelectionResets _resetSelections; + HighlightResets _highlightResets; HighlightRemoves _highlightRemoves; HighlightQueries _highlightQueries; @@ -185,7 +192,7 @@ public: void resetStage(const Stage::Name& name, const StagePointer& stage); void setItemTransition(ItemID id, Index transitionId); - void resetItemTransition(ItemID id); + void removeItemTransition(ItemID id); protected: @@ -215,9 +222,11 @@ protected: void resetTransitionFinishedOperator(const Transaction::TransitionFinishedOperators& transactions); void removeItems(const Transaction::Removes& transactions); void updateItems(const Transaction::Updates& transactions); - void transitionItems(const Transaction::TransitionAdds& transactions); - void reApplyTransitions(const Transaction::TransitionReApplies& transactions); + + void resetTransitionItems(const Transaction::TransitionResets& transactions); + void removeTransitionItems(const Transaction::TransitionRemoves& transactions); void queryTransitionItems(const Transaction::TransitionQueries& transactions); + void resetHighlights(const Transaction::HighlightResets& transactions); void removeHighlights(const Transaction::HighlightRemoves& transactions); void queryHighlights(const Transaction::HighlightQueries& transactions); diff --git a/libraries/render/src/render/TransitionStage.h b/libraries/render/src/render/TransitionStage.h index 1d10a5dedb..abfdca9a06 100644 --- a/libraries/render/src/render/TransitionStage.h +++ b/libraries/render/src/render/TransitionStage.h @@ -30,7 +30,7 @@ namespace render { static bool isIndexInvalid(Index index) { return index == INVALID_INDEX; } - bool checkTransitionId(Index index) const { return _transitions.checkIndex(index); } + bool isTransitionUsed(Index index) const { return _transitions.checkIndex(index) && !_transitions.isElementFreed(index); } const Transition& getTransition(Index TransitionId) const { return _transitions.get(TransitionId); }