From 542d671e54db41da70c521d6c2749f63c6893e5d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Nov 2014 20:01:09 -0800 Subject: [PATCH] cleanup entity scripts when changing domains or entity is deleted --- interface/src/entities/EntityTreeRenderer.cpp | 11 ++++++++++- interface/src/entities/EntityTreeRenderer.h | 3 +++ libraries/entities/src/EntityTree.cpp | 3 +++ libraries/entities/src/EntityTree.h | 3 +++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/interface/src/entities/EntityTreeRenderer.cpp b/interface/src/entities/EntityTreeRenderer.cpp index 46406e9f5e..2eaa0fa707 100644 --- a/interface/src/entities/EntityTreeRenderer.cpp +++ b/interface/src/entities/EntityTreeRenderer.cpp @@ -61,11 +61,13 @@ EntityTreeRenderer::~EntityTreeRenderer() { void EntityTreeRenderer::clear() { OctreeRenderer::clear(); + _entityScripts.clear(); } void EntityTreeRenderer::init() { OctreeRenderer::init(); - static_cast(_tree)->setFBXService(this); + EntityTree* entityTree = static_cast(_tree); + entityTree->setFBXService(this); if (_wantScripts) { _entitiesScriptEngine = new ScriptEngine(NO_SCRIPT, "Entities", @@ -77,6 +79,8 @@ void EntityTreeRenderer::init() { // first chance, we'll check for enter/leave entity events. glm::vec3 avatarPosition = Application::getInstance()->getAvatar()->getPosition(); _lastAvatarPosition = avatarPosition + glm::vec3(1.f, 1.f, 1.f); + + connect(entityTree, &EntityTree::deletingEntity, this, &EntityTreeRenderer::deletingEntity); } QScriptValue EntityTreeRenderer::loadEntityScript(const EntityItemID& entityItemID) { @@ -762,4 +766,9 @@ void EntityTreeRenderer::mouseMoveEvent(QMouseEvent* event, unsigned int deviceI } } +void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) { + if (_entityScripts.contains(entityID)) { + _entityScripts.remove(entityID); + } +} diff --git a/interface/src/entities/EntityTreeRenderer.h b/interface/src/entities/EntityTreeRenderer.h index b8acb28c3b..ff9066dd6d 100644 --- a/interface/src/entities/EntityTreeRenderer.h +++ b/interface/src/entities/EntityTreeRenderer.h @@ -101,6 +101,9 @@ signals: void enterEntity(const EntityItemID& entityItemID); void leaveEntity(const EntityItemID& entityItemID); + +public slots: + void deletingEntity(const EntityItemID& entityID); private: QList _releasedModels; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index f31f21ebe9..199bd92030 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -185,6 +185,8 @@ void EntityTree::trackDeletedEntity(const EntityItemID& entityID) { } void EntityTree::deleteEntity(const EntityItemID& entityID) { + emit deletingEntity(entityID); + // NOTE: callers must lock the tree before using this method DeleteEntityOperator theOperator(this, entityID); recurseTreeWithOperator(&theOperator); @@ -197,6 +199,7 @@ void EntityTree::deleteEntities(QSet entityIDs) { foreach(const EntityItemID& entityID, entityIDs) { // tell our delete operator about this entityID theOperator.addEntityIDToDeleteList(entityID); + emit deletingEntity(entityID); } recurseTreeWithOperator(&theOperator); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 53b407c7f5..8d1acc0d01 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -141,6 +141,9 @@ public: void trackDeletedEntity(const EntityItemID& entityID); QList& getMovingEntities() { return _movingEntities; } + +signals: + void deletingEntity(const EntityItemID& entityID); private: