mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-04-23 04:30:09 -05:00
Move browser specific functionality to screenspacebrowser
This commit is contained in:
@@ -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;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user