From c882cdd3a3f0480ca41f5572ae290cbfcfee915c Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 7 May 2021 11:50:13 +0200 Subject: [PATCH] Add selection functionality to send index from and to GUI and move capping of scroll too browser --- .../include/screenspaceskybrowser.h | 3 ++ modules/skybrowser/skybrowsermodule.cpp | 53 +++++++++++++------ modules/skybrowser/skybrowsermodule.h | 11 ++-- modules/skybrowser/skybrowsermodule_lua.inl | 19 +++++-- .../skybrowser/src/screenspaceskybrowser.cpp | 15 ++++-- .../skybrowser/src/screenspaceskytarget.cpp | 18 ++++--- 6 files changed, 85 insertions(+), 34 deletions(-) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index e4b9a68f31..1df60ea0ed 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -59,6 +59,9 @@ namespace openspace { bool _camIsSyncedWWT; ScreenSpaceSkyTarget* _skyTarget; std::thread _threadWWTMessages; + // For capping the calls to change the zoom from scrolling + constexpr static const std::chrono::milliseconds TimeUpdateInterval{ 25 }; + std::chrono::system_clock::time_point _lastUpdateTime; }; } diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 19cf31ed07..6ce9f54186 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -120,6 +120,14 @@ namespace openspace { "Add one or multiple exoplanet systems to the scene, as specified by the " "input. An input string should be the name of the system host star" }, + { + "setSelectedBrowser", + & skybrowser::luascriptfunctions::setSelectedBrowser, + {}, + "string or list of strings", + "Add one or multiple exoplanet systems to the scene, as specified by the " + "input. An input string should be the name of the system host star" + }, { "getTargetData", &skybrowser::luascriptfunctions::getTargetData, @@ -234,7 +242,6 @@ SkyBrowserModule::SkyBrowserModule() // Selection has changed if (lastObj != _mouseOnObject) { - glm::ivec3 highlightAddition{ 35, 35, 35 }; // Remove highlight if (to_browser(lastObj)) { to_browser(lastObj)->setBorderColor(to_browser(lastObj)->getColor() - highlightAddition); @@ -258,19 +265,16 @@ SkyBrowserModule::SkyBrowserModule() global::callback::mouseScrollWheel->emplace_back( [&](double, double scroll) -> bool { - // Cap how often the zoom is allowed to update - std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); - if (now - _lastUpdateTime > TimeUpdateInterval) { - // If mouse is on browser or target, apply zoom - if (to_browser(_mouseOnObject)) { - to_browser(_mouseOnObject)->scrollZoom(scroll); - return true; - } - else if (to_target(_mouseOnObject) && to_target(_mouseOnObject)->getSkyBrowser()) { - to_target(_mouseOnObject)->getSkyBrowser()->scrollZoom(scroll); - } - _lastUpdateTime = std::chrono::system_clock::now(); + + // If mouse is on browser or target, apply zoom + if (to_browser(_mouseOnObject)) { + to_browser(_mouseOnObject)->scrollZoom(scroll); + return true; } + else if (to_target(_mouseOnObject) && to_target(_mouseOnObject)->getSkyBrowser()) { + to_target(_mouseOnObject)->getSkyBrowser()->scrollZoom(scroll); + } + return false; } ); @@ -278,9 +282,13 @@ SkyBrowserModule::SkyBrowserModule() global::callback::mouseButton->emplace_back( [&](MouseButton button, MouseAction action, KeyModifier modifier) -> bool { - if (action == MouseAction::Press) { + if (_mouseOnObject && action == MouseAction::Press) { - if (_mouseOnObject && button == MouseButton::Left) { + // Get the currently selected browser + setSelectedBrowser(_mouseOnObject); + + + if (button == MouseButton::Left) { startDragMousePos = _mousePosition; startDragObjectPos = _mouseOnObject->getScreenSpacePosition(); @@ -435,6 +443,21 @@ void SkyBrowserModule::rotateCamera(double deltaTime) { } } +void SkyBrowserModule::setSelectedBrowser(ScreenSpaceRenderable* ptr) { + ScreenSpaceSkyBrowser* browser = to_browser(ptr) ? to_browser(ptr) : to_target(ptr)->getSkyBrowser(); + std::vector browsers = getSkyBrowsers(); + auto it = std::find(browsers.begin(), browsers.end(), browser); + // Get index + selectedBrowser = std::distance(browsers.begin(), it); +} + +void SkyBrowserModule::setSelectedBrowser(int i) { + selectedBrowser = i; +} + +int SkyBrowserModule::getSelectedBrowserIndex() { + return selectedBrowser; +} /* std::vector SkyBrowserModule::documentations() const { return { diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 3d9248cafc..46e5f48064 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -57,6 +57,9 @@ public: std::vector getSkyBrowsers(); void startRotation(glm::dvec2 coordsEnd); void rotateCamera(double deltaTime); + void setSelectedBrowser(ScreenSpaceRenderable* ptr); + void setSelectedBrowser(int i); + int getSelectedBrowserIndex(); scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; @@ -86,14 +89,16 @@ protected: // Current interaction status bool currentlyResizingBrowser; bool currentlyDraggingObject; + // Data handler WWTDataHandler* dataHandler; - // For capping the calls to change the zoom from scrolling - constexpr static const std::chrono::milliseconds TimeUpdateInterval{ 50 }; - std::chrono::system_clock::time_point _lastUpdateTime; + // For animating rotation of camera to look at coordinate glm::dvec3 _coordsToAnimateTo; glm::dvec3 _coordsStartAnimation; bool isRotating = false; + // For tracking the currently selected browser + int selectedBrowser{ -1 }; + glm::ivec3 highlightAddition{ 35, 35, 35 }; }; } // namespace openspace diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 9891bae7f8..bafb28b719 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -36,9 +36,9 @@ namespace openspace::skybrowser::luascriptfunctions { // Load image ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::selectImage"); const int i = ghoul::lua::value(L, 1); - - ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("SkyBrowser1")); - SkyBrowserModule* module = global::moduleEngine->module(); + SkyBrowserModule* module = global::moduleEngine->module(); + ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[module->getSelectedBrowserIndex()]; + const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i]; // Load image collection, if it isn't loaded already // TODO: Update or remove with new WWT API @@ -252,6 +252,8 @@ namespace openspace::skybrowser::luascriptfunctions { lua_settable(L, -3); ghoul::lua::push(L, "Dec", sphericalJ2000.y); lua_settable(L, -3); + ghoul::lua::push(L, "SelectedBrowserIndex", module->getSelectedBrowserIndex()); + lua_settable(L, -3); // Set table for the current ImageData lua_settable(L, -3); @@ -296,13 +298,22 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::adjustCamera"); const int i = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - //module->getSkyBrowsers()[0]->getSkyTarget()->lock(); if (module->getSkyBrowsers().size() > i) { module->startRotation(module->getSkyBrowsers()[i]->getSkyTarget()->getTargetDirectionCelestial()); } return 0; } + + int setSelectedBrowser(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser"); + const int i = ghoul::lua::value(L, 1); + SkyBrowserModule* module = global::moduleEngine->module(); + if (module->getSkyBrowsers().size() < i) { + module->setSelectedBrowser(i); + } + return 0; + } } diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 54f5933c60..77e62cb548 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -184,11 +184,16 @@ namespace openspace { } void ScreenSpaceSkyBrowser::scrollZoom(float scroll) { - // Make scroll more sensitive the smaller the FOV - float x = _vfieldOfView; - float zoomFactor = atan(x / 50.0) + exp(x / 40) - 0.999999; - float zoom = scroll > 0.0 ? -zoomFactor : zoomFactor; - _vfieldOfView = std::clamp(_vfieldOfView + zoom, 0.001f, 70.0f); + // Cap how often the zoom is allowed to update + std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + if (now - _lastUpdateTime > TimeUpdateInterval) { + // Make scroll more sensitive the smaller the FOV + float x = _vfieldOfView; + float zoomFactor = atan(x / 50.0) + exp(x / 40) - 0.999999; + float zoom = scroll > 0.0 ? -zoomFactor : zoomFactor; + _vfieldOfView = std::clamp(_vfieldOfView + zoom, 0.001f, 70.0f); + _lastUpdateTime = std::chrono::system_clock::now(); + } } void ScreenSpaceSkyBrowser::executeJavascript(std::string script) const { diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index 8deac38412..742190bb6d 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -367,14 +367,18 @@ namespace openspace { } bool ScreenSpaceSkyTarget::animateFOV(float endFOV, float deltaTime) { - double distance = static_cast(_skyBrowser->_vfieldOfView.value()) - endFOV; - // If distance is too large, keep animating - if (abs(distance) > 0.01) { - _skyBrowser->setVerticalFieldOfView(_skyBrowser->_vfieldOfView.value() - (distance * deltaTime * 2.0)); - return false; + if (_skyBrowser) { + double distance = static_cast(_skyBrowser->_vfieldOfView.value()) - endFOV; + // If distance is too large, keep animating + if (abs(distance) > 0.01) { + _skyBrowser->scrollZoom(distance); + return false; + } + // Animation is finished + return true; } - // Animation is finished - return true; + LINFO("Browser not connected to target!"); + return true; } void ScreenSpaceSkyTarget::startAnimation(glm::dvec2 coordsEnd, float FOVEnd) {