From 6cf7dd8d45bfd6ac0016c4f9782e4e19fe2599d4 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 26 May 2021 16:23:49 +0200 Subject: [PATCH] Load, connect and set up connection to WWT app properly with the help of OpenSpace Lua api --- data/assets/skyBrowser.asset | 15 ---- data/assets/skyBrowserTargetPair.asset | 42 +++++++++ data/assets/skyTarget.asset | 13 --- .../include/screenspaceskybrowser.h | 2 + .../skybrowser/include/screenspaceskytarget.h | 4 +- modules/skybrowser/skybrowsermodule.cpp | 88 +++++++++++++++---- modules/skybrowser/skybrowsermodule.h | 5 +- modules/skybrowser/skybrowsermodule_lua.inl | 75 +++++++++++++++- .../skybrowser/src/screenspaceskybrowser.cpp | 36 ++++---- .../skybrowser/src/screenspaceskytarget.cpp | 11 +-- 10 files changed, 212 insertions(+), 79 deletions(-) delete mode 100644 data/assets/skyBrowser.asset create mode 100644 data/assets/skyBrowserTargetPair.asset delete mode 100644 data/assets/skyTarget.asset diff --git a/data/assets/skyBrowser.asset b/data/assets/skyBrowser.asset deleted file mode 100644 index 93315772fb..0000000000 --- a/data/assets/skyBrowser.asset +++ /dev/null @@ -1,15 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') - - local spec = { - Type = "ScreenSpaceSkyBrowser", - Identifier = "SkyBrowser1", - Name = "SkyBrowser", - Url = "http://localhost:8000/", - FaceCamera = false, - TargetID = "SkyTarget1", - CartesianPosition = {-1.0, -0.5, -2.1}, - UseRadiusAzimuthElevation = false, - RadiusAzimuthElevation = {1.0, 0.0, 0.0}, -- use for dome - }; - -assetHelper.registerScreenSpaceRenderables(asset, { spec }) diff --git a/data/assets/skyBrowserTargetPair.asset b/data/assets/skyBrowserTargetPair.asset new file mode 100644 index 0000000000..5bc6656e43 --- /dev/null +++ b/data/assets/skyBrowserTargetPair.asset @@ -0,0 +1,42 @@ +local assetHelper = asset.require('util/asset_helper') + +local targetId= "SkyTarget0" +local browserId = "SkyBrowser0" + +local browser = { + Type = "ScreenSpaceSkyBrowser", + Identifier = browserId, + Name = "SkyBrowser", + Url = "http://localhost:8000/", + FaceCamera = false, + TargetID = targetId, + CartesianPosition = {-1.0, -0.5, -2.1}, + UseRadiusAzimuthElevation = false, + RadiusAzimuthElevation = {1.0, 0.0, 0.0}, -- use for dome +}; + +local target = { + Type = "ScreenSpaceSkyTarget", + Identifier = targetId, + Name = "Target", + FaceCamera = false, + BrowserID = browserId, + UseRadiusAzimuthElevation = false, + RadiusAzimuthElevation = {1.0, 0.0, 0.0}, -- use for dome +}; + +asset.onInitialize(function () + openspace.addScreenSpaceRenderable(browser) + openspace.addScreenSpaceRenderable(target) + openspace.skybrowser.addToSkyBrowserModule(browserId) + openspace.skybrowser.addToSkyBrowserModule(targetId) + openspace.skybrowser.connectBrowserTarget(browserId) + openspace.skybrowser.connectBrowserTarget(targetId) +end) + +asset.onDeinitialize(function () + openspace.removeScreenSpaceRenderable(browserId) + openspace.removeScreenSpaceRenderable(targetId) +end) + +asset.export("browser", {browser, target}) diff --git a/data/assets/skyTarget.asset b/data/assets/skyTarget.asset deleted file mode 100644 index f758f2cbaf..0000000000 --- a/data/assets/skyTarget.asset +++ /dev/null @@ -1,13 +0,0 @@ -local assetHelper = asset.require('util/asset_helper') - - local spec = { - Type = "ScreenSpaceSkyTarget", - Identifier = "SkyTarget1", - Name = "Target", - FaceCamera = false, - BrowserID = "SkyBrowser1", - UseRadiusAzimuthElevation = false, - RadiusAzimuthElevation = {1.0, 0.0, 0.0}, -- use for dome - }; - -assetHelper.registerScreenSpaceRenderables(asset, { spec }) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index d0f568cae4..09c2158ec6 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -19,6 +19,8 @@ namespace openspace { bool initializeGL() override; bool deinitializeGL() override; bool setConnectedTarget(); + void initializeBrowser(); + void setIdInBrowser(); // Communication with the webpage and WWT void executeJavascript(std::string script) const; diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index 2b26b667d5..6edb7af03d 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -27,6 +27,8 @@ namespace openspace { void render() override; void createShaders(); + void initializeWithBrowser(); + void setBrowser(ScreenSpaceSkyBrowser* browser); ScreenSpaceSkyBrowser* getSkyBrowser(); @@ -35,7 +37,7 @@ namespace openspace { glm::dvec3 getTargetDirectionGalactic(); glm::dvec2 getScreenSpacePosition(); - void setConnectedBrowser(); + bool setConnectedBrowser(); void setBorderColor(glm::ivec3 color); glm::ivec3 getColor(); properties::FloatProperty& getOpacity(); diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index f089378cbe..082bf6455b 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -193,6 +193,38 @@ 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" + }, + { + "sendOutIdsToBrowsers", + &skybrowser::luascriptfunctions::sendOutIdsToBrowsers, + {}, + "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" + }, + { + "initializeBrowserAndTarget", + &skybrowser::luascriptfunctions::initializeBrowserAndTarget, + {}, + "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" + }, + { + "connectBrowserTarget", + &skybrowser::luascriptfunctions::connectBrowserTarget, + {}, + "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" + }, + { + "addToSkyBrowserModule", + &skybrowser::luascriptfunctions::addToSkyBrowserModule, + {}, + "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" }, }; @@ -206,23 +238,10 @@ SkyBrowserModule::SkyBrowserModule() , currentlyResizingBrowser(false) , currentlyDraggingObject(false) , resizeVector(0.f, 0.f) - , shouldInitialize(true) , changeViewWithinBrowser(false) { global::callback::mousePosition->emplace_back( [&](double x, double y) { - // Quick fix to make all renderables find its corresponding partner - if (shouldInitialize) { - std::for_each(renderables.begin(), renderables.end(), [&](ScreenSpaceRenderable* obj) { - if (to_target(obj)) { - to_target(obj)->setConnectedBrowser(); - } - else if (to_browser(obj)) { - to_browser(obj)->setConnectedTarget(); - } - }); - shouldInitialize = false; - } glm::vec2 pos = glm::vec2(static_cast(x), static_cast(y)); _mousePosition = getMousePositionInScreenSpaceCoords(pos); @@ -278,7 +297,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) && obj->isEnabled()); + return obj && (obj->coordIsInsideCornersScreenSpace(_mousePosition) && obj->isEnabled()); }); _mouseOnObject = currentlyOnObject != renderables.end() ? *currentlyOnObject : nullptr; @@ -327,8 +346,14 @@ SkyBrowserModule::SkyBrowserModule() if (_mouseOnObject && action == MouseAction::Press) { // Get the currently selected browser - setSelectedBrowser(_mouseOnObject); + if (to_browser(_mouseOnObject)) { + setSelectedBrowser(to_browser(_mouseOnObject)); + } + else if (to_target(_mouseOnObject) && + to_target(_mouseOnObject)->getSkyBrowser()) { + setSelectedBrowser(to_target(_mouseOnObject)->getSkyBrowser()); + } if (button == MouseButton::Left) { isRotating = false; @@ -513,6 +538,26 @@ void SkyBrowserModule::createTargetBrowserPair() { "openspace.addScreenSpaceRenderable(" + target + ");", scripting::ScriptEngine::RemoteScripting::Yes ); + + openspace::global::scriptEngine->queueScript( + "openspace.skybrowser.addToSkyBrowserModule(" + idTarget + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); + + openspace::global::scriptEngine->queueScript( + "openspace.skybrowser.addToSkyBrowserModule(" + idBrowser + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); + + openspace::global::scriptEngine->queueScript( + "openspace.skybrowser.connectBrowserTarget(" + idBrowser + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); + + openspace::global::scriptEngine->queueScript( + "openspace.skybrowser.connectBrowserTarget(" + idTarget + ");", + scripting::ScriptEngine::RemoteScripting::Yes + ); } void SkyBrowserModule::removeTargetBrowserPair(std::string& browserId) { @@ -524,7 +569,7 @@ void SkyBrowserModule::removeTargetBrowserPair(std::string& browserId) { std::string targetId{ "" }; bool hasTarget = browser->getSkyTarget(); if (hasTarget) { - std::string targetId = browser->getSkyTarget()->identifier(); + targetId = browser->getSkyTarget()->identifier(); openspace::global::scriptEngine->queueScript( "openspace.removeScreenSpaceRenderable('" + targetId + "');", @@ -648,6 +693,10 @@ std::map& SkyBrowserModule::getSkyBrowsers( return browsers; } +std::vector& SkyBrowserModule::getBrowsersAndTargets() { + return renderables; +} + void SkyBrowserModule::startRotation(glm::dvec2 coordsEnd) { // Save coordinates to rotate to in galactic world coordinates @@ -719,9 +768,10 @@ bool SkyBrowserModule::fadeBrowserAndTarget(bool makeTransparent, double fadeTim return finished; } -void SkyBrowserModule::setSelectedBrowser(ScreenSpaceRenderable* ptr) { - ScreenSpaceSkyBrowser* browser = to_browser(ptr) ? to_browser(ptr) : to_target(ptr)->getSkyBrowser(); - selectedBrowser = browser->identifier(); +void SkyBrowserModule::setSelectedBrowser(ScreenSpaceSkyBrowser* browser) { + if (browser) { + selectedBrowser = browser->identifier(); + } } void SkyBrowserModule::setSelectedBrowser(std::string id) { diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 14966237de..8d6f8261c6 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -60,10 +60,11 @@ public: void addRenderable(ScreenSpaceRenderable* object); WWTDataHandler* getWWTDataHandler(); std::map& getSkyBrowsers(); + std::vector& getBrowsersAndTargets(); void startRotation(glm::dvec2 coordsEnd); void rotateCamera(double deltaTime); bool fadeBrowserAndTarget(bool makeTransparent, double fadeTime, double deltaTime); - void setSelectedBrowser(ScreenSpaceRenderable* ptr); + void setSelectedBrowser(ScreenSpaceSkyBrowser* ptr); void setSelectedBrowser(std::string id); bool browserIdExists(std::string id); std::string selectedBrowserId(); @@ -86,8 +87,6 @@ protected: ScreenSpaceSkyBrowser* to_browser(ScreenSpaceRenderable* ptr); ScreenSpaceSkyTarget* to_target(ScreenSpaceRenderable* ptr); - bool shouldInitialize; - // The browsers and targets std::vector renderables; // Only the browsers diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 2376dcbdf5..64874570e6 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -130,13 +130,16 @@ namespace openspace::skybrowser::luascriptfunctions { int loadImagesToWWT(lua_State* L) { // Load images from url - ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::loadImagesToWWT"); + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::loadImagesToWWT"); + const std::string id = ghoul::lua::value(L, 1); + LINFO("Connection established to WorldWide Telescope application in " + id); + LINFO("Loading image collections to " + id); SkyBrowserModule* module = global::moduleEngine->module(); // 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 (std::pair pair : module->getSkyBrowsers()) { - ScreenSpaceSkyBrowser* browser = pair.second; + if (module->browserIdExists(id)) { + ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[id]; if (!browser->hasLoadedCollections()) { browser->sendMessageToWWT(wwtmessage::loadCollection(root)); browser->setHasLoadedCollections(true); @@ -146,6 +149,72 @@ namespace openspace::skybrowser::luascriptfunctions { return 0; } + int sendOutIdsToBrowsers(lua_State* L) { + // This is called when the sky_browser website is connected to OpenSpace + ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::sendOutIdsToBrowsers"); + + // Send out ID's to the browsers + SkyBrowserModule* module = global::moduleEngine->module(); + std::map browsers = module->getSkyBrowsers(); + for (std::pair pair : browsers) { + pair.second->setIdInBrowser(); + } + + return 0; + } + + int connectBrowserTarget(lua_State* L) { + // In order to connect, the target and browsers must have been loaded into the + // module. This is to ensure that the renderables have been found + + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::connectBrowserTarget"); + const std::string id = ghoul::lua::value(L, 1); + + // Find the screenspace renderable that has the id + SkyBrowserModule* module = global::moduleEngine->module(); + std::vector renderables = module->getBrowsersAndTargets(); + auto found = std::find_if(std::begin(renderables), std::end(renderables), + [&](ScreenSpaceRenderable* renderable) { + return renderable && id == renderable->identifier(); + }); + if (dynamic_cast(*found)) { + ScreenSpaceSkyBrowser* browser = dynamic_cast(*found); + browser->setConnectedTarget(); + } + else if (dynamic_cast(*found)) { + ScreenSpaceSkyTarget* target = dynamic_cast(*found); + target->setConnectedBrowser(); + } + return 0; + } + + int initializeBrowserAndTarget(lua_State* L) { + // Initialize browser with ID and its corresponding target + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::initializeBrowserAndTarget"); + const std::string id = ghoul::lua::value(L, 1); + SkyBrowserModule* module = global::moduleEngine->module(); + if (module->browserIdExists(id)) { + module->getSkyBrowsers()[id]->initializeBrowser(); + ScreenSpaceSkyTarget* target = module->getSkyBrowsers()[id]->getSkyTarget(); + if (target) { + target->initializeWithBrowser(); + } + } + + return 0; + } + + int addToSkyBrowserModule(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::addToSkyBrowserModule"); + const std::string id = ghoul::lua::value(L, 1); + LINFO("Add to sky browser module id " + id); + ScreenSpaceRenderable* object = global::renderEngine->screenSpaceRenderable(id); + SkyBrowserModule* module = global::moduleEngine->module(); + module->addRenderable(object); + + return 0; + } + int getListOfImages(lua_State* L) { // Send image list to GUI ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::getListOfImages"); diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 84dbe36ae7..4a20c26d6a 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -93,10 +93,7 @@ namespace openspace { const Parameters p = codegen::bake(dictionary); _browserDimensions = p.browserDimensions.value_or(_browserDimensions); _browserDimensions.onChange([&]() { - if (!_skyTarget) { - setConnectedTarget(); - } - else { + if(_skyTarget) { glm::vec2 dim = getBrowserPixelDimensions(); _skyTarget->setDimensions(dim); } @@ -149,18 +146,23 @@ namespace openspace { } bool ScreenSpaceSkyBrowser::initializeGL() { - - global::moduleEngine->module()->addRenderable(this); - setConnectedTarget(); - if (_skyTarget) { - _skyTarget->setDimensions(getBrowserPixelDimensions()); - } - - WWTfollowCamera(); - return ScreenSpaceBrowser::initializeGL(); } + void ScreenSpaceSkyBrowser::setIdInBrowser() { + // Send ID to it's browser + executeJavascript("setId('" + identifier() + "')"); + } + + void ScreenSpaceSkyBrowser::initializeBrowser() { + // Set border color + setBorderColor(_borderColor.value()); + // Connect to target + setConnectedTarget(); + // Track target + WWTfollowCamera(); + } + bool ScreenSpaceSkyBrowser::deinitializeGL() { // Set flag to false so the thread can exit _camIsSyncedWWT = false; @@ -172,14 +174,8 @@ namespace openspace { } bool ScreenSpaceSkyBrowser::setConnectedTarget() { - setBorderColor(_borderColor.value()); _skyTarget = dynamic_cast(global::renderEngine->screenSpaceRenderable(_skyTargetID.value())); - if (_skyTarget) { - _skyTarget->setBorderColor(_borderColor.value()); - _skyTarget->updateFOV(_vfieldOfView.value()); - _skyTarget->setDimensions(getBrowserPixelDimensions()); - } - return _skyTarget != nullptr; + return _skyTarget; } ScreenSpaceSkyTarget* ScreenSpaceSkyBrowser::getSkyTarget() { diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index 40889faaf1..e5457045a4 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -79,6 +79,7 @@ namespace openspace { , _skyBrowserID(BrowserIDInfo) , _showCrosshairThreshold(CrosshairThresholdInfo, 2.f, 1.f, 70.f) , _borderColor(220, 220, 220) + , _skyBrowser(nullptr) { // Handle target dimension property const Parameters p = codegen::bake(dictionary); @@ -129,10 +130,13 @@ namespace openspace { } } - void ScreenSpaceSkyTarget::setConnectedBrowser() { + bool ScreenSpaceSkyTarget::setConnectedBrowser() { _skyBrowser = dynamic_cast(global::renderEngine->screenSpaceRenderable(_skyBrowserID.value())); + return _skyBrowser; + } + + void ScreenSpaceSkyTarget::initializeWithBrowser() { if (_skyBrowser) { - _skyBrowser->setBorderColor(_skyBrowser->getColor()); _borderColor = _skyBrowser->getColor(); updateFOV(_skyBrowser->_vfieldOfView.value()); _targetDimensions = _skyBrowser->getBrowserPixelDimensions(); @@ -144,9 +148,6 @@ namespace openspace { } bool ScreenSpaceSkyTarget::initializeGL() { - global::moduleEngine->module()->addRenderable(this); - - setConnectedBrowser(); glGenVertexArrays(1, &_vertexArray); glGenBuffers(1, &_vertexBuffer);