mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 13:28:09 +02:00
only add valid renderables to _renderablesToUpdate
This commit is contained in:
parent
500f381827
commit
2f5b7f32c6
1 changed files with 13 additions and 28 deletions
|
@ -184,6 +184,7 @@ void EntityTreeRenderer::clear() {
|
||||||
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
|
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
|
||||||
}
|
}
|
||||||
_entitiesInScene.clear();
|
_entitiesInScene.clear();
|
||||||
|
_renderablesToUpdate.clear();
|
||||||
|
|
||||||
// reset the zone to the default (while we load the next scene)
|
// reset the zone to the default (while we load the next scene)
|
||||||
_layeredZones.clear();
|
_layeredZones.clear();
|
||||||
|
@ -289,31 +290,12 @@ void EntityTreeRenderer::updateChangedEntities(const render::ScenePointer& scene
|
||||||
|
|
||||||
{
|
{
|
||||||
PROFILE_RANGE_EX(simulation_physics, "CopyRenderables", 0xffff00ff, (uint64_t)changedEntities.size());
|
PROFILE_RANGE_EX(simulation_physics, "CopyRenderables", 0xffff00ff, (uint64_t)changedEntities.size());
|
||||||
if (_renderablesToUpdate.empty()) {
|
for (const auto& entityId : changedEntities) {
|
||||||
for (const auto& entityId : changedEntities) {
|
auto renderable = renderableForEntityId(entityId);
|
||||||
auto renderable = renderableForEntityId(entityId);
|
if (renderable) {
|
||||||
if (!renderable) {
|
// only add valid renderables _renderablesToUpdate
|
||||||
continue;
|
|
||||||
}
|
|
||||||
_renderablesToUpdate.insert({ entityId, renderable });
|
_renderablesToUpdate.insert({ entityId, renderable });
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// we weren't able to update all renderables last frame
|
|
||||||
// so we have to be more careful when processing changed renderables
|
|
||||||
std::unordered_map<EntityItemID, EntityRendererPointer>::iterator itr;
|
|
||||||
for (const auto& entityId : changedEntities) {
|
|
||||||
auto renderable = renderableForEntityId(entityId);
|
|
||||||
itr = _renderablesToUpdate.find(entityId);
|
|
||||||
if (itr != _renderablesToUpdate.end()) {
|
|
||||||
if (!renderable) {
|
|
||||||
_renderablesToUpdate.erase(itr);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
_renderablesToUpdate.insert(itr, { entityId, renderable });
|
|
||||||
} else if (renderable) {
|
|
||||||
_renderablesToUpdate.insert({ entityId, renderable });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,6 +306,7 @@ void EntityTreeRenderer::updateChangedEntities(const render::ScenePointer& scene
|
||||||
uint64_t updateStart = usecTimestampNow();
|
uint64_t updateStart = usecTimestampNow();
|
||||||
for (const auto& entry : _renderablesToUpdate) {
|
for (const auto& entry : _renderablesToUpdate) {
|
||||||
const auto& renderable = entry.second;
|
const auto& renderable = entry.second;
|
||||||
|
assert(renderable); // only valid renderables are added to _renderablesToUpdate
|
||||||
renderable->updateInScene(scene, transaction);
|
renderable->updateInScene(scene, transaction);
|
||||||
}
|
}
|
||||||
size_t numRenderables = _renderablesToUpdate.size() + 1; // add one to avoid divide by zero
|
size_t numRenderables = _renderablesToUpdate.size() + 1; // add one to avoid divide by zero
|
||||||
|
@ -357,6 +340,7 @@ void EntityTreeRenderer::updateChangedEntities(const render::ScenePointer& scene
|
||||||
PROFILE_RANGE_EX(simulation_physics, "SortRenderables", 0xffff00ff, (uint64_t)_renderablesToUpdate.size());
|
PROFILE_RANGE_EX(simulation_physics, "SortRenderables", 0xffff00ff, (uint64_t)_renderablesToUpdate.size());
|
||||||
std::unordered_map<EntityItemID, EntityRendererPointer>::iterator itr = _renderablesToUpdate.begin();
|
std::unordered_map<EntityItemID, EntityRendererPointer>::iterator itr = _renderablesToUpdate.begin();
|
||||||
while (itr != _renderablesToUpdate.end()) {
|
while (itr != _renderablesToUpdate.end()) {
|
||||||
|
assert(itr->second); // only valid renderables are added to _renderablesToUpdate
|
||||||
sortedRenderables.push(SortableRenderer(itr->second));
|
sortedRenderables.push(SortableRenderer(itr->second));
|
||||||
++itr;
|
++itr;
|
||||||
}
|
}
|
||||||
|
@ -377,9 +361,9 @@ void EntityTreeRenderer::updateChangedEntities(const render::ScenePointer& scene
|
||||||
std::unordered_map<EntityItemID, EntityRendererPointer>::iterator itr;
|
std::unordered_map<EntityItemID, EntityRendererPointer>::iterator itr;
|
||||||
size_t numSorted = sortedRenderables.size();
|
size_t numSorted = sortedRenderables.size();
|
||||||
while (!sortedRenderables.empty() && usecTimestampNow() < expiry) {
|
while (!sortedRenderables.empty() && usecTimestampNow() < expiry) {
|
||||||
const EntityRendererPointer& renderer = sortedRenderables.top().getRenderer();
|
const EntityRendererPointer& renderable = sortedRenderables.top().getRenderer();
|
||||||
renderer->updateInScene(scene, transaction);
|
renderable->updateInScene(scene, transaction);
|
||||||
_renderablesToUpdate.erase(renderer->getEntity()->getID());
|
_renderablesToUpdate.erase(renderable->getEntity()->getID());
|
||||||
sortedRenderables.pop();
|
sortedRenderables.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -839,7 +823,8 @@ void EntityTreeRenderer::mouseMoveEvent(QMouseEvent* event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) {
|
void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) {
|
||||||
// If it's in the pending queue, remove it
|
// If it's in a pending queue, remove it
|
||||||
|
_renderablesToUpdate.erase(entityID);
|
||||||
_entitiesToAdd.erase(entityID);
|
_entitiesToAdd.erase(entityID);
|
||||||
|
|
||||||
auto itr = _entitiesInScene.find(entityID);
|
auto itr = _entitiesInScene.find(entityID);
|
||||||
|
@ -847,7 +832,7 @@ void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) {
|
||||||
// Not in the scene, and no longer potentially in the pending queue, we're done
|
// Not in the scene, and no longer potentially in the pending queue, we're done
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_tree && !_shuttingDown && _entitiesScriptEngine) {
|
if (_tree && !_shuttingDown && _entitiesScriptEngine) {
|
||||||
_entitiesScriptEngine->unloadEntityScript(entityID, true);
|
_entitiesScriptEngine->unloadEntityScript(entityID, true);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue