From 21cdc9d5cb4e9858a40e2b634f608b971acde72b Mon Sep 17 00:00:00 2001 From: sylvass Date: Mon, 15 Nov 2021 15:30:58 -0500 Subject: [PATCH] Clean up --- .../include/screenspaceskybrowser.h | 2 +- modules/skybrowser/skybrowsermodule.cpp | 99 +++++++++--- modules/skybrowser/skybrowsermodule.h | 27 ++-- modules/skybrowser/skybrowsermodule_lua.inl | 143 ++++++------------ modules/skybrowser/src/pair.cpp | 3 + .../skybrowser/src/screenspaceskybrowser.cpp | 10 +- 6 files changed, 153 insertions(+), 131 deletions(-) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 06829d37ea..291763d591 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -104,7 +104,7 @@ namespace openspace { // Target & images ScreenSpaceSkyTarget* _skyTarget{ nullptr }; - std::thread _threadWwtMessages; + std::thread _wwtMessages; std::deque _selectedImages; // Time variables diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 647e77dfad..c997dd7020 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -25,6 +25,7 @@ #include +#include #include #include "skybrowsermodule_lua.inl" #include @@ -243,6 +244,11 @@ namespace openspace { SkyBrowserModule::SkyBrowserModule() : OpenSpaceModule(SkyBrowserModule::Name) { + // Find the hover circle + _hoverCircle = dynamic_cast( + global::renderEngine->screenSpaceRenderable("HoverCircle")); + + // Set callback functions global::callback::mouseButton->emplace_back( [&](MouseButton button, MouseAction action, KeyModifier modifier) -> bool { @@ -400,8 +406,8 @@ SkyBrowserModule::SkyBrowserModule() _isTransitioningVizMode = true; // Select the 3D browser when moving out of the solar system - if (!_isCameraInSolarSystem && _browser3d != nullptr) { - _selectedBrowser = _browser3d->renderable()->identifier(); + if (!_isCameraInSolarSystem && _browser3dNode) { + _selectedBrowser = _browser3dNode->renderable()->identifier(); } } @@ -423,8 +429,7 @@ SkyBrowserModule::SkyBrowserModule() } }); - _hoverCircle = dynamic_cast( - global::renderEngine->screenSpaceRenderable("HoverCircle")); + } SkyBrowserModule::~SkyBrowserModule() { @@ -594,9 +599,14 @@ void SkyBrowserModule::removeTargetBrowserPair(std::string& id) { _mouseOnPair = nullptr; } - -void SkyBrowserModule::set3dBrowser(SceneGraphNode* node) { - _browser3d = node; +void SkyBrowserModule::set3dBrowser(const std::string& id) +{ + SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id); + if (node) { + // Add to module + _browser3dNode = node; + _browser3d = dynamic_cast(_browser3dNode->renderable()); + } } void SkyBrowserModule::selectImage2dBrowser(int i) @@ -623,11 +633,11 @@ void SkyBrowserModule::selectImage2dBrowser(int i) void SkyBrowserModule::selectImage3dBrowser(int i) { - if (!_browser3d) { + if (!_browser3dNode) { return; } RenderableSkyBrowser* renderable = dynamic_cast( - _browser3d->renderable()); + _browser3dNode->renderable()); if (renderable) { const ImageData& image = _dataHandler->getImage(i); renderable->displayImage(image, i); @@ -660,6 +670,13 @@ void SkyBrowserModule::moveHoverCircle(int i) } } +void SkyBrowserModule::disableHoverCircle() +{ + if (_hoverCircle && _hoverCircle->isEnabled()) { + _hoverCircle->property("Enabled")->set(false); + } +} + void SkyBrowserModule::loadImages(const std::string& root, const std::string& directory, std::vector& speckFiles) { @@ -671,6 +688,23 @@ int SkyBrowserModule::nLoadedImages() return _dataHandler->nLoadedImages(); } +void SkyBrowserModule::add2dSelectedImagesTo3d(const std::string& pairId) +{ + Pair* pair = getPair(pairId); + + if (pair && get3dBrowser()) { + + // Empty 3D browser selection + get3dBrowser()->getSelectedImages().clear(); + // Copy 2D selection of images to 3D browser + const std::deque images = pair->getSelectedImages(); + std::for_each(std::begin(images), std::end(images), [&](const int i) { + const ImageData& image = _dataHandler->getImage(i); + get3dBrowser()->displayImage(image, i); + }); + } +} + const std::unique_ptr& SkyBrowserModule::getWWTDataHandler() { return _dataHandler; } @@ -691,15 +725,31 @@ Pair* SkyBrowserModule::getPair(std::string id) return &(*it); } -SceneGraphNode* SkyBrowserModule::get3dBrowser() { +SceneGraphNode* SkyBrowserModule::get3dBrowserNode() { + return _browser3dNode; +} + +RenderableSkyBrowser* SkyBrowserModule::get3dBrowser(const std::string& id) +{ + if (_browser3dNode->identifier() == id || _browser3d->identifier() == id) { + return _browser3d; + } + else { + return nullptr; + } + +} + +RenderableSkyBrowser* SkyBrowserModule::get3dBrowser() +{ return _browser3d; } void SkyBrowserModule::lookAt3dBrowser() { - if (!_browser3d) { + if (!_browser3dNode) { return; } - std::string id = _browser3d->identifier(); + std::string id = _browser3dNode->identifier(); // Target camera on the 3D sky browser openspace::global::scriptEngine->queueScript( "openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator." @@ -718,6 +768,18 @@ void SkyBrowserModule::lookAt3dBrowser() { ); } +void SkyBrowserModule::place3dBrowser(const ImageData& image, const int i) +{ + // If the image has a 3D position, add it to the scene graph + if (image.has3dCoords && get3dBrowser()) { + get3dBrowser()->displayImage(image, i); + get3dBrowser()->placeAt3dPosition(image); + } + else { + LINFO("Image has no 3D coordinate!"); + } +} + void SkyBrowserModule::startRotatingCamera(glm::dvec3 endAnimation) { // Save coordinates to rotate to in galactic world coordinates _endAnimation = endAnimation; @@ -756,10 +818,11 @@ void SkyBrowserModule::incrementallyFadeBrowserTargets(Transparency goal, float bool isAllFinished{ false }; for (Pair& pair : _targetsBrowsers) { if (pair.isEnabled()) { - pair.incrementallyFade(transparency, _fadingTime, deltaTime); bool isPairFinished = pair.hasFinishedFading(transparency); - - if (isPairFinished && goal == Transparency::Transparent) { + if (!isPairFinished) { + pair.incrementallyFade(transparency, _fadingTime, deltaTime); + } + else if (isPairFinished && goal == Transparency::Transparent) { pair.disable(); } isAllFinished &= isPairFinished; @@ -787,8 +850,10 @@ void SkyBrowserModule::setSelectedBrowser(ScreenSpaceSkyBrowser* browser) { } } -void SkyBrowserModule::setSelectedBrowser(std::string id) { - _selectedBrowser = id; +void SkyBrowserModule::setSelectedBrowser(const std::string& id) { + if (getPair(id) || _browser3dNode->identifier() == id) { + _selectedBrowser = id; + } } std::string SkyBrowserModule::selectedBrowserId() { diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 16263e0cd5..923174674c 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -40,6 +40,7 @@ namespace openspace { class ScreenSpaceSkyBrowser; +class RenderableSkyBrowser; enum class Transparency { Transparent = 0, @@ -59,46 +60,49 @@ public: // Getters std::vector& getPairs(); Pair* getPair(std::string id); - SceneGraphNode* get3dBrowser(); + SceneGraphNode* get3dBrowserNode(); + RenderableSkyBrowser* get3dBrowser(); + RenderableSkyBrowser* get3dBrowser(const std::string& id); const std::unique_ptr& getWWTDataHandler(); std::string selectedBrowserId(); // Setters + void set3dBrowser(const std::string& id); void setSelectedBrowser(ScreenSpaceSkyBrowser* ptr); - void setSelectedBrowser(std::string id); - void set3dBrowser(SceneGraphNode* node); + void setSelectedBrowser(const std::string& id); void selectImage2dBrowser(int i); void selectImage3dBrowser(int i); + void setSelectedObject(); // Manage mouse interactions - // Rotation and animation - + // Rotation, animation, placement void lookAtTarget(std::string id); void incrementallyRotateCamera(double deltaTime); void incrementallyFadeBrowserTargets(Transparency goal, float deltaTime); void incrementallyAnimateTargets(double deltaTime); void lookAt3dBrowser(); + void place3dBrowser(const ImageData& image, const int i); // Boolean functions bool isCameraInSolarSystem(); - // Managing the browsers + // Managing the target browser pairs void createTargetBrowserPair(); void removeTargetBrowserPair(std::string& browserId); void addTargetBrowserPair(std::string targetId, std::string browserId); + + // Hover circle void moveHoverCircle(int i); + void disableHoverCircle(); // Image collection handling void loadImages(const std::string& root, const std::string& directory, std::vector& speckFiles); int nLoadedImages(); - - // Manage mouse interactions - void setSelectedObject(); + void add2dSelectedImagesTo3d(const std::string& pairId); scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; - protected: void internalInitialize(const ghoul::Dictionary& dict) override; void internalDeinitialize() override; @@ -112,7 +116,8 @@ private: Pair* _selectedPair{ nullptr }; bool _isBrowser{ false }; ScreenSpaceImageLocal* _hoverCircle{ nullptr }; - SceneGraphNode* _browser3d{ nullptr }; + SceneGraphNode* _browser3dNode{ nullptr }; + RenderableSkyBrowser* _browser3d{ nullptr }; std::string _selectedBrowser{ "" }; // Currently selected browser (2D or 3D) // Fading diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 9396d9ac43..8b2861b16c 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -1,7 +1,6 @@ #include -#include #include #include #include @@ -45,11 +44,8 @@ namespace openspace::skybrowser::luascriptfunctions { int disableHoverCircle(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::disableHoverCircle"); - ScreenSpaceImageLocal* hoverCircle = dynamic_cast( - global::renderEngine->screenSpaceRenderable("HoverCircle")); - if (hoverCircle->isEnabled()) { - hoverCircle->property("Enabled")->set(false); - } + SkyBrowserModule* module = global::moduleEngine->module(); + module->disableHoverCircle(); return 0; } @@ -85,10 +81,8 @@ namespace openspace::skybrowser::luascriptfunctions { if (module->getPair(id)) { module->getPair(id)->setImageOrder(i, order); } - else if (module->get3dBrowser() != nullptr) { - RenderableSkyBrowser* browser3d = dynamic_cast( - module->get3dBrowser()->renderable()); - browser3d->setImageLayerOrder(i, order); + else if (module->get3dBrowser(id)) { + module->get3dBrowser(id)->setImageLayerOrder(i, order); } return 0; @@ -111,19 +105,14 @@ namespace openspace::skybrowser::luascriptfunctions { if (module->getPair(id)) { module->getPair(id)->loadImages(root); } - else { - SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id); - if (node) { - RenderableSkyBrowser* browser3d = dynamic_cast( - node->renderable()); - if (browser3d) { - // Load Image collections - browser3d->stopSyncingWwtView(); - LINFO("Load images to " + browser3d->identifier()); - browser3d->sendMessageToWwt(wwtmessage::loadCollection(root)); - LINFO("Image collection loaded in " + browser3d->identifier()); - } - } + else if (module->get3dBrowser(id)) { + + // Load Image collections + module->get3dBrowser(id)->stopSyncingWwtView(); + LINFO("Load images to " + module->get3dBrowser(id)->identifier()); + module->get3dBrowser(id)->sendMessageToWwt(wwtmessage::loadCollection(root)); + LINFO("Image collection loaded in " + module->get3dBrowser(id)->identifier()); + } return 0; @@ -139,12 +128,9 @@ namespace openspace::skybrowser::luascriptfunctions { for (Pair pair : pairs) { pair.sendIdToBrowser(); } - SceneGraphNode* node = module->get3dBrowser(); - if(node) { - std::string id = node->identifier(); - RenderableSkyBrowser* browsers3d = dynamic_cast( - node->renderable()); - browsers3d->setIdInBrowser(id); + if(module->get3dBrowser()) { + std::string id = module->get3dBrowserNode()->identifier(); + module->get3dBrowser()->setIdInBrowser(id); } return 0; } @@ -172,17 +158,10 @@ namespace openspace::skybrowser::luascriptfunctions { if (module->getPair(id)) { module->getPair(id)->synchronizeWithWwt(); } - else { - SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id); - if (node) { - RenderableSkyBrowser* browser3d = dynamic_cast( - node->renderable()); - if (browser3d && id == node->identifier()) { - // Initialize - LINFO("Initializing 3D sky browsers"); - browser3d->syncWwtView(); - } - } + else if(module->get3dBrowser(id)) { + // Initialize + LINFO("Initializing 3D sky browsers"); + module->get3dBrowser()->syncWwtView(); } return 0; @@ -194,11 +173,7 @@ namespace openspace::skybrowser::luascriptfunctions { SkyBrowserModule* module = global::moduleEngine->module(); LINFO("Add to sky browser module id " + id); - SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id); - if (node) { - // Add to module - module->set3dBrowser(node); - } + module->set3dBrowser(id); return 0; } @@ -302,11 +277,14 @@ namespace openspace::skybrowser::luascriptfunctions { // Add the window data for OpenSpace ghoul::lua::push(L, "OpenSpace"); lua_newtable(L); - glm::dvec3 cartesian = skybrowser::cameraDirectionEquatorial(); - glm::dvec2 spherical = skybrowser::cartesianToSpherical(cartesian); + glm::dvec3 cartesianCam = skybrowser::cameraDirectionEquatorial(); + glm::dvec2 sphericalCam = skybrowser::cartesianToSpherical(cartesianCam); // Convert to vector so ghoul can read it - std::vector viewDirCelestVec = { cartesian.x, cartesian.y, cartesian.z }; - + std::vector viewDirCelestVec = { + cartesianCam.x, + cartesianCam.y, + cartesianCam.z + }; // Calculate the smallest FOV of vertical and horizontal glm::dvec2 fovs = skybrowser::fovWindow(); @@ -316,9 +294,9 @@ namespace openspace::skybrowser::luascriptfunctions { lua_settable(L, -3); ghoul::lua::push(L, "cartesianDirection", viewDirCelestVec); lua_settable(L, -3); - ghoul::lua::push(L, "ra", spherical.x); + ghoul::lua::push(L, "ra", sphericalCam.x); lua_settable(L, -3); - ghoul::lua::push(L, "dec", spherical.y); + ghoul::lua::push(L, "dec", sphericalCam.y); lua_settable(L, -3); ghoul::lua::push(L, "selectedBrowserId", module->selectedBrowserId()); lua_settable(L, -3); @@ -379,17 +357,14 @@ namespace openspace::skybrowser::luascriptfunctions { } } - else if(module->get3dBrowser()){ - SceneGraphNode* node = module->get3dBrowser(); - RenderableSkyBrowser* browser3d = dynamic_cast( - node->renderable()); + else if(module->get3dBrowser()){ // Convert deque to vector so ghoul can read it std::vector selectedImagesVector; - std::deque selectedImages = browser3d->getSelectedImages(); + std::deque selectedImages = module->get3dBrowser()->getSelectedImages(); std::for_each(selectedImages.begin(), selectedImages.end(), [&](int index) { selectedImagesVector.push_back(index); }); - glm::dvec3 position3dBrowser = node->position(); + glm::dvec3 position3dBrowser = module->get3dBrowserNode()->position(); glm::dvec3 cartesian = skybrowser::galacticToEquatorial(position3dBrowser); glm::dvec2 spherical = skybrowser::cartesianToSpherical(cartesian); std::vector celestialCartVec = { @@ -401,14 +376,14 @@ namespace openspace::skybrowser::luascriptfunctions { //glm::ivec3 color = browser->_borderColor.value(); std::vector colorVec = { 200, 200, 200 }; - ghoul::lua::push(L, browser3d->identifier()); + ghoul::lua::push(L, module->get3dBrowser()->identifier()); lua_newtable(L); // Push ("Key", value) - ghoul::lua::push(L, "id", browser3d->identifier()); + ghoul::lua::push(L, "id", module->get3dBrowser()->identifier()); lua_settable(L, -3); - ghoul::lua::push(L, "name", node->guiName()); + ghoul::lua::push(L, "name", module->get3dBrowserNode()->guiName()); lua_settable(L, -3); - ghoul::lua::push(L, "FOV", browser3d->verticalFov()); + ghoul::lua::push(L, "FOV", module->get3dBrowser()->verticalFov()); lua_settable(L, -3); ghoul::lua::push(L, "selectedImages", selectedImagesVector); lua_settable(L, -3); @@ -445,22 +420,9 @@ namespace openspace::skybrowser::luascriptfunctions { int set3dSelectedImagesAs2dSelection(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::set3dSelectedImagesAs2dSelection"); - const std::string id = ghoul::lua::value(L, 1); + const std::string pairId = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - Pair* pair = module->getPair(id); - - if (pair && module->get3dBrowser()) { - RenderableSkyBrowser* browser3d = dynamic_cast( - module->get3dBrowser()->renderable()); - // Empty 3D browser selection - browser3d->getSelectedImages().clear(); - // Copy 2D selection of images to 3D browser - const std::deque images = pair->getSelectedImages(); - std::for_each(std::begin(images), std::end(images), [&](const int i) { - const ImageData& image = module->getWWTDataHandler()->getImage(i); - browser3d->displayImage(image, i); - }); - } + module->add2dSelectedImagesTo3d(pairId); return 0; } @@ -480,10 +442,8 @@ namespace openspace::skybrowser::luascriptfunctions { module->getPair(id)->setImageOpacity(i, opacity); } - else if (module->get3dBrowser() != nullptr) { - RenderableSkyBrowser* browser3d = dynamic_cast( - module->get3dBrowser()->renderable()); - browser3d->sendMessageToWwt(message); + else if (module->get3dBrowser(id)) { + module->get3dBrowser(id)->sendMessageToWwt(message); } return 0; @@ -505,9 +465,9 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser"); const std::string id = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - if (module->getPair(id)) { - module->setSelectedBrowser(id); - } + + module->setSelectedBrowser(id); + return 0; } @@ -535,16 +495,7 @@ namespace openspace::skybrowser::luascriptfunctions { SkyBrowserModule* module = global::moduleEngine->module(); const ImageData image = module->getWWTDataHandler()->getImage(i); - // If the image has a 3D position, add it to the scene graph - if (image.has3dCoords && module->get3dBrowser()) { - RenderableSkyBrowser* browser = dynamic_cast( - module->get3dBrowser()->renderable()); - browser->displayImage(image, i); - browser->placeAt3dPosition(image); - } - else { - LINFO("Image has no 3D coordinate!"); - } + module->place3dBrowser(image, i); return 0; } @@ -562,10 +513,8 @@ namespace openspace::skybrowser::luascriptfunctions { if (pair) { pair->removeSelectedImage(i); } - else if (module->get3dBrowser() != nullptr) { - RenderableSkyBrowser* browser3d = dynamic_cast( - module->get3dBrowser()->renderable()); - browser3d->removeSelectedImage(image, i); + else if (module->get3dBrowser(id)) { + module->get3dBrowser(id)->removeSelectedImage(image, i); } return 0; } diff --git a/modules/skybrowser/src/pair.cpp b/modules/skybrowser/src/pair.cpp index 2d34a88f86..886bbc0970 100644 --- a/modules/skybrowser/src/pair.cpp +++ b/modules/skybrowser/src/pair.cpp @@ -243,6 +243,9 @@ namespace openspace { void Pair::incrementallyFade(float goalState, float fadeTime, float deltaTime) { float opacityDelta = static_cast(deltaTime / fadeTime); + if (_target->opacity() > goalState) { + opacityDelta *= -1.f; + } if (!isTargetFadeFinished(goalState)) { _target->setOpacity(_target->opacity() + opacityDelta); diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index bf98160443..7a5ef34f44 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -138,8 +138,8 @@ namespace openspace { ScreenSpaceSkyBrowser::~ScreenSpaceSkyBrowser() { // Set flag to false so the thread can exit _isSyncedWithWwt = false; - if (_threadWwtMessages.joinable()) { - _threadWwtMessages.join(); + if (_wwtMessages.joinable()) { + _wwtMessages.join(); LINFO("Joined thread"); } } @@ -198,8 +198,8 @@ namespace openspace { bool ScreenSpaceSkyBrowser::deinitializeGL() { // Set flag to false so the thread can exit _isSyncedWithWwt = false; - if (_threadWwtMessages.joinable()) { - _threadWwtMessages.join(); + if (_wwtMessages.joinable()) { + _wwtMessages.join(); LINFO("Joined thread"); } return ScreenSpaceBrowser::deinitializeGL(); @@ -311,7 +311,7 @@ namespace openspace { void ScreenSpaceSkyBrowser::syncWwtView() { // Start a thread to enable user interaction while sending the calls to WWT - _threadWwtMessages = std::thread([&] { + _wwtMessages = std::thread([&] { while (_isSyncedWithWwt) { if (_skyTarget) { // Message WorldWide Telescope current view