From 5df7ce7424b8b4855a7e43f3df573726b91772a8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 16 Sep 2015 11:43:28 -0700 Subject: [PATCH 1/3] fix for missing jurisdiction listener in Agent --- assignment-client/src/Agent.cpp | 6 ++++++ libraries/entities/src/EntityScriptingInterface.h | 2 +- libraries/octree/src/OctreeHeadlessViewer.cpp | 6 ++---- libraries/octree/src/OctreeHeadlessViewer.h | 4 ++-- libraries/octree/src/OctreeScriptingInterface.cpp | 1 + libraries/octree/src/OctreeScriptingInterface.h | 7 +++---- libraries/script-engine/src/ScriptEngine.cpp | 3 ++- 7 files changed, 17 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index fda226b934..f2d73bd1a6 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -191,8 +191,14 @@ void Agent::run() { auto entityScriptingInterface = DependencyManager::get(); _scriptEngine->registerGlobalObject("EntityViewer", &_entityViewer); + + // we need to make sure that init has been called for our EntityScriptingInterface + // so that it actually has a jurisdiction listener when we ask it for it next + entityScriptingInterface->init(); _entityViewer.setJurisdictionListener(entityScriptingInterface->getJurisdictionListener()); + _entityViewer.init(); + entityScriptingInterface->setEntityTree(_entityViewer.getTree()); // wire up our additional agent related processing to the update signal diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 581eed184d..8d2b0b6892 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -1,6 +1,6 @@ // // EntityScriptingInterface.h -// libraries/models/src +// libraries/entities/src // // Created by Brad Hefta-Gaub on 12/6/13. // Copyright 2013 High Fidelity, Inc. diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index 3a80180008..88a77a4c53 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -23,9 +23,6 @@ OctreeHeadlessViewer::OctreeHeadlessViewer() : _viewFrustum.setProjection(glm::perspective(glm::radians(DEFAULT_FIELD_OF_VIEW_DEGREES), DEFAULT_ASPECT_RATIO, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP)); } -OctreeHeadlessViewer::~OctreeHeadlessViewer() { -} - void OctreeHeadlessViewer::init() { OctreeRenderer::init(); setViewFrustum(&_viewFrustum); @@ -34,8 +31,9 @@ void OctreeHeadlessViewer::init() { void OctreeHeadlessViewer::queryOctree() { char serverType = getMyNodeType(); PacketType packetType = getMyQueryMessageType(); + NodeToJurisdictionMap& jurisdictions = *_jurisdictionListener->getJurisdictions(); - + bool wantExtraDebugging = false; if (wantExtraDebugging) { diff --git a/libraries/octree/src/OctreeHeadlessViewer.h b/libraries/octree/src/OctreeHeadlessViewer.h index be076e7b5f..5a17f48a19 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.h +++ b/libraries/octree/src/OctreeHeadlessViewer.h @@ -29,7 +29,7 @@ class OctreeHeadlessViewer : public OctreeRenderer { Q_OBJECT public: OctreeHeadlessViewer(); - virtual ~OctreeHeadlessViewer(); + virtual ~OctreeHeadlessViewer() {}; virtual void renderElement(OctreeElementPointer element, RenderArgs* args) { /* swallow these */ } virtual void init(); @@ -65,7 +65,7 @@ public slots: private: ViewFrustum _viewFrustum; - JurisdictionListener* _jurisdictionListener; + JurisdictionListener* _jurisdictionListener = nullptr; OctreeQuery _octreeQuery; float _voxelSizeScale; int _boundaryLevelAdjust; diff --git a/libraries/octree/src/OctreeScriptingInterface.cpp b/libraries/octree/src/OctreeScriptingInterface.cpp index 97e7f67ff5..8913e88cf5 100644 --- a/libraries/octree/src/OctreeScriptingInterface.cpp +++ b/libraries/octree/src/OctreeScriptingInterface.cpp @@ -54,6 +54,7 @@ void OctreeScriptingInterface::init() { if (_initialized) { return; } + if (_jurisdictionListener) { _managedJurisdictionListener = false; } else { diff --git a/libraries/octree/src/OctreeScriptingInterface.h b/libraries/octree/src/OctreeScriptingInterface.h index ea897bbb4f..47b01c64f9 100644 --- a/libraries/octree/src/OctreeScriptingInterface.h +++ b/libraries/octree/src/OctreeScriptingInterface.h @@ -21,8 +21,7 @@ class OctreeScriptingInterface : public QObject { Q_OBJECT public: - OctreeScriptingInterface(OctreeEditPacketSender* packetSender = NULL, - JurisdictionListener* jurisdictionListener = NULL); + OctreeScriptingInterface(OctreeEditPacketSender* packetSender = NULL, JurisdictionListener* jurisdictionListener = NULL); ~OctreeScriptingInterface(); @@ -86,8 +85,8 @@ public slots: protected: /// attached OctreeEditPacketSender that handles queuing and sending of packets to VS - OctreeEditPacketSender* _packetSender; - JurisdictionListener* _jurisdictionListener; + OctreeEditPacketSender* _packetSender = nullptr; + JurisdictionListener* _jurisdictionListener = nullptr; bool _managedPacketSender; bool _managedJurisdictionListener; bool _initialized; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index a7136edd7b..cd9e9d2e6c 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -263,7 +263,7 @@ void ScriptEngine::init() { } _isInitialized = true; - + auto entityScriptingInterface = DependencyManager::get(); entityScriptingInterface->init(); @@ -559,6 +559,7 @@ void ScriptEngine::run() { if (!_isInitialized) { init(); } + _isRunning = true; _isFinished = false; if (_wantSignals) { From bca00db4a8f4d0d74cc3b8e3d014333c847d1642 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 16 Sep 2015 11:48:15 -0700 Subject: [PATCH 2/3] use unique_ptr for Agent ScriptEngine --- assignment-client/src/Agent.cpp | 13 +++---------- assignment-client/src/Agent.h | 3 ++- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index f2d73bd1a6..58d8c931f8 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -153,11 +153,11 @@ void Agent::run() { qDebug() << "Downloaded script:" << scriptContents; - _scriptEngine = new ScriptEngine(scriptContents, _payload); + _scriptEngine = std::unique_ptr(new ScriptEngine(scriptContents, _payload)); _scriptEngine->setParent(this); // be the parent of the script engine so it gets moved when we do // setup an Avatar for the script to use - ScriptableAvatar scriptedAvatar(_scriptEngine); + ScriptableAvatar scriptedAvatar(_scriptEngine.get()); scriptedAvatar.setForceFaceTrackerConnected(true); // call model URL setters with empty URLs so our avatar, if user, will have the default models @@ -202,17 +202,10 @@ void Agent::run() { entityScriptingInterface->setEntityTree(_entityViewer.getTree()); // wire up our additional agent related processing to the update signal - QObject::connect(_scriptEngine, &ScriptEngine::update, this, &Agent::processAgentAvatarAndAudio); + QObject::connect(_scriptEngine.get(), &ScriptEngine::update, this, &Agent::processAgentAvatarAndAudio); _scriptEngine->run(); setFinished(true); - - // kill the avatar identity timer - delete _avatarIdentityTimer; - - // delete the script engine - delete _scriptEngine; - } void Agent::setIsAvatar(bool isAvatar) { diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 33a8eb58c2..ab000015d5 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -12,6 +12,7 @@ #ifndef hifi_Agent_h #define hifi_Agent_h +#include #include #include @@ -61,7 +62,7 @@ private slots: void processAgentAvatarAndAudio(float deltaTime); private: - ScriptEngine* _scriptEngine; + std::unique_ptr _scriptEngine; EntityEditPacketSender _entityEditSender; EntityTreeHeadlessViewer _entityViewer; QTimer* _pingTimer; From 229e73f88c4444bf3f8d9812ceb061192ea96477 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 16 Sep 2015 11:52:05 -0700 Subject: [PATCH 3/3] protect the agent from null timers in avatar stop --- assignment-client/src/Agent.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 58d8c931f8..157154606f 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -226,10 +226,17 @@ void Agent::setIsAvatar(bool isAvatar) { } if (!_isAvatar) { - delete _avatarIdentityTimer; - _avatarIdentityTimer = NULL; - delete _avatarBillboardTimer; - _avatarBillboardTimer = NULL; + if (_avatarIdentityTimer) { + _avatarIdentityTimer->stop(); + delete _avatarIdentityTimer; + _avatarIdentityTimer = nullptr; + } + + if (_avatarBillboardTimer) { + _avatarIdentityTimer->stop(); + delete _avatarIdentityTimer; + _avatarBillboardTimer = nullptr; + } } }