From 60240707453333abc14a80c86f91c3a4ce30424b Mon Sep 17 00:00:00 2001 From: Erik Broberg Date: Thu, 15 Sep 2016 17:02:00 -0400 Subject: [PATCH] Add new classes SyncEngine and SyncData to encapsulate SGCT synchronization --- include/openspace/engine/syncengine.h | 57 ++++++++++++++++ include/openspace/util/syncdata.h | 95 +++++++++++++++++++++++++++ src/CMakeLists.txt | 4 ++ src/engine/syncengine.cpp | 75 +++++++++++++++++++++ src/util/syncdata.cpp | 39 +++++++++++ 5 files changed, 270 insertions(+) create mode 100644 include/openspace/engine/syncengine.h create mode 100644 include/openspace/util/syncdata.h create mode 100644 src/engine/syncengine.cpp create mode 100644 src/util/syncdata.cpp diff --git a/include/openspace/engine/syncengine.h b/include/openspace/engine/syncengine.h new file mode 100644 index 0000000000..50daf2248d --- /dev/null +++ b/include/openspace/engine/syncengine.h @@ -0,0 +1,57 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __SYNCENGINE_H__ +#define __SYNCENGINE_H__ + + +#include + + +namespace openspace { + +class Syncable; +class SyncBuffer; + +class SyncEngine { +public: + + void encode(SyncBuffer* syncBuffer); + void decode(SyncBuffer* syncBuffer); + void applySyncedUpdates(); + + void addSyncable(Syncable* syncable); + void addSyncables(const std::vector& syncables); + void removeSyncable(Syncable* syncable); + +private: + + ::std::vector _syncables; + +}; + + +} // namespace openspace + +#endif //#ifndef __SYNCENGINE_H__ diff --git a/include/openspace/util/syncdata.h b/include/openspace/util/syncdata.h new file mode 100644 index 0000000000..bf5494a4dd --- /dev/null +++ b/include/openspace/util/syncdata.h @@ -0,0 +1,95 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __SYNC_DATA_H__ +#define __SYNC_DATA_H__ + +#include + +#include +#include + + +namespace openspace { + + + +class Syncable { +public: + virtual ~Syncable() {}; + +protected: + friend class SyncEngine; + virtual void encode(SyncBuffer* syncBuffer) = 0; + virtual void decode(SyncBuffer* syncBuffer, bool directDecode = false) = 0; + virtual void applySyncedUpdate() = 0; +}; + + +template +class SyncData : public Syncable { +public: + + SyncData() {}; + SyncData(const T& val) : data(val) {}; + + SyncData& operator=(const T& rhs) { + data = rhs; + return *this; + } + + operator T&() { + return data; + } + + operator const T&() const { + return data; + } + +protected: + virtual void encode(SyncBuffer* syncBuffer) { + syncBuffer->encode(data); + } + + virtual void decode(SyncBuffer* syncBuffer, bool directDecode = false) { + if (directDecode) { + syncBuffer->decode(data); + } + else { + syncBuffer->decode(doubleBufferedData); + } + } + + virtual void applySyncedUpdate() { + data = doubleBufferedData; + }; + + T data; + T doubleBufferedData; +}; + + +} // namespace openspace + +#endif //#ifndef __SYNC_DATA_H__ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0edb26d5f7..23b5075a98 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -31,6 +31,7 @@ set(OPENSPACE_SOURCE ${OPENSPACE_BASE_DIR}/src/engine/moduleengine_lua.inl ${OPENSPACE_BASE_DIR}/src/engine/openspaceengine.cpp ${OPENSPACE_BASE_DIR}/src/engine/settingsengine.cpp + ${OPENSPACE_BASE_DIR}/src/engine/syncengine.cpp ${OPENSPACE_BASE_DIR}/src/engine/wrapper/sgctwindowwrapper.cpp ${OPENSPACE_BASE_DIR}/src/engine/wrapper/windowwrapper.cpp ${OPENSPACE_BASE_DIR}/src/interaction/controller.cpp @@ -98,6 +99,7 @@ set(OPENSPACE_SOURCE ${OPENSPACE_BASE_DIR}/src/util/spicemanager.cpp ${OPENSPACE_BASE_DIR}/src/util/spicemanager_lua.inl ${OPENSPACE_BASE_DIR}/src/util/syncbuffer.cpp + ${OPENSPACE_BASE_DIR}/src/util/syncdata.cpp ${OPENSPACE_BASE_DIR}/src/util/histogram.cpp ${OPENSPACE_BASE_DIR}/src/util/time.cpp ${OPENSPACE_BASE_DIR}/src/util/time_lua.inl @@ -112,6 +114,7 @@ set(OPENSPACE_HEADER ${OPENSPACE_BASE_DIR}/include/openspace/engine/moduleengine.h ${OPENSPACE_BASE_DIR}/include/openspace/engine/openspaceengine.h ${OPENSPACE_BASE_DIR}/include/openspace/engine/settingsengine.h + ${OPENSPACE_BASE_DIR}/include/openspace/engine/syncengine.h ${OPENSPACE_BASE_DIR}/include/openspace/engine/wrapper/sgctwindowwrapper.h ${OPENSPACE_BASE_DIR}/include/openspace/engine/wrapper/windowwrapper.h ${OPENSPACE_BASE_DIR}/include/openspace/interaction/controller.h @@ -186,6 +189,7 @@ set(OPENSPACE_HEADER ${OPENSPACE_BASE_DIR}/include/openspace/util/screenlog.h ${OPENSPACE_BASE_DIR}/include/openspace/util/spicemanager.h ${OPENSPACE_BASE_DIR}/include/openspace/util/syncbuffer.h + ${OPENSPACE_BASE_DIR}/include/openspace/util/syncdata.h ${OPENSPACE_BASE_DIR}/include/openspace/util/time.h ${OPENSPACE_BASE_DIR}/include/openspace/util/updatestructures.h ${OPENSPACE_BASE_DIR}/include/openspace/util/transformationmanager.h diff --git a/src/engine/syncengine.cpp b/src/engine/syncengine.cpp new file mode 100644 index 0000000000..333d826d7b --- /dev/null +++ b/src/engine/syncengine.cpp @@ -0,0 +1,75 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include +#include +#include +#include + +#include + + +namespace { + const std::string _loggerCat = "SyncEngine"; +} + + +namespace openspace { + + + // should be called on sgct master + void SyncEngine::encode(SyncBuffer* syncBuffer) { + for (const auto& syncable : _syncables) { + syncable->encode(syncBuffer); + } + } + + //should be called on sgct slaves + void SyncEngine::decode(SyncBuffer* syncBuffer) { + for (const auto& syncable : _syncables) { + syncable->decode(syncBuffer); + } + } + + void SyncEngine::applySyncedUpdates() { + for (const auto& syncable : _syncables) { + syncable->applySyncedUpdate(); + } + } + + void SyncEngine::addSyncable(Syncable* syncable) { + _syncables.push_back(syncable); + } + + void SyncEngine::addSyncables(const std::vector& syncables) { + for (const auto& syncable : syncables) { + addSyncable(syncable); + } + } + + void SyncEngine::removeSyncable(Syncable* syncable) { + _syncables.erase(std::remove(_syncables.begin(), _syncables.end(), syncable)); + } + +} diff --git a/src/util/syncdata.cpp b/src/util/syncdata.cpp new file mode 100644 index 0000000000..dbbb4b8f11 --- /dev/null +++ b/src/util/syncdata.cpp @@ -0,0 +1,39 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include +#include +#include +#include + +#include + + +namespace { + const std::string _loggerCat = "SyncData"; +} + +namespace openspace { + +}