Add lua functions for communication with GUI: add and remove target browser pairs and 3D browsers, change opacity of layer, use ID:s for the browser

This commit is contained in:
Ylva Selling
2021-05-21 10:00:04 +02:00
parent 37c7737c55
commit ee33d1df24
6 changed files with 307 additions and 102 deletions

View File

@@ -13,7 +13,7 @@ namespace openspace {
{
public:
ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary);
virtual ~ScreenSpaceSkyBrowser() = default;
virtual ~ScreenSpaceSkyBrowser();
bool initializeGL() override;
bool deinitializeGL() override;

View File

@@ -44,7 +44,7 @@
#include <ghoul/opengl/texture.h>
#include <cmath> // For atan2
#include <glm/gtx/string_cast.hpp> // For printing glm data
#include <algorithm>
#include <fstream>
@@ -146,6 +146,22 @@ namespace openspace {
"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"
},
{
"createTargetBrowserPair",
&skybrowser::luascriptfunctions::createTargetBrowserPair,
{},
"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"
},
{
"removeTargetBrowserPair",
&skybrowser::luascriptfunctions::removeTargetBrowserPair,
{},
"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"
},
{
"create3dSkyBrowser",
&skybrowser::luascriptfunctions::create3dSkyBrowser,
@@ -153,6 +169,22 @@ 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"
},
{
"remove3dSkyBrowser",
&skybrowser::luascriptfunctions::remove3dSkyBrowser,
{},
"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"
},
{
"setOpacityOfImageLayer",
&skybrowser::luascriptfunctions::setOpacityOfImageLayer,
{},
"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"
},
};
@@ -238,7 +270,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);
return (obj->coordIsInsideCornersScreenSpace(_mousePosition) && obj->isEnabled());
});
_mouseOnObject = currentlyOnObject != renderables.end() ? *currentlyOnObject : nullptr;
@@ -355,7 +387,8 @@ SkyBrowserModule::SkyBrowserModule()
double deltaTime = global::windowDelegate->deltaTime();
// Fade out or in browser & target
for (ScreenSpaceSkyBrowser* browser : browsers) {
for (std::pair<std::string, ScreenSpaceSkyBrowser*> pair : browsers) {
ScreenSpaceSkyBrowser* browser = pair.second;
// If outside solar system and browser is visible
if (!_cameraInSolarSystem && browser->isEnabled()) {
bool fadingIsFinished = fadeBrowserAndTarget(true, fadingTime, deltaTime);
@@ -423,15 +456,175 @@ void SkyBrowserModule::addRenderable(ScreenSpaceRenderable* object) {
renderables.push_back(object);
// Sort on z coordinate, objects closer to camera are in beginning of list
std::sort(renderables.begin(), renderables.end());
if (to_browser(object)) {
browsers.push_back(to_browser(object));
ScreenSpaceSkyBrowser* browser = to_browser(object);
if (browser) {
browsers[browser->identifier()] = browser;
}
}
void SkyBrowserModule::add3dBrowser(SceneGraphNode* node) {
bool SkyBrowserModule::browserIdExists(std::string id) {
// If the id doesn't exist, return false
if (browsers.find(id) == browsers.end()) {
return false;
}
return true;
}
void SkyBrowserModule::createTargetBrowserPair() {
int noOfPairs = getSkyBrowsers().size() + 1;
std::string nameBrowser = "Sky Browser " + std::to_string(noOfPairs);
std::string nameTarget = "Sky Target " + std::to_string(noOfPairs);
std::string idBrowser = "SkyBrowser" + std::to_string(noOfPairs);
std::string idTarget = "SkyTarget" + std::to_string(noOfPairs);
glm::vec3 positionBrowser = { -1.0f, -0.5f, -2.1f };
std::string guiPath = "/SkyBrowser";
const std::string browser = "{"
"Identifier = '" + idBrowser + "',"
"Type = 'ScreenSpaceSkyBrowser',"
"Name = '" + nameBrowser + "',"
"Url = 'http://localhost:8000/',"
"FaceCamera = false,"
"TargetID = '" + idTarget + "',"
"CartesianPosition = " + ghoul::to_string(positionBrowser) + ","
"}";
const std::string target = "{"
"Identifier = '" + idTarget + "',"
"Type = 'ScreenSpaceSkyTarget',"
"Name = '" + nameTarget + "',"
"FaceCamera = false,"
"BrowserID = '" + idBrowser + "',"
"}";
openspace::global::scriptEngine->queueScript(
"openspace.addScreenSpaceRenderable(" + browser + ");",
scripting::ScriptEngine::RemoteScripting::Yes
);
openspace::global::scriptEngine->queueScript(
"openspace.addScreenSpaceRenderable(" + target + ");",
scripting::ScriptEngine::RemoteScripting::Yes
);
}
void SkyBrowserModule::removeTargetBrowserPair(std::string& browserId) {
if (!browserIdExists(browserId)) return;
ScreenSpaceSkyBrowser* browser = browsers[browserId];
// Find corresponding target
std::string targetId{ "" };
bool hasTarget = browser->getSkyTarget();
if (hasTarget) {
std::string targetId = browser->getSkyTarget()->identifier();
openspace::global::scriptEngine->queueScript(
"openspace.removeScreenSpaceRenderable('" + targetId + "');",
scripting::ScriptEngine::RemoteScripting::Yes
);
}
// Remove pointer to the renderable from browsers vector
browsers.erase(browserId);
// Remove pointer to the renderable from screenspace renderable vector
renderables.erase(std::remove_if(std::begin(renderables), std::end(renderables),
[&](ScreenSpaceRenderable* renderable) {
bool foundBrowser = renderable->identifier() == browserId;
if (hasTarget) {
bool foundTarget = renderable->identifier() == targetId;
return foundBrowser || foundTarget;
}
else {
return foundBrowser;
}
}));
// Remove from engine
openspace::global::scriptEngine->queueScript(
"openspace.removeScreenSpaceRenderable('" + browserId + "');",
scripting::ScriptEngine::RemoteScripting::Yes
);
}
void SkyBrowserModule::create3dBrowser(ImageData& image) {
std::string id = "SkyBrowser3d" + std::to_string(browsers3d.size()+1);
glm::dvec3 position = image.position3d * distanceconstants::Parsec;
std::string translation = ghoul::to_string(position);
std::string guiPath = "/SkyBrowser";
// Calculate the size of the plane with trigonometry
// Calculate in equatorial coordinate system since the FOV is from Earth
// /|
// /_| Adjacent is the horizontal line, opposite the vertical
// \ | Calculate for half the triangle first, then multiply with 2
// \|
glm::dvec3 j2000 = skybrowser::galacticCartesianToJ2000Cartesian(position);
double adjacent = glm::length(j2000);
double opposite = 2 * adjacent * glm::tan(glm::radians(image.fov * 0.5));
// Calculate rotation to make the plane face the solar system barycenter
glm::dvec3 normal = glm::normalize(-position);
glm::dvec3 newRight = glm::normalize(
glm::cross(glm::dvec3(0.0, 0.0, 1.0), normal)
);
glm::dvec3 newUp = glm::cross(normal, newRight);
glm::dmat3 originOrientedRotation = glm::dmat3(1.0);
originOrientedRotation[0] = newRight;
originOrientedRotation[1] = newUp;
originOrientedRotation[2] = normal;
const std::string browser = "{"
"Identifier = '" + id + "',"
"Parent = 'SolarSystemBarycenter',"
"Renderable = {"
"Type = 'RenderableSkyBrowser',"
"Size = " + std::to_string(opposite) + ","
"Origin = 'Center',"
"Billboard = false,"
"Url = 'http://localhost:8000'"
"},"
"Transform = {"
"Translation = {"
"Type = 'StaticTranslation',"
"Position = " + translation + ""
"},"
"Rotation = {"
"Type = 'StaticRotation',"
"Rotation = " + ghoul::to_string(originOrientedRotation) + ""
"}"
"},"
"GUI = {"
"Name = '" + image.name + "',"
"Path = '" + guiPath + "'"
"}"
"}";
LINFO(browser);
openspace::global::scriptEngine->queueScript(
"openspace.addSceneGraphNode(" + browser + ");",
scripting::ScriptEngine::RemoteScripting::Yes
);
}
void SkyBrowserModule::add3dBrowser(RenderableSkyBrowser* node) {
browsers3d.push_back(node);
}
void SkyBrowserModule::remove3dBrowser(std::string& id) {
// Remove pointer to the renderable from module vector
browsers3d.erase(std::remove_if(std::begin(browsers3d), std::end(browsers3d),
[&](RenderableSkyBrowser* browser) {
return browser->identifier() == id;
}));
openspace::global::scriptEngine->queueScript(
"openspace.removeSceneGraphNode(" + id + ");",
scripting::ScriptEngine::RemoteScripting::Yes
);
}
ScreenSpaceSkyBrowser* SkyBrowserModule::to_browser(ScreenSpaceRenderable* ptr) {
return dynamic_cast<ScreenSpaceSkyBrowser*>(ptr);
}
@@ -443,7 +636,7 @@ WWTDataHandler* SkyBrowserModule::getWWTDataHandler() {
return dataHandler;
}
std::vector<ScreenSpaceSkyBrowser*>& SkyBrowserModule::getSkyBrowsers() {
std::map<std::string, ScreenSpaceSkyBrowser*>& SkyBrowserModule::getSkyBrowsers() {
return browsers;
}
@@ -491,7 +684,8 @@ bool SkyBrowserModule::fadeBrowserAndTarget(bool makeTransparent, double fadeTim
opacityDelta *= -1.f;
}
bool finished = true;
for (ScreenSpaceSkyBrowser* browser : browsers) {
for (std::pair <std::string, ScreenSpaceSkyBrowser*> idAndBrowser : browsers) {
ScreenSpaceSkyBrowser* browser = idAndBrowser.second;
// If there is a target, fade it as well. Otherwise, skip
ScreenSpaceSkyTarget* target = browser->getSkyTarget();
bool targetFinished = true;
@@ -519,16 +713,14 @@ bool SkyBrowserModule::fadeBrowserAndTarget(bool makeTransparent, double fadeTim
void SkyBrowserModule::setSelectedBrowser(ScreenSpaceRenderable* ptr) {
ScreenSpaceSkyBrowser* browser = to_browser(ptr) ? to_browser(ptr) : to_target(ptr)->getSkyBrowser();
auto it = std::find(browsers.begin(), browsers.end(), browser);
// Get index
selectedBrowser = std::distance(browsers.begin(), it);
selectedBrowser = browser->identifier();
}
void SkyBrowserModule::setSelectedBrowser(int i) {
selectedBrowser = i;
void SkyBrowserModule::setSelectedBrowser(std::string id) {
selectedBrowser = id;
}
int SkyBrowserModule::getSelectedBrowserIndex() {
std::string SkyBrowserModule::selectedBrowserId() {
return selectedBrowser;
}

View File

@@ -32,7 +32,7 @@
#include <openspace/properties/scalar/floatproperty.h>
#include <openspace/properties/stringproperty.h>
#include <thread>
#include <string>
#include <iostream>
#include <fstream>
@@ -45,6 +45,7 @@ class RenderableSkyBrowser;
class ScreenSpaceRenderable;
class WWTDataHandler;
class SceneGraphNode;
class ImageData;
class SkyBrowserModule : public OpenSpaceModule {
@@ -58,16 +59,21 @@ public:
glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos);
void addRenderable(ScreenSpaceRenderable* object);
WWTDataHandler* getWWTDataHandler();
std::vector<ScreenSpaceSkyBrowser*>& getSkyBrowsers();
std::map<std::string, ScreenSpaceSkyBrowser*>& getSkyBrowsers();
void startRotation(glm::dvec2 coordsEnd);
void rotateCamera(double deltaTime);
bool fadeBrowserAndTarget(bool makeTransparent, double fadeTime, double deltaTime);
void setSelectedBrowser(ScreenSpaceRenderable* ptr);
void setSelectedBrowser(int i);
int getSelectedBrowserIndex();
void setSelectedBrowser(std::string id);
bool browserIdExists(std::string id);
std::string selectedBrowserId();
int loadImages(const std::string& root, const std::string& directory);
void add3dBrowser(SceneGraphNode* node);
void add3dBrowser(RenderableSkyBrowser* node);
void remove3dBrowser(std::string& id);
bool cameraInSolarSystem();
void createTargetBrowserPair();
void removeTargetBrowserPair(std::string& browserId);
void create3dBrowser(ImageData& image);
scripting::LuaLibrary luaLibrary() const override;
//std::vector<documentation::Documentation> documentations() const override;
@@ -82,10 +88,13 @@ protected:
bool shouldInitialize;
// Renderable vector and ptr to where mouse is
// The browsers and targets
std::vector<ScreenSpaceRenderable*> renderables;
std::vector<ScreenSpaceSkyBrowser*> browsers;
std::vector<SceneGraphNode*> browsers3d;
// Only the browsers
std::map<std::string, ScreenSpaceSkyBrowser*> browsers;
// 3D browsers
std::vector<RenderableSkyBrowser*> browsers3d;
// Pointer to what mouse is currently on
ScreenSpaceRenderable* _mouseOnObject;
// Dragging
glm::vec2 startDragMousePos;
@@ -106,7 +115,7 @@ protected:
glm::dvec3 _coordsStartAnimation;
bool isRotating = false;
// For tracking the currently selected browser
int selectedBrowser{ -1 };
std::string selectedBrowser;
glm::ivec3 highlightAddition{ 35, 35, 35 };
// Mode of browsing
bool _cameraInSolarSystem{ true };

View File

@@ -39,7 +39,7 @@ namespace openspace::skybrowser::luascriptfunctions {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::selectImage");
const int i = ghoul::lua::value<int>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
ScreenSpaceSkyBrowser* selectedBrowser = module->getSkyBrowsers()[module->getSelectedBrowserIndex()];
ScreenSpaceSkyBrowser* selectedBrowser = module->getSkyBrowsers()[module->selectedBrowserId()];
if (selectedBrowser) {
ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i];
@@ -104,12 +104,10 @@ namespace openspace::skybrowser::luascriptfunctions {
int lockTarget(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::lockTarget");
const int i = ghoul::lua::value<int>(L, 1);
const std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
std::vector<ScreenSpaceSkyBrowser*> browsers = module->getSkyBrowsers();
ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget();
if (i < browsers.size()) {
ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget();
if (module->browserIdExists(id)) {
ScreenSpaceSkyTarget* target = module->getSkyBrowsers()[id]->getSkyTarget();
if (target) {
target->lock();
}
@@ -119,11 +117,10 @@ namespace openspace::skybrowser::luascriptfunctions {
int unlockTarget(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::unlockTarget");
const int i = ghoul::lua::value<int>(L, 1);
const std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
std::vector<ScreenSpaceSkyBrowser*> browsers = module->getSkyBrowsers();
if (i < browsers.size()) {
ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget();
if (module->browserIdExists(id)) {
ScreenSpaceSkyTarget* target = module->getSkyBrowsers()[id]->getSkyTarget();
if (target) {
target->unlock();
}
@@ -138,7 +135,8 @@ namespace openspace::skybrowser::luascriptfunctions {
// 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 (ScreenSpaceSkyBrowser* browser : module->getSkyBrowsers()) {
for (std::pair<std::string,ScreenSpaceSkyBrowser*> pair : module->getSkyBrowsers()) {
ScreenSpaceSkyBrowser* browser = pair.second;
if (!browser->hasLoadedCollections()) {
browser->sendMessageToWWT(wwtmessage::loadCollection(root));
browser->setHasLoadedCollections(true);
@@ -244,7 +242,7 @@ namespace openspace::skybrowser::luascriptfunctions {
lua_settable(L, -3);
ghoul::lua::push(L, "dec", sphericalJ2000.y);
lua_settable(L, -3);
ghoul::lua::push(L, "selectedBrowserIndex", module->getSelectedBrowserIndex());
ghoul::lua::push(L, "selectedBrowserId", module->selectedBrowserId());
lua_settable(L, -3);
ghoul::lua::push(L, "cameraInSolarSystem", module->cameraInSolarSystem());
lua_settable(L, -3);
@@ -252,9 +250,11 @@ namespace openspace::skybrowser::luascriptfunctions {
lua_settable(L, -3);
// Pass data for all the browsers and the corresponding targets
std::vector<ScreenSpaceSkyBrowser*> browsers = module->getSkyBrowsers();
std::map<std::string, ScreenSpaceSkyBrowser*> browsers = module->getSkyBrowsers();
for (ScreenSpaceSkyBrowser* browser : browsers) {
for (std::pair<std::string, ScreenSpaceSkyBrowser*> pair : browsers) {
ScreenSpaceSkyBrowser* browser = pair.second;
std::string id = pair.first;
// Only add browsers that have an initialized target
ScreenSpaceSkyTarget* target = browser->getSkyTarget();
if (target) {
@@ -269,6 +269,10 @@ namespace openspace::skybrowser::luascriptfunctions {
index++;
lua_newtable(L);
// Push ("Key", value)
ghoul::lua::push(L, "id", id);
lua_settable(L, -3);
ghoul::lua::push(L, "name", browser->guiName());
lua_settable(L, -3);
ghoul::lua::push(L, "FOV", browser->fieldOfView());
lua_settable(L, -3);
ghoul::lua::push(L, "cartesianDirection", celestialCartVec);
@@ -290,25 +294,59 @@ namespace openspace::skybrowser::luascriptfunctions {
}
int adjustCamera(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::adjustCamera");
const int i = ghoul::lua::value<int>(L, 1);
const std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
if (module->getSkyBrowsers().size() > i) {
module->startRotation(module->getSkyBrowsers()[i]->getSkyTarget()->getTargetDirectionCelestial());
if (module->browserIdExists(id)) {
ScreenSpaceSkyTarget* target = module->getSkyBrowsers()[id]->getSkyTarget();
if (target) {
module->startRotation(target->getTargetDirectionCelestial());
}
}
return 0;
}
int setOpacityOfImageLayer(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 3, "lua::setOpacityOfImageLayer");
const std::string browserId = ghoul::lua::value<std::string>(L, 1);
const int i = ghoul::lua::value<int>(L, 2);
double opacity = ghoul::lua::value<double>(L, 3);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
if (module->browserIdExists(browserId)) {
ImageData& image = module->getWWTDataHandler()->getLoadedImages()[i];
ghoul::Dictionary message = wwtmessage::setLayerOpacity(image, opacity);
module->getSkyBrowsers()[browserId]->sendMessageToWWT(message);
}
return 0;
}
int setSelectedBrowser(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser");
const int i = ghoul::lua::value<int>(L, 1);
const std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
if (module->getSkyBrowsers().size() < i) {
module->setSelectedBrowser(i);
if (module->browserIdExists(id)) {
module->setSelectedBrowser(id);
}
return 0;
}
int createTargetBrowserPair(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::createTargetBrowserPair");
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->createTargetBrowserPair();
return 0;
}
int removeTargetBrowserPair(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::removeTargetBrowserPair");
std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->removeTargetBrowserPair(id);
return 0;
}
int create3dSkyBrowser(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::create3dSkyBrowser");
// Image index to place in 3D
@@ -318,64 +356,7 @@ namespace openspace::skybrowser::luascriptfunctions {
// If the image has a 3D position, add it to the scene graph
if (image.has3dCoords) {
std::string id = "SkyBrowser" + std::to_string(i);
glm::dvec3 position = image.position3d * distanceconstants::Parsec;
std::string translation = ghoul::to_string(position);
std::string guiPath = "/SkyBrowser";
// Calculate the size of the plane with trigonometry
// Calculate in equatorial coordinate system since the FOV is from Earth
// /|
// /_| Adjacent is the horizontal line, opposite the vertical
// \ | Calculate for half the triangle first, then multiply with 2
// \|
glm::dvec3 j2000 = skybrowser::galacticCartesianToJ2000Cartesian(position);
double adjacent = glm::length(j2000);
double opposite = 2 * adjacent * glm::tan(glm::radians(image.fov * 0.5));
// Calculate rotation to make the plane face the solar system barycenter
glm::dvec3 normal = glm::normalize(-position);
glm::dvec3 newRight = glm::normalize(
glm::cross(glm::dvec3(0.0, 0.0, 1.0), normal)
);
glm::dvec3 newUp = glm::cross(normal, newRight);
glm::dmat3 originOrientedRotation = glm::dmat3(1.0);
originOrientedRotation[0] = newRight;
originOrientedRotation[1] = newUp;
originOrientedRotation[2] = normal;
const std::string browser = "{"
"Identifier = '" + id + "',"
"Parent = 'SolarSystemBarycenter',"
"Renderable = {"
"Type = 'RenderableSkyBrowser',"
"Size = " + std::to_string(opposite) +","
"Origin = 'Center',"
"Billboard = false,"
"Url = 'http://localhost:8000'"
"},"
"Transform = {"
"Translation = {"
"Type = 'StaticTranslation',"
"Position = " + translation + ""
"},"
"Rotation = {"
"Type = 'StaticRotation',"
"Rotation = " + ghoul::to_string(originOrientedRotation) + ""
"}"
"},"
"GUI = {"
"Name = '" + image.name + "',"
"Path = '" + guiPath + "'"
"}"
"}";
LINFO(browser);
openspace::global::scriptEngine->queueScript(
"openspace.addSceneGraphNode(" + browser + ");",
scripting::ScriptEngine::RemoteScripting::Yes
);
module->create3dBrowser(image);
}
else {
LINFO("Image has no 3D coordinate!");
@@ -383,6 +364,16 @@ namespace openspace::skybrowser::luascriptfunctions {
return 0;
}
int remove3dSkyBrowser(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::remove3dSkyBrowser");
// Image index to place in 3D
std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->remove3dBrowser(id);
return 0;
}
}

View File

@@ -1,4 +1,5 @@
#include <modules/skybrowser/include/renderableskybrowser.h>
#include <modules/skybrowser/skybrowsermodule.h>
#include <modules/webbrowser/webbrowsermodule.h>
#include <modules/webbrowser/include/webkeyboardhandler.h>
#include <modules/webbrowser/include/browserinstance.h>
@@ -117,6 +118,9 @@ namespace openspace {
_browserInstance->initialize();
_browserInstance->loadUrl(_url);
_browserInstance->reshape(_dimensions.value());
// Add pointer to module
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->add3dBrowser(this);
}
void RenderableSkyBrowser::deinitializeGL() {

View File

@@ -139,6 +139,15 @@ namespace openspace {
});
}
ScreenSpaceSkyBrowser::~ScreenSpaceSkyBrowser() {
// Set flag to false so the thread can exit
_camIsSyncedWWT = false;
if (_threadWWTMessages.joinable()) {
_threadWWTMessages.join();
LINFO("Joined thread");
}
}
bool ScreenSpaceSkyBrowser::initializeGL() {
global::moduleEngine->module<SkyBrowserModule>()->addRenderable(this);