From 66d09a4c3ceca00c7574668c646ea2423d2d3b27 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Mon, 10 Jul 2017 16:02:12 +0200 Subject: [PATCH] Some objects fade and fixed crash due to invalid meta item id --- .../src/RenderableModelEntityItem.cpp | 14 ++++++++++---- libraries/render-utils/src/FadeEffect.cpp | 2 +- libraries/render/src/render/IndexedContainer.h | 4 ++++ libraries/render/src/render/Scene.cpp | 10 ++++++++++ libraries/render/src/render/TransitionStage.cpp | 4 +++- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 95a8812550..b65c8ee49c 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -493,11 +493,17 @@ ModelPointer RenderableModelEntityItem::getModelNotSafe() { void RenderableModelEntityItem::setModelURLFinished(bool success) { if (success) { const render::ScenePointer& scene = AbstractViewStateInterface::instance()->getMain3DScene(); - render::Transaction transaction; - const auto& item = scene->getItem(_myMetaItem); - transaction.transitionItem(_myMetaItem, render::Transition::ELEMENT_ENTER_LEAVE_DOMAIN); - scene->enqueueTransaction(transaction); + if (scene->isAllocatedID(_myMetaItem)) { + render::Transaction transaction; + + const auto& item = scene->getItem(_myMetaItem); + if (!item.exist()) { + qWarning() << "Starting transition on item without payload"; + } + transaction.transitionItem(_myMetaItem, render::Transition::ELEMENT_ENTER_LEAVE_DOMAIN); + scene->enqueueTransaction(transaction); + } } } diff --git a/libraries/render-utils/src/FadeEffect.cpp b/libraries/render-utils/src/FadeEffect.cpp index c8a9167ed4..9067f4ff09 100644 --- a/libraries/render-utils/src/FadeEffect.cpp +++ b/libraries/render-utils/src/FadeEffect.cpp @@ -620,7 +620,7 @@ render::ShapePipeline::ItemSetter FadeJob::getItemSetter() const { auto scene = args->_scene; auto batch = args->_batch; auto transitionStage = scene->getStage(render::TransitionStage::getName()); - render::Transition transitionState = transitionStage->getTransition(item.getTransitionId()); + auto& transitionState = transitionStage->getTransition(item.getTransitionId()); render::ShapeKey shapeKey(args->_globalShapeKey); // TODO test various cases: polyvox... etc diff --git a/libraries/render/src/render/IndexedContainer.h b/libraries/render/src/render/IndexedContainer.h index 4429ea22db..5aca12f83e 100644 --- a/libraries/render/src/render/IndexedContainer.h +++ b/libraries/render/src/render/IndexedContainer.h @@ -98,6 +98,10 @@ namespace indexed_container { return _elements[index]; } + bool isElementFreed(Index index) const { + return std::find(_allocator._freeIndices.begin(), _allocator._freeIndices.end(), index) != _allocator._freeIndices.end(); + } + const Element& get(Index index) const { return _elements[index]; } diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 12a04eef7b..2c55658657 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -178,6 +178,12 @@ void Scene::removeItems(const ItemIDs& ids) { _masterNonspatialSet.erase(removedID); } + // If there is a transition on this item, remove it + if (item.getTransitionId() != render::TransitionStage::INVALID_INDEX) { + auto transitionStage = getStage(TransitionStage::getName()); + transitionStage->removeTransition(item.getTransitionId()); + } + // Kill it item.kill(); } @@ -237,6 +243,10 @@ void Scene::transitionItems(const ItemIDs& ids, const TransitionTypes& types) { if (*transitionType != Transition::NONE) { transitionId = transitionStage->addTransition(itemId, *transitionType); } + else { + const auto& item = _items[itemId]; + transitionStage->removeTransition(item.getTransitionId()); + } setItemTransition(itemId, transitionId); // next loop diff --git a/libraries/render/src/render/TransitionStage.cpp b/libraries/render/src/render/TransitionStage.cpp index 76943d3409..ad2fbbe9cc 100644 --- a/libraries/render/src/render/TransitionStage.cpp +++ b/libraries/render/src/render/TransitionStage.cpp @@ -23,7 +23,9 @@ void TransitionStage::removeTransition(Index index) { if (idIterator != _activeTransitionIds.end()) { _activeTransitionIds.erase(idIterator); } - _transitions.freeElement(index); + if (!_transitions.isElementFreed(index)) { + _transitions.freeElement(index); + } } TransitionStageSetup::TransitionStageSetup() {