From 40d424a01d686077a114971a6704942bfe8de1b5 Mon Sep 17 00:00:00 2001 From: danteruiz Date: Wed, 27 Mar 2019 16:42:34 -0700 Subject: [PATCH 1/7] avatar fading --- interface/src/avatar/.#AvatarManager.cpp | 1 + interface/src/avatar/AvatarManager.cpp | 26 ++++++++---- interface/src/avatar/AvatarManager.h | 7 ++-- interface/src/avatar/OtherAvatar.cpp | 1 + .../src/avatars-renderer/Avatar.h | 1 + libraries/avatars/src/AvatarData.cpp | 1 + libraries/render/src/render/Scene.cpp | 42 +++++++++++++++++-- libraries/render/src/render/Scene.h | 12 +++++- libraries/render/src/render/Transition.h | 2 +- 9 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 interface/src/avatar/.#AvatarManager.cpp diff --git a/interface/src/avatar/.#AvatarManager.cpp b/interface/src/avatar/.#AvatarManager.cpp new file mode 100644 index 0000000000..b55ef44c07 --- /dev/null +++ b/interface/src/avatar/.#AvatarManager.cpp @@ -0,0 +1 @@ +Dante@DESKTOP-TUOA3HH.30568:1553633650 \ No newline at end of file diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 69f7054953..ea8cdc8105 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -210,7 +210,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { { // lock the hash for read to check the size QReadLocker lock(&_hashLock); - if (_avatarHash.size() < 2 && _avatarsToFadeOut.isEmpty()) { + if (_avatarHash.size() < 2 && _avatarsToFadeOut.empty()) { return; } } @@ -386,8 +386,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { _numAvatarsNotUpdated = numAvatarsNotUpdated; _numHeroAvatarsUpdated = numHerosUpdated; - simulateAvatarFades(deltaTime); - + removeFadedAvatars(); _avatarSimulationTime = (float)(usecTimestampNow() - startTime) / (float)USECS_PER_MSEC; } @@ -400,18 +399,17 @@ void AvatarManager::postUpdate(float deltaTime, const render::ScenePointer& scen } } -void AvatarManager::simulateAvatarFades(float deltaTime) { +void AvatarManager::removeFadedAvatars() { if (_avatarsToFadeOut.empty()) { return; } QReadLocker locker(&_hashLock); - QVector::iterator avatarItr = _avatarsToFadeOut.begin(); + auto avatarItr = _avatarsToFadeOut.begin(); const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; while (avatarItr != _avatarsToFadeOut.end()) { auto avatar = std::static_pointer_cast(*avatarItr); - avatar->updateFadingStatus(); if (!avatar->isFading()) { // fading to zero is such a rare event we push a unique transaction for each if (avatar->isInScene()) { @@ -452,7 +450,6 @@ void AvatarManager::buildPhysicsTransaction(PhysicsEngine::Transaction& transact transaction.objectsToRemove.push_back(mState); } avatar->resetDetailedMotionStates(); - } else { if (avatar->getDetailedMotionStates().size() == 0) { avatar->createDetailedMotionStates(avatar); @@ -541,8 +538,21 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar // remove from node sets, if present DependencyManager::get()->removeFromIgnoreMuteSets(avatar->getSessionUUID()); DependencyManager::get()->avatarDisconnected(avatar->getSessionUUID()); - avatar->fadeOut(qApp->getMain3DScene(), removalReason); + render::Transaction transaction; + auto scene = qApp->getMain3DScene(); + avatar->fadeOut(scene, removalReason); + + AvatarData* avatarData = removedAvatar.get(); + transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatarDataWeakPtr]() { + auto avatarDataPtr = avatarDataWeakPtr.lock(); + + if (avatarDataPtr) { + auto avatar = std::static_pointer_cast(avatarDataPtr); + avatar->setIsFading(false); + } + }); } + _avatarsToFadeOut.push_back(removedAvatar); } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 0468fbd809..9dde3a11fb 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -220,10 +220,10 @@ private: explicit AvatarManager(QObject* parent = 0); explicit AvatarManager(const AvatarManager& other); - void simulateAvatarFades(float deltaTime); - AvatarSharedPointer newSharedAvatar(const QUuid& sessionUUID) override; + void removeFadedAvatars(); + // called only from the AvatarHashMap thread - cannot be called while this thread holds the // hash lock, since handleRemovedAvatar needs a write lock on the entity tree and the entity tree // frequently grabs a read lock on the hash to get a given avatar by ID @@ -231,8 +231,7 @@ private: KillAvatarReason removalReason = KillAvatarReason::NoReason) override; void handleTransitAnimations(AvatarTransit::Status status); - QVector _avatarsToFadeOut; - + std::vector _avatarsToFadeOut; using SetOfOtherAvatars = std::set; SetOfOtherAvatars _avatarsToChangeInPhysics; diff --git a/interface/src/avatar/OtherAvatar.cpp b/interface/src/avatar/OtherAvatar.cpp index 11eb6542c4..22ddea14c6 100755 --- a/interface/src/avatar/OtherAvatar.cpp +++ b/interface/src/avatar/OtherAvatar.cpp @@ -50,6 +50,7 @@ OtherAvatar::OtherAvatar(QThread* thread) : Avatar(thread) { } OtherAvatar::~OtherAvatar() { + qDebug() << "-------->"; removeOrb(); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 6026367440..1eb760b857 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -463,6 +463,7 @@ public: void fadeIn(render::ScenePointer scene); void fadeOut(render::ScenePointer scene, KillAvatarReason reason); bool isFading() const { return _isFading; } + void setIsFading(bool isFading) { _isFading = isFading; } void updateFadingStatus(); // JSDoc is in AvatarData.h. diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 26407c3564..ee701020b5 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -132,6 +132,7 @@ AvatarData::AvatarData() : } AvatarData::~AvatarData() { + qDebug() << "AvatarData::~AvatarData()"; delete _headData; } diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 1850261c99..d3bcfb1f95 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -47,6 +47,10 @@ void Transaction::queryTransitionOnItem(ItemID id, TransitionQueryFunc func) { _queriedTransitions.emplace_back(id, func); } +void Transaction::transitionFinishedOperator(ItemID id, TransitionFinishedFunc func) { + _transitionFinishedOperators.emplace_back(id, func); +} + void Transaction::updateItem(ItemID id, const UpdateFunctorPointer& functor) { _updatedItems.emplace_back(id, functor); } @@ -75,6 +79,7 @@ void Transaction::reserve(const std::vector& transactionContainer) size_t addedTransitionsCount = 0; size_t queriedTransitionsCount = 0; size_t reAppliedTransitionsCount = 0; + size_t transitionFinishedOperatorsCount = 0; size_t highlightResetsCount = 0; size_t highlightRemovesCount = 0; size_t highlightQueriesCount = 0; @@ -85,6 +90,7 @@ void Transaction::reserve(const std::vector& transactionContainer) updatedItemsCount += transaction._updatedItems.size(); resetSelectionsCount += transaction._resetSelections.size(); addedTransitionsCount += transaction._addedTransitions.size(); + transitionFinishedOperatorsCount += transaction._transitionFinishedOperators.size(); queriedTransitionsCount += transaction._queriedTransitions.size(); reAppliedTransitionsCount += transaction._reAppliedTransitions.size(); highlightResetsCount += transaction._highlightResets.size(); @@ -99,6 +105,7 @@ void Transaction::reserve(const std::vector& transactionContainer) _addedTransitions.reserve(addedTransitionsCount); _queriedTransitions.reserve(queriedTransitionsCount); _reAppliedTransitions.reserve(reAppliedTransitionsCount); + _transitionFinishedOperators.reserve(transitionFinishedOperatorsCount); _highlightResets.reserve(highlightResetsCount); _highlightRemoves.reserve(highlightRemovesCount); _highlightQueries.reserve(highlightQueriesCount); @@ -142,6 +149,7 @@ void Transaction::merge(Transaction&& transaction) { moveElements(_resetSelections, transaction._resetSelections); moveElements(_addedTransitions, transaction._addedTransitions); moveElements(_queriedTransitions, transaction._queriedTransitions); + moveElements(_transitionFinishedOperators, transaction._transitionFinishedOperators); moveElements(_reAppliedTransitions, transaction._reAppliedTransitions); moveElements(_highlightResets, transaction._highlightResets); moveElements(_highlightRemoves, transaction._highlightRemoves); @@ -156,6 +164,7 @@ void Transaction::merge(const Transaction& transaction) { copyElements(_addedTransitions, transaction._addedTransitions); copyElements(_queriedTransitions, transaction._queriedTransitions); copyElements(_reAppliedTransitions, transaction._reAppliedTransitions); + copyElements(_transitionFinishedOperators, transaction._transitionFinishedOperators); copyElements(_highlightResets, transaction._highlightResets); copyElements(_highlightRemoves, transaction._highlightRemoves); copyElements(_highlightQueries, transaction._highlightQueries); @@ -168,6 +177,7 @@ void Transaction::clear() { _resetSelections.clear(); _addedTransitions.clear(); _queriedTransitions.clear(); + _transitionFinishedOperators.clear(); _reAppliedTransitions.clear(); _highlightResets.clear(); _highlightRemoves.clear(); @@ -261,6 +271,10 @@ void Scene::processTransactionFrame(const Transaction& transaction) { // Update the numItemsAtomic counter AFTER the reset changes went through _numAllocatedItems.exchange(maxID); + // reset transition finished operator + + resetTransitionFinishedOperator(transaction._transitionFinishedOperators); + // updates updateItems(transaction._updatedItems); @@ -440,6 +454,18 @@ void Scene::queryTransitionItems(const Transaction::TransitionQueries& transacti } } +void Scene::resetTransitionFinishedOperator(const Transaction::TransitionFinishedOperators& transactions) { + for (auto& finishedOperator : transactions) { + auto itemId = std::get<0>(finishedOperator); + const auto& item = _items[itemId]; + auto func = std::get<1>(finishedOperator); + + if (item.exist() && func != nullptr) { + _transitionFinishedOperatorMap[itemId] = func; + } + } +} + void Scene::resetHighlights(const Transaction::HighlightResets& transactions) { auto outlineStage = getStage(HighlightStage::getName()); if (outlineStage) { @@ -528,8 +554,18 @@ void Scene::resetItemTransition(ItemID itemId) { auto& item = _items[itemId]; if (!render::TransitionStage::isIndexInvalid(item.getTransitionId())) { auto transitionStage = getStage(TransitionStage::getName()); - transitionStage->removeTransition(item.getTransitionId()); - setItemTransition(itemId, render::TransitionStage::INVALID_INDEX); + auto transitionItemId = transitionStage->getTransition(item.getTransitionId()).itemId; + + if (transitionItemId == itemId) { + auto transitionFinishedOperator = _transitionFinishedOperatorMap[transitionItemId]; + + if (transitionFinishedOperator) { + transitionFinishedOperator(); + _transitionFinishedOperatorMap[transitionItemId] = nullptr; + } + transitionStage->removeTransition(item.getTransitionId()); + setItemTransition(itemId, render::TransitionStage::INVALID_INDEX); + } } } @@ -587,4 +623,4 @@ void Scene::resetStage(const Stage::Name& name, const StagePointer& stage) { } else { (*found).second = stage; } -} \ No newline at end of file +} diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index f00c74775d..c8eafcb696 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -32,12 +32,14 @@ class Scene; // These changes must be expressed through the corresponding command from the Transaction // THe Transaction is then queued on the Scene so all the pending transactions can be consolidated and processed at the time // of updating the scene before it s rendered. -// +// + class Transaction { friend class Scene; public: typedef std::function TransitionQueryFunc; + typedef std::function TransitionFinishedFunc; typedef std::function SelectionHighlightQueryFunc; Transaction() {} @@ -52,6 +54,7 @@ public: 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)); @@ -84,6 +87,7 @@ protected: using Update = std::tuple; using TransitionAdd = std::tuple; using TransitionQuery = std::tuple; + using TransitionFinishedOperator = std::tuple; using TransitionReApply = ItemID; using SelectionReset = Selection; using HighlightReset = std::tuple; @@ -95,6 +99,7 @@ protected: using Updates = std::vector; using TransitionAdds = std::vector; using TransitionQueries = std::vector; + using TransitionFinishedOperators = std::vector; using TransitionReApplies = std::vector; using SelectionResets = std::vector; using HighlightResets = std::vector; @@ -107,6 +112,7 @@ protected: TransitionAdds _addedTransitions; TransitionQueries _queriedTransitions; TransitionReApplies _reAppliedTransitions; + TransitionFinishedOperators _transitionFinishedOperators; SelectionResets _resetSelections; HighlightResets _highlightResets; HighlightRemoves _highlightRemoves; @@ -208,6 +214,7 @@ protected: ItemIDSet _masterNonspatialSet; void resetItems(const Transaction::Resets& transactions); + void resetTransitionFinishedOperator(const Transaction::TransitionFinishedOperators& transactions); void removeItems(const Transaction::Removes& transactions); void updateItems(const Transaction::Updates& transactions); void transitionItems(const Transaction::TransitionAdds& transactions); @@ -223,6 +230,9 @@ protected: mutable std::mutex _selectionsMutex; // mutable so it can be used in the thread safe getSelection const method SelectionMap _selections; + mutable std::mutex _transitionFinishedOperatorMapMutex; + std::unordered_map _transitionFinishedOperatorMap; + void resetSelections(const Transaction::SelectionResets& transactions); // More actions coming to selections soon: // void removeFromSelection(const Selection& selection); diff --git a/libraries/render/src/render/Transition.h b/libraries/render/src/render/Transition.h index 30bda8aa2a..eca41e9d6c 100644 --- a/libraries/render/src/render/Transition.h +++ b/libraries/render/src/render/Transition.h @@ -50,4 +50,4 @@ namespace render { typedef std::vector TransitionTypes; } -#endif // hifi_render_Transition_h \ No newline at end of file +#endif // hifi_render_Transition_h From d9b522d10cb55025e6f8927f72d31f94690b8e96 Mon Sep 17 00:00:00 2001 From: danteruiz Date: Wed, 27 Mar 2019 16:43:03 -0700 Subject: [PATCH 2/7] remove error file --- interface/src/avatar/.#AvatarManager.cpp | 1 - interface/src/avatar/AvatarManager.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 interface/src/avatar/.#AvatarManager.cpp diff --git a/interface/src/avatar/.#AvatarManager.cpp b/interface/src/avatar/.#AvatarManager.cpp deleted file mode 100644 index b55ef44c07..0000000000 --- a/interface/src/avatar/.#AvatarManager.cpp +++ /dev/null @@ -1 +0,0 @@ -Dante@DESKTOP-TUOA3HH.30568:1553633650 \ No newline at end of file diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index ea8cdc8105..33cd48a047 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -542,7 +542,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar auto scene = qApp->getMain3DScene(); avatar->fadeOut(scene, removalReason); - AvatarData* avatarData = removedAvatar.get(); + std::weak_ptr avatarDataWeakPtr = removedAvatar; transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatarDataWeakPtr]() { auto avatarDataPtr = avatarDataWeakPtr.lock(); From 04d9858f028fd642891fdb2ab43036df35cafb68 Mon Sep 17 00:00:00 2001 From: danteruiz Date: Thu, 28 Mar 2019 11:43:53 -0700 Subject: [PATCH 3/7] fixing remaining issues --- interface/src/avatar/AvatarManager.cpp | 12 ++++-------- interface/src/avatar/OtherAvatar.cpp | 1 - libraries/avatars/src/AvatarData.cpp | 1 - libraries/render/src/render/Scene.cpp | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 33cd48a047..aa1847f64b 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -542,15 +542,11 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar auto scene = qApp->getMain3DScene(); avatar->fadeOut(scene, removalReason); - std::weak_ptr avatarDataWeakPtr = removedAvatar; - transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatarDataWeakPtr]() { - auto avatarDataPtr = avatarDataWeakPtr.lock(); - - if (avatarDataPtr) { - auto avatar = std::static_pointer_cast(avatarDataPtr); - avatar->setIsFading(false); - } + transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatar]() { + avatar->setIsFading(false); }); + + scene->enqueueTransaction(transaction); } _avatarsToFadeOut.push_back(removedAvatar); diff --git a/interface/src/avatar/OtherAvatar.cpp b/interface/src/avatar/OtherAvatar.cpp index 22ddea14c6..11eb6542c4 100755 --- a/interface/src/avatar/OtherAvatar.cpp +++ b/interface/src/avatar/OtherAvatar.cpp @@ -50,7 +50,6 @@ OtherAvatar::OtherAvatar(QThread* thread) : Avatar(thread) { } OtherAvatar::~OtherAvatar() { - qDebug() << "-------->"; removeOrb(); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index ee701020b5..26407c3564 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -132,7 +132,6 @@ AvatarData::AvatarData() : } AvatarData::~AvatarData() { - qDebug() << "AvatarData::~AvatarData()"; delete _headData; } diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index d3bcfb1f95..0cbb7e1214 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -408,7 +408,7 @@ void Scene::transitionItems(const Transaction::TransitionAdds& transactions) { // 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 != Transition::NONE || !(oldTransitionType == Transition::ELEMENT_LEAVE_DOMAIN || oldTransitionType == Transition::USER_LEAVE_DOMAIN)) { + if (transitionType == Transition::NONE && oldTransitionType != Transition::NONE) { resetItemTransition(itemId); } } From b9d04c6ebb48181166da49fa8787faa5b75cd5fc Mon Sep 17 00:00:00 2001 From: danteruiz Date: Thu, 28 Mar 2019 16:42:29 -0700 Subject: [PATCH 4/7] adding entity to a faded list --- interface/src/avatar/MyAvatar.cpp | 2 -- interface/src/avatar/OtherAvatar.cpp | 1 - .../src/avatars-renderer/Avatar.cpp | 12 ------- .../src/avatars-renderer/Avatar.h | 1 - .../src/EntityTreeRenderer.cpp | 11 ++++++ .../src/EntityTreeRenderer.h | 4 +++ .../src/RenderableEntityItem.h | 3 ++ libraries/render/src/render/Scene.cpp | 36 ++++++++++--------- libraries/render/src/render/Scene.h | 3 +- 9 files changed, 38 insertions(+), 35 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 298e661f24..c5175aff73 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -939,8 +939,6 @@ void MyAvatar::simulate(float deltaTime, bool inView) { } handleChangedAvatarEntityData(); - - updateFadingStatus(); } // As far as I know no HMD system supports a play area of a kilometer in radius. diff --git a/interface/src/avatar/OtherAvatar.cpp b/interface/src/avatar/OtherAvatar.cpp index 11eb6542c4..81d88302fe 100755 --- a/interface/src/avatar/OtherAvatar.cpp +++ b/interface/src/avatar/OtherAvatar.cpp @@ -356,7 +356,6 @@ void OtherAvatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "grabs"); applyGrabChanges(); } - updateFadingStatus(); } void OtherAvatar::handleChangedAvatarEntityData() { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 992ee5db96..96a545fa97 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -682,18 +682,6 @@ void Avatar::fade(render::Transaction& transaction, render::Transition::Type typ _isFading = true; } -void Avatar::updateFadingStatus() { - if (_isFading) { - render::Transaction transaction; - transaction.queryTransitionOnItem(_renderItemID, [this](render::ItemID id, const render::Transition* transition) { - if (!transition || transition->isFinished) { - _isFading = false; - } - }); - AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); - } -} - void Avatar::removeFromScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_renderItemID); render::Item::clearID(_renderItemID); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 1eb760b857..da04c4adf7 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -464,7 +464,6 @@ public: void fadeOut(render::ScenePointer scene, KillAvatarReason reason); bool isFading() const { return _isFading; } void setIsFading(bool isFading) { _isFading = isFading; } - void updateFadingStatus(); // JSDoc is in AvatarData.h. Q_INVOKABLE virtual float getEyeHeight() const override; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index c235460404..3eed625916 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1057,6 +1057,17 @@ void EntityTreeRenderer::checkAndCallPreload(const EntityItemID& entityID, bool } } +void EntityTreeRenderable::fadeOutRenderable(const EntityRendererPointer& renderable) { + render::Transaction transaction; + auto scene = qApp->getMain3DScene(); + + transaction.transitionFinishedOperator(renderable->getRenderItemID(), [renderable]() { + renderable->setIsFading(false); + }); + + scene->enqueueTransaction(transaction); +} + void EntityTreeRenderer::playEntityCollisionSound(const EntityItemPointer& entity, const Collision& collision) { assert((bool)entity); auto renderable = renderableForEntity(entity); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index a511d73210..4d6c0e3ba2 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -93,6 +93,9 @@ public: /// reloads the entity scripts, calling unload and preload void reloadEntityScripts(); + void fadeOutRenderable(const EntityRenderablePointer& renderable); + void removeFadedRenderables(); + // event handles which may generate entity related events QUuid mousePressEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); @@ -255,6 +258,7 @@ private: std::unordered_map _renderablesToUpdate; std::unordered_map _entitiesInScene; std::unordered_map _entitiesToAdd; + std::vector _entityRendersToFadeOut; // For Scene.shouldRenderEntities QList _entityIDsLastInScene; diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index 39f9ad091e..b37e46d02e 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -44,6 +44,9 @@ public: const EntityItemPointer& getEntity() const { return _entity; } const ItemID& getRenderItemID() const { return _renderItemID; } + bool getIsFading() { return _isFading; } + void setIsFading(bool isFading) { _isFading = isFading; } + const SharedSoundPointer& getCollisionSound() { return _collisionSound; } void setCollisionSound(const SharedSoundPointer& sound) { _collisionSound = sound; } diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 0cbb7e1214..ad6523ce11 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -271,10 +271,6 @@ void Scene::processTransactionFrame(const Transaction& transaction) { // Update the numItemsAtomic counter AFTER the reset changes went through _numAllocatedItems.exchange(maxID); - // reset transition finished operator - - resetTransitionFinishedOperator(transaction._transitionFinishedOperators); - // updates updateItems(transaction._updatedItems); @@ -285,6 +281,7 @@ void Scene::processTransactionFrame(const Transaction& transaction) { transitionItems(transaction._addedTransitions); reApplyTransitions(transaction._reAppliedTransitions); queryTransitionItems(transaction._queriedTransitions); + resetTransitionFinishedOperator(transaction._transitionFinishedOperators); // Update the numItemsAtomic counter AFTER the pending changes went through _numAllocatedItems.exchange(maxID); @@ -408,7 +405,7 @@ void Scene::transitionItems(const Transaction::TransitionAdds& transactions) { // 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 == Transition::NONE && oldTransitionType != Transition::NONE) { + if (transitionType != oldTransitionType) { resetItemTransition(itemId); } } @@ -454,14 +451,19 @@ void Scene::queryTransitionItems(const Transaction::TransitionQueries& transacti } } -void Scene::resetTransitionFinishedOperator(const Transaction::TransitionFinishedOperators& transactions) { - for (auto& finishedOperator : transactions) { +void Scene::resetTransitionFinishedOperator(const Transaction::TransitionFinishedOperators& operators) { + for (auto& finishedOperator : operators) { auto itemId = std::get<0>(finishedOperator); const auto& item = _items[itemId]; auto func = std::get<1>(finishedOperator); if (item.exist() && func != nullptr) { - _transitionFinishedOperatorMap[itemId] = func; + TransitionStage::Index transitionId = item.getTransitionId(); + if (!TransitionStage::isIndexInvalid(transitionId)) { + _transitionFinishedOperatorMap[transitionId].emplace_back(func); + } else { + fucn(); + } } } } @@ -552,20 +554,20 @@ void Scene::setItemTransition(ItemID itemId, Index transitionId) { void Scene::resetItemTransition(ItemID itemId) { auto& item = _items[itemId]; - if (!render::TransitionStage::isIndexInvalid(item.getTransitionId())) { + TransitionStage::Index transitionId = item.getTransitionId(); + if (!render::TransitionStage::isIndexInvalid(transitionId)) { auto transitionStage = getStage(TransitionStage::getName()); - auto transitionItemId = transitionStage->getTransition(item.getTransitionId()).itemId; - if (transitionItemId == itemId) { - auto transitionFinishedOperator = _transitionFinishedOperatorMap[transitionItemId]; + auto finishedOperators = _transitionFinishedOperatorMap[transitionId]; - if (transitionFinishedOperator) { - transitionFinishedOperator(); - _transitionFinishedOperatorMap[transitionItemId] = nullptr; + for (auto finishedOperator : finishedOperators) { + if (finishedOperator) { + finishedOperator(); } - transitionStage->removeTransition(item.getTransitionId()); - setItemTransition(itemId, render::TransitionStage::INVALID_INDEX); } + _transitionFinishedOperatorMap.erase(transitionId); + transitionStage->removeTransition(transitionId); + setItemTransition(itemId, render::TransitionStage::INVALID_INDEX); } } diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index c8eafcb696..e2195cf8c1 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -230,8 +230,7 @@ protected: mutable std::mutex _selectionsMutex; // mutable so it can be used in the thread safe getSelection const method SelectionMap _selections; - mutable std::mutex _transitionFinishedOperatorMapMutex; - std::unordered_map _transitionFinishedOperatorMap; + std::unordered_map> _transitionFinishedOperatorMap; void resetSelections(const Transaction::SelectionResets& transactions); // More actions coming to selections soon: From db17f094dab32fdd822eefbd77c32e26d582a187 Mon Sep 17 00:00:00 2001 From: danteruiz Date: Fri, 29 Mar 2019 15:23:16 -0700 Subject: [PATCH 5/7] adding entities to fade out list; --- interface/src/avatar/AvatarManager.cpp | 5 +- .../src/avatars-renderer/Avatar.cpp | 4 +- .../src/avatars-renderer/Avatar.h | 2 +- .../src/EntityTreeRenderer.cpp | 50 +++++++++++++------ .../src/EntityTreeRenderer.h | 6 ++- .../src/RenderableEntityItem.cpp | 8 ++- libraries/render/src/render/Scene.cpp | 6 +-- libraries/render/src/render/Scene.h | 3 +- 8 files changed, 51 insertions(+), 33 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index aa1847f64b..fea0652964 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -531,7 +531,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar // it might not fire until after we create a new instance for the same remote avatar, which creates a race // on the creation of entities for that avatar instance and the deletion of entities for this instance avatar->removeAvatarEntitiesFromTree(); - + avatar->setIsFading(false); if (removalReason == KillAvatarReason::TheirAvatarEnteredYourBubble) { emit DependencyManager::get()->enteredIgnoreRadius(); } else if (removalReason == KillAvatarReason::AvatarDisconnected) { @@ -540,12 +540,11 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar DependencyManager::get()->avatarDisconnected(avatar->getSessionUUID()); render::Transaction transaction; auto scene = qApp->getMain3DScene(); - avatar->fadeOut(scene, removalReason); + avatar->fadeOut(transaction, removalReason); transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatar]() { avatar->setIsFading(false); }); - scene->enqueueTransaction(transaction); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 96a545fa97..dccf37c5b8 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -659,9 +659,8 @@ void Avatar::fadeIn(render::ScenePointer scene) { scene->enqueueTransaction(transaction); } -void Avatar::fadeOut(render::ScenePointer scene, KillAvatarReason reason) { +void Avatar::fadeOut(render::Transaction& transaction, KillAvatarReason reason) { render::Transition::Type transitionType = render::Transition::USER_LEAVE_DOMAIN; - render::Transaction transaction; if (reason == KillAvatarReason::YourAvatarEnteredTheirBubble) { transitionType = render::Transition::BUBBLE_ISECT_TRESPASSER; @@ -669,7 +668,6 @@ void Avatar::fadeOut(render::ScenePointer scene, KillAvatarReason reason) { transitionType = render::Transition::BUBBLE_ISECT_OWNER; } fade(transaction, transitionType); - scene->enqueueTransaction(transaction); } void Avatar::fade(render::Transaction& transaction, render::Transition::Type type) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index da04c4adf7..b4cad4f967 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -461,7 +461,7 @@ public: bool isMoving() const { return _moving; } void fadeIn(render::ScenePointer scene); - void fadeOut(render::ScenePointer scene, KillAvatarReason reason); + void fadeOut(render::Transaction& transaction, KillAvatarReason reason); bool isFading() const { return _isFading; } void setIsFading(bool isFading) { _isFading = isFading; } diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 3eed625916..2701467a2d 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -214,6 +214,30 @@ void EntityTreeRenderer::stopDomainAndNonOwnedEntities() { } } +void EntityTreeRenderer::removeFadedRenderables() { + if (_entityRenderablesToFadeOut.empty()) { + return; + } + + std::unique_lock lock(_entitiesToFadeLock); + auto entityIter = _entityRenderablesToFadeOut.begin(); + auto scene = _viewState->getMain3DScene(); + render::Transaction transaction; + + while (entityIter != _entityRenderablesToFadeOut.end()) { + auto entityRenderable = *entityIter; + + if (!entityRenderable->getIsFading()) { + entityRenderable->removeFromScene(scene, transaction); + entityIter = _entityRenderablesToFadeOut.erase(entityIter); + } else { + ++entityIter; + } + } + + scene->enqueueTransaction(transaction); +} + void EntityTreeRenderer::clearDomainAndNonOwnedEntities() { stopDomainAndNonOwnedEntities(); @@ -221,17 +245,15 @@ void EntityTreeRenderer::clearDomainAndNonOwnedEntities() { // remove all entities from the scene auto scene = _viewState->getMain3DScene(); if (scene) { - render::Transaction transaction; for (const auto& entry : _entitiesInScene) { const auto& renderer = entry.second; const EntityItemPointer& entityItem = renderer->getEntity(); if (!(entityItem->isLocalEntity() || (entityItem->isAvatarEntity() && entityItem->getOwningAvatarID() == getTree()->getMyAvatarSessionUUID()))) { - renderer->removeFromScene(scene, transaction); + fadeOutRenderable(renderer); } else { savedEntities[entry.first] = entry.second; } } - scene->enqueueTransaction(transaction); } _renderablesToUpdate = savedEntities; @@ -258,12 +280,10 @@ void EntityTreeRenderer::clear() { // remove all entities from the scene auto scene = _viewState->getMain3DScene(); if (scene) { - render::Transaction transaction; for (const auto& entry : _entitiesInScene) { const auto& renderer = entry.second; - renderer->removeFromScene(scene, transaction); + fadeOutRenderable(renderer); } - scene->enqueueTransaction(transaction); } else { qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown"; } @@ -531,6 +551,7 @@ void EntityTreeRenderer::update(bool simulate) { } } + removeFadedRenderables(); } void EntityTreeRenderer::handleSpaceUpdate(std::pair proxyUpdate) { @@ -1016,10 +1037,7 @@ void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) { forceRecheckEntities(); // reset our state to force checking our inside/outsideness of entities - // here's where we remove the entity payload from the scene - render::Transaction transaction; - renderable->removeFromScene(scene, transaction); - scene->enqueueTransaction(transaction); + fadeOutRenderable(renderable); } void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) { @@ -1057,24 +1075,26 @@ void EntityTreeRenderer::checkAndCallPreload(const EntityItemID& entityID, bool } } -void EntityTreeRenderable::fadeOutRenderable(const EntityRendererPointer& renderable) { +void EntityTreeRenderer::fadeOutRenderable(const EntityRendererPointer& renderable) { render::Transaction transaction; - auto scene = qApp->getMain3DScene(); + auto scene = _viewState->getMain3DScene(); + renderable->setIsFading(true); transaction.transitionFinishedOperator(renderable->getRenderItemID(), [renderable]() { renderable->setIsFading(false); }); scene->enqueueTransaction(transaction); + _entityRenderablesToFadeOut.push_back(renderable); } void EntityTreeRenderer::playEntityCollisionSound(const EntityItemPointer& entity, const Collision& collision) { assert((bool)entity); auto renderable = renderableForEntity(entity); - if (!renderable) { - return; + if (!renderable) { + return; } - + SharedSoundPointer collisionSound = renderable->getCollisionSound(); if (!collisionSound) { return; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 4d6c0e3ba2..32504abd56 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -93,7 +93,7 @@ public: /// reloads the entity scripts, calling unload and preload void reloadEntityScripts(); - void fadeOutRenderable(const EntityRenderablePointer& renderable); + void fadeOutRenderable(const EntityRendererPointer& renderable); void removeFadedRenderables(); // event handles which may generate entity related events @@ -258,7 +258,9 @@ private: std::unordered_map _renderablesToUpdate; std::unordered_map _entitiesInScene; std::unordered_map _entitiesToAdd; - std::vector _entityRendersToFadeOut; + + std::mutex _entitiesToFadeLock; + std::vector _entityRenderablesToFadeOut; // For Scene.shouldRenderEntities QList _entityIDsLastInScene; diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index a6826da91b..e4e135cd7f 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -148,7 +148,7 @@ EntityRenderer::EntityRenderer(const EntityItemPointer& entity) : _created(entit }); } -EntityRenderer::~EntityRenderer() { } +EntityRenderer::~EntityRenderer() {} // // Smart payload proxy members, implementing the payload interface @@ -418,9 +418,7 @@ void EntityRenderer::doRenderUpdateSynchronous(const ScenePointer& scene, Transa if (fading || _prevIsTransparent != transparent) { emit requestRenderUpdate(); } - if (fading) { - _isFading = Interpolate::calculateFadeRatio(_fadeStartTime) < 1.0f; - } + _prevIsTransparent = transparent; updateModelTransformAndBound(); @@ -493,4 +491,4 @@ glm::vec4 EntityRenderer::calculatePulseColor(const glm::vec4& color, const Puls } return result; -} \ No newline at end of file +} diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index ad6523ce11..c93054d5fe 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -461,8 +461,8 @@ void Scene::resetTransitionFinishedOperator(const Transaction::TransitionFinishe TransitionStage::Index transitionId = item.getTransitionId(); if (!TransitionStage::isIndexInvalid(transitionId)) { _transitionFinishedOperatorMap[transitionId].emplace_back(func); - } else { - fucn(); + } else if (func) { + func(); } } } @@ -559,7 +559,7 @@ void Scene::resetItemTransition(ItemID itemId) { auto transitionStage = getStage(TransitionStage::getName()); auto finishedOperators = _transitionFinishedOperatorMap[transitionId]; - + qDebug() << "removing transition: " << transitionId; for (auto finishedOperator : finishedOperators) { if (finishedOperator) { finishedOperator(); diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index e2195cf8c1..08fbf33bcd 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -34,6 +34,7 @@ class Scene; // of updating the scene before it s rendered. // + class Transaction { friend class Scene; public: @@ -230,7 +231,7 @@ protected: mutable std::mutex _selectionsMutex; // mutable so it can be used in the thread safe getSelection const method SelectionMap _selections; - std::unordered_map> _transitionFinishedOperatorMap; + std::unordered_map> _transitionFinishedOperatorMap; void resetSelections(const Transaction::SelectionResets& transactions); // More actions coming to selections soon: From fcb838a71f6d6e2c3f1b94051b131dbcd528f37d Mon Sep 17 00:00:00 2001 From: danteruiz Date: Mon, 1 Apr 2019 15:43:04 -0700 Subject: [PATCH 6/7] addressing review requests --- interface/src/avatar/AvatarManager.cpp | 59 +++++++------------ interface/src/avatar/AvatarManager.h | 4 -- libraries/avatars/src/AvatarHashMap.cpp | 1 - .../src/EntityTreeRenderer.cpp | 31 ++-------- .../src/EntityTreeRenderer.h | 2 - libraries/render/src/render/Scene.cpp | 1 - 6 files changed, 24 insertions(+), 74 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index fea0652964..956ea12aee 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -84,7 +84,6 @@ AvatarManager::AvatarManager(QObject* parent) : AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { AvatarSharedPointer avatar = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer); - const auto otherAvatar = std::static_pointer_cast(avatar); if (otherAvatar && _space) { std::unique_lock lock(_spaceLock); @@ -210,7 +209,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { { // lock the hash for read to check the size QReadLocker lock(&_hashLock); - if (_avatarHash.size() < 2 && _avatarsToFadeOut.empty()) { + if (_avatarHash.size() < 2) { return; } } @@ -375,18 +374,12 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { qApp->getMain3DScene()->enqueueTransaction(renderTransaction); } - if (!_spaceProxiesToDelete.empty() && _space) { - std::unique_lock lock(_spaceLock); - workloadTransaction.remove(_spaceProxiesToDelete); - _spaceProxiesToDelete.clear(); - } _space->enqueueTransaction(workloadTransaction); _numAvatarsUpdated = numAvatarsUpdated; _numAvatarsNotUpdated = numAvatarsNotUpdated; _numHeroAvatarsUpdated = numHerosUpdated; - removeFadedAvatars(); _avatarSimulationTime = (float)(usecTimestampNow() - startTime) / (float)USECS_PER_MSEC; } @@ -399,30 +392,6 @@ void AvatarManager::postUpdate(float deltaTime, const render::ScenePointer& scen } } -void AvatarManager::removeFadedAvatars() { - if (_avatarsToFadeOut.empty()) { - return; - } - - QReadLocker locker(&_hashLock); - auto avatarItr = _avatarsToFadeOut.begin(); - const render::ScenePointer& scene = qApp->getMain3DScene(); - render::Transaction transaction; - while (avatarItr != _avatarsToFadeOut.end()) { - auto avatar = std::static_pointer_cast(*avatarItr); - if (!avatar->isFading()) { - // fading to zero is such a rare event we push a unique transaction for each - if (avatar->isInScene()) { - avatar->removeFromScene(*avatarItr, scene, transaction); - } - avatarItr = _avatarsToFadeOut.erase(avatarItr); - } else { - ++avatarItr; - } - } - scene->enqueueTransaction(transaction); -} - AvatarSharedPointer AvatarManager::newSharedAvatar(const QUuid& sessionUUID) { auto otherAvatar = new OtherAvatar(qApp->thread()); otherAvatar->setSessionUUID(sessionUUID); @@ -517,10 +486,6 @@ void AvatarManager::removeDeadAvatarEntities(const SetOfEntities& deadEntities) void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason) { auto avatar = std::static_pointer_cast(removedAvatar); - { - std::unique_lock lock(_spaceLock); - _spaceProxiesToDelete.push_back(avatar->getSpaceIndex()); - } AvatarHashMap::handleRemovedAvatar(avatar, removalReason); avatar->tearDownGrabs(); @@ -534,6 +499,15 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar avatar->setIsFading(false); if (removalReason == KillAvatarReason::TheirAvatarEnteredYourBubble) { emit DependencyManager::get()->enteredIgnoreRadius(); + + workload::Transaction workloadTransaction; + workloadTransaction.remove(avatar->getSpaceIndex()); + _space->enqueueTransaction(workloadTransaction); + + const render::ScenePointer& scene = qApp->getMain3DScene(); + render::Transaction transaction; + avatar->removeFromScene(avatar, scene, transaction); + scene->enqueueTransaction(transaction); } else if (removalReason == KillAvatarReason::AvatarDisconnected) { // remove from node sets, if present DependencyManager::get()->removeFromIgnoreMuteSets(avatar->getSessionUUID()); @@ -542,13 +516,20 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar auto scene = qApp->getMain3DScene(); avatar->fadeOut(transaction, removalReason); - transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatar]() { + workload::SpacePointer space = _space; + transaction.transitionFinishedOperator(avatar->getRenderItemID(), [space, avatar]() { avatar->setIsFading(false); + const render::ScenePointer& scene = qApp->getMain3DScene(); + render::Transaction transaction; + avatar->removeFromScene(avatar, scene, transaction); + scene->enqueueTransaction(transaction); + + workload::Transaction workloadTransaction; + workloadTransaction.remove(avatar->getSpaceIndex()); + space->enqueueTransaction(workloadTransaction); }); scene->enqueueTransaction(transaction); } - - _avatarsToFadeOut.push_back(removedAvatar); } void AvatarManager::clearOtherAvatars() { diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 9dde3a11fb..f9b82da0c1 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -222,8 +222,6 @@ private: AvatarSharedPointer newSharedAvatar(const QUuid& sessionUUID) override; - void removeFadedAvatars(); - // called only from the AvatarHashMap thread - cannot be called while this thread holds the // hash lock, since handleRemovedAvatar needs a write lock on the entity tree and the entity tree // frequently grabs a read lock on the hash to get a given avatar by ID @@ -231,7 +229,6 @@ private: KillAvatarReason removalReason = KillAvatarReason::NoReason) override; void handleTransitAnimations(AvatarTransit::Status status); - std::vector _avatarsToFadeOut; using SetOfOtherAvatars = std::set; SetOfOtherAvatars _avatarsToChangeInPhysics; @@ -251,7 +248,6 @@ private: mutable std::mutex _spaceLock; workload::SpacePointer _space; - std::vector _spaceProxiesToDelete; AvatarTransit::TransitConfig _transitConfig; }; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index c16d65506a..3abd352778 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -439,7 +439,6 @@ void AvatarHashMap::removeAvatar(const QUuid& sessionUUID, KillAvatarReason remo } auto removedAvatar = _avatarHash.take(sessionUUID); - if (removedAvatar) { removedAvatars.push_back(removedAvatar); } diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 2701467a2d..7c9c724212 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -214,30 +214,6 @@ void EntityTreeRenderer::stopDomainAndNonOwnedEntities() { } } -void EntityTreeRenderer::removeFadedRenderables() { - if (_entityRenderablesToFadeOut.empty()) { - return; - } - - std::unique_lock lock(_entitiesToFadeLock); - auto entityIter = _entityRenderablesToFadeOut.begin(); - auto scene = _viewState->getMain3DScene(); - render::Transaction transaction; - - while (entityIter != _entityRenderablesToFadeOut.end()) { - auto entityRenderable = *entityIter; - - if (!entityRenderable->getIsFading()) { - entityRenderable->removeFromScene(scene, transaction); - entityIter = _entityRenderablesToFadeOut.erase(entityIter); - } else { - ++entityIter; - } - } - - scene->enqueueTransaction(transaction); -} - void EntityTreeRenderer::clearDomainAndNonOwnedEntities() { stopDomainAndNonOwnedEntities(); @@ -551,7 +527,6 @@ void EntityTreeRenderer::update(bool simulate) { } } - removeFadedRenderables(); } void EntityTreeRenderer::handleSpaceUpdate(std::pair proxyUpdate) { @@ -1080,12 +1055,14 @@ void EntityTreeRenderer::fadeOutRenderable(const EntityRendererPointer& renderab auto scene = _viewState->getMain3DScene(); renderable->setIsFading(true); - transaction.transitionFinishedOperator(renderable->getRenderItemID(), [renderable]() { + transaction.transitionFinishedOperator(renderable->getRenderItemID(), [scene, renderable]() { renderable->setIsFading(false); + render::Transaction transaction; + renderable->removeFromScene(scene, transaction); + scene->enqueueTransaction(transaction); }); scene->enqueueTransaction(transaction); - _entityRenderablesToFadeOut.push_back(renderable); } void EntityTreeRenderer::playEntityCollisionSound(const EntityItemPointer& entity, const Collision& collision) { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 32504abd56..08dd06f5c1 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -259,8 +259,6 @@ private: std::unordered_map _entitiesInScene; std::unordered_map _entitiesToAdd; - std::mutex _entitiesToFadeLock; - std::vector _entityRenderablesToFadeOut; // For Scene.shouldRenderEntities QList _entityIDsLastInScene; diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index c93054d5fe..16d1d49d9f 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -559,7 +559,6 @@ void Scene::resetItemTransition(ItemID itemId) { auto transitionStage = getStage(TransitionStage::getName()); auto finishedOperators = _transitionFinishedOperatorMap[transitionId]; - qDebug() << "removing transition: " << transitionId; for (auto finishedOperator : finishedOperators) { if (finishedOperator) { finishedOperator(); From 8115ef6d3613dfe228d201d145759f96e77c45dd Mon Sep 17 00:00:00 2001 From: danteruiz Date: Mon, 1 Apr 2019 16:46:15 -0700 Subject: [PATCH 7/7] addressing more requested changes --- interface/src/avatar/AvatarManager.cpp | 2 -- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 1 - libraries/avatars-renderer/src/avatars-renderer/Avatar.h | 3 --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 2 -- libraries/entities-renderer/src/EntityTreeRenderer.h | 1 - libraries/entities-renderer/src/RenderableEntityItem.cpp | 3 +++ libraries/entities-renderer/src/RenderableEntityItem.h | 3 --- 7 files changed, 3 insertions(+), 12 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 956ea12aee..3fbff292d7 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -496,7 +496,6 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar // it might not fire until after we create a new instance for the same remote avatar, which creates a race // on the creation of entities for that avatar instance and the deletion of entities for this instance avatar->removeAvatarEntitiesFromTree(); - avatar->setIsFading(false); if (removalReason == KillAvatarReason::TheirAvatarEnteredYourBubble) { emit DependencyManager::get()->enteredIgnoreRadius(); @@ -518,7 +517,6 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar workload::SpacePointer space = _space; transaction.transitionFinishedOperator(avatar->getRenderItemID(), [space, avatar]() { - avatar->setIsFading(false); const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; avatar->removeFromScene(avatar, scene, transaction); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index dccf37c5b8..77e5933d3d 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -677,7 +677,6 @@ void Avatar::fade(render::Transaction& transaction, render::Transition::Type typ transaction.addTransitionToItem(itemId, type, _renderItemID); } } - _isFading = true; } void Avatar::removeFromScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index b4cad4f967..56684e34b3 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -462,8 +462,6 @@ public: void fadeIn(render::ScenePointer scene); void fadeOut(render::Transaction& transaction, KillAvatarReason reason); - bool isFading() const { return _isFading; } - void setIsFading(bool isFading) { _isFading = isFading; } // JSDoc is in AvatarData.h. Q_INVOKABLE virtual float getEyeHeight() const override; @@ -655,7 +653,6 @@ protected: bool _initialized { false }; bool _isAnimatingScale { false }; bool _mustFadeIn { false }; - bool _isFading { false }; bool _reconstructSoftEntitiesJointMap { false }; float _modelScale { 1.0f }; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 7c9c724212..6cfff7bc41 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1054,9 +1054,7 @@ void EntityTreeRenderer::fadeOutRenderable(const EntityRendererPointer& renderab render::Transaction transaction; auto scene = _viewState->getMain3DScene(); - renderable->setIsFading(true); transaction.transitionFinishedOperator(renderable->getRenderItemID(), [scene, renderable]() { - renderable->setIsFading(false); render::Transaction transaction; renderable->removeFromScene(scene, transaction); scene->enqueueTransaction(transaction); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 08dd06f5c1..cee91ad1c7 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -94,7 +94,6 @@ public: void reloadEntityScripts(); void fadeOutRenderable(const EntityRendererPointer& renderable); - void removeFadedRenderables(); // event handles which may generate entity related events QUuid mousePressEvent(QMouseEvent* event); diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index e4e135cd7f..3a56521702 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -418,6 +418,9 @@ void EntityRenderer::doRenderUpdateSynchronous(const ScenePointer& scene, Transa if (fading || _prevIsTransparent != transparent) { emit requestRenderUpdate(); } + if (fading) { + _isFading = Interpolate::calculateFadeRatio(_fadeStartTime) < 1.0f; + } _prevIsTransparent = transparent; diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index b37e46d02e..39f9ad091e 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -44,9 +44,6 @@ public: const EntityItemPointer& getEntity() const { return _entity; } const ItemID& getRenderItemID() const { return _renderItemID; } - bool getIsFading() { return _isFading; } - void setIsFading(bool isFading) { _isFading = isFading; } - const SharedSoundPointer& getCollisionSound() { return _collisionSound; } void setCollisionSound(const SharedSoundPointer& sound) { _collisionSound = sound; }