mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-10 21:38:42 +02:00
Avoid recreating model items when adding to scene
This commit is contained in:
parent
377a20e983
commit
e4cba14333
3 changed files with 44 additions and 60 deletions
|
@ -434,8 +434,6 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
|
||||||
_showCollisionHull = shouldShowCollisionHull;
|
_showCollisionHull = shouldShowCollisionHull;
|
||||||
render::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
|
|
||||||
_model->removeFromScene(scene, pendingChanges);
|
|
||||||
|
|
||||||
render::Item::Status::Getters statusGetters;
|
render::Item::Status::Getters statusGetters;
|
||||||
makeEntityItemStatusGetters(getThisPointer(), statusGetters);
|
makeEntityItemStatusGetters(getThisPointer(), statusGetters);
|
||||||
_model->addToScene(scene, pendingChanges, statusGetters, _showCollisionHull);
|
_model->addToScene(scene, pendingChanges, statusGetters, _showCollisionHull);
|
||||||
|
|
|
@ -541,43 +541,6 @@ void Model::setVisibleInScene(bool newValue, std::shared_ptr<render::Scene> scen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Model::addToScene(std::shared_ptr<render::Scene> 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<ModelMeshPartPayload::Payload>(renderItem);
|
|
||||||
pendingChanges.resetItem(item, renderPayload);
|
|
||||||
pendingChanges.updateItem<ModelMeshPartPayload>(item, [](ModelMeshPartPayload& data) {
|
|
||||||
data.notifyLocationChanged();
|
|
||||||
});
|
|
||||||
_modelMeshRenderItems.insert(item, renderPayload);
|
|
||||||
somethingAdded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (auto renderItem, _collisionRenderItemsSet) {
|
|
||||||
auto item = scene->allocateID();
|
|
||||||
auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem);
|
|
||||||
pendingChanges.resetItem(item, renderPayload);
|
|
||||||
pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) {
|
|
||||||
data.notifyLocationChanged();
|
|
||||||
});
|
|
||||||
_collisionRenderItems.insert(item, renderPayload);
|
|
||||||
somethingAdded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
_readyWhenAdded = readyToAddToScene();
|
|
||||||
|
|
||||||
return somethingAdded;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::addToScene(std::shared_ptr<render::Scene> scene,
|
bool Model::addToScene(std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges,
|
render::PendingChanges& pendingChanges,
|
||||||
render::Item::Status::Getters& statusGetters,
|
render::Item::Status::Getters& statusGetters,
|
||||||
|
@ -589,28 +552,48 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene,
|
||||||
|
|
||||||
bool somethingAdded = false;
|
bool somethingAdded = false;
|
||||||
|
|
||||||
foreach (auto renderItem, _modelMeshRenderItemsSet) {
|
if (_modelMeshRenderItems.size()) {
|
||||||
auto item = scene->allocateID();
|
for (auto item : _modelMeshRenderItems.keys()) {
|
||||||
auto renderPayload = std::make_shared<ModelMeshPartPayload::Payload>(renderItem);
|
pendingChanges.updateItem<ModelMeshPartPayload>(item, [](ModelMeshPartPayload& data) {
|
||||||
renderPayload->addStatusGetters(statusGetters);
|
data.notifyLocationChanged();
|
||||||
pendingChanges.resetItem(item, renderPayload);
|
});
|
||||||
pendingChanges.updateItem<ModelMeshPartPayload>(item, [](ModelMeshPartPayload& data) {
|
}
|
||||||
data.notifyLocationChanged();
|
} else {
|
||||||
});
|
for (auto renderItem : _modelMeshRenderItemsSet) {
|
||||||
_modelMeshRenderItems.insert(item, renderPayload);
|
auto item = scene->allocateID();
|
||||||
somethingAdded = true;
|
auto renderPayload = std::make_shared<ModelMeshPartPayload::Payload>(renderItem);
|
||||||
|
if (statusGetters.size()) {
|
||||||
|
renderPayload->addStatusGetters(statusGetters);
|
||||||
|
}
|
||||||
|
pendingChanges.resetItem(item, renderPayload);
|
||||||
|
pendingChanges.updateItem<ModelMeshPartPayload>(item, [](ModelMeshPartPayload& data) {
|
||||||
|
data.notifyLocationChanged();
|
||||||
|
});
|
||||||
|
_modelMeshRenderItems.insert(item, renderPayload);
|
||||||
|
somethingAdded = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (auto renderItem, _collisionRenderItemsSet) {
|
if (_collisionRenderItems.size()) {
|
||||||
auto item = scene->allocateID();
|
for (auto item : _collisionRenderItems.keys()) {
|
||||||
auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem);
|
pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) {
|
||||||
renderPayload->addStatusGetters(statusGetters);
|
data.notifyLocationChanged();
|
||||||
pendingChanges.resetItem(item, renderPayload);
|
});
|
||||||
pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) {
|
}
|
||||||
data.notifyLocationChanged();
|
} else {
|
||||||
});
|
for (auto renderItem : _collisionRenderItemsSet) {
|
||||||
_collisionRenderItems.insert(item, renderPayload);
|
auto item = scene->allocateID();
|
||||||
somethingAdded = true;
|
auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem);
|
||||||
|
if (statusGetters.size()) {
|
||||||
|
renderPayload->addStatusGetters(statusGetters);
|
||||||
|
}
|
||||||
|
pendingChanges.resetItem(item, renderPayload);
|
||||||
|
pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) {
|
||||||
|
data.notifyLocationChanged();
|
||||||
|
});
|
||||||
|
_collisionRenderItems.insert(item, renderPayload);
|
||||||
|
somethingAdded = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_readyWhenAdded = readyToAddToScene();
|
_readyWhenAdded = readyToAddToScene();
|
||||||
|
|
|
@ -87,7 +87,10 @@ public:
|
||||||
bool initWhenReady(render::ScenePointer scene);
|
bool initWhenReady(render::ScenePointer scene);
|
||||||
bool addToScene(std::shared_ptr<render::Scene> scene,
|
bool addToScene(std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges,
|
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<render::Scene> scene,
|
bool addToScene(std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges,
|
render::PendingChanges& pendingChanges,
|
||||||
render::Item::Status::Getters& statusGetters,
|
render::Item::Status::Getters& statusGetters,
|
||||||
|
|
Loading…
Reference in a new issue