From b9d04c6ebb48181166da49fa8787faa5b75cd5fc Mon Sep 17 00:00:00 2001 From: danteruiz Date: Thu, 28 Mar 2019 16:42:29 -0700 Subject: [PATCH] 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: