mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-03-13 17:09:05 -05:00
Make target move to look at image coordinate when clicked in GUI
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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<std::string>& getAllImageCollectionUrls() const;
|
||||
const std::vector<ImageCollection>& getAllImageCollectionUrls() const;
|
||||
const std::vector<ImageData>& getLoadedImages() const;
|
||||
|
||||
private:
|
||||
@@ -43,7 +49,7 @@ namespace openspace {
|
||||
tinyxml2::XMLElement* getChildNode(tinyxml2::XMLElement* node, std::string name);
|
||||
|
||||
std::vector<ImageData> images;
|
||||
std::vector<std::string> imageUrls;
|
||||
std::vector<ImageCollection> imageUrls;
|
||||
std::vector<tinyxml2::XMLDocument*> xmls;
|
||||
|
||||
};
|
||||
|
||||
@@ -20,92 +20,112 @@
|
||||
#include <thread>
|
||||
#include <glm/gtx/string_cast.hpp>
|
||||
#include <openspace/util/coordinateconversion.h>
|
||||
|
||||
#include <glm/gtx/vector_angle.hpp>
|
||||
|
||||
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<int>(L, 1);
|
||||
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("SkyBrowser1"));
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
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<int>(L, 1);
|
||||
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("SkyBrowser1"));
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i];
|
||||
// Load image collection, if it isn't loaded already
|
||||
const std::vector<ImageCollection>& 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<SkyBrowserModule>();
|
||||
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<SkyBrowserModule>();
|
||||
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<SkyBrowserModule>();
|
||||
//std::string root = "https://raw.githubusercontent.com/WorldWideTelescope/wwt-web-client/master/assets/webclient-explore-root.wtml";
|
||||
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("SkyBrowser1"));
|
||||
//const std::vector<std::string>& 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<SkyBrowserModule>();
|
||||
// If no data has been loaded yet, load it!
|
||||
if (module->getWWTDataHandler()->getLoadedImages().size() == 0) {
|
||||
moveBrowser(L);
|
||||
}
|
||||
|
||||
const std::vector<ImageData>& 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<SkyBrowserModule>();
|
||||
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<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("SkyBrowser1"));
|
||||
//const std::vector<std::string>& 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<SkyBrowserModule>();
|
||||
// If no data has been loaded yet, load it!
|
||||
if (module->getWWTDataHandler()->getLoadedImages().size() == 0) {
|
||||
moveBrowser(L);
|
||||
//followCamera(L);
|
||||
}
|
||||
|
||||
const std::vector<ImageData>& 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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<std::string>& WWTDataHandler::getAllImageCollectionUrls() const {
|
||||
const std::vector<ImageCollection>& WWTDataHandler::getAllImageCollectionUrls() const {
|
||||
return imageUrls;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user