diff --git a/modules/skybrowser/include/renderableskytarget.h b/modules/skybrowser/include/renderableskytarget.h index 8aa0b2a2d3..8279f17606 100644 --- a/modules/skybrowser/include/renderableskytarget.h +++ b/modules/skybrowser/include/renderableskytarget.h @@ -57,6 +57,8 @@ public: static documentation::Documentation Documentation(); + glm::dvec3 rightVector(); + glm::dvec3 upVector(); private: // Properties properties::FloatProperty _crossHairSize; @@ -67,6 +69,8 @@ private: double _borderRadius = 0.0; glm::ivec3 _borderColor = glm::ivec3(230); float _ratio = 1.f; + glm::dvec3 _rightVector; + glm::dvec3 _upVector; }; } // namespace openspace diff --git a/modules/skybrowser/src/renderableskytarget.cpp b/modules/skybrowser/src/renderableskytarget.cpp index a0356dc2af..1bb88121b5 100644 --- a/modules/skybrowser/src/renderableskytarget.cpp +++ b/modules/skybrowser/src/renderableskytarget.cpp @@ -151,6 +151,16 @@ glm::ivec3 RenderableSkyTarget::borderColor() const { return _borderColor; } +glm::dvec3 RenderableSkyTarget::rightVector() { + double scaling = (_verticalFov / 70)* static_cast(_size.value()); + return scaling * _rightVector; +} + +glm::dvec3 RenderableSkyTarget::upVector() { + double scaling = (_verticalFov / 70) * static_cast(_size.value()); + return scaling * _upVector; +} + void RenderableSkyTarget::render(const RenderData& data, RendererTasks&) { ZoneScoped const bool showRectangle = _verticalFov > _showRectangleThreshold; @@ -175,14 +185,14 @@ void RenderableSkyTarget::render(const RenderData& data, RendererTasks&) { ); glm::dvec3 normal = glm::normalize(data.camera.positionVec3() - objectPositionWorld); - glm::dvec3 newRight = glm::normalize( + _rightVector = glm::normalize( glm::cross(data.camera.lookUpVectorWorldSpace(), normal) ); - glm::dvec3 newUp = glm::cross(normal, newRight); + _upVector = glm::cross(normal, _rightVector); glm::dmat4 cameraOrientedRotation = glm::dmat4(1.0); - cameraOrientedRotation[0] = glm::dvec4(newRight, 0.0); - cameraOrientedRotation[1] = glm::dvec4(newUp, 0.0); + cameraOrientedRotation[0] = glm::dvec4(_rightVector, 0.0); + cameraOrientedRotation[1] = glm::dvec4(_upVector, 0.0); cameraOrientedRotation[2] = glm::dvec4(normal, 0.0); const glm::dmat4 rotationTransform = _billboard ? diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index 68a1207a92..fc9ca529e1 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -81,30 +81,15 @@ void TargetBrowserPair::startFinetuningTarget() { // The fine tune of the target is a way to "drag and drop" the target with click // drag on the sky browser window. This is to be able to drag the target around when it // has a very small field of view -void TargetBrowserPair::fineTuneTarget(const glm::vec2& translation) -{ - glm::dvec3 startTarget = skybrowser::galacticToEquatorial( - glm::normalize(_startTargetPosition) - ); - glm::dvec2 multiplierRight = { -1.0, 1.0 }; - glm::dvec2 multiplierLeft = { 1.0, -1.0 }; - glm::dvec2 drag = glm::dvec2(translation); - glm::dvec2 fovs = _browser->fieldsOfView(); - glm::dvec3 cartUpperRight = skybrowser::sphericalToCartesian(fovs * multiplierRight); - glm::dvec3 cartLowerLeft = skybrowser::sphericalToCartesian(fovs * multiplierLeft); - glm::dvec3 cartUpperLeft = skybrowser::sphericalToCartesian(fovs); - glm::dvec3 upperRightCorner = startTarget - 0.5 * cartUpperRight; - glm::dvec3 lowerLeftCorner = startTarget - 0.5 * cartLowerLeft; - glm::dvec3 upperLeftCorner = startTarget - 0.5 * cartUpperLeft; +void TargetBrowserPair::fineTuneTarget(const glm::vec2& translation) { + glm::dvec2 percentage = glm::dvec2(translation); + glm::dvec3 right = _targetRenderable->rightVector() * percentage.x; + glm::dvec3 up = _targetRenderable->upVector() * percentage.y; - glm::dvec3 vecToRight = (upperRightCorner - upperLeftCorner) * drag.x; - glm::dvec3 vecToDown = (lowerLeftCorner - upperLeftCorner) * drag.y; - - - glm::dvec3 newCartesian = startTarget - (vecToRight + vecToDown); + glm::dvec3 newCartesian = _startTargetPosition - (right - up); aimTargetGalactic( _targetNode->identifier(), - skybrowser::equatorialToGalactic(newCartesian) + newCartesian ); }