diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index b87900f3f8..525d61bafe 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -18,7 +18,7 @@ namespace openspace { void sendMouseEvent(CefStructBase event, int x, int y) const; glm::vec2 getUpperRightCornerScreenSpace(); glm::vec2 getLowerLeftCornerScreenSpace(); - bool coordIsInsideBrowserScreenSpace(glm::vec2 coord); + bool coordIsInsideCornersScreenSpace(glm::vec2 coord); private: }; diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index 7a923e0838..c9531b31ca 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -17,7 +17,16 @@ namespace openspace { public: ScreenSpaceSkyTarget(const ghoul::Dictionary& dictionary); virtual ~ScreenSpaceSkyTarget() = default; - + glm::vec2 getScreenSpacePosition(); + + void translate(glm::vec2 translation, glm::vec2 position); + + glm::vec2 getScreenSpaceDimensions(); + glm::vec2 getUpperRightCornerScreenSpace(); + glm::vec2 getLowerLeftCornerScreenSpace(); + bool coordIsInsideCornersScreenSpace(glm::vec2 coord); + + void bindTexture() override; private: std::unique_ptr _texture; diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index ce42ba3157..acd15c69bc 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -86,30 +86,36 @@ SkyBrowserModule::SkyBrowserModule() , _testProperty(TestInfo) , _zoomFactor(ZoomInfo, 50.f ,0.1f ,70.f) , _skyBrowser(nullptr) + , _skyTarget(nullptr) , _camIsSyncedWWT(true) , mouseIsClickedPreviouslyLeft(false) , _listenForInteractions(true) + , mouseIsOnBrowser(false) + , mouseIsOnTarget(false) { addProperty(_testProperty); addProperty(_zoomFactor); - createTarget(); - global::callback::mousePosition->emplace_back( [&](double x, double y) { glm::vec2 pos = glm::vec2(static_cast(x), static_cast(y)); _mousePosition = getMousePositionInScreenSpaceCoords(pos); if (_skyBrowser) { - mouseIsOnBrowser = _skyBrowser->coordIsInsideBrowserScreenSpace(_mousePosition); + mouseIsOnBrowser = _skyBrowser->coordIsInsideCornersScreenSpace(_mousePosition); + } + if (_skyTarget) { + mouseIsOnTarget = _skyTarget->coordIsInsideCornersScreenSpace(_mousePosition); } - } ); global::callback::mouseScrollWheel->emplace_back( [&](double, double scroll) -> bool { - float zoom = scroll > 0.0 ? -2.0f : 2.0f; - _zoomFactor = std::clamp(_zoomFactor + zoom, 0.001f, 70.0f); + if (mouseIsOnBrowser) { + float zoom = scroll > 0.0 ? -2.0f : 2.0f; + _zoomFactor = std::clamp(_zoomFactor + zoom, 0.001f, 70.0f); + } + return true; } ); @@ -215,7 +221,6 @@ void SkyBrowserModule::handleInteractions() { */ _threadHandleInteractions = std::thread([&] { while (_listenForInteractions) { - LINFO(std::to_string(_mouseScroll)); bool mouseIsClickedLeft = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Left); bool mouseIsClickedRight = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Right); @@ -224,10 +229,14 @@ void SkyBrowserModule::handleInteractions() { } else { mouseIsClickedPreviouslyLeft = false; + } if (mouseIsClickedRight && !mouseIsClickedLeft) { moveTarget(); } + else { + mouseIsClickedPreviouslyRight = false; + } } }); } @@ -241,27 +250,26 @@ glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mouse void SkyBrowserModule::dragBrowser() { // First click on browser - user is not holding down the button since last frame - // glm::dvec2 mouseCoords = if (mouseIsOnBrowser && !mouseIsClickedPreviouslyLeft) { mouseIsClickedPreviouslyLeft = true; - startDragMousePos = _mousePosition; - startDragObjectPos = _skyBrowser->getScreenSpacePosition(); + startDragMousePosBrowser = _mousePosition; + startDragObjectPosBrowser = _skyBrowser->getScreenSpacePosition(); } else if (mouseIsClickedPreviouslyLeft) { - _skyBrowser->translate(_mousePosition - startDragMousePos, startDragObjectPos); + _skyBrowser->translate(_mousePosition - startDragMousePosBrowser, startDragObjectPosBrowser); } } void SkyBrowserModule::moveTarget() { // First click on browser - user is not holding down the button since last frame - - if (mouseIsOnBrowser && !mouseIsClickedPreviouslyRight) { + if (mouseIsOnTarget && !mouseIsClickedPreviouslyRight) { mouseIsClickedPreviouslyRight = true; - startDragMousePos = _mousePosition; - // startDragObjectPos = _skyTarget->getScreenSpacePosition(); + startDragMousePosTarget = _mousePosition; + startDragObjectPosTarget = _skyTarget->getScreenSpacePosition(); + LINFO(glm::to_string(startDragObjectPosTarget)); } else if (mouseIsClickedPreviouslyRight) { - // _skyTarget->translate(mouseCoords - startDragMousePos, startDragObjectPos); + _skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget); } } @@ -281,10 +289,8 @@ void SkyBrowserModule::WWTfollowCamera() { // 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 { @@ -317,7 +323,6 @@ ghoul::Dictionary SkyBrowserModule::createMessageForPausingWWTTime() const { return msg; } - void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget) { _skyBrowser = skyBrowser; _skyTarget = skyTarget; @@ -366,7 +371,8 @@ void SkyBrowserModule::createTarget() { "Type = 'ScreenSpaceSkyTarget'," "Identifier = 'ScreenSpaceTarget'," "Name = 'Screen Space Target'," - "FaceCamera = false" + "FaceCamera = false ," + "Scale = 0.25" "}"; openspace::global::scriptEngine->queueScript( diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index ca2860972c..4de0833147 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -82,13 +82,16 @@ protected: bool _listenForInteractions; std::thread _threadWWTMessages; std::thread _threadHandleInteractions; - glm::vec2 startDragMousePos; - glm::vec2 startDragObjectPos; + glm::vec2 startDragMousePosBrowser; + glm::vec2 startDragObjectPosBrowser; + glm::vec2 startDragMousePosTarget; + glm::vec2 startDragObjectPosTarget; bool mouseIsClickedPreviouslyLeft; bool mouseIsClickedPreviouslyRight; glm::vec2 _mousePosition; double _mouseScroll; bool mouseIsOnBrowser; + bool mouseIsOnTarget; }; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 16151bacc8..b7e794193d 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -57,7 +57,7 @@ namespace openspace::skybrowser::luascriptfunctions { SkyBrowserModule* module = global::moduleEngine->module(); ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser")); - ScreenSpaceSkyTarget* target = dynamic_cast(global::renderEngine->screenSpaceRenderable("Target")); + ScreenSpaceSkyTarget* target = dynamic_cast(global::renderEngine->screenSpaceRenderable("ScreenSpaceTarget")); module->initializeBrowser(browser, target); module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0)); module->checkIfTargetExist(); diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 5e3ffdfa3b..c212535e6e 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -119,7 +119,7 @@ namespace openspace { return getScreenSpacePosition() - (getScreenSpaceDimensions()/2.0f); } - bool ScreenSpaceSkyBrowser::coordIsInsideBrowserScreenSpace(glm::vec2 coord) { + bool ScreenSpaceSkyBrowser::coordIsInsideCornersScreenSpace(glm::vec2 coord) { bool lessThanUpperRight = coord.x < getUpperRightCornerScreenSpace().x && coord.y < getUpperRightCornerScreenSpace().y; bool moreThanLowerLeft = coord.x > getLowerLeftCornerScreenSpace().x && coord.y > getLowerLeftCornerScreenSpace().y; return lessThanUpperRight && moreThanLowerLeft; diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index 2b382dba23..2fc605d0a8 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -24,6 +24,8 @@ #include #include +#include +#include namespace { constexpr const char* _loggerCat = "ScreenSpaceSkyTarget"; @@ -62,7 +64,6 @@ namespace openspace { _texture = std::move(texture); _objectSize = _texture->dimensions(); - _scale = 0.1f; } } @@ -71,5 +72,65 @@ namespace openspace { _texture->bind(); } } - + + void ScreenSpaceSkyTarget::translate(glm::vec2 translation, glm::vec2 position) { + + glm::vec2 windowRatio = global::windowDelegate->currentWindowSize(); + windowRatio /= windowRatio.y; + + _cartesianPosition = glm::translate(glm::mat4(1.f), glm::vec3(translation * windowRatio, 0.0f)) * glm::vec4(position * windowRatio, _cartesianPosition.value().z, 1.0f); + } + + glm::vec2 ScreenSpaceSkyTarget::getScreenSpacePosition() { + glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * + localRotationMatrix() * scaleMatrix(); + glm::mat4 viewProj = global::renderEngine->scene()->camera()->viewProjectionMatrix(); + glm::mat4 screenSpaceTransform = viewProj * modelTransform; + + glm::vec3 scale; + glm::quat rotation; + glm::vec3 translation; + glm::vec3 skew; + glm::vec4 perspective; + glm::decompose(screenSpaceTransform, scale, rotation, translation, skew, perspective); + + return translation; + } + + glm::vec2 ScreenSpaceSkyTarget::getScreenSpaceDimensions() { + glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * + localRotationMatrix() * scaleMatrix(); + glm::mat4 viewProj = global::renderEngine->scene()->camera()->viewProjectionMatrix(); + glm::mat4 screenSpaceTransform = viewProj * modelTransform; + + + glm::vec3 scale; + glm::quat rotation; + glm::vec3 translation; + glm::vec3 skew; + glm::vec4 perspective; + glm::decompose(screenSpaceTransform, scale, rotation, translation, skew, perspective); + + // Scale is negative and relative to the whole screen + // Changing to positive and View Coordinates [-1,1] + // E.g. a full screen screenspacebrowser will have [2,2] + scale = -2.0f * scale; + + return scale; + } + + glm::vec2 ScreenSpaceSkyTarget::getUpperRightCornerScreenSpace() { + + return getScreenSpacePosition() + (getScreenSpaceDimensions() / 2.0f); + } + + glm::vec2 ScreenSpaceSkyTarget::getLowerLeftCornerScreenSpace() { + return getScreenSpacePosition() - (getScreenSpaceDimensions() / 2.0f); + } + + bool ScreenSpaceSkyTarget::coordIsInsideCornersScreenSpace(glm::vec2 coord) { + bool lessThanUpperRight = coord.x < getUpperRightCornerScreenSpace().x && coord.y < getUpperRightCornerScreenSpace().y; + bool moreThanLowerLeft = coord.x > getLowerLeftCornerScreenSpace().x && coord.y > getLowerLeftCornerScreenSpace().y; + return lessThanUpperRight && moreThanLowerLeft; + } }