mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 12:37:51 +02:00
Delete domain entities only
This commit is contained in:
parent
6cd5770505
commit
8252481ce7
11 changed files with 109 additions and 8 deletions
|
@ -6755,7 +6755,7 @@ void Application::updateWindowTitle() const {
|
||||||
DependencyManager::get< MessagesClient >()->sendLocalMessage("Toolbar-DomainChanged", "");
|
DependencyManager::get< MessagesClient >()->sendLocalMessage("Toolbar-DomainChanged", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::clearDomainOctreeDetails() {
|
void Application::clearDomainOctreeDetails(bool clearAll) {
|
||||||
// before we delete all entities get MyAvatar's AvatarEntityData ready
|
// before we delete all entities get MyAvatar's AvatarEntityData ready
|
||||||
getMyAvatar()->prepareAvatarEntityDataForReload();
|
getMyAvatar()->prepareAvatarEntityDataForReload();
|
||||||
|
|
||||||
|
@ -6774,7 +6774,8 @@ void Application::clearDomainOctreeDetails() {
|
||||||
});
|
});
|
||||||
|
|
||||||
// reset the model renderer
|
// reset the model renderer
|
||||||
getEntities()->clear();
|
qDebug() << "-----> clearAll: " << clearAll;
|
||||||
|
clearAll ? getEntities()->clear() : getEntities()->clearDomainEntities();
|
||||||
|
|
||||||
auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
|
auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
|
||||||
|
|
||||||
|
@ -6812,7 +6813,7 @@ void Application::goToErrorDomainURL(QUrl errorDomainURL) {
|
||||||
void Application::resettingDomain() {
|
void Application::resettingDomain() {
|
||||||
_notifiedPacketVersionMismatchThisDomain = false;
|
_notifiedPacketVersionMismatchThisDomain = false;
|
||||||
|
|
||||||
clearDomainOctreeDetails();
|
clearDomainOctreeDetails(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::nodeAdded(SharedNodePointer node) const {
|
void Application::nodeAdded(SharedNodePointer node) const {
|
||||||
|
@ -6898,7 +6899,7 @@ void Application::nodeKilled(SharedNodePointer node) {
|
||||||
QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(), "audioMixerKilled");
|
QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(), "audioMixerKilled");
|
||||||
} else if (node->getType() == NodeType::EntityServer) {
|
} else if (node->getType() == NodeType::EntityServer) {
|
||||||
// we lost an entity server, clear all of the domain octree details
|
// we lost an entity server, clear all of the domain octree details
|
||||||
clearDomainOctreeDetails();
|
clearDomainOctreeDetails(false);
|
||||||
} else if (node->getType() == NodeType::AssetServer) {
|
} else if (node->getType() == NodeType::AssetServer) {
|
||||||
// asset server going away - check if we have the asset browser showing
|
// asset server going away - check if we have the asset browser showing
|
||||||
|
|
||||||
|
|
|
@ -469,7 +469,7 @@ private slots:
|
||||||
void onDesktopRootItemCreated(QQuickItem* qmlContext);
|
void onDesktopRootItemCreated(QQuickItem* qmlContext);
|
||||||
void onDesktopRootContextCreated(QQmlContext* qmlContext);
|
void onDesktopRootContextCreated(QQmlContext* qmlContext);
|
||||||
void showDesktop();
|
void showDesktop();
|
||||||
void clearDomainOctreeDetails();
|
void clearDomainOctreeDetails(bool clearAll = true);
|
||||||
void onAboutToQuit();
|
void onAboutToQuit();
|
||||||
void onPresent(quint32 frameCount);
|
void onPresent(quint32 frameCount);
|
||||||
|
|
||||||
|
|
|
@ -197,9 +197,8 @@ void EntityTreeRenderer::resetEntitiesScriptEngine() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::clear() {
|
void EntityTreeRenderer::stopEntityScripts() {
|
||||||
leaveAllEntities();
|
leaveAllEntities();
|
||||||
|
|
||||||
// unload and stop the engine
|
// unload and stop the engine
|
||||||
if (_entitiesScriptEngine) {
|
if (_entitiesScriptEngine) {
|
||||||
// do this here (instead of in deleter) to avoid marshalling unload signals back to this thread
|
// do this here (instead of in deleter) to avoid marshalling unload signals back to this thread
|
||||||
|
@ -211,6 +210,42 @@ void EntityTreeRenderer::clear() {
|
||||||
if (_wantScripts && !_shuttingDown) {
|
if (_wantScripts && !_shuttingDown) {
|
||||||
resetEntitiesScriptEngine();
|
resetEntitiesScriptEngine();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityTreeRenderer::clearDomainEntities() {
|
||||||
|
stopEntityScripts();
|
||||||
|
|
||||||
|
std::unordered_map<EntityItemID, EntityRendererPointer> savedEntities;
|
||||||
|
// remove all entities from the scene
|
||||||
|
_space->clear();
|
||||||
|
auto scene = _viewState->getMain3DScene();
|
||||||
|
if (scene) {
|
||||||
|
render::Transaction transaction;
|
||||||
|
for (const auto& entry : _entitiesInScene) {
|
||||||
|
const auto& renderer = entry.second;
|
||||||
|
const EntityItemPointer& entityItem = renderer->getEntity();
|
||||||
|
if (entityItem->isDomainEntity()) {
|
||||||
|
renderer->removeFromScene(scene, transaction);
|
||||||
|
} else {
|
||||||
|
savedEntities[entry.first] = entry.second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scene->enqueueTransaction(transaction);
|
||||||
|
} else {
|
||||||
|
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
|
||||||
|
}
|
||||||
|
_entitiesInScene.clear();
|
||||||
|
_renderablesToUpdate = savedEntities;
|
||||||
|
_entitiesInScene = savedEntities;
|
||||||
|
|
||||||
|
// reset the zone to the default (while we load the next scene)
|
||||||
|
_layeredZones.clear();
|
||||||
|
|
||||||
|
OctreeProcessor::clearDomainEntities();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityTreeRenderer::clear() {
|
||||||
|
stopEntityScripts();
|
||||||
|
|
||||||
// remove all entities from the scene
|
// remove all entities from the scene
|
||||||
_space->clear();
|
_space->clear();
|
||||||
|
|
|
@ -86,6 +86,7 @@ public:
|
||||||
virtual void init() override;
|
virtual void init() override;
|
||||||
|
|
||||||
/// clears the tree
|
/// clears the tree
|
||||||
|
virtual void clearDomainEntities() override;
|
||||||
virtual void clear() override;
|
virtual void clear() override;
|
||||||
|
|
||||||
/// reloads the entity scripts, calling unload and preload
|
/// reloads the entity scripts, calling unload and preload
|
||||||
|
@ -161,6 +162,7 @@ private:
|
||||||
bool findBestZoneAndMaybeContainingEntities(QVector<EntityItemID>* entitiesContainingAvatar = nullptr);
|
bool findBestZoneAndMaybeContainingEntities(QVector<EntityItemID>* entitiesContainingAvatar = nullptr);
|
||||||
|
|
||||||
bool applyLayeredZones();
|
bool applyLayeredZones();
|
||||||
|
void stopEntityScripts();
|
||||||
|
|
||||||
void checkAndCallPreload(const EntityItemID& entityID, bool reload = false, bool unloadFirst = false);
|
void checkAndCallPreload(const EntityItemID& entityID, bool reload = false, bool unloadFirst = false);
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,39 @@ OctreeElementPointer EntityTree::createNewElement(unsigned char* octalCode) {
|
||||||
return std::static_pointer_cast<OctreeElement>(newElement);
|
return std::static_pointer_cast<OctreeElement>(newElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EntityTree::eraseDomainEntities() {
|
||||||
|
emit clearingEntities();
|
||||||
|
|
||||||
|
if (_simulation) {
|
||||||
|
_simulation->clearEntities();
|
||||||
|
}
|
||||||
|
_staleProxies.clear();
|
||||||
|
QHash<EntityItemID, EntityItemPointer> localMap;
|
||||||
|
localMap.swap(_entityMap);
|
||||||
|
QHash<EntityItemID, EntityItemPointer> savedEntities;
|
||||||
|
this->withWriteLock([&] {
|
||||||
|
foreach(EntityItemPointer entity, localMap) {
|
||||||
|
EntityTreeElementPointer element = entity->getElement();
|
||||||
|
if (element) {
|
||||||
|
element->cleanupDomainEntities();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!entity->isDomainEntity()) {
|
||||||
|
savedEntities[entity->getEntityItemID()] = entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
localMap.clear();
|
||||||
|
_entityMap = savedEntities;
|
||||||
|
|
||||||
|
resetClientEditStats();
|
||||||
|
clearDeletedEntities();
|
||||||
|
|
||||||
|
{
|
||||||
|
QWriteLocker locker(&_needsParentFixupLock);
|
||||||
|
_needsParentFixup.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
void EntityTree::eraseAllOctreeElements(bool createNewRoot) {
|
void EntityTree::eraseAllOctreeElements(bool createNewRoot) {
|
||||||
emit clearingEntities();
|
emit clearingEntities();
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,8 @@ public:
|
||||||
return std::static_pointer_cast<EntityTreeElement>(_rootElement);
|
return std::static_pointer_cast<EntityTreeElement>(_rootElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual void eraseDomainEntities() override;
|
||||||
virtual void eraseAllOctreeElements(bool createNewRoot = true) override;
|
virtual void eraseAllOctreeElements(bool createNewRoot = true) override;
|
||||||
|
|
||||||
virtual void readBitstreamToTree(const unsigned char* bitstream,
|
virtual void readBitstreamToTree(const unsigned char* bitstream,
|
||||||
|
|
|
@ -683,6 +683,23 @@ EntityItemPointer EntityTreeElement::getEntityWithEntityItemID(const EntityItemI
|
||||||
return foundEntity;
|
return foundEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EntityTreeElement::cleanupDomainEntities() {
|
||||||
|
withWriteLock([&] {
|
||||||
|
EntityItems savedEntities;
|
||||||
|
foreach(EntityItemPointer entity, _entityItems) {
|
||||||
|
if (entity->isDomainEntity()) {
|
||||||
|
entity->preDelete();
|
||||||
|
entity->_element = NULL;
|
||||||
|
} else {
|
||||||
|
savedEntities.push_back(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_entityItems = savedEntities;
|
||||||
|
});
|
||||||
|
bumpChangedContent();
|
||||||
|
}
|
||||||
|
|
||||||
void EntityTreeElement::cleanupEntities() {
|
void EntityTreeElement::cleanupEntities() {
|
||||||
withWriteLock([&] {
|
withWriteLock([&] {
|
||||||
foreach(EntityItemPointer entity, _entityItems) {
|
foreach(EntityItemPointer entity, _entityItems) {
|
||||||
|
|
|
@ -189,6 +189,7 @@ public:
|
||||||
EntityItemPointer getEntityWithEntityItemID(const EntityItemID& id) const;
|
EntityItemPointer getEntityWithEntityItemID(const EntityItemID& id) const;
|
||||||
void getEntitiesInside(const AACube& box, QVector<EntityItemPointer>& foundEntities);
|
void getEntitiesInside(const AACube& box, QVector<EntityItemPointer>& foundEntities);
|
||||||
|
|
||||||
|
void cleanupDomainEntities();
|
||||||
void cleanupEntities(); /// called by EntityTree on cleanup this will free all entities
|
void cleanupEntities(); /// called by EntityTree on cleanup this will free all entities
|
||||||
bool removeEntityItem(EntityItemPointer entity, bool deletion = false);
|
bool removeEntityItem(EntityItemPointer entity, bool deletion = false);
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,7 @@ public:
|
||||||
|
|
||||||
OctreeElementPointer getRoot() { return _rootElement; }
|
OctreeElementPointer getRoot() { return _rootElement; }
|
||||||
|
|
||||||
|
virtual void eraseDomainEntities() { _isDirty = true; };
|
||||||
virtual void eraseAllOctreeElements(bool createNewRoot = true);
|
virtual void eraseAllOctreeElements(bool createNewRoot = true);
|
||||||
|
|
||||||
virtual void readBitstreamToTree(const unsigned char* bitstream, uint64_t bufferSizeBytes, ReadBitstreamToTreeParams& args);
|
virtual void readBitstreamToTree(const unsigned char* bitstream, uint64_t bufferSizeBytes, ReadBitstreamToTreeParams& args);
|
||||||
|
|
|
@ -197,6 +197,14 @@ void OctreeProcessor::processDatagram(ReceivedMessage& message, SharedNodePointe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OctreeProcessor::clearDomainEntities() {
|
||||||
|
if (_tree) {
|
||||||
|
_tree->withWriteLock([&] {
|
||||||
|
_tree->eraseDomainEntities();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
void OctreeProcessor::clear() {
|
void OctreeProcessor::clear() {
|
||||||
if (_tree) {
|
if (_tree) {
|
||||||
_tree->withWriteLock([&] {
|
_tree->withWriteLock([&] {
|
||||||
|
|
|
@ -43,6 +43,7 @@ public:
|
||||||
virtual void init();
|
virtual void init();
|
||||||
|
|
||||||
/// clears the tree
|
/// clears the tree
|
||||||
|
virtual void clearDomainEntities();
|
||||||
virtual void clear();
|
virtual void clear();
|
||||||
|
|
||||||
float getAverageElementsPerPacket() const { return _elementsPerPacket.getAverage(); }
|
float getAverageElementsPerPacket() const { return _elementsPerPacket.getAverage(); }
|
||||||
|
|
Loading…
Reference in a new issue