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 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/include/renderableskytarget.h b/modules/skybrowser/include/renderableskytarget.h index 92616c7cca..8aa0b2a2d3 100644 --- a/modules/skybrowser/include/renderableskytarget.h +++ b/modules/skybrowser/include/renderableskytarget.h @@ -62,10 +62,9 @@ private: properties::FloatProperty _crossHairSize; properties::FloatProperty _showRectangleThreshold; properties::FloatProperty _lineWidth; - - double _borderRadius = 0.0; - double _verticalFov = 10.0; + properties::DoubleProperty _verticalFov; + double _borderRadius = 0.0; glm::ivec3 _borderColor = glm::ivec3(230); float _ratio = 1.f; }; diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 0a19865c2c..e5abaa69c0 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/include/wwtcommunicator.h b/modules/skybrowser/include/wwtcommunicator.h index e9e717cef6..d068341eab 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 @@ -71,8 +72,9 @@ protected: void setIdInBrowser(const std::string& id) const; std::deque>::iterator findSelectedImage(int i); + properties::DoubleProperty _verticalFov; + double _borderRadius = 0.0; - double _verticalFov = 10.0f; glm::ivec3 _borderColor = glm::ivec3(70); glm::dvec2 _equatorialAim = glm::dvec2(0.0); double _targetRoll = 0.0; diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 84d881013b..1cd2df8a47 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 ); @@ -525,7 +539,8 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { codegen::lua::PointSpaceCraft, codegen::lua::GetWwtImageCollectionUrl, codegen::lua::StopAnimations, - codegen::lua::SetBorderRadius + codegen::lua::SetBorderRadius, + codegen::lua::ReloadDisplayCopyOnNode } }; } 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; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 35798b4e9c..e752903d28 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -39,6 +39,37 @@ 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()->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(); + } + } +} + + /** * Takes an index to an image and selects that image in the currently * selected sky browser. @@ -419,6 +450,10 @@ namespace { [[codegen::luawrap]] void createTargetBrowserPair() { using namespace openspace; + if (!global::windowDelegate->isMaster()) { + return; + } + SkyBrowserModule* module = global::moduleEngine->module(); int uniqueIdentifier = module->uniqueIdentifierCounter(); @@ -480,23 +515,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 ); } 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); diff --git a/modules/skybrowser/src/renderableskytarget.cpp b/modules/skybrowser/src/renderableskytarget.cpp index bc8413f6b6..a0356dc2af 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 6af011fa42..3221e4569f 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; }); @@ -333,12 +334,13 @@ void ScreenSpaceSkyBrowser::update() { WwtCommunicator::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 27b12f52c9..81a682064f 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -268,7 +268,8 @@ void TargetBrowserPair::setBrowserRatio(float ratio) { } void TargetBrowserPair::setVerticalFovWithScroll(float scroll) { - _browser->setVerticalFovWithScroll(scroll); + double fov = _browser->setVerticalFovWithScroll(scroll); + _targetRenderable->setVerticalFov(fov); } void TargetBrowserPair::setImageCollectionIsLoaded(bool isLoaded) { diff --git a/modules/skybrowser/src/wwtcommunicator.cpp b/modules/skybrowser/src/wwtcommunicator.cpp index acae457541..08263b68e2 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