From 45e5d91b9dcc2cc035b25965d2e16869c39b6c7b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sat, 4 Nov 2017 20:49:55 -0700 Subject: [PATCH] Change the sub renderItemIDs list of the Model entity in its meta through a transaction instead of going through the pointer to the model --- .../entities-renderer/src/RenderableEntityItem.cpp | 8 ++++++++ .../entities-renderer/src/RenderableEntityItem.h | 4 ++++ .../src/RenderableModelEntityItem.cpp | 13 ++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index f9e88b430f..9e4d832037 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -295,6 +295,14 @@ void EntityRenderer::updateInScene(const ScenePointer& scene, Transaction& trans }); } +void EntityRenderer::clearSubRenderItemIDs() { + _subRenderItemIDs.clear(); +} + +void EntityRenderer::setSubRenderItemIDs(const render::ItemIDs& ids) { + _subRenderItemIDs = ids; +} + // // Internal methods // diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index d770e7c7aa..ed636ebf73 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -49,6 +49,9 @@ public: virtual bool addToScene(const ScenePointer& scene, Transaction& transaction) final; virtual void removeFromScene(const ScenePointer& scene, Transaction& transaction); + void clearSubRenderItemIDs(); + void setSubRenderItemIDs(const render::ItemIDs& ids); + protected: virtual bool needsRenderUpdateFromEntity() const final { return needsRenderUpdateFromEntity(_entity); } virtual void onAddToScene(const EntityItemPointer& entity); @@ -113,6 +116,7 @@ protected: SharedSoundPointer _collisionSound; QUuid _changeHandlerId; ItemID _renderItemID{ Item::INVALID_ITEM_ID }; + ItemIDs _subRenderItemIDs; quint64 _fadeStartTime{ usecTimestampNow() }; bool _isFading{ _entitiesShouldFadeFunction() }; bool _prevIsTransparent { false }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 03380ad321..d09db97cc3 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -953,7 +953,8 @@ ItemKey ModelEntityRenderer::getKey() { uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) { if (_model) { - auto metaSubItems = _model->fetchRenderItemIDs(); + // auto metaSubItems = _model->fetchRenderItemIDs(); + auto metaSubItems = _subRenderItemIDs; subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end()); return (uint32_t)metaSubItems.size(); } @@ -1202,6 +1203,10 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce if ((bool)model) { model->removeFromScene(scene, transaction); withWriteLock([&] { _model.reset(); }); + transaction.updateItem(getRenderItemID(), [](PayloadProxyInterface& data) { + auto re = static_cast(&data); + re->clearSubRenderItemIDs(); + }); } return; } @@ -1297,6 +1302,12 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce render::Item::Status::Getters statusGetters; makeStatusGetters(entity, statusGetters); model->addToScene(scene, transaction, statusGetters); + + auto newRenderItemIDs{ model->fetchRenderItemIDs() }; + transaction.updateItem(getRenderItemID(), [newRenderItemIDs](PayloadProxyInterface& data) { + auto re = static_cast(&data); + re->setSubRenderItemIDs(newRenderItemIDs); + }); } }