From ee33d1df24fcf60ea2df54710f2319ffafeb0990 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 21 May 2021 10:00:04 +0200 Subject: [PATCH] Add lua functions for communication with GUI: add and remove target browser pairs and 3D browsers, change opacity of layer, use ID:s for the browser --- .../include/screenspaceskybrowser.h | 2 +- modules/skybrowser/skybrowsermodule.cpp | 220 ++++++++++++++++-- modules/skybrowser/skybrowsermodule.h | 27 ++- modules/skybrowser/skybrowsermodule_lua.inl | 147 ++++++------ .../skybrowser/src/renderableskybrowser.cpp | 4 + .../skybrowser/src/screenspaceskybrowser.cpp | 9 + 6 files changed, 307 insertions(+), 102 deletions(-) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 6ff6a63d2d..6fb3c91d04 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -13,7 +13,7 @@ namespace openspace { { public: ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary); - virtual ~ScreenSpaceSkyBrowser() = default; + virtual ~ScreenSpaceSkyBrowser(); bool initializeGL() override; bool deinitializeGL() override; diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 67019622a3..1addcc882b 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -44,7 +44,7 @@ #include #include // For atan2 #include // For printing glm data - +#include #include @@ -146,6 +146,22 @@ 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" }, + { + "createTargetBrowserPair", + &skybrowser::luascriptfunctions::createTargetBrowserPair, + {}, + "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" + }, + { + "removeTargetBrowserPair", + &skybrowser::luascriptfunctions::removeTargetBrowserPair, + {}, + "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" + }, { "create3dSkyBrowser", &skybrowser::luascriptfunctions::create3dSkyBrowser, @@ -153,6 +169,22 @@ namespace openspace { "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" + }, + { + "remove3dSkyBrowser", + &skybrowser::luascriptfunctions::remove3dSkyBrowser, + {}, + "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" + }, + { + "setOpacityOfImageLayer", + &skybrowser::luascriptfunctions::setOpacityOfImageLayer, + {}, + "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" }, }; @@ -238,7 +270,7 @@ SkyBrowserModule::SkyBrowserModule() // Find and save what mouse is currently hovering on auto currentlyOnObject = std::find_if(renderables.begin(), renderables.end(), [&](ScreenSpaceRenderable* obj) { - return obj->coordIsInsideCornersScreenSpace(_mousePosition); + return (obj->coordIsInsideCornersScreenSpace(_mousePosition) && obj->isEnabled()); }); _mouseOnObject = currentlyOnObject != renderables.end() ? *currentlyOnObject : nullptr; @@ -355,7 +387,8 @@ SkyBrowserModule::SkyBrowserModule() double deltaTime = global::windowDelegate->deltaTime(); // Fade out or in browser & target - for (ScreenSpaceSkyBrowser* browser : browsers) { + for (std::pair pair : browsers) { + ScreenSpaceSkyBrowser* browser = pair.second; // If outside solar system and browser is visible if (!_cameraInSolarSystem && browser->isEnabled()) { bool fadingIsFinished = fadeBrowserAndTarget(true, fadingTime, deltaTime); @@ -423,15 +456,175 @@ void SkyBrowserModule::addRenderable(ScreenSpaceRenderable* object) { renderables.push_back(object); // Sort on z coordinate, objects closer to camera are in beginning of list std::sort(renderables.begin(), renderables.end()); - if (to_browser(object)) { - browsers.push_back(to_browser(object)); + ScreenSpaceSkyBrowser* browser = to_browser(object); + if (browser) { + browsers[browser->identifier()] = browser; } } -void SkyBrowserModule::add3dBrowser(SceneGraphNode* node) { +bool SkyBrowserModule::browserIdExists(std::string id) { + // If the id doesn't exist, return false + if (browsers.find(id) == browsers.end()) { + return false; + } + return true; +} + +void SkyBrowserModule::createTargetBrowserPair() { + int noOfPairs = getSkyBrowsers().size() + 1; + std::string nameBrowser = "Sky Browser " + std::to_string(noOfPairs); + std::string nameTarget = "Sky Target " + std::to_string(noOfPairs); + std::string idBrowser = "SkyBrowser" + std::to_string(noOfPairs); + std::string idTarget = "SkyTarget" + std::to_string(noOfPairs); + glm::vec3 positionBrowser = { -1.0f, -0.5f, -2.1f }; + std::string guiPath = "/SkyBrowser"; + + const std::string browser = "{" + "Identifier = '" + idBrowser + "'," + "Type = 'ScreenSpaceSkyBrowser'," + "Name = '" + nameBrowser + "'," + "Url = 'http://localhost:8000/'," + "FaceCamera = false," + "TargetID = '" + idTarget + "'," + "CartesianPosition = " + ghoul::to_string(positionBrowser) + "," + "}"; + const std::string target = "{" + "Identifier = '" + idTarget + "'," + "Type = 'ScreenSpaceSkyTarget'," + "Name = '" + nameTarget + "'," + "FaceCamera = false," + "BrowserID = '" + idBrowser + "'," + "}"; + + openspace::global::scriptEngine->queueScript( + "openspace.addScreenSpaceRenderable(" + browser + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); + + openspace::global::scriptEngine->queueScript( + "openspace.addScreenSpaceRenderable(" + target + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); +} + +void SkyBrowserModule::removeTargetBrowserPair(std::string& browserId) { + if (!browserIdExists(browserId)) return; + + ScreenSpaceSkyBrowser* browser = browsers[browserId]; + + // Find corresponding target + std::string targetId{ "" }; + bool hasTarget = browser->getSkyTarget(); + if (hasTarget) { + std::string targetId = browser->getSkyTarget()->identifier(); + + openspace::global::scriptEngine->queueScript( + "openspace.removeScreenSpaceRenderable('" + targetId + "');", + scripting::ScriptEngine::RemoteScripting::Yes + ); + } + // Remove pointer to the renderable from browsers vector + browsers.erase(browserId); + + // Remove pointer to the renderable from screenspace renderable vector + renderables.erase(std::remove_if(std::begin(renderables), std::end(renderables), + [&](ScreenSpaceRenderable* renderable) { + bool foundBrowser = renderable->identifier() == browserId; + if (hasTarget) { + bool foundTarget = renderable->identifier() == targetId; + return foundBrowser || foundTarget; + } + else { + return foundBrowser; + } + })); + // Remove from engine + openspace::global::scriptEngine->queueScript( + "openspace.removeScreenSpaceRenderable('" + browserId + "');", + scripting::ScriptEngine::RemoteScripting::Yes + ); + + +} + +void SkyBrowserModule::create3dBrowser(ImageData& image) { + std::string id = "SkyBrowser3d" + std::to_string(browsers3d.size()+1); + glm::dvec3 position = image.position3d * distanceconstants::Parsec; + std::string translation = ghoul::to_string(position); + std::string guiPath = "/SkyBrowser"; + + // Calculate the size of the plane with trigonometry + // Calculate in equatorial coordinate system since the FOV is from Earth + // /| + // /_| Adjacent is the horizontal line, opposite the vertical + // \ | Calculate for half the triangle first, then multiply with 2 + // \| + glm::dvec3 j2000 = skybrowser::galacticCartesianToJ2000Cartesian(position); + double adjacent = glm::length(j2000); + double opposite = 2 * adjacent * glm::tan(glm::radians(image.fov * 0.5)); + + // Calculate rotation to make the plane face the solar system barycenter + glm::dvec3 normal = glm::normalize(-position); + glm::dvec3 newRight = glm::normalize( + glm::cross(glm::dvec3(0.0, 0.0, 1.0), normal) + ); + glm::dvec3 newUp = glm::cross(normal, newRight); + + glm::dmat3 originOrientedRotation = glm::dmat3(1.0); + originOrientedRotation[0] = newRight; + originOrientedRotation[1] = newUp; + originOrientedRotation[2] = normal; + + + const std::string browser = "{" + "Identifier = '" + id + "'," + "Parent = 'SolarSystemBarycenter'," + "Renderable = {" + "Type = 'RenderableSkyBrowser'," + "Size = " + std::to_string(opposite) + "," + "Origin = 'Center'," + "Billboard = false," + "Url = 'http://localhost:8000'" + "}," + "Transform = {" + "Translation = {" + "Type = 'StaticTranslation'," + "Position = " + translation + "" + "}," + "Rotation = {" + "Type = 'StaticRotation'," + "Rotation = " + ghoul::to_string(originOrientedRotation) + "" + "}" + "}," + "GUI = {" + "Name = '" + image.name + "'," + "Path = '" + guiPath + "'" + "}" + "}"; + LINFO(browser); + openspace::global::scriptEngine->queueScript( + "openspace.addSceneGraphNode(" + browser + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); +} + +void SkyBrowserModule::add3dBrowser(RenderableSkyBrowser* node) { browsers3d.push_back(node); } +void SkyBrowserModule::remove3dBrowser(std::string& id) { + // Remove pointer to the renderable from module vector + browsers3d.erase(std::remove_if(std::begin(browsers3d), std::end(browsers3d), + [&](RenderableSkyBrowser* browser) { + return browser->identifier() == id; + })); + + openspace::global::scriptEngine->queueScript( + "openspace.removeSceneGraphNode(" + id + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); +} + ScreenSpaceSkyBrowser* SkyBrowserModule::to_browser(ScreenSpaceRenderable* ptr) { return dynamic_cast(ptr); } @@ -443,7 +636,7 @@ WWTDataHandler* SkyBrowserModule::getWWTDataHandler() { return dataHandler; } -std::vector& SkyBrowserModule::getSkyBrowsers() { +std::map& SkyBrowserModule::getSkyBrowsers() { return browsers; } @@ -491,7 +684,8 @@ bool SkyBrowserModule::fadeBrowserAndTarget(bool makeTransparent, double fadeTim opacityDelta *= -1.f; } bool finished = true; - for (ScreenSpaceSkyBrowser* browser : browsers) { + for (std::pair idAndBrowser : browsers) { + ScreenSpaceSkyBrowser* browser = idAndBrowser.second; // If there is a target, fade it as well. Otherwise, skip ScreenSpaceSkyTarget* target = browser->getSkyTarget(); bool targetFinished = true; @@ -519,16 +713,14 @@ bool SkyBrowserModule::fadeBrowserAndTarget(bool makeTransparent, double fadeTim void SkyBrowserModule::setSelectedBrowser(ScreenSpaceRenderable* ptr) { ScreenSpaceSkyBrowser* browser = to_browser(ptr) ? to_browser(ptr) : to_target(ptr)->getSkyBrowser(); - auto it = std::find(browsers.begin(), browsers.end(), browser); - // Get index - selectedBrowser = std::distance(browsers.begin(), it); + selectedBrowser = browser->identifier(); } -void SkyBrowserModule::setSelectedBrowser(int i) { - selectedBrowser = i; +void SkyBrowserModule::setSelectedBrowser(std::string id) { + selectedBrowser = id; } -int SkyBrowserModule::getSelectedBrowserIndex() { +std::string SkyBrowserModule::selectedBrowserId() { return selectedBrowser; } diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index f1a82ca656..14966237de 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -32,7 +32,7 @@ #include #include #include - +#include #include #include @@ -45,6 +45,7 @@ class RenderableSkyBrowser; class ScreenSpaceRenderable; class WWTDataHandler; class SceneGraphNode; +class ImageData; class SkyBrowserModule : public OpenSpaceModule { @@ -58,16 +59,21 @@ public: glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos); void addRenderable(ScreenSpaceRenderable* object); WWTDataHandler* getWWTDataHandler(); - std::vector& getSkyBrowsers(); + std::map& getSkyBrowsers(); void startRotation(glm::dvec2 coordsEnd); void rotateCamera(double deltaTime); bool fadeBrowserAndTarget(bool makeTransparent, double fadeTime, double deltaTime); void setSelectedBrowser(ScreenSpaceRenderable* ptr); - void setSelectedBrowser(int i); - int getSelectedBrowserIndex(); + void setSelectedBrowser(std::string id); + bool browserIdExists(std::string id); + std::string selectedBrowserId(); int loadImages(const std::string& root, const std::string& directory); - void add3dBrowser(SceneGraphNode* node); + void add3dBrowser(RenderableSkyBrowser* node); + void remove3dBrowser(std::string& id); bool cameraInSolarSystem(); + void createTargetBrowserPair(); + void removeTargetBrowserPair(std::string& browserId); + void create3dBrowser(ImageData& image); scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; @@ -82,10 +88,13 @@ protected: bool shouldInitialize; - // Renderable vector and ptr to where mouse is + // The browsers and targets std::vector renderables; - std::vector browsers; - std::vector browsers3d; + // Only the browsers + std::map browsers; + // 3D browsers + std::vector browsers3d; + // Pointer to what mouse is currently on ScreenSpaceRenderable* _mouseOnObject; // Dragging glm::vec2 startDragMousePos; @@ -106,7 +115,7 @@ protected: glm::dvec3 _coordsStartAnimation; bool isRotating = false; // For tracking the currently selected browser - int selectedBrowser{ -1 }; + std::string selectedBrowser; glm::ivec3 highlightAddition{ 35, 35, 35 }; // Mode of browsing bool _cameraInSolarSystem{ true }; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index f22f603bb1..b8f1db706b 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -39,7 +39,7 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::selectImage"); const int i = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - ScreenSpaceSkyBrowser* selectedBrowser = module->getSkyBrowsers()[module->getSelectedBrowserIndex()]; + ScreenSpaceSkyBrowser* selectedBrowser = module->getSkyBrowsers()[module->selectedBrowserId()]; if (selectedBrowser) { ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i]; @@ -104,12 +104,10 @@ namespace openspace::skybrowser::luascriptfunctions { int lockTarget(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::lockTarget"); - const int i = ghoul::lua::value(L, 1); + const std::string id = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - std::vector browsers = module->getSkyBrowsers(); - ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); - if (i < browsers.size()) { - ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); + if (module->browserIdExists(id)) { + ScreenSpaceSkyTarget* target = module->getSkyBrowsers()[id]->getSkyTarget(); if (target) { target->lock(); } @@ -119,11 +117,10 @@ namespace openspace::skybrowser::luascriptfunctions { int unlockTarget(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::unlockTarget"); - const int i = ghoul::lua::value(L, 1); + const std::string id = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - std::vector browsers = module->getSkyBrowsers(); - if (i < browsers.size()) { - ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); + if (module->browserIdExists(id)) { + ScreenSpaceSkyTarget* target = module->getSkyBrowsers()[id]->getSkyTarget(); if (target) { target->unlock(); } @@ -138,7 +135,8 @@ namespace openspace::skybrowser::luascriptfunctions { // Load the collections here because here we know that the browser can execute javascript std::string root = "https://raw.githubusercontent.com/WorldWideTelescope/wwt-web-client/master/assets/webclient-explore-root.wtml"; - for (ScreenSpaceSkyBrowser* browser : module->getSkyBrowsers()) { + for (std::pair pair : module->getSkyBrowsers()) { + ScreenSpaceSkyBrowser* browser = pair.second; if (!browser->hasLoadedCollections()) { browser->sendMessageToWWT(wwtmessage::loadCollection(root)); browser->setHasLoadedCollections(true); @@ -244,7 +242,7 @@ 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()); + ghoul::lua::push(L, "selectedBrowserId", module->selectedBrowserId()); lua_settable(L, -3); ghoul::lua::push(L, "cameraInSolarSystem", module->cameraInSolarSystem()); lua_settable(L, -3); @@ -252,9 +250,11 @@ namespace openspace::skybrowser::luascriptfunctions { lua_settable(L, -3); // Pass data for all the browsers and the corresponding targets - std::vector browsers = module->getSkyBrowsers(); + std::map browsers = module->getSkyBrowsers(); - for (ScreenSpaceSkyBrowser* browser : browsers) { + for (std::pair pair : browsers) { + ScreenSpaceSkyBrowser* browser = pair.second; + std::string id = pair.first; // Only add browsers that have an initialized target ScreenSpaceSkyTarget* target = browser->getSkyTarget(); if (target) { @@ -269,6 +269,10 @@ namespace openspace::skybrowser::luascriptfunctions { index++; lua_newtable(L); // Push ("Key", value) + ghoul::lua::push(L, "id", id); + lua_settable(L, -3); + ghoul::lua::push(L, "name", browser->guiName()); + lua_settable(L, -3); ghoul::lua::push(L, "FOV", browser->fieldOfView()); lua_settable(L, -3); ghoul::lua::push(L, "cartesianDirection", celestialCartVec); @@ -290,25 +294,59 @@ namespace openspace::skybrowser::luascriptfunctions { } int adjustCamera(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::adjustCamera"); - const int i = ghoul::lua::value(L, 1); + const std::string id = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - if (module->getSkyBrowsers().size() > i) { - module->startRotation(module->getSkyBrowsers()[i]->getSkyTarget()->getTargetDirectionCelestial()); + if (module->browserIdExists(id)) { + ScreenSpaceSkyTarget* target = module->getSkyBrowsers()[id]->getSkyTarget(); + if (target) { + module->startRotation(target->getTargetDirectionCelestial()); + } } return 0; } + int setOpacityOfImageLayer(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 3, "lua::setOpacityOfImageLayer"); + const std::string browserId = ghoul::lua::value(L, 1); + const int i = ghoul::lua::value(L, 2); + double opacity = ghoul::lua::value(L, 3); + SkyBrowserModule* module = global::moduleEngine->module(); + + if (module->browserIdExists(browserId)) { + ImageData& image = module->getWWTDataHandler()->getLoadedImages()[i]; + ghoul::Dictionary message = wwtmessage::setLayerOpacity(image, opacity); + module->getSkyBrowsers()[browserId]->sendMessageToWWT(message); + } + return 0; + } int setSelectedBrowser(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser"); - const int i = ghoul::lua::value(L, 1); + const std::string id = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - if (module->getSkyBrowsers().size() < i) { - module->setSelectedBrowser(i); + if (module->browserIdExists(id)) { + module->setSelectedBrowser(id); } return 0; } + int createTargetBrowserPair(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::createTargetBrowserPair"); + SkyBrowserModule* module = global::moduleEngine->module(); + module->createTargetBrowserPair(); + + return 0; + } + + int removeTargetBrowserPair(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::removeTargetBrowserPair"); + std::string id = ghoul::lua::value(L, 1); + SkyBrowserModule* module = global::moduleEngine->module(); + module->removeTargetBrowserPair(id); + + return 0; + } + int create3dSkyBrowser(lua_State* L) { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::create3dSkyBrowser"); // Image index to place in 3D @@ -318,64 +356,7 @@ namespace openspace::skybrowser::luascriptfunctions { // If the image has a 3D position, add it to the scene graph if (image.has3dCoords) { - std::string id = "SkyBrowser" + std::to_string(i); - glm::dvec3 position = image.position3d * distanceconstants::Parsec; - std::string translation = ghoul::to_string(position); - std::string guiPath = "/SkyBrowser"; - - // Calculate the size of the plane with trigonometry - // Calculate in equatorial coordinate system since the FOV is from Earth - // /| - // /_| Adjacent is the horizontal line, opposite the vertical - // \ | Calculate for half the triangle first, then multiply with 2 - // \| - glm::dvec3 j2000 = skybrowser::galacticCartesianToJ2000Cartesian(position); - double adjacent = glm::length(j2000); - double opposite = 2 * adjacent * glm::tan(glm::radians(image.fov * 0.5)); - - // Calculate rotation to make the plane face the solar system barycenter - glm::dvec3 normal = glm::normalize(-position); - glm::dvec3 newRight = glm::normalize( - glm::cross(glm::dvec3(0.0, 0.0, 1.0), normal) - ); - glm::dvec3 newUp = glm::cross(normal, newRight); - - glm::dmat3 originOrientedRotation = glm::dmat3(1.0); - originOrientedRotation[0] = newRight; - originOrientedRotation[1] = newUp; - originOrientedRotation[2] = normal; - - - const std::string browser = "{" - "Identifier = '" + id + "'," - "Parent = 'SolarSystemBarycenter'," - "Renderable = {" - "Type = 'RenderableSkyBrowser'," - "Size = " + std::to_string(opposite) +"," - "Origin = 'Center'," - "Billboard = false," - "Url = 'http://localhost:8000'" - "}," - "Transform = {" - "Translation = {" - "Type = 'StaticTranslation'," - "Position = " + translation + "" - "}," - "Rotation = {" - "Type = 'StaticRotation'," - "Rotation = " + ghoul::to_string(originOrientedRotation) + "" - "}" - "}," - "GUI = {" - "Name = '" + image.name + "'," - "Path = '" + guiPath + "'" - "}" - "}"; - LINFO(browser); - openspace::global::scriptEngine->queueScript( - "openspace.addSceneGraphNode(" + browser + ");", - scripting::ScriptEngine::RemoteScripting::Yes - ); + module->create3dBrowser(image); } else { LINFO("Image has no 3D coordinate!"); @@ -383,6 +364,16 @@ namespace openspace::skybrowser::luascriptfunctions { return 0; } + + int remove3dSkyBrowser(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::remove3dSkyBrowser"); + // Image index to place in 3D + std::string id = ghoul::lua::value(L, 1); + SkyBrowserModule* module = global::moduleEngine->module(); + module->remove3dBrowser(id); + + return 0; + } } diff --git a/modules/skybrowser/src/renderableskybrowser.cpp b/modules/skybrowser/src/renderableskybrowser.cpp index 82b73a742e..39a51878e3 100644 --- a/modules/skybrowser/src/renderableskybrowser.cpp +++ b/modules/skybrowser/src/renderableskybrowser.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -117,6 +118,9 @@ namespace openspace { _browserInstance->initialize(); _browserInstance->loadUrl(_url); _browserInstance->reshape(_dimensions.value()); + // Add pointer to module + SkyBrowserModule* module = global::moduleEngine->module(); + module->add3dBrowser(this); } void RenderableSkyBrowser::deinitializeGL() { diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 62520f00d9..8d2ec66c37 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -139,6 +139,15 @@ namespace openspace { }); } + ScreenSpaceSkyBrowser::~ScreenSpaceSkyBrowser() { + // Set flag to false so the thread can exit + _camIsSyncedWWT = false; + if (_threadWWTMessages.joinable()) { + _threadWWTMessages.join(); + LINFO("Joined thread"); + } + } + bool ScreenSpaceSkyBrowser::initializeGL() { global::moduleEngine->module()->addRenderable(this);