From de68e406b0b70e680bebf54aa8bd12c4e8635189 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Wed, 27 Apr 2022 18:20:51 +0200 Subject: [PATCH] Send topic on presync instead of from itmemanager (closes #2037) --- modules/server/src/topics/skybrowsertopic.cpp | 9 +++--- modules/skybrowser/skybrowsermodule.cpp | 32 +++++++++++++++++++ modules/skybrowser/skybrowsermodule.h | 9 ++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/modules/server/src/topics/skybrowsertopic.cpp b/modules/server/src/topics/skybrowsertopic.cpp index d9ae067218..8b782c119a 100644 --- a/modules/server/src/topics/skybrowsertopic.cpp +++ b/modules/server/src/topics/skybrowsertopic.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include namespace { @@ -56,7 +55,8 @@ SkyBrowserTopic::SkyBrowserTopic() SkyBrowserTopic::~SkyBrowserTopic() { if (_targetDataCallbackHandle != UnsetOnChangeHandle) { - global::timeManager->removeTimeChangeCallback(_targetDataCallbackHandle); + SkyBrowserModule* module = global::moduleEngine->module(); + module->removePreSyncCallback(_targetDataCallbackHandle); } } @@ -76,13 +76,14 @@ void SkyBrowserTopic::handleJson(const nlohmann::json& json) { return; } - _targetDataCallbackHandle = global::timeManager->addTimeChangeCallback([this]() { + SkyBrowserModule* module = global::moduleEngine->module(); + _targetDataCallbackHandle = module->addPreSyncCallback([this]() { std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); if (now - _lastUpdateTime > _skyBrowserUpdateTime) { sendBrowserData(); _lastUpdateTime = std::chrono::system_clock::now(); } - }); + }); } void SkyBrowserTopic::sendBrowserData() { diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 1ec9bcdbdd..148f9925c8 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -154,6 +154,13 @@ SkyBrowserModule::SkyBrowserModule() if (_cameraRotation.isAnimating() && _allowCameraRotation) { incrementallyRotateCamera(); } + + // Trigger callbacks (should maybe have a check to see if update is needed) + using K = CallbackHandle; + using V = CallbackFunction; + for (const std::pair& it : _preSyncCallbacks) { + it.second(); // call function + } }); } @@ -397,6 +404,31 @@ bool SkyBrowserModule::isSelectedPairFacingCamera() const { return found ? found->isFacingCamera() : false; } +SkyBrowserModule::CallbackHandle SkyBrowserModule::addPreSyncCallback( + CallbackFunction cb) +{ + CallbackHandle handle = _nextCallbackHandle++; + _preSyncCallbacks.emplace_back(handle, std::move(cb)); + return handle; +} + +void SkyBrowserModule::removePreSyncCallback(CallbackHandle handle) { + const auto it = std::find_if( + _preSyncCallbacks.begin(), + _preSyncCallbacks.end(), + [handle](const std::pair& cb) { + return cb.first == handle; + } + ); + + ghoul_assert( + it != _preSyncCallbacks.end(), + "handle must be a valid callback handle" + ); + + _preSyncCallbacks.erase(it); +} + scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { return { "skybrowser", diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 4e8e6d3f7d..c2092a1178 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -52,6 +52,8 @@ enum class MouseInteraction { class SkyBrowserModule : public OpenSpaceModule { public: constexpr static const char* Name = "SkyBrowser"; + using CallbackHandle = int; + using CallbackFunction = std::function; SkyBrowserModule(); @@ -90,6 +92,9 @@ public: void loadImages(const std::string& root, const std::filesystem::path& directory); int nLoadedImages() const; + CallbackHandle addPreSyncCallback(CallbackFunction cb); + void removePreSyncCallback(CallbackHandle handle); + scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; @@ -125,6 +130,10 @@ private: // Data handler for the image collections std::unique_ptr _dataHandler; + + // Callbacks for tiggering topic + int _nextCallbackHandle = 0; + std::vector> _preSyncCallbacks; }; } // namespace openspace