From dd304fee316b65eec4e049e712ee349f08e3d490 Mon Sep 17 00:00:00 2001 From: Erik Broberg Date: Fri, 16 Sep 2016 15:40:29 -0400 Subject: [PATCH] Make ScriptEngine implement Syncable interface --- include/openspace/scripting/scriptengine.h | 14 ++++---- include/openspace/util/syncdata.h | 6 +++- src/engine/openspaceengine.cpp | 18 ++-------- src/scripting/scriptengine.cpp | 42 +++++++++++----------- 4 files changed, 35 insertions(+), 45 deletions(-) diff --git a/include/openspace/scripting/scriptengine.h b/include/openspace/scripting/scriptengine.h index cb7797e181..656d201224 100644 --- a/include/openspace/scripting/scriptengine.h +++ b/include/openspace/scripting/scriptengine.h @@ -26,6 +26,7 @@ #define __SCRIPTENGINE_H__ #include +#include #include @@ -47,7 +48,7 @@ namespace scripting { * openspace namespac prefix in Lua. The same functions can be exposed to * other Lua states by passing them to the #initializeLuaState method. */ -class ScriptEngine { +class ScriptEngine : public Syncable { public: /** * Initializes the internal Lua state and registers a common set of library functions @@ -73,13 +74,10 @@ public: bool writeLog(const std::string& script); - void serialize(SyncBuffer* syncBuffer); - - void deserialize(SyncBuffer* syncBuffer); - - void postSynchronizationPreDraw(); - - void preSynchronization(); + virtual void presync(bool isMaster); + virtual void encode(SyncBuffer* syncBuffer); + virtual void decode(SyncBuffer* syncBuffer); + virtual void postsync(bool isMaster); void queueScript(const std::string &script); diff --git a/include/openspace/util/syncdata.h b/include/openspace/util/syncdata.h index b9cfe67dc3..956a8c0c32 100644 --- a/include/openspace/util/syncdata.h +++ b/include/openspace/util/syncdata.h @@ -35,7 +35,11 @@ namespace openspace { - +/** +* Interace for synchronizable data +* +* Used by SyncEngine for synchronization +*/ class Syncable { public: virtual ~Syncable() {}; diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index d0dcf0acf3..f41c50e288 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -511,6 +511,7 @@ bool OpenSpaceEngine::initialize() { _syncEngine->addSyncables(Time::ref().getSyncables()); _syncEngine->addSyncables(_renderEngine->getSyncables()); + _syncEngine->addSyncable(_scriptEngine.get()); LINFO("Finished initializing"); return true; @@ -759,6 +760,7 @@ void OpenSpaceEngine::setRunTime(double d){ void OpenSpaceEngine::preSynchronization() { FileSys.triggerFilesystemEvents(); + _syncEngine->presync(_isMaster); if (_isMaster) { double dt = _windowWrapper->averageDeltaTime(); @@ -772,7 +774,6 @@ void OpenSpaceEngine::preSynchronization() { scheduledScripts.pop(); } - _scriptEngine->preSynchronization(); _interactionHandler->updateInputStates(dt); _renderEngine->updateSceneGraph(); @@ -785,8 +786,6 @@ void OpenSpaceEngine::preSynchronization() { } void OpenSpaceEngine::postSynchronizationPreDraw() { - double t1 = Time::ref().j2000Seconds(); - _syncEngine->postsync(_isMaster); if (_isInShutdownMode) { @@ -796,19 +795,15 @@ void OpenSpaceEngine::postSynchronizationPreDraw() { _shutdownCountdown -= _windowWrapper->averageDeltaTime(); } - _scriptEngine->postSynchronizationPreDraw(); - _renderEngine->updateFade(); _renderEngine->updateRenderer(); _renderEngine->updateScreenSpaceRenderables(); - _renderEngine->updateShaderPrograms(); if (!_isMaster) { _renderEngine->updateSceneGraph(); _renderEngine->camera()->invalidateCache(); - } - + } // Step the camera using the current mouse velocities which are synced //_interactionHandler->updateCamera(); @@ -952,10 +947,6 @@ void OpenSpaceEngine::mouseScrollWheelCallback(double pos) { void OpenSpaceEngine::encode() { if (_syncBuffer) { _syncEngine->encode(_syncBuffer.get()); - - _scriptEngine->serialize(_syncBuffer.get()); - //_renderEngine->serialize(_syncBuffer.get()); - _syncBuffer->write(); } _networkEngine->publishStatusMessage(); @@ -966,9 +957,6 @@ void OpenSpaceEngine::decode() { if (_syncBuffer) { _syncBuffer->read(); _syncEngine->decode(_syncBuffer.get()); - - _scriptEngine->deserialize(_syncBuffer.get()); - } } diff --git a/src/scripting/scriptengine.cpp b/src/scripting/scriptengine.cpp index a795067bf6..680ed308a8 100644 --- a/src/scripting/scriptengine.cpp +++ b/src/scripting/scriptengine.cpp @@ -624,30 +624,46 @@ bool ScriptEngine::writeLog(const std::string& script) { return true; } +void ScriptEngine::presync(bool isMaster) { + if (isMaster) { + _mutex.lock(); -void ScriptEngine::serialize(SyncBuffer* syncBuffer){ + if (!_queuedScripts.empty()) { + _currentSyncedScript = _queuedScripts.back(); + _queuedScripts.pop_back(); + + //Not really a received script but the master also needs to run the script... + _receivedScripts.push_back(_currentSyncedScript); + } + + _mutex.unlock(); + } + +} + +void ScriptEngine::encode(SyncBuffer* syncBuffer) { syncBuffer->encode(_currentSyncedScript); _currentSyncedScript.clear(); } -void ScriptEngine::deserialize(SyncBuffer* syncBuffer){ +void ScriptEngine::decode(SyncBuffer* syncBuffer) { syncBuffer->decode(_currentSyncedScript); - if (!_currentSyncedScript.empty()){ + if (!_currentSyncedScript.empty()) { _mutex.lock(); _receivedScripts.push_back(_currentSyncedScript); _mutex.unlock(); } } -void ScriptEngine::postSynchronizationPreDraw() { +void ScriptEngine::postsync(bool isMaster) { std::vector scripts; _mutex.lock(); scripts.assign(_receivedScripts.begin(), _receivedScripts.end()); _receivedScripts.clear(); _mutex.unlock(); - + while (!scripts.empty()) { try { runScript(scripts.back()); @@ -657,22 +673,6 @@ void ScriptEngine::postSynchronizationPreDraw() { } scripts.pop_back(); } - -} - -void ScriptEngine::preSynchronization() { - - _mutex.lock(); - - if (!_queuedScripts.empty()){ - _currentSyncedScript = _queuedScripts.back(); - _queuedScripts.pop_back(); - - //Not really a received script but the master also needs to run the script... - _receivedScripts.push_back(_currentSyncedScript); - } - - _mutex.unlock(); } void ScriptEngine::queueScript(const std::string &script){