mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-04 02:29:49 -06:00
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:
@@ -13,7 +13,7 @@ namespace openspace {
|
||||
{
|
||||
public:
|
||||
ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary);
|
||||
virtual ~ScreenSpaceSkyBrowser() = default;
|
||||
virtual ~ScreenSpaceSkyBrowser();
|
||||
|
||||
bool initializeGL() override;
|
||||
bool deinitializeGL() override;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user