From 8f98320bf69a503442553f912962adcd34063320 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 21 Sep 2022 14:34:36 +0200 Subject: [PATCH 1/9] Add new functions into the window delegate to query node id --- apps/OpenSpace/main.cpp | 6 ++++++ include/openspace/engine/windowdelegate.h | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 0799a706b6..4b50f87617 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -948,6 +948,12 @@ void setSgctDelegateFunctions() { sgctDelegate.showStatistics = [](bool enabled) { Engine::instance().setStatsGraphVisibility(enabled); }; + sgctDelegate.numberOfNodes = []() { + return ClusterManager::instance().numberOfNodes(); + }; + sgctDelegate.currentNode = []() { + return ClusterManager::instance().thisNodeId(); + }; } void checkCommandLineForSettings(int& argc, char** argv, bool& hasSGCT, bool& hasProfile, diff --git a/include/openspace/engine/windowdelegate.h b/include/openspace/engine/windowdelegate.h index b76a9bb765..5d707ed958 100644 --- a/include/openspace/engine/windowdelegate.h +++ b/include/openspace/engine/windowdelegate.h @@ -107,6 +107,10 @@ struct WindowDelegate { void (*setScreenshotFolder)(std::string) = [](std::string) {}; void (*showStatistics)(bool) = [](bool) {}; + + int (*numberOfNodes)() = []() { return 0; }; + + int (*currentNode)() = []() { return 0; }; }; } // namespace openspace From 4214811c6af6a72144f849b6261258d500e76621 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 22 Sep 2022 03:07:04 -0400 Subject: [PATCH 2/9] Add lua function to reload a display copy on a specific node --- modules/skybrowser/include/browser.h | 1 + modules/skybrowser/skybrowsermodule.cpp | 3 ++- modules/skybrowser/skybrowsermodule_lua.inl | 27 +++++++++++++++++++++ modules/skybrowser/src/browser.cpp | 4 +++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/modules/skybrowser/include/browser.h b/modules/skybrowser/include/browser.h index 04e7a70f7e..b1fb89848c 100644 --- a/modules/skybrowser/include/browser.h +++ b/modules/skybrowser/include/browser.h @@ -72,6 +72,7 @@ public: void update(); void updateBrowserSize(); + void reload(); glm::vec2 browserPixelDimensions() const; float browserRatio() const; diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 5d8c692343..3682cddb68 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -524,7 +524,8 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { codegen::lua::ShowAllTargetsAndBrowsers, codegen::lua::PointSpaceCraft, codegen::lua::GetWwtImageCollectionUrl, - codegen::lua::StopAnimations + codegen::lua::StopAnimations, + codegen::lua::ReloadDisplayCopyOnNode } }; } diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 25b1c8a769..fbebdb42d8 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -39,6 +39,33 @@ namespace { constexpr std::string_view _loggerCat = "SkyBrowserModule"; + +/** +* Reloads the sky browser display copy for the node index that is sent in. +* .If no ID is sent in, it will reload all display copies on that node. +*/ +[[codegen::luawrap]] void reloadDisplayCopyOnNode(int nodeIndex, std::string id = "all") { + using namespace openspace; + + if (global::windowDelegate->currentNode() != nodeIndex) + return; + + SkyBrowserModule* module = global::moduleEngine->module(); + if (id != "all") { + TargetBrowserPair* pair = module->pair(id); + if (pair) { + pair->browser()->reload(); + } + } + else { + const std::vector>& pairs = module->pairs(); + for (const std::unique_ptr& pair : pairs) { + pair->browser()->reload(); + } + } +} + + /** * Takes an index to an image and selects that image in the currently * selected sky browser. diff --git a/modules/skybrowser/src/browser.cpp b/modules/skybrowser/src/browser.cpp index fd8553e594..ee65c6838a 100644 --- a/modules/skybrowser/src/browser.cpp +++ b/modules/skybrowser/src/browser.cpp @@ -179,6 +179,10 @@ void Browser::updateBrowserSize() { _browserDimensions = _texture->dimensions(); } +void Browser::reload() { + _reload.set(true); +} + float Browser::browserRatio() const { return static_cast(_texture->dimensions().x) / static_cast(_texture->dimensions().y); From 2c31e485d8d13508350bedda16dec337c6adf043 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 22 Sep 2022 04:23:16 -0400 Subject: [PATCH 3/9] Add potential fix for flickering of target --- modules/skybrowser/include/screenspaceskybrowser.h | 2 +- modules/skybrowser/src/screenspaceskybrowser.cpp | 3 ++- modules/skybrowser/src/targetbrowserpair.cpp | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index a2faed2372..84fa784e0f 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -50,7 +50,7 @@ public: glm::dvec2 fineTuneVector(const glm::dvec2& drag); bool isInitialized() const; - void setVerticalFovWithScroll(float scroll); + double setVerticalFovWithScroll(float scroll); void setOpacity(float opacity); void setRatio(float ratio); void setIdInBrowser() const; diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 63cee8a767..f094d7a91a 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -328,12 +328,13 @@ void ScreenSpaceSkyBrowser::update() { ScreenSpaceRenderable::update(); } -void ScreenSpaceSkyBrowser::setVerticalFovWithScroll(float scroll) { +double ScreenSpaceSkyBrowser::setVerticalFovWithScroll(float scroll) { // Make scroll more sensitive the smaller the FOV double x = _verticalFov; double zoomFactor = atan(x / 50.0) + exp(x / 40.0) - 0.99999999999999999999999999999; double zoom = scroll > 0.0 ? zoomFactor : -zoomFactor; _verticalFov = std::clamp(_verticalFov + zoom, 0.0, 70.0); + return _verticalFov; } void ScreenSpaceSkyBrowser::bindTexture() { diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index cdc74f04f1..028d6ffce8 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -262,7 +262,8 @@ void TargetBrowserPair::setBrowserRatio(float ratio) { } void TargetBrowserPair::setVerticalFovWithScroll(float scroll) { - _browser->setVerticalFovWithScroll(scroll); + double fov = _browser->setVerticalFovWithScroll(scroll); + _target->setVerticalFov(fov); } void TargetBrowserPair::setImageCollectionIsLoaded(bool isLoaded) { From a88ea892db0e2457dfa12cebca495906162f325f Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 22 Sep 2022 04:25:57 -0400 Subject: [PATCH 4/9] Fix typo --- modules/skybrowser/src/targetbrowserpair.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index 028d6ffce8..d2a8b16c8c 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -263,7 +263,7 @@ void TargetBrowserPair::setBrowserRatio(float ratio) { void TargetBrowserPair::setVerticalFovWithScroll(float scroll) { double fov = _browser->setVerticalFovWithScroll(scroll); - _target->setVerticalFov(fov); + _targetRenderable->setVerticalFov(fov); } void TargetBrowserPair::setImageCollectionIsLoaded(bool isLoaded) { From a49e37fedc5cd9574cab4da60401ba35a189521a Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 22 Sep 2022 05:10:05 -0400 Subject: [PATCH 5/9] Turn vertical fov into properties to ensure that the fov is synchronized on all nodes --- .../skybrowser/include/renderableskytarget.h | 3 +-- modules/skybrowser/include/wwtcommunicator.h | 4 +++- .../skybrowser/src/renderableskytarget.cpp | 15 ++++++++++++++ .../skybrowser/src/screenspaceskybrowser.cpp | 1 + modules/skybrowser/src/wwtcommunicator.cpp | 20 ++++++++++++++++++- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/modules/skybrowser/include/renderableskytarget.h b/modules/skybrowser/include/renderableskytarget.h index 03859dcddb..b92801d622 100644 --- a/modules/skybrowser/include/renderableskytarget.h +++ b/modules/skybrowser/include/renderableskytarget.h @@ -61,8 +61,7 @@ private: properties::FloatProperty _crossHairSize; properties::FloatProperty _showRectangleThreshold; properties::FloatProperty _lineWidth; - - double _verticalFov = 10.0; + properties::DoubleProperty _verticalFov; glm::ivec3 _borderColor = glm::ivec3(230); float _ratio = 1.f; diff --git a/modules/skybrowser/include/wwtcommunicator.h b/modules/skybrowser/include/wwtcommunicator.h index e8344e2142..639d030331 100644 --- a/modules/skybrowser/include/wwtcommunicator.h +++ b/modules/skybrowser/include/wwtcommunicator.h @@ -26,6 +26,7 @@ #define __OPENSPACE_MODULE_SKYBROWSER___WWTCOMMUNICATOR___H__ #include +#include #include @@ -69,7 +70,8 @@ protected: void setIdInBrowser(const std::string& id) const; std::deque>::iterator findSelectedImage(int i); - double _verticalFov = 10.0f; + properties::DoubleProperty _verticalFov; + glm::ivec3 _borderColor = glm::ivec3(70); glm::dvec2 _equatorialAim = glm::dvec2(0.0); double _targetRoll = 0.0; diff --git a/modules/skybrowser/src/renderableskytarget.cpp b/modules/skybrowser/src/renderableskytarget.cpp index ebfe9ab4b3..3eb07446e2 100644 --- a/modules/skybrowser/src/renderableskytarget.cpp +++ b/modules/skybrowser/src/renderableskytarget.cpp @@ -68,6 +68,12 @@ namespace { "The thickness of the line of the target. The larger number, the thicker line" }; + constexpr openspace::properties::Property::PropertyInfo VerticalFovInfo = { + "VerticalFov", + "Vertical Field Of View", + "The vertical field of view of the target." + }; + struct [[codegen::Dictionary(RenderableSkyTarget)]] Parameters { // [[codegen::verbatim(crossHairSizeInfo.description)]] std::optional crossHairSize; @@ -77,6 +83,9 @@ namespace { // [[codegen::verbatim(LineWidthInfo.description)]] std::optional lineWidth; + + // [[codegen::verbatim(VerticalFovInfo.description)]] + std::optional verticalFov; }; #include "renderableskytarget_codegen.cpp" @@ -93,6 +102,7 @@ RenderableSkyTarget::RenderableSkyTarget(const ghoul::Dictionary& dictionary) , _crossHairSize(crossHairSizeInfo, 2.f, 1.f, 10.f) , _showRectangleThreshold(RectangleThresholdInfo, 5.f, 0.1f, 70.f) , _lineWidth(LineWidthInfo, 13.f, 1.f, 100.f) + , _verticalFov(VerticalFovInfo, 10.0, 0.00000000001, 70.0) , _borderColor(220, 220, 220) { // Handle target dimension property @@ -104,7 +114,12 @@ RenderableSkyTarget::RenderableSkyTarget(const ghoul::Dictionary& dictionary) _showRectangleThreshold = p.rectangleThreshold.value_or(_showRectangleThreshold); addProperty(_showRectangleThreshold); + _lineWidth = p.lineWidth.value_or(_lineWidth); addProperty(_lineWidth); + + _verticalFov= p.verticalFov.value_or(_verticalFov); + _verticalFov.setReadOnly(true); + addProperty(_verticalFov); } void RenderableSkyTarget::bindTexture() {} diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index f094d7a91a..2165dee49e 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -119,6 +119,7 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary addProperty(_browserDimensions); addProperty(_reload); addProperty(_textureQuality); + addProperty(_verticalFov); _textureQuality.onChange([this]() { _textureDimensionsIsDirty = true; }); diff --git a/modules/skybrowser/src/wwtcommunicator.cpp b/modules/skybrowser/src/wwtcommunicator.cpp index 8f91b7bf91..82f5577c0d 100644 --- a/modules/skybrowser/src/wwtcommunicator.cpp +++ b/modules/skybrowser/src/wwtcommunicator.cpp @@ -116,13 +116,31 @@ namespace { MessageCounter++; return msg; } + + constexpr openspace::properties::Property::PropertyInfo VerticalFovInfo = { + "VerticalFov", + "Vertical Field Of View", + "The vertical field of view of the target." + }; + + struct [[codegen::Dictionary(WwtCommunicator)]] Parameters { + // [[codegen::verbatim(VerticalFovInfo.description)]] + std::optional verticalFov; + }; + #include "wwtcommunicator_codegen.cpp" } // namespace namespace openspace { WwtCommunicator::WwtCommunicator(const ghoul::Dictionary& dictionary) : Browser(dictionary) -{} + , _verticalFov(VerticalFovInfo, 10.0, 0.00000000001, 70.0) +{ + // Handle target dimension property + const Parameters p = codegen::bake(dictionary); + _verticalFov = p.verticalFov.value_or(_verticalFov); + _verticalFov.setReadOnly(true); +} void WwtCommunicator::update() { // Cap how messages are passed From f6c3ab2ee8be130d00dab2da94d57226ffb9214d Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 22 Sep 2022 05:10:33 -0400 Subject: [PATCH 6/9] Set the size of the target on the master node only to ensure that the target plane is the same size on all nodes in a cluster --- modules/skybrowser/skybrowsermodule_lua.inl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index fbebdb42d8..42d8a590df 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -446,6 +446,10 @@ namespace { [[codegen::luawrap]] void createTargetBrowserPair() { using namespace openspace; + if (!global::windowDelegate->isMaster()) { + return; + } + SkyBrowserModule* module = global::moduleEngine->module(); int uniqueIdentifier = module->uniqueIdentifierCounter(); @@ -507,23 +511,23 @@ namespace { global::scriptEngine->queueScript( "openspace.addScreenSpaceRenderable(" + browser + ");", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::RemoteScripting::Yes ); global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + target + ");", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::RemoteScripting::Yes ); global::scriptEngine->queueScript( "openspace.skybrowser.addPairToSkyBrowserModule('" + idTarget + "','" + idBrowser + "');", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::RemoteScripting::Yes ); global::scriptEngine->queueScript( "openspace.skybrowser.setSelectedBrowser('" + idBrowser + "');", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::RemoteScripting::Yes ); } From 7ed3c785786ccdc95c26944657d1c80a2770ff5b Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 23 Sep 2022 12:53:16 -0400 Subject: [PATCH 7/9] Set initialize to false when reloading so the browser can redo the initialization process --- modules/skybrowser/skybrowsermodule_lua.inl | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 42d8a590df..4ab3b2247e 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -54,6 +54,7 @@ namespace { if (id != "all") { TargetBrowserPair* pair = module->pair(id); if (pair) { + pair->browser()->setIsInitialized(false); pair->browser()->reload(); } } From 0fd20db5e87d935506fe85e94c548cb1400c7c9f Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 23 Sep 2022 12:53:41 -0400 Subject: [PATCH 8/9] Add property for synchronizing aim so synchronization can be turned off for performance reasons --- modules/skybrowser/skybrowsermodule.cpp | 18 ++++++++++++++++-- modules/skybrowser/skybrowsermodule.h | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 3682cddb68..1ddddb3ce3 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -92,6 +92,12 @@ namespace { "inversed" }; + constexpr openspace::properties::Property::PropertyInfo SynchronizeAimInfo = { + "SynchronizeAim", + "Synchronize Aim", + "If checked, the target and the browser will have synchronized aim." + }; + constexpr openspace::properties::Property::PropertyInfo SpaceCraftTimeInfo = { "SpaceCraftAnimationTime", "Space Craft Animation Time", @@ -127,6 +133,9 @@ namespace { // [[codegen::verbatim(InverseZoomInfo.description)]] std::optional inverseZoomDirection; + // [[codegen::verbatim(SynchronizeAimInfo.description)]] + std::optional synchronizeAim; + // [[codegen::verbatim(SpaceCraftTimeInfo.description)]] std::optional spaceCraftAnimationTime; @@ -149,6 +158,7 @@ SkyBrowserModule::SkyBrowserModule() , _browserAnimationSpeed(BrowserSpeedInfo, 5.0, 0.0, 10.0) , _hideTargetsBrowsersWithGui(HideWithGuiInfo, false) , _inverseZoomDirection(InverseZoomInfo, false) + , _synchronizeAim(SynchronizeAimInfo, true) , _spaceCraftAnimationTime(SpaceCraftTimeInfo, 2.0, 0.0, 10.0) , _wwtImageCollectionUrl( ImageCollectionInfo, @@ -165,6 +175,7 @@ SkyBrowserModule::SkyBrowserModule() addProperty(_inverseZoomDirection); addProperty(_spaceCraftAnimationTime); addProperty(_wwtImageCollectionUrl); + addProperty(_synchronizeAim); _wwtImageCollectionUrl.setReadOnly(true); // Set callback functions @@ -209,8 +220,10 @@ SkyBrowserModule::SkyBrowserModule() } if (_isCameraInSolarSystem) { - for (const std::unique_ptr& pair : _targetsBrowsers) { - pair->synchronizeAim(); + if (_synchronizeAim) { + for (const std::unique_ptr& pair : _targetsBrowsers) { + pair->synchronizeAim(); + } } incrementallyAnimateTargets(); } @@ -230,6 +243,7 @@ void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) { _browserAnimationSpeed = p.browserSpeed.value_or(_browserAnimationSpeed); _inverseZoomDirection = p.inverseZoomDirection.value_or(_inverseZoomDirection); _wwtImageCollectionUrl = p.wwtImageCollectionUrl.value_or(_wwtImageCollectionUrl); + _synchronizeAim = p.synchronizeAim.value_or(_synchronizeAim); _hideTargetsBrowsersWithGui = p.hideTargetsBrowsersGui.value_or( _hideTargetsBrowsersWithGui ); diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 52c85970f9..04810aff33 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -101,6 +101,7 @@ private: properties::DoubleProperty _browserAnimationSpeed; properties::BoolProperty _hideTargetsBrowsersWithGui; properties::BoolProperty _inverseZoomDirection; + properties::BoolProperty _synchronizeAim; properties::DoubleProperty _spaceCraftAnimationTime; properties::StringProperty _wwtImageCollectionUrl; From 90f2ad0cbed72edde41ecc9ab0a9b6e357152da7 Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Tue, 4 Oct 2022 14:12:00 -0400 Subject: [PATCH 9/9] telling browser to reload collection on reload --- modules/skybrowser/skybrowsermodule_lua.inl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 4ab3b2247e..b8fad22aed 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -55,12 +55,15 @@ namespace { TargetBrowserPair* pair = module->pair(id); if (pair) { pair->browser()->setIsInitialized(false); + pair->browser()->setImageCollectionIsLoaded(false); pair->browser()->reload(); } } else { const std::vector>& pairs = module->pairs(); for (const std::unique_ptr& pair : pairs) { + pair->browser()->setIsInitialized(false); + pair->browser()->setImageCollectionIsLoaded(false); pair->browser()->reload(); } }