From 970e7ca17d8ff6617d4ea2dca038141d301612b8 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 13 May 2016 13:32:00 -0700 Subject: [PATCH] don't crash when a moving model entity is deleted --- .../src/RenderableModelEntityItem.cpp | 21 +++++++++++++++---- .../src/RenderableModelEntityItem.h | 2 ++ libraries/render/src/render/Scene.cpp | 5 +++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index e13c2eac98..a7e14b4c07 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -808,13 +808,26 @@ void RenderableModelEntityItem::locationChanged(bool tellPhysics) { _model->setRotation(getRotation()); _model->setTranslation(getPosition()); - auto myMetaItemCopy = _myMetaItem; - void* key = (void*)this; - AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [_myMetaItem]() { + std::weak_ptr weakSelf = + std::static_pointer_cast(getThisPointer()); + + AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [weakSelf]() { + auto self = weakSelf.lock(); + if (!self) { + return; + } + + render::ItemID myMetaItem = self->getMetaRenderItem(); + + if (myMetaItem == render::Item::INVALID_ITEM_ID) { + return; + } + render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); render::PendingChanges pendingChanges; - pendingChanges.updateItem(myMetaItemCopy, [](RenderableModelEntityItemMeta& data){}); + + pendingChanges.updateItem(myMetaItem); scene->enqueuePendingChanges(pendingChanges); }); } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 59208d209d..9b21743395 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -87,6 +87,8 @@ public: bool hasRenderAnimation() const { return !_renderAnimationProperties.getURL().isEmpty(); } const QString& getRenderAnimationURL() const { return _renderAnimationProperties.getURL(); } + render::ItemID getMetaRenderItem() { return _myMetaItem; } + private: QVariantMap parseTexturesToMap(QString textures); void remapTextures(); diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index e091b4842c..0b1d8fb55f 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -157,6 +157,11 @@ void Scene::updateItems(const ItemIDs& ids, UpdateFunctors& functors) { auto updateFunctor = functors.begin(); for (auto updateID : ids) { + if (updateID == Item::INVALID_ITEM_ID) { + updateFunctor++; + continue; + } + // Access the true item auto& item = _items[updateID]; auto oldCell = item.getCell();