Load, connect and set up connection to WWT app properly with the help of OpenSpace Lua api

This commit is contained in:
Ylva Selling
2021-05-26 16:23:49 +02:00
parent eeb1ac5737
commit 6cf7dd8d45
10 changed files with 212 additions and 79 deletions

View File

@@ -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 })

View File

@@ -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})

View File

@@ -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 })

View File

@@ -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;

View File

@@ -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();

View File

@@ -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<float>(x), static_cast<float>(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<std::string, ScreenSpaceSkyBrowser*>& SkyBrowserModule::getSkyBrowsers(
return browsers;
}
std::vector<ScreenSpaceRenderable*>& 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) {

View File

@@ -60,10 +60,11 @@ public:
void addRenderable(ScreenSpaceRenderable* object);
WWTDataHandler* getWWTDataHandler();
std::map<std::string, ScreenSpaceSkyBrowser*>& getSkyBrowsers();
std::vector<ScreenSpaceRenderable*>& 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<ScreenSpaceRenderable*> renderables;
// Only the browsers

View File

@@ -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<std::string>(L, 1);
LINFO("Connection established to WorldWide Telescope application in " + id);
LINFO("Loading image collections to " + id);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
// 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<std::string,ScreenSpaceSkyBrowser*> 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<SkyBrowserModule>();
std::map<std::string, ScreenSpaceSkyBrowser*> browsers = module->getSkyBrowsers();
for (std::pair<std::string, ScreenSpaceSkyBrowser*> 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<std::string>(L, 1);
// Find the screenspace renderable that has the id
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
std::vector<ScreenSpaceRenderable*> renderables = module->getBrowsersAndTargets();
auto found = std::find_if(std::begin(renderables), std::end(renderables),
[&](ScreenSpaceRenderable* renderable) {
return renderable && id == renderable->identifier();
});
if (dynamic_cast<ScreenSpaceSkyBrowser*>(*found)) {
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(*found);
browser->setConnectedTarget();
}
else if (dynamic_cast<ScreenSpaceSkyTarget*>(*found)) {
ScreenSpaceSkyTarget* target = dynamic_cast<ScreenSpaceSkyTarget*>(*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<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
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<std::string>(L, 1);
LINFO("Add to sky browser module id " + id);
ScreenSpaceRenderable* object = global::renderEngine->screenSpaceRenderable(id);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->addRenderable(object);
return 0;
}
int getListOfImages(lua_State* L) {
// Send image list to GUI
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::getListOfImages");

View File

@@ -93,10 +93,7 @@ namespace openspace {
const Parameters p = codegen::bake<Parameters>(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<SkyBrowserModule>()->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<ScreenSpaceSkyTarget*>(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() {

View File

@@ -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<Parameters>(dictionary);
@@ -129,10 +130,13 @@ namespace openspace {
}
}
void ScreenSpaceSkyTarget::setConnectedBrowser() {
bool ScreenSpaceSkyTarget::setConnectedBrowser() {
_skyBrowser = dynamic_cast<ScreenSpaceSkyBrowser*>(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<SkyBrowserModule>()->addRenderable(this);
setConnectedBrowser();
glGenVertexArrays(1, &_vertexArray);
glGenBuffers(1, &_vertexBuffer);