cleanup entity scripts when changing domains or entity is deleted

This commit is contained in:
ZappoMan 2014-11-06 20:01:09 -08:00
parent 55576e7f9d
commit 542d671e54
4 changed files with 19 additions and 1 deletions

View file

@ -61,11 +61,13 @@ EntityTreeRenderer::~EntityTreeRenderer() {
void EntityTreeRenderer::clear() {
OctreeRenderer::clear();
_entityScripts.clear();
}
void EntityTreeRenderer::init() {
OctreeRenderer::init();
static_cast<EntityTree*>(_tree)->setFBXService(this);
EntityTree* entityTree = static_cast<EntityTree*>(_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);
}
}

View file

@ -101,6 +101,9 @@ signals:
void enterEntity(const EntityItemID& entityItemID);
void leaveEntity(const EntityItemID& entityItemID);
public slots:
void deletingEntity(const EntityItemID& entityID);
private:
QList<Model*> _releasedModels;

View file

@ -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<EntityItemID> entityIDs) {
foreach(const EntityItemID& entityID, entityIDs) {
// tell our delete operator about this entityID
theOperator.addEntityIDToDeleteList(entityID);
emit deletingEntity(entityID);
}
recurseTreeWithOperator(&theOperator);

View file

@ -141,6 +141,9 @@ public:
void trackDeletedEntity(const EntityItemID& entityID);
QList<EntityItem*>& getMovingEntities() { return _movingEntities; }
signals:
void deletingEntity(const EntityItemID& entityID);
private: