mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-25 22:39:04 -06:00
Load, connect and set up connection to WWT app properly with the help of OpenSpace Lua api
This commit is contained in:
@@ -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 })
|
||||
42
data/assets/skyBrowserTargetPair.asset
Normal file
42
data/assets/skyBrowserTargetPair.asset
Normal 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})
|
||||
@@ -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 })
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user