diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index d2a2545be2..63102a70bf 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -44,7 +44,9 @@ namespace openspace { void setPosition(glm::vec3 pos); void translate(glm::vec2 translation, glm::vec2 position); - + // Only works for galactic coords outside of the solar system + void lookAtGalacticCoord(glm::dvec3 galacticCoord); + glm::vec2 getScreenSpaceDimensions(); glm::vec2 getUpperRightCornerScreenSpace(); glm::vec2 getLowerLeftCornerScreenSpace(); diff --git a/modules/skybrowser/include/wwtdatahandler.h b/modules/skybrowser/include/wwtdatahandler.h index 4d292580fd..3e94ee7439 100644 --- a/modules/skybrowser/include/wwtdatahandler.h +++ b/modules/skybrowser/include/wwtdatahandler.h @@ -17,6 +17,12 @@ namespace openspace { bool hasCoords; }; + struct ImageCollection { + std::string name; + std::string url; + bool loaded = false; + }; + class WWTDataHandler { public: @@ -29,7 +35,7 @@ namespace openspace { void loadWTMLCollectionsFromDirectory(std::string directory); int loadAllImagesFromXMLs(); - const std::vector& getAllImageCollectionUrls() const; + const std::vector& getAllImageCollectionUrls() const; const std::vector& getLoadedImages() const; private: @@ -43,7 +49,7 @@ namespace openspace { tinyxml2::XMLElement* getChildNode(tinyxml2::XMLElement* node, std::string name); std::vector images; - std::vector imageUrls; + std::vector imageUrls; std::vector xmls; }; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 6f612f24e1..9d5eae5b8c 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -20,92 +20,112 @@ #include #include #include - +#include namespace { - constexpr const char _loggerCat[] = "SkyBrowserModule"; + constexpr const char _loggerCat[] = "SkyBrowserModule"; } // namespace namespace openspace::skybrowser::luascriptfunctions { - int loadImgCollection(lua_State* L) { - // Load image - ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::loadCollection"); - const int i = ghoul::lua::value(L, 1); - - ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("SkyBrowser1")); - SkyBrowserModule* module = global::moduleEngine->module(); - const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i]; - browser->sendMessageToWWT(browser->createMessageForSettingForegroundWWT(resultImage.name)); - LINFO("Loading image " + resultImage.name); - - browser->sendMessageToWWT(browser->createMessageForSettingForegroundOpacityWWT(100)); - return 1; - } - - int followCamera(lua_State* L) { - // Load images from url - ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::followCamera"); + int loadImgCollection(lua_State* L) { + // Load image + ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::loadCollection"); + const int i = ghoul::lua::value(L, 1); + + ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("SkyBrowser1")); + SkyBrowserModule* module = global::moduleEngine->module(); + const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i]; + // Load image collection, if it isn't loaded already + const std::vector& collections = module->getWWTDataHandler()->getAllImageCollectionUrls(); + auto it = std::find_if(collections.begin(), collections.end(), [&](const ImageCollection& coll) { + return coll.name == resultImage.collection; + }); + if (!it->loaded) { + browser->sendMessageToWWT(browser->createMessageForLoadingWWTImgColl(it->url)); + } + browser->sendMessageToWWT(browser->createMessageForSettingForegroundWWT(resultImage.name)); - SkyBrowserModule* module = global::moduleEngine->module(); - std::string root = "https://raw.githubusercontent.com/WorldWideTelescope/wwt-web-client/master/assets/webclient-explore-root.wtml"; + LINFO("Loading image " + resultImage.name); + // Only move camera if the image has coordinates + + if (resultImage.hasCoords) { - module->getWWTDataHandler()->loadWTMLCollectionsFromURL(root, "root"); - LINFO(std::to_string( module->getWWTDataHandler()->loadAllImagesFromXMLs())); + // The RA from WWT is in the unit hours: to convert to degrees, multiply with 360 (deg) /24 (h)=15 + glm::dvec3 imageCoordsGalactic = icrsToGalacticCartesian(resultImage.celestCoords.x * 15, resultImage.celestCoords.y, 1.0); + browser->getSkyTarget()->lookAtGalacticCoord(imageCoordsGalactic); - return 1; - } + // In WWT, VFOV = ZoomLevel * 6 + //browser->setFieldOfView(resultImage.zoomLevel * 6); + } + browser->sendMessageToWWT(browser->createMessageForSettingForegroundOpacityWWT(100)); + return 1; + } + + int followCamera(lua_State* L) { + // Load images from url + ghoul::lua::checkArgumentsAndThrow(L, 2, "lua::followCamera"); - int moveBrowser(lua_State* L) { - // Load images from local directory - ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::moveBrowser"); - SkyBrowserModule* module = global::moduleEngine->module(); - module->getWWTDataHandler()->loadWTMLCollectionsFromDirectory(absPath("${MODULE_SKYBROWSER}/WWTimagedata/")); - std::string noOfLoadedImgs = std::to_string(module->getWWTDataHandler()->loadAllImagesFromXMLs()); - LINFO("Loaded " + noOfLoadedImgs + " WorldWide Telescope images."); + //SkyBrowserModule* module = global::moduleEngine->module(); + //std::string root = "https://raw.githubusercontent.com/WorldWideTelescope/wwt-web-client/master/assets/webclient-explore-root.wtml"; - ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("SkyBrowser1")); - //const std::vector& imageUrls = module->getWWTDataHandler()->getAllImageCollectionUrls(); - //for (const std::string url : imageUrls) { - // browser->sendMessageToWWT(browser->createMessageForLoadingWWTImgColl(url)); - //} - std::string root = "https://raw.githubusercontent.com/WorldWideTelescope/wwt-web-client/master/assets/webclient-explore-root.wtml"; - browser->sendMessageToWWT(browser->createMessageForLoadingWWTImgColl(root)); - return 1; - } + //module->getWWTDataHandler()->loadWTMLCollectionsFromURL(root, "root"); + //LINFO(std::to_string( module->getWWTDataHandler()->loadAllImagesFromXMLs())); - int createBrowser(lua_State* L) { - // Send image list to GUI - ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::createBrowser"); - SkyBrowserModule* module = global::moduleEngine->module(); - // If no data has been loaded yet, load it! - if (module->getWWTDataHandler()->getLoadedImages().size() == 0) { - moveBrowser(L); - } - - const std::vector& images = module->getWWTDataHandler()->getLoadedImages(); + return 1; + } - lua_newtable(L); + int moveBrowser(lua_State* L) { + // Load images from local directory + ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::moveBrowser"); + SkyBrowserModule* module = global::moduleEngine->module(); + module->getWWTDataHandler()->loadWTMLCollectionsFromDirectory(absPath("${MODULE_SKYBROWSER}/WWTimagedata/")); + std::string noOfLoadedImgs = std::to_string(module->getWWTDataHandler()->loadAllImagesFromXMLs()); + LINFO("Loaded " + noOfLoadedImgs + " WorldWide Telescope images."); - for (int i = 0; i < images.size(); i++) { - // Push a table { image name, image url } with index : number - lua_newtable(L); - lua_pushstring(L, images[i].name.c_str()); - lua_rawseti(L, -2, 1); - lua_pushstring(L, images[i].thumbnailUrl.c_str()); - lua_rawseti(L, -2, 2); + ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("SkyBrowser1")); + //const std::vector& imageUrls = module->getWWTDataHandler()->getAllImageCollectionUrls(); + //for (const std::string url : imageUrls) { + // browser->sendMessageToWWT(browser->createMessageForLoadingWWTImgColl(url)); + //} + std::string root = "https://raw.githubusercontent.com/WorldWideTelescope/wwt-web-client/master/assets/webclient-explore-root.wtml"; + browser->sendMessageToWWT(browser->createMessageForLoadingWWTImgColl(root)); + return 1; + } - lua_rawseti(L, -2, i+1); - } - - return 1; - } - int adjustCamera(lua_State* L) { - ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::adjustCamera"); + int createBrowser(lua_State* L) { + // Send image list to GUI + ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::createBrowser"); + SkyBrowserModule* module = global::moduleEngine->module(); + // If no data has been loaded yet, load it! + if (module->getWWTDataHandler()->getLoadedImages().size() == 0) { + moveBrowser(L); + //followCamera(L); + } + + const std::vector& images = module->getWWTDataHandler()->getLoadedImages(); - return 1; - } - + lua_newtable(L); + + for (int i = 0; i < images.size(); i++) { + // Push a table { image name, image url } with index : number + lua_newtable(L); + lua_pushstring(L, images[i].name.c_str()); + lua_rawseti(L, -2, 1); + lua_pushstring(L, images[i].thumbnailUrl.c_str()); + lua_rawseti(L, -2, 2); + + lua_rawseti(L, -2, i+1); + } + + return 1; + } + int adjustCamera(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::adjustCamera"); + + return 1; + } + } diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index 09900d21d8..9b4a4cc4f9 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -294,6 +294,18 @@ namespace openspace { // Convert to celestial coordinates return convertGalacticToCelestial(targetDirection); } + + void ScreenSpaceSkyTarget::lookAtGalacticCoord(glm::dvec3 galacticCoord) { + + glm::dmat4 cameraInvRotMat = global::navigationHandler->camera()->viewRotationMatrix(); + glm::dvec3 viewDirectionLocal = cameraInvRotMat * glm::dvec4(galacticCoord, 1.f); + + glm::dvec2 angleCoordsLocal = glm::dvec2(atan(viewDirectionLocal.x / viewDirectionLocal.z), atan(viewDirectionLocal.y / viewDirectionLocal.z)); + double projPlaneDistance = -2.1f; + glm::dvec2 imageCoordsScreenSpace = glm::dvec2(projPlaneDistance * tan(angleCoordsLocal.x), projPlaneDistance * tan(angleCoordsLocal.y)); + // Translate target + translate(glm::vec2(imageCoordsScreenSpace) - getScreenSpacePosition(), getScreenSpacePosition()); + } glm::dvec2 ScreenSpaceSkyTarget::convertGalacticToCelestial(glm::dvec3 rGal) const { // Used the math from this website: https://gea.esac.esa.int/archive/documentation/GD --> diff --git a/modules/skybrowser/src/wwtdatahandler.cpp b/modules/skybrowser/src/wwtdatahandler.cpp index 01413700e7..08774747aa 100644 --- a/modules/skybrowser/src/wwtdatahandler.cpp +++ b/modules/skybrowser/src/wwtdatahandler.cpp @@ -43,8 +43,12 @@ namespace openspace { XMLElement* element = root->FirstChildElement(std::string("Folder").c_str()); // If there are no folders, or there are folder but without urls, stop recursion if (!element || (element && !element->FindAttribute("Url"))) { - - imageUrls.push_back(url); + // Save the url + std::string collectionName = root->FindAttribute("Name") ? root->FindAttribute("Name")->Value() : ""; + if (collectionName != "") { + ImageCollection newCollection{ collectionName, url }; + imageUrls.push_back(newCollection); + } xmls.push_back(doc); LINFO("Saving " + url); @@ -68,6 +72,12 @@ namespace openspace { tinyxml2::XMLDocument* doc = new tinyxml2::XMLDocument(); if (doc->LoadFile(entry.path().u8string().c_str()) == tinyxml2::XMLError::XML_SUCCESS) { + tinyxml2::XMLElement* root = doc->RootElement(); + std::string collectionName = root->FindAttribute("Name") ? root->FindAttribute("Name")->Value() : ""; + if (collectionName != "") { + ImageCollection newCollection{collectionName, entry.path().u8string()}; + imageUrls.push_back(newCollection); + } xmls.push_back(doc); } } @@ -90,7 +100,7 @@ namespace openspace { return images.size(); } - const std::vector& WWTDataHandler::getAllImageCollectionUrls() const { + const std::vector& WWTDataHandler::getAllImageCollectionUrls() const { return imageUrls; }