mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-05-01 00:09:58 -05:00
Add function to drag and change view within browser
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user