diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index b510f58b12..a9dcb3883c 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -434,8 +434,6 @@ void RenderableModelEntityItem::render(RenderArgs* args) { _showCollisionHull = shouldShowCollisionHull; render::PendingChanges pendingChanges; - _model->removeFromScene(scene, pendingChanges); - render::Item::Status::Getters statusGetters; makeEntityItemStatusGetters(getThisPointer(), statusGetters); _model->addToScene(scene, pendingChanges, statusGetters, _showCollisionHull); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 39ffc9dd9a..3a5928f3d1 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -541,43 +541,6 @@ void Model::setVisibleInScene(bool newValue, std::shared_ptr scen } } - -bool Model::addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges, bool showCollisionHull) { - - if ((!_meshGroupsKnown || showCollisionHull != _showCollisionHull) && isLoaded()) { - _showCollisionHull = showCollisionHull; - segregateMeshGroups(); - } - - bool somethingAdded = false; - - foreach (auto renderItem, _modelMeshRenderItemsSet) { - auto item = scene->allocateID(); - auto renderPayload = std::make_shared(renderItem); - pendingChanges.resetItem(item, renderPayload); - pendingChanges.updateItem(item, [](ModelMeshPartPayload& data) { - data.notifyLocationChanged(); - }); - _modelMeshRenderItems.insert(item, renderPayload); - somethingAdded = true; - } - - foreach (auto renderItem, _collisionRenderItemsSet) { - auto item = scene->allocateID(); - auto renderPayload = std::make_shared(renderItem); - pendingChanges.resetItem(item, renderPayload); - pendingChanges.updateItem(item, [](MeshPartPayload& data) { - data.notifyLocationChanged(); - }); - _collisionRenderItems.insert(item, renderPayload); - somethingAdded = true; - } - - _readyWhenAdded = readyToAddToScene(); - - return somethingAdded; -} - bool Model::addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges, render::Item::Status::Getters& statusGetters, @@ -589,28 +552,48 @@ bool Model::addToScene(std::shared_ptr scene, bool somethingAdded = false; - foreach (auto renderItem, _modelMeshRenderItemsSet) { - auto item = scene->allocateID(); - auto renderPayload = std::make_shared(renderItem); - renderPayload->addStatusGetters(statusGetters); - pendingChanges.resetItem(item, renderPayload); - pendingChanges.updateItem(item, [](ModelMeshPartPayload& data) { - data.notifyLocationChanged(); - }); - _modelMeshRenderItems.insert(item, renderPayload); - somethingAdded = true; + if (_modelMeshRenderItems.size()) { + for (auto item : _modelMeshRenderItems.keys()) { + pendingChanges.updateItem(item, [](ModelMeshPartPayload& data) { + data.notifyLocationChanged(); + }); + } + } else { + for (auto renderItem : _modelMeshRenderItemsSet) { + auto item = scene->allocateID(); + auto renderPayload = std::make_shared(renderItem); + if (statusGetters.size()) { + renderPayload->addStatusGetters(statusGetters); + } + pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [](ModelMeshPartPayload& data) { + data.notifyLocationChanged(); + }); + _modelMeshRenderItems.insert(item, renderPayload); + somethingAdded = true; + } } - foreach (auto renderItem, _collisionRenderItemsSet) { - auto item = scene->allocateID(); - auto renderPayload = std::make_shared(renderItem); - renderPayload->addStatusGetters(statusGetters); - pendingChanges.resetItem(item, renderPayload); - pendingChanges.updateItem(item, [](MeshPartPayload& data) { - data.notifyLocationChanged(); - }); - _collisionRenderItems.insert(item, renderPayload); - somethingAdded = true; + if (_collisionRenderItems.size()) { + for (auto item : _collisionRenderItems.keys()) { + pendingChanges.updateItem(item, [](MeshPartPayload& data) { + data.notifyLocationChanged(); + }); + } + } else { + for (auto renderItem : _collisionRenderItemsSet) { + auto item = scene->allocateID(); + auto renderPayload = std::make_shared(renderItem); + if (statusGetters.size()) { + renderPayload->addStatusGetters(statusGetters); + } + pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [](MeshPartPayload& data) { + data.notifyLocationChanged(); + }); + _collisionRenderItems.insert(item, renderPayload); + somethingAdded = true; + } } _readyWhenAdded = readyToAddToScene(); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 03760378f0..239d0e7c28 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -87,7 +87,10 @@ public: bool initWhenReady(render::ScenePointer scene); bool addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges, - bool showCollisionHull = false); + bool showCollisionHull = false) { + auto getters = render::Item::Status::Getters(0); + return addToScene(scene, pendingChanges, getters, showCollisionHull); + } bool addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges, render::Item::Status::Getters& statusGetters,