Add function to drag and change view within browser

This commit is contained in:
Ester Lindgren
2021-04-06 08:44:42 +02:00
parent 19aa6895fd
commit c234b69436
6 changed files with 94 additions and 20 deletions
@@ -28,14 +28,13 @@ namespace openspace {
glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const;
float fieldOfView() const;
void scrollZoom(float scroll);
ScreenSpaceSkyTarget* getSkyTarget();
// Translation
//void translate(glm::vec2 translation);
// Position and dimension and corners
glm::vec2 getScreenSpaceBrowserDimension();
glm::vec2 getBrowserPixelDimensions();
glm::vec2 coordIsOnResizeArea(glm::vec2 coord);
// Scaling
void scale(glm::vec2 scalingFactor);
+66 -6
View File
@@ -93,7 +93,15 @@ 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"
}
},
{
"adjustCamera",
& skybrowser::luascriptfunctions::adjustCamera,
{},
"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;
@@ -107,6 +115,7 @@ SkyBrowserModule::SkyBrowserModule()
, currentlyDraggingObject(false)
, resizeVector(0.f, 0.f)
, shouldInitialize(true)
, changeViewWithinBrowser(false)
{
global::callback::mousePosition->emplace_back(
[&](double x, double y) {
@@ -127,7 +136,37 @@ SkyBrowserModule::SkyBrowserModule()
_mousePosition = getMousePositionInScreenSpaceCoords(pos);
if (currentlyDraggingObject) {
_mouseOnObject->translate(_mousePosition - startDragMousePos, startDragObjectPos);
glm::dvec2 move = _mousePosition - startDragMousePos;
// Change view within the browser and move target accordingly to mousedrag movement
if (changeViewWithinBrowser) {
// WWT FOV
double WWTVerticalFOV = to_browser(_mouseOnObject)->fieldOfView();
glm::dvec2 browserDim = to_browser(_mouseOnObject)->getScreenSpaceDimensions();
double browserRatio = browserDim.x / browserDim.y;
glm::dvec2 WWTFOV = glm::dvec2(WWTVerticalFOV * browserRatio, WWTVerticalFOV);
// OpenSpace FOV
glm::dvec2 windowDim = global::windowDelegate->currentWindowSize();
double windowRatio = windowDim.y / windowDim.x;
double OpenSpaceHorizontalFOV = global::windowDelegate->getHorizFieldOfView();
glm::dvec2 OpenSpaceFOV = glm::dvec2(OpenSpaceHorizontalFOV, OpenSpaceHorizontalFOV * windowRatio);
glm::dvec2 angleResult = WWTFOV * (move / browserDim);
glm::dvec2 OSresult = angleResult / OpenSpaceFOV;
// Calculate translation in ScreenSpaceCoordinates
glm::dvec2 screenSpaceCoord{ (2 / windowRatio), 2.f };
glm::dvec2 result = screenSpaceCoord * OSresult;
to_browser(_mouseOnObject)->getSkyTarget()->translate(-result, startDragObjectPos);
}
// Move browser or target
else _mouseOnObject->translate(move, startDragObjectPos);
}
else if (currentlyResizingBrowser) {
// Calculate scaling factor
@@ -214,18 +253,22 @@ SkyBrowserModule::SkyBrowserModule()
currentlyDraggingObject = true;
return true;
}
}
else if (to_browser(_mouseOnObject) && button == MouseButton::Right) {
//startDragMousePos = _mousePosition;
//startDragObjectPos = dynamic_cast<ScreenSpaceSkyBrowser*>(_mouseOnObject)->->getScreenSpacePosition();
//currentlyDraggingObject = true;
// Change view (by moving target) within browser if right mouse click on browser
startDragMousePos = _mousePosition;
startDragObjectPos = to_browser(_mouseOnObject)->getSkyTarget()->getScreenSpacePosition();
changeViewWithinBrowser = true;
currentlyDraggingObject = true;
return true;
}
}
else if (action == MouseAction::Release) {
if (currentlyDraggingObject) {
currentlyDraggingObject = false;
changeViewWithinBrowser = false;
return true;
}
if (currentlyResizingBrowser) {
@@ -285,6 +328,23 @@ ScreenSpaceSkyTarget* SkyBrowserModule::to_target(ScreenSpaceRenderable* ptr) {
}
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::vector<documentation::Documentation> SkyBrowserModule::documentations() const {
return {
+4 -1
View File
@@ -49,10 +49,12 @@ public:
glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos);
void addRenderable(ScreenSpaceRenderable* object);
glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const;
scripting::LuaLibrary luaLibrary() const override;
//std::vector<documentation::Documentation> documentations() const override;
protected:
protected:
void internalInitialize(const ghoul::Dictionary& dict) override;
void internalDeinitialize() override;
// Using snake case on these casting functions to make them similar to eg std::to_string
@@ -67,6 +69,7 @@ protected:
// Dragging
glm::vec2 startDragMousePos;
glm::vec2 startDragObjectPos;
bool changeViewWithinBrowser;
// Resizing
glm::vec2 startResizeBrowserSize;
glm::vec2 resizeVector;
@@ -23,6 +23,9 @@
#include <openspace/util/camera.h>
#include <thread>
#include <openspace/util/coordinateconversion.h>
#include <glm/gtx/rotate_vector.hpp>
namespace {
constexpr const char _loggerCat[] = "SkyBrowserModule";
@@ -52,6 +55,11 @@ namespace openspace::skybrowser::luascriptfunctions {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::createBrowser");
return 1;
}
int adjustCamera(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::adjustCamera");
return 1;
}
@@ -18,10 +18,11 @@
#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
#include <openspace/util/coordinateconversion.h> // to adjust camera angle
#include <glm/gtx/vector_angle.hpp>
namespace {
constexpr const char* _loggerCat = "ScreenSpaceSkyBrowser";
@@ -79,7 +80,7 @@ namespace openspace {
setConnectedTarget();
}
else {
glm::vec2 dim = getScreenSpaceBrowserDimension();
glm::vec2 dim = getBrowserPixelDimensions();
_skyTarget->setDimensions(dim);
}
});
@@ -126,7 +127,7 @@ namespace openspace {
global::moduleEngine->module<SkyBrowserModule>()->addRenderable(this);
setConnectedTarget();
if (_skyTarget) {
_skyTarget->setDimensions(getScreenSpaceBrowserDimension());
_skyTarget->setDimensions(getBrowserPixelDimensions());
}
WWTfollowCamera();
@@ -149,12 +150,18 @@ namespace openspace {
return _skyTarget != nullptr;
}
ScreenSpaceSkyTarget* ScreenSpaceSkyBrowser::getSkyTarget() {
return _skyTarget;
}
float ScreenSpaceSkyBrowser::fieldOfView() const {
return _fieldOfView;
}
void ScreenSpaceSkyBrowser::scrollZoom(float scroll) {
float zoom = scroll > 0.0 ? -log(_fieldOfView + 1.1f) : log(_fieldOfView + 1.1f);
float zoomFactor = log(_fieldOfView + 1.1f);
float zoom = scroll > 0.0 ? -zoomFactor : zoomFactor;
_fieldOfView = std::clamp(_fieldOfView + zoom, 0.001f, 70.0f);
}
@@ -277,9 +284,6 @@ namespace openspace {
_cartesianPosition = glm::translate(glm::mat4(1.f), glm::vec3(translation, 0.0f)) * glm::vec4(position, 1.0f);
}*/
glm::vec2 ScreenSpaceSkyBrowser::coordIsOnResizeArea(glm::vec2 coord) {
glm::vec2 resizePosition = glm::vec2{ 0 };
// Make sure coord is on browser
@@ -338,7 +342,7 @@ namespace openspace {
_scale = _startScale * scalingFactor;
}
glm::vec2 ScreenSpaceSkyBrowser::getScreenSpaceBrowserDimension() {
glm::vec2 ScreenSpaceSkyBrowser::getBrowserPixelDimensions() {
return _browserDimensions.value();
}
}
@@ -72,7 +72,7 @@ namespace openspace {
: ScreenSpaceRenderable(dictionary)
, _targetDimensions(TargetDimensionInfo, glm::ivec2(1000.f), glm::ivec2(0.f), glm::ivec2(6000.f))
, _skyBrowserID(BrowserIDInfo)
, _showCrosshairThreshold(CrosshairThresholdInfo, 3.f, 1.f, 70.f)
, _showCrosshairThreshold(CrosshairThresholdInfo, 2.f, 1.f, 70.f)
, _borderColor(220.f, 220.f, 220.f)
{
// Handle target dimension property
@@ -204,7 +204,7 @@ namespace openspace {
glDisable(GL_CULL_FACE);
glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * scaleMatrix();
float borderWidth = 0.005f/_scale.value();
float borderWidth = 0.002f/_scale.value();
glm::vec2 targetDim;
bool showCrosshair;
_targetDimensions.value() == glm::vec2(0) ? targetDim = glm::vec2(1) : targetDim = _targetDimensions.value();