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); }