diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dc018c10e2..58b28fcef9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2317,7 +2317,7 @@ void Application::update(float deltaTime) { updateDialogs(deltaTime); // update various stats dialogs if present updateCursor(deltaTime); // Handle cursor updates - { + if (!_aboutToQuit) { PerformanceTimer perfTimer("entities"); _entities.update(); // update the models... { diff --git a/interface/src/entities/EntityTreeRenderer.cpp b/interface/src/entities/EntityTreeRenderer.cpp index ab59f76200..2544ecc792 100644 --- a/interface/src/entities/EntityTreeRenderer.cpp +++ b/interface/src/entities/EntityTreeRenderer.cpp @@ -86,7 +86,7 @@ void EntityTreeRenderer::init() { connect(entityTree, &EntityTree::deletingEntity, this, &EntityTreeRenderer::deletingEntity); connect(entityTree, &EntityTree::addingEntity, this, &EntityTreeRenderer::checkAndCallPreload); - connect(entityTree, &EntityTree::entityScriptChanging, this, &EntityTreeRenderer::checkAndCallPreload); + connect(entityTree, &EntityTree::entityScriptChanging, this, &EntityTreeRenderer::entitySciptChanging); connect(entityTree, &EntityTree::changingEntityID, this, &EntityTreeRenderer::changingEntityID); } @@ -192,6 +192,22 @@ QScriptValue EntityTreeRenderer::loadEntityScript(EntityItem* entity) { return entityScriptObject; // newly constructed } +QScriptValue EntityTreeRenderer::getPreviouslyLoadedEntityScript(const EntityItemID& entityItemID) { + EntityItem* entity = static_cast(_tree)->findEntityByEntityItemID(entityItemID); + return getPreviouslyLoadedEntityScript(entity); +} + + +QScriptValue EntityTreeRenderer::getPreviouslyLoadedEntityScript(EntityItem* entity) { + if (entity) { + EntityItemID entityID = entity->getEntityItemID(); + if (_entityScripts.contains(entityID)) { + EntityScriptDetails details = _entityScripts[entityID]; + return details.scriptObject; // previously loaded + } + } + return QScriptValue(); // no script +} void EntityTreeRenderer::setTree(Octree* newTree) { OctreeRenderer::setTree(newTree); static_cast(_tree)->setFBXService(this); @@ -842,9 +858,16 @@ void EntityTreeRenderer::mouseMoveEvent(QMouseEvent* event, unsigned int deviceI } void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) { + + checkAndCallUnload(entityID); _entityScripts.remove(entityID); } +void EntityTreeRenderer::entitySciptChanging(const EntityItemID& entityID) { + checkAndCallUnload(entityID); + checkAndCallPreload(entityID); +} + void EntityTreeRenderer::checkAndCallPreload(const EntityItemID& entityID) { // load the entity script if needed... QScriptValue entityScript = loadEntityScript(entityID); @@ -854,6 +877,15 @@ void EntityTreeRenderer::checkAndCallPreload(const EntityItemID& entityID) { } } +void EntityTreeRenderer::checkAndCallUnload(const EntityItemID& entityID) { + QScriptValue entityScript = getPreviouslyLoadedEntityScript(entityID); + if (entityScript.property("unload").isValid()) { + QScriptValueList entityArgs = createEntityArgs(entityID); + entityScript.property("unload").call(entityScript, entityArgs); + } +} + + void EntityTreeRenderer::changingEntityID(const EntityItemID& oldEntityID, const EntityItemID& newEntityID) { if (_entityScripts.contains(oldEntityID)) { EntityScriptDetails details = _entityScripts[oldEntityID]; diff --git a/interface/src/entities/EntityTreeRenderer.h b/interface/src/entities/EntityTreeRenderer.h index 7a8155cd6b..e5eba79e0d 100644 --- a/interface/src/entities/EntityTreeRenderer.h +++ b/interface/src/entities/EntityTreeRenderer.h @@ -106,9 +106,12 @@ signals: public slots: void deletingEntity(const EntityItemID& entityID); void changingEntityID(const EntityItemID& oldEntityID, const EntityItemID& newEntityID); - void checkAndCallPreload(const EntityItemID& entityID); + void entitySciptChanging(const EntityItemID& entityID); private: + void checkAndCallPreload(const EntityItemID& entityID); + void checkAndCallUnload(const EntityItemID& entityID); + QList _releasedModels; void renderProxies(const EntityItem* entity, RenderArgs* args); PickRay computePickRay(float x, float y); @@ -127,6 +130,8 @@ private: QScriptValue loadEntityScript(EntityItem* entity); QScriptValue loadEntityScript(const EntityItemID& entityItemID); + QScriptValue getPreviouslyLoadedEntityScript(const EntityItemID& entityItemID); + QScriptValue getPreviouslyLoadedEntityScript(EntityItem* entity); QString loadScriptContents(const QString& scriptMaybeURLorText); QScriptValueList createMouseEventArgs(const EntityItemID& entityID, QMouseEvent* event, unsigned int deviceID); QScriptValueList createMouseEventArgs(const EntityItemID& entityID, const MouseEvent& mouseEvent);