Move browser specific functionality to screenspacebrowser

This commit is contained in:
Ylva Selling
2021-03-22 09:50:19 +01:00
parent 39b1887e14
commit 51f40172f7
5 changed files with 233 additions and 246 deletions
@@ -4,34 +4,59 @@
#include <modules/webbrowser/include/screenspacebrowser.h>
namespace openspace {
class ScreenSpaceSkyTarget;
class ScreenSpaceSkyBrowser : public ScreenSpaceBrowser
{
public:
ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary);
virtual ~ScreenSpaceSkyBrowser() = default;
bool deinitializeGL() override;
// Communication with the webpage and WWT
void executeJavascript(std::string& script) const;
ghoul::Dictionary createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly = true) const;
ghoul::Dictionary createMessageForPausingWWTTime() const;
ghoul::Dictionary createMessageForLoadingWWTImgColl(const std::string& url) const;
bool sendMessageToWWT(const ghoul::Dictionary& msg);
void sendMouseEvent(CefStructBase<CefMouseEventTraits> event, int x, int y) const;
void WWTfollowCamera();
glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const;
float fieldOfView() const;
void scrollZoom(float scroll);
// Translation
void translate(glm::vec2 translation);
void translate(glm::vec2 translation, glm::vec2 position);
// Position and dimension and corners
glm::vec2 getScreenSpacePosition();
glm::vec2 getScreenSpaceDimensions();
void sendMouseEvent(CefStructBase<CefMouseEventTraits> event, int x, int y) const;
glm::vec2 getUpperRightCornerScreenSpace();
glm::vec2 getLowerLeftCornerScreenSpace();
glm::vec2 getScreenSpaceBrowserDimension();
// Mouse interaction
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
glm::vec2 coordIsOnResizeArea(glm::vec2 coord);
// Scaling
void scale(glm::vec2 scalingFactor);
void scale(float scalingFactor);
glm::mat4 scaleMatrix() override;
// Resizing
void saveResizeStartSize();
void updateBrowserSize();
void scale(float scalingFactor);
glm::vec2 getScreenSpaceBrowserDimension();
// Flag for dimensions
bool _browserDimIsDirty;
properties::FloatProperty _fieldOfView;
ScreenSpaceSkyTarget* _skyTarget;
private:
glm::vec2 _startSize;
float _startScale;
properties::Vec2Property _browserDimensions;
bool _camIsSyncedWWT;
std::thread _threadWWTMessages;
};
}
+67 -213
View File
@@ -27,11 +27,8 @@
//#include <modules/webbrowser/webbrowsermodule.h>
//#include <modules/webbrowser/include/screenspacebrowser.h>
#include <openspace/rendering/screenspacerenderable.h>
#include <openspace/rendering/renderable.h>
#include <openspace/engine/moduleengine.h>
#include <openspace/engine/globals.h>
#include <openspace/engine/globalscallbacks.h>
#include <openspace/interaction/navigationhandler.h>
@@ -39,18 +36,13 @@
#include <openspace/rendering/renderengine.h>
#include <openspace/scene/scene.h>
#include <openspace/util/factorymanager.h>
#include <thread>
#include <chrono>
#include "skybrowsermodule_lua.inl"
#include "skybrowsermodule_lua.inl"
#include <openspace/engine/windowdelegate.h>
#include <ghoul/logging/logmanager.h>
#include <ghoul/opengl/texture.h>
#include <cmath> // For atan2
#include <ghoul/misc/dictionaryjsonformatter.h> // formatJson
#include <glm/gtx/string_cast.hpp>
#include <glm/gtx/rotate_vector.hpp >
#include <ghoul/filesystem/filesystem.h>
namespace {
@@ -60,20 +52,11 @@ namespace {
"Show Sky Browser",
"Show sky browser and target for WorldWide Telescope imagery."
};
constexpr const openspace::properties::Property::PropertyInfo ZoomInfo =
{
"Zoom",
"Zoom Info",
"tjobidabidobidabidopp plupp"
};
struct [[codegen::Dictionary(SkyBrowserModule)]] Parameters {
// [[codegen::verbatim(ShowSkyBrowserInfo.description)]]
std::optional<bool> show;
// [[codegen::verbatim(ZoomInfo.description)]]
std::optional<float> zoom;
};
#include "skybrowsermodule_codegen.cpp"
@@ -83,34 +66,62 @@ namespace {
namespace openspace {
scripting::LuaLibrary SkyBrowserModule::luaLibrary() const {
scripting::LuaLibrary res;
res.name = "skybrowser";
res.functions = {
{
"create",
&skybrowser::luascriptfunctions::createBrowser,
{},
"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"
},
{
"move",
&skybrowser::luascriptfunctions::moveBrowser,
{},
"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"
},
{
"follow",
&skybrowser::luascriptfunctions::followCamera,
{},
"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"
},
{
"loacImgCollection",
&skybrowser::luascriptfunctions::loadImgCollection,
{},
"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"
}
};
return res;
}
SkyBrowserModule::SkyBrowserModule()
: OpenSpaceModule(SkyBrowserModule::Name)
, _showBrowserAndTarget(ShowSkyBrowserInfo)
, _fieldOfView(ZoomInfo, 50.f ,0.1f ,70.f)
, _skyBrowser(nullptr)
, _skyTarget(nullptr)
, _camIsSyncedWWT(true)
, currentlyDraggingBrowser(false)
, currentlyDraggingTarget(false)
, currentlyResizingBrowser(false)
, _listenForInteractions(true)
, mouseIsOnBrowser(false)
, mouseIsOnTarget(false)
{
addProperty(_showBrowserAndTarget);
addProperty(_fieldOfView);
_fieldOfView.onChange([&]() {
if (_skyTarget) {
_skyTarget->updateFOV(_fieldOfView);
float scaleWhenFovIs10 = static_cast<float>(10.f / global::windowDelegate->getHorizFieldOfView());
_skyTarget->setScale(std::max(static_cast<float>(_fieldOfView / global::windowDelegate->getHorizFieldOfView()), scaleWhenFovIs10));
}
});
_showBrowserAndTarget.onChange([&]() {
if (_showBrowserAndTarget) {
@@ -145,14 +156,34 @@ SkyBrowserModule::SkyBrowserModule()
else {
mouseIsOnBrowser = false;
}
if (currentlyDraggingBrowser) {
_skyBrowser->translate(_mousePosition - startDragMousePosBrowser, startDragObjectPosBrowser);
}
if (currentlyDraggingTarget) {
_skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget);
}
if (currentlyResizingBrowser) {
// Calculate scaling factor
glm::vec2 mouseDragVector = (_mousePosition - startDragMousePosBrowser);
glm::vec2 scalingVector = mouseDragVector * resizeVector;
glm::vec2 newSizeRelToOld = (startResizeBrowserSize + (scalingVector)) / startResizeBrowserSize;
_skyBrowser->scale(newSizeRelToOld);
// Make sure the browser doesn't move in directions it's not supposed to
_skyBrowser->translate(mouseDragVector * abs(resizeVector) / 2.f, startDragObjectPosBrowser);
_skyTarget->setScreenSpaceTargetDimension(_skyBrowser->getScreenSpaceBrowserDimension());
}
}
);
global::callback::mouseScrollWheel->emplace_back(
[&](double, double scroll) -> bool {
if (mouseIsOnBrowser) {
float zoom = scroll > 0.0 ? -log(_fieldOfView + 1.1f) : log(_fieldOfView + 1.1f);
_fieldOfView = std::clamp(_fieldOfView + zoom, 0.001f, 70.0f);
_skyBrowser->scrollZoom(scroll);
return true;
}
@@ -221,69 +252,14 @@ SkyBrowserModule::SkyBrowserModule()
}
void SkyBrowserModule::internalDeinitialize() {
// Set flag to false so the thread can exit
_camIsSyncedWWT = false;
if (_threadWWTMessages.joinable()) {
_threadWWTMessages.join();
LINFO("Joined thread");
}
if (_threadHandleInteractions.joinable()) {
_threadHandleInteractions.join();
LINFO("Joined thread");
}
}
scripting::LuaLibrary SkyBrowserModule::luaLibrary() const {
scripting::LuaLibrary res;
res.name = "skybrowser";
res.functions = {
{
"create",
&skybrowser::luascriptfunctions::createBrowser,
{},
"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"
},
{
"move",
&skybrowser::luascriptfunctions::moveBrowser,
{},
"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"
},
{
"follow",
&skybrowser::luascriptfunctions::followCamera,
{},
"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"
},
{
"loacImgCollection",
&skybrowser::luascriptfunctions::loadImgCollection,
{},
"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"
}
};
return res;
}
float SkyBrowserModule::fieldOfView() const{
return _fieldOfView;
}
void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) {
const Parameters p = codegen::bake<Parameters>(dict);
_showBrowserAndTarget = p.show.value_or(_showBrowserAndTarget);
_fieldOfView = p.zoom.value_or(_fieldOfView);
// register ScreenSpaceBrowser
auto fScreenSpaceRenderable = FactoryManager::ref().factory<ScreenSpaceRenderable>();
@@ -296,50 +272,6 @@ void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) {
}
bool SkyBrowserModule::sendMessageToWWT(const ghoul::Dictionary& msg) {
if (_skyBrowser) {
std::string script = "sendMessageToWWT(" + ghoul::formatJson(msg) + ");";
_skyBrowser->executeJavascript(script);
return true;
}
else {
LERROR("No sky browser added! Can't send message.");
return false;
}
}
void SkyBrowserModule::handleInteractions() {
/*
CefStructBase<CefMouseEventTraits> event;
_skyBrowser->sendMouseEvent(event, scroll, scroll);
*/
_threadHandleInteractions = std::thread([&] {
while (_listenForInteractions) {
if (currentlyDraggingBrowser) {
_skyBrowser->translate(_mousePosition - startDragMousePosBrowser, startDragObjectPosBrowser);
}
if (currentlyDraggingTarget) {
_skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget);
}
if (currentlyResizingBrowser) {
// Calculate scaling factor
glm::vec2 mouseDragVector = (_mousePosition - startDragMousePosBrowser);
glm::vec2 scalingVector = mouseDragVector * resizeVector;
glm::vec2 newSizeRelToOld = (startResizeBrowserSize + (scalingVector)) / startResizeBrowserSize;
_skyBrowser->scale(newSizeRelToOld);
// Make sure the browser doesn't move in directions it's not supposed to
_skyBrowser->translate(mouseDragVector * abs(resizeVector) /2.f, startDragObjectPosBrowser);
_skyTarget->setScreenSpaceTargetDimension(_skyBrowser->getScreenSpaceBrowserDimension());
}
}
});
}
glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mousePos) {
glm::vec2 size = global::windowDelegate->currentWindowSize();
// Change origin to middle of the window
@@ -351,95 +283,17 @@ glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mouse
return screenSpacePos;
}
void SkyBrowserModule::WWTfollowCamera() {
// Start a thread to enable user interaction while sending the calls to WWT
_threadWWTMessages = std::thread([&] {
while (_camIsSyncedWWT) {
// Get camera view direction and orthogonal coordinate system of camera view direction
glm::vec3 viewDirection = global::navigationHandler->camera()->viewDirectionWorldSpace();
glm::vec3 upDirection = global::navigationHandler->camera()->lookUpVectorWorldSpace();
glm::vec3 sideDirection = glm::cross(upDirection, viewDirection);
glm::vec2 angleOffset = _skyTarget ? _skyTarget->getAnglePosition() : glm::vec2(0);
// Change view if target is moved
glm::vec3 targetDirection = glm::rotate(viewDirection, angleOffset.x, upDirection);
targetDirection = glm::rotate(targetDirection, angleOffset.y, sideDirection);
// Convert to celestial coordinates
glm::dvec2 celestCoords = convertGalacticToCelestial(targetDirection);
ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoords, _fieldOfView);
// Sleep so we don't bombard WWT with too many messages
std::this_thread::sleep_for(std::chrono::milliseconds(50));
sendMessageToWWT(message);
}
});
}
ghoul::Dictionary SkyBrowserModule::createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly) const {
using namespace std::string_literals;
ghoul::Dictionary msg;
msg.setValue("event", "center_on_coordinates"s);
msg.setValue("ra", static_cast<double>(celestCoords[0]));
msg.setValue("dec", static_cast<double>(celestCoords[1]));
msg.setValue("fov", static_cast<double>(fov));
msg.setValue("instant", moveInstantly);
return msg;
}
ghoul::Dictionary SkyBrowserModule::createMessageForLoadingWWTImgColl(const std::string& url) const {
using namespace std::string_literals;
ghoul::Dictionary msg;
msg.setValue("event", "center_on_coordinates"s);
msg.setValue("url", url);
return msg;
}
ghoul::Dictionary SkyBrowserModule::createMessageForPausingWWTTime() const {
using namespace std::string_literals;
ghoul::Dictionary msg;
msg.setValue("event", "pause_time"s);
return msg;
}
void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget) {
_skyBrowser = skyBrowser;
_skyTarget = skyTarget;
_skyBrowser->_skyTarget = _skyTarget;
}
ScreenSpaceSkyBrowser* SkyBrowserModule::skyBrowser() {
return _skyBrowser;
}
glm::dvec2 SkyBrowserModule::convertGalacticToCelestial(glm::dvec3 rGal) const {
// Used the math from this website: https://gea.esac.esa.int/archive/documentation/GD -->
// R2/Data_processing/chap_cu3ast/sec_cu3ast_intro/ssec_cu3ast_intro_tansforms.html#SSS1
const glm::dmat3 conversionMatrix = glm::dmat3({
-0.0548755604162154, 0.4941094278755837, -0.8676661490190047, // col 0
-0.8734370902348850, -0.4448296299600112, -0.1980763734312015, // col 1
-0.4838350155487132, 0.7469822444972189, 0.4559837761750669 // col 2
});
glm::dvec3 rICRS = glm::transpose(conversionMatrix) * rGal;
float ra = atan2(rICRS[1], rICRS[0]);
float dec = atan2(rICRS[2], glm::sqrt((rICRS[0] * rICRS[0]) + (rICRS[1] * rICRS[1])));
ra = ra > 0 ? ra : ra + (2 * glm::pi<float>());
return glm::dvec2(glm::degrees(ra), glm::degrees(dec));
}
std::string SkyBrowserModule::createTarget(glm::ivec2 dimension) {
std::string browserDim = fmt::format("{{{},{}}}", dimension.x, dimension.y);
-20
View File
@@ -45,21 +45,8 @@ public:
SkyBrowserModule();
virtual ~SkyBrowserModule() = default;
float fieldOfView() const;
glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const;
void WWTfollowCamera();
std::string createBrowser();
std::string createTarget(glm::ivec2 dimension);
ghoul::Dictionary createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly = true) const;
ghoul::Dictionary createMessageForPausingWWTTime() const;
ghoul::Dictionary createMessageForLoadingWWTImgColl(const std::string& url) const;
bool sendMessageToWWT(const ghoul::Dictionary& msg);
void handleInteractions();
glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos);
void initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget);
@@ -70,15 +57,9 @@ public:
protected:
void internalInitialize(const ghoul::Dictionary& dict) override;
void internalDeinitialize() override;
properties::BoolProperty _showBrowserAndTarget;
properties::FloatProperty _fieldOfView;
ScreenSpaceSkyBrowser* _skyBrowser;
ScreenSpaceSkyTarget* _skyTarget;
bool _camIsSyncedWWT;
bool _listenForInteractions;
std::thread _threadWWTMessages;
std::thread _threadHandleInteractions;
glm::vec2 startDragMousePosBrowser;
glm::vec2 startDragObjectPosBrowser;
glm::vec2 startDragMousePosTarget;
@@ -89,7 +70,6 @@ protected:
bool currentlyResizingBrowser;
bool currentlyDraggingTarget;
glm::vec2 _mousePosition;
double _mouseScroll;
bool mouseIsOnBrowser;
bool mouseIsOnTarget;
};
+2 -3
View File
@@ -36,7 +36,7 @@ namespace openspace::skybrowser::luascriptfunctions {
// https://docs.worldwidetelescope.org/data-guide/1/data-file-formats/collections/sample-blank-collection.wtml
std::string url = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->sendMessageToWWT(module->createMessageForLoadingWWTImgColl(url));
module->skyBrowser()->sendMessageToWWT(module->skyBrowser()->createMessageForLoadingWWTImgColl(url));
return 1;
}
@@ -50,8 +50,7 @@ namespace openspace::skybrowser::luascriptfunctions {
module->initializeBrowser(browser, target);
module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0));
module->WWTfollowCamera();
module->handleInteractions();
browser->WWTfollowCamera();
return 1;
}
@@ -1,21 +1,24 @@
#include <modules/skybrowser/include/screenspaceskybrowser.h>
#include <ghoul/opengl/texture.h>
#include <modules/skybrowser/include/screenspaceskytarget.h>
#include <modules/webbrowser/include/webkeyboardhandler.h>
#include <modules/webbrowser/include/browserinstance.h>
#include <modules/webbrowser/include/screenspacebrowser.h>
#include <ghoul/logging/logmanager.h>
#include <openspace/engine/globals.h>
#include <openspace/engine/globalscallbacks.h>
#include <openspace/interaction/navigationhandler.h>
#include <openspace/engine/windowdelegate.h>
#include <glm/gtx/string_cast.hpp>
#include <openspace/interaction/navigationhandler.h>
#include <openspace/rendering/renderengine.h>
#include <openspace/util/camera.h>
#include <openspace/scene/scene.h>
#include <ghoul/misc/dictionaryjsonformatter.h> // formatJson
#include <ghoul/logging/logmanager.h>
#include <ghoul/opengl/texture.h>
#include <glm/gtx/matrix_decompose.hpp>
#include <glm/gtx/string_cast.hpp>
#include <glm/gtx/rotate_vector.hpp >
#include <glm/gtx/string_cast.hpp>
#include <thread>
#include <chrono> // Milliseconds
namespace {
constexpr const char* _loggerCat = "ScreenSpaceSkyBrowser";
@@ -26,11 +29,21 @@ namespace {
"Browser Dimensions Info",
"Set the dimensions of the SkyTarget according to the SkyBrowser ratio "
};
constexpr const openspace::properties::Property::PropertyInfo ZoomInfo =
{
"Zoom",
"Zoom Info",
"tjobidabidobidabidopp plupp"
};
struct [[codegen::Dictionary(ScreenSpaceSkyBrowser)]] Parameters {
// [[codegen::verbatim(BrowserDimensionInfo.description)]]
std::optional<glm::vec2> browserDimensions;
// [[codegen::verbatim(ZoomInfo.description)]]
std::optional<float> zoom;
};
#include "screenspaceskybrowser_codegen.cpp"
@@ -40,6 +53,8 @@ namespace openspace {
ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary)
: ScreenSpaceBrowser(dictionary)
, _browserDimensions(BrowserDimensionInfo, _dimensions, glm::ivec2(0.f), glm::ivec2(300.f))
, _fieldOfView(ZoomInfo, 50.f, 0.1f, 70.f)
, _camIsSyncedWWT(true)
{
// Handle target dimension property
const Parameters p = codegen::bake<Parameters>(dictionary);
@@ -47,6 +62,17 @@ namespace openspace {
_browserDimensions.onChange([&]() { _browserDimIsDirty = true; });
addProperty(_browserDimensions);
_fieldOfView = p.zoom.value_or(_fieldOfView);
addProperty(_fieldOfView);
_fieldOfView.onChange([&]() {
if (_skyTarget) {
_skyTarget->updateFOV(_fieldOfView);
float scaleWhenFovIs10 = static_cast<float>(10.f / global::windowDelegate->getHorizFieldOfView());
_skyTarget->setScale(std::max(static_cast<float>(_fieldOfView / global::windowDelegate->getHorizFieldOfView()), scaleWhenFovIs10));
}
});
std::string identifier;
if (dictionary.hasValue<std::string>(KeyIdentifier)) {
identifier = dictionary.value<std::string>(KeyIdentifier);
@@ -61,6 +87,25 @@ namespace openspace {
_cartesianPosition.setValue(glm::vec3(_cartesianPosition.value().x, _cartesianPosition.value().y, -2.1f));
}
bool ScreenSpaceSkyBrowser::deinitializeGL() {
// Set flag to false so the thread can exit
_camIsSyncedWWT = false;
if (_threadWWTMessages.joinable()) {
_threadWWTMessages.join();
LINFO("Joined thread");
}
return ScreenSpaceBrowser::deinitializeGL();
}
float ScreenSpaceSkyBrowser::fieldOfView() const {
return _fieldOfView;
}
void ScreenSpaceSkyBrowser::scrollZoom(float scroll) {
float zoom = scroll > 0.0 ? -log(_fieldOfView + 1.1f) : log(_fieldOfView + 1.1f);
_fieldOfView = std::clamp(_fieldOfView + zoom, 0.001f, 70.0f);
}
void ScreenSpaceSkyBrowser::executeJavascript(std::string& script) const {
//LINFOC(_loggerCat, "Executing javascript " + script);
if (_browserInstance && _browserInstance->getBrowser() && _browserInstance->getBrowser()->GetMainFrame()) {
@@ -68,6 +113,42 @@ namespace openspace {
frame->ExecuteJavaScript(script, frame->GetURL(), 0);
}
}
bool ScreenSpaceSkyBrowser::sendMessageToWWT(const ghoul::Dictionary& msg) {
std::string script = "sendMessageToWWT(" + ghoul::formatJson(msg) + ");";
executeJavascript(script);
return true;
}
ghoul::Dictionary ScreenSpaceSkyBrowser::createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly) const {
using namespace std::string_literals;
ghoul::Dictionary msg;
msg.setValue("event", "center_on_coordinates"s);
msg.setValue("ra", static_cast<double>(celestCoords[0]));
msg.setValue("dec", static_cast<double>(celestCoords[1]));
msg.setValue("fov", static_cast<double>(fov));
msg.setValue("instant", moveInstantly);
return msg;
}
ghoul::Dictionary ScreenSpaceSkyBrowser::createMessageForLoadingWWTImgColl(const std::string& url) const {
using namespace std::string_literals;
ghoul::Dictionary msg;
msg.setValue("event", "center_on_coordinates"s);
msg.setValue("url", url);
return msg;
}
ghoul::Dictionary ScreenSpaceSkyBrowser::createMessageForPausingWWTTime() const {
using namespace std::string_literals;
ghoul::Dictionary msg;
msg.setValue("event", "pause_time"s);
return msg;
}
void ScreenSpaceSkyBrowser::sendMouseEvent(CefStructBase<CefMouseEventTraits> event, int x, int y) const {
//LINFOC(_loggerCat, "Executing javascript " + script);
@@ -80,6 +161,54 @@ namespace openspace {
}
}
void ScreenSpaceSkyBrowser::WWTfollowCamera() {
// Start a thread to enable user interaction while sending the calls to WWT
_threadWWTMessages = std::thread([&] {
while (_camIsSyncedWWT) {
// Get camera view direction and orthogonal coordinate system of camera view direction
glm::vec3 viewDirection = global::navigationHandler->camera()->viewDirectionWorldSpace();
glm::vec3 upDirection = global::navigationHandler->camera()->lookUpVectorWorldSpace();
glm::vec3 sideDirection = glm::cross(upDirection, viewDirection);
glm::vec2 angleOffset = _skyTarget ? _skyTarget->getAnglePosition() : glm::vec2(0);
// Change view if target is moved
glm::vec3 targetDirection = glm::rotate(viewDirection, angleOffset.x, upDirection);
targetDirection = glm::rotate(targetDirection, angleOffset.y, sideDirection);
// Convert to celestial coordinates
glm::dvec2 celestCoords = convertGalacticToCelestial(targetDirection);
ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoords, _fieldOfView);
// Sleep so we don't bombard WWT with too many messages
std::this_thread::sleep_for(std::chrono::milliseconds(50));
sendMessageToWWT(message);
}
});
}
glm::dvec2 ScreenSpaceSkyBrowser::convertGalacticToCelestial(glm::dvec3 rGal) const {
// Used the math from this website: https://gea.esac.esa.int/archive/documentation/GD -->
// R2/Data_processing/chap_cu3ast/sec_cu3ast_intro/ssec_cu3ast_intro_tansforms.html#SSS1
const glm::dmat3 conversionMatrix = glm::dmat3({
-0.0548755604162154, 0.4941094278755837, -0.8676661490190047, // col 0
-0.8734370902348850, -0.4448296299600112, -0.1980763734312015, // col 1
-0.4838350155487132, 0.7469822444972189, 0.4559837761750669 // col 2
});
glm::dvec3 rICRS = glm::transpose(conversionMatrix) * rGal;
float ra = atan2(rICRS[1], rICRS[0]);
float dec = atan2(rICRS[2], glm::sqrt((rICRS[0] * rICRS[0]) + (rICRS[1] * rICRS[1])));
ra = ra > 0 ? ra : ra + (2 * glm::pi<float>());
return glm::dvec2(glm::degrees(ra), glm::degrees(dec));
}
void ScreenSpaceSkyBrowser::translate(glm::vec2 translation) {
glm::vec3 position = _cartesianPosition;
_cartesianPosition = glm::translate(glm::mat4(1.f), glm::vec3(translation, 0.0f)) * glm::vec4(position, 1.0f);