From c16ee0698f29d1e5c0f9b67d5cbbfd623761afa3 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 11 Mar 2021 11:40:55 +0100 Subject: [PATCH 1/5] Implement simple version of scroll --- modules/skybrowser/skybrowsermodule.cpp | 63 ++++++++++++++----- modules/skybrowser/skybrowsermodule.h | 16 +++-- modules/skybrowser/skybrowsermodule_lua.inl | 3 +- .../skybrowser/src/screenspaceskytarget.cpp | 19 ++++++ 4 files changed, 78 insertions(+), 23 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 475092d763..ce42ba3157 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -51,7 +51,6 @@ #include // formatJson #include - namespace { constexpr const openspace::properties::Property::PropertyInfo TestInfo = { @@ -88,7 +87,7 @@ SkyBrowserModule::SkyBrowserModule() , _zoomFactor(ZoomInfo, 50.f ,0.1f ,70.f) , _skyBrowser(nullptr) , _camIsSyncedWWT(true) - , mouseIsClickedPreviously(false) + , mouseIsClickedPreviouslyLeft(false) , _listenForInteractions(true) { addProperty(_testProperty); @@ -98,7 +97,20 @@ SkyBrowserModule::SkyBrowserModule() global::callback::mousePosition->emplace_back( [&](double x, double y) { - _mousePosition = glm::vec2(static_cast(x), static_cast(y)); + glm::vec2 pos = glm::vec2(static_cast(x), static_cast(y)); + _mousePosition = getMousePositionInScreenSpaceCoords(pos); + if (_skyBrowser) { + mouseIsOnBrowser = _skyBrowser->coordIsInsideBrowserScreenSpace(_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); + return true; } ); } @@ -203,37 +215,53 @@ void SkyBrowserModule::handleInteractions() { */ _threadHandleInteractions = std::thread([&] { while (_listenForInteractions) { - bool mouseIsClicked = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Left); + LINFO(std::to_string(_mouseScroll)); + bool mouseIsClickedLeft = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Left); + bool mouseIsClickedRight = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Right); - if (mouseIsClicked) { + if (mouseIsClickedLeft && !mouseIsClickedRight) { dragBrowser(); } else { - mouseIsClickedPreviously = false; + mouseIsClickedPreviouslyLeft = false; + } + if (mouseIsClickedRight && !mouseIsClickedLeft) { + moveTarget(); } } }); } -glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords() { +glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mousePos) { glm::vec2 size = glm::vec2(global::windowDelegate->currentWindowSize()); // Transform pixel coordinates to screen space coordinates [-1,1] - return glm::vec2((_mousePosition - (size / 2.0f)) * glm::vec2(1.0f,-1.0f) / (size / 2.0f)); + return glm::vec2((mousePos - (size / 2.0f)) * glm::vec2(1.0f,-1.0f) / (size / 2.0f)); } void SkyBrowserModule::dragBrowser() { // First click on browser - user is not holding down the button since last frame - glm::dvec2 mouseCoords = getMousePositionInScreenSpaceCoords(); - bool mouseIsOnBrowser = _skyBrowser->coordIsInsideBrowserScreenSpace(mouseCoords); - - if (mouseIsOnBrowser && !mouseIsClickedPreviously) { - mouseIsClickedPreviously = true; - startDragMousePos = mouseCoords; + // glm::dvec2 mouseCoords = + if (mouseIsOnBrowser && !mouseIsClickedPreviouslyLeft) { + mouseIsClickedPreviouslyLeft = true; + startDragMousePos = _mousePosition; startDragObjectPos = _skyBrowser->getScreenSpacePosition(); } - else if (mouseIsClickedPreviously) { - _skyBrowser->translate(mouseCoords - startDragMousePos, startDragObjectPos); + else if (mouseIsClickedPreviouslyLeft) { + _skyBrowser->translate(_mousePosition - startDragMousePos, startDragObjectPos); + } +} + +void SkyBrowserModule::moveTarget() { + // First click on browser - user is not holding down the button since last frame + + if (mouseIsOnBrowser && !mouseIsClickedPreviouslyRight) { + mouseIsClickedPreviouslyRight = true; + startDragMousePos = _mousePosition; + // startDragObjectPos = _skyTarget->getScreenSpacePosition(); + } + else if (mouseIsClickedPreviouslyRight) { + // _skyTarget->translate(mouseCoords - startDragMousePos, startDragObjectPos); } } @@ -290,8 +318,9 @@ ghoul::Dictionary SkyBrowserModule::createMessageForPausingWWTTime() const { } -void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser) { +void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget) { _skyBrowser = skyBrowser; + _skyTarget = skyTarget; } ScreenSpaceSkyBrowser* SkyBrowserModule::skyBrowser() { diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index cd20b4f7fd..ca2860972c 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -61,10 +61,11 @@ public: bool sendMessageToWWT(const ghoul::Dictionary& msg); void handleInteractions(); - glm::vec2 getMousePositionInScreenSpaceCoords(); + glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos); void dragBrowser(); + void moveTarget(); - void initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser_); + void initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget); ScreenSpaceSkyBrowser* skyBrowser(); scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; @@ -76,14 +77,19 @@ protected: properties::StringProperty _testProperty; properties::FloatProperty _zoomFactor; ScreenSpaceSkyBrowser* _skyBrowser; + ScreenSpaceSkyTarget* _skyTarget; bool _camIsSyncedWWT; bool _listenForInteractions; std::thread _threadWWTMessages; std::thread _threadHandleInteractions; - glm::dvec2 startDragMousePos; - glm::dvec2 startDragObjectPos; - bool mouseIsClickedPreviously; + glm::vec2 startDragMousePos; + glm::vec2 startDragObjectPos; + bool mouseIsClickedPreviouslyLeft; + bool mouseIsClickedPreviouslyRight; glm::vec2 _mousePosition; + double _mouseScroll; + bool mouseIsOnBrowser; + }; } // namespace openspace diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index fe1fe696b0..16151bacc8 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -57,7 +57,8 @@ namespace openspace::skybrowser::luascriptfunctions { SkyBrowserModule* module = global::moduleEngine->module(); ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser")); - module->initializeBrowser(browser); + ScreenSpaceSkyTarget* target = dynamic_cast(global::renderEngine->screenSpaceRenderable("Target")); + module->initializeBrowser(browser, target); module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0)); module->checkIfTargetExist(); diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index 436403091f..2b382dba23 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -23,6 +23,8 @@ #include #include +#include + namespace { constexpr const char* _loggerCat = "ScreenSpaceSkyTarget"; @@ -45,6 +47,23 @@ namespace openspace { } identifier = makeUniqueIdentifier(identifier); setIdentifier(identifier); + + std::unique_ptr texture = + ghoul::io::TextureReader::ref().loadTexture(absPath("D:/Ylvas/OpenSpace/modules/skybrowser/target.png")); + + if (texture) { + // Images don't need to start on 4-byte boundaries, for example if the + // image is only RGB + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + texture->uploadTexture(); + texture->setFilter(ghoul::opengl::Texture::FilterMode::LinearMipMap); + texture->purgeFromRAM(); + + _texture = std::move(texture); + _objectSize = _texture->dimensions(); + _scale = 0.1f; + } } void ScreenSpaceSkyTarget::bindTexture() { From ebcbce56f5b91aad6e76ea341f21c8de00a88d4e Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 11 Mar 2021 14:00:12 +0100 Subject: [PATCH 2/5] Add functionality to drag target --- .../include/screenspaceskybrowser.h | 2 +- .../skybrowser/include/screenspaceskytarget.h | 11 +++- modules/skybrowser/skybrowsermodule.cpp | 46 +++++++------ modules/skybrowser/skybrowsermodule.h | 7 +- modules/skybrowser/skybrowsermodule_lua.inl | 2 +- .../skybrowser/src/screenspaceskybrowser.cpp | 2 +- .../skybrowser/src/screenspaceskytarget.cpp | 65 ++++++++++++++++++- 7 files changed, 107 insertions(+), 28 deletions(-) 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; + } } From c9fc1765ad3b9da5c88b84831c0b9a66af838ad2 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 11 Mar 2021 16:12:23 +0100 Subject: [PATCH 3/5] Change drag function of target and browser to callback function --- modules/skybrowser/skybrowsermodule.cpp | 118 +++++++++++--------- modules/skybrowser/skybrowsermodule.h | 7 +- modules/skybrowser/skybrowsermodule_lua.inl | 3 +- 3 files changed, 68 insertions(+), 60 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index acd15c69bc..f381f0a476 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -88,23 +88,34 @@ SkyBrowserModule::SkyBrowserModule() , _skyBrowser(nullptr) , _skyTarget(nullptr) , _camIsSyncedWWT(true) - , mouseIsClickedPreviouslyLeft(false) + , currentlyDraggingBrowser(false) + , currentlyDraggingTarget(false) , _listenForInteractions(true) , mouseIsOnBrowser(false) , mouseIsOnTarget(false) + { addProperty(_testProperty); addProperty(_zoomFactor); + + global::callback::mousePosition->emplace_back( - [&](double x, double y) { + [&](double x, double y) { glm::vec2 pos = glm::vec2(static_cast(x), static_cast(y)); _mousePosition = getMousePositionInScreenSpaceCoords(pos); - if (_skyBrowser) { - mouseIsOnBrowser = _skyBrowser->coordIsInsideCornersScreenSpace(_mousePosition); - } + if (_skyTarget) { - mouseIsOnTarget = _skyTarget->coordIsInsideCornersScreenSpace(_mousePosition); + mouseIsOnTarget = _skyTarget->coordIsInsideCornersScreenSpace(_mousePosition); + } + else { + mouseIsOnTarget = false; + } + if (_skyBrowser) { + mouseIsOnBrowser = _skyBrowser->coordIsInsideCornersScreenSpace(_mousePosition); + } + else { + mouseIsOnBrowser = false; } } ); @@ -114,11 +125,49 @@ SkyBrowserModule::SkyBrowserModule() if (mouseIsOnBrowser) { float zoom = scroll > 0.0 ? -2.0f : 2.0f; _zoomFactor = std::clamp(_zoomFactor + zoom, 0.001f, 70.0f); + return true; } - return true; + return false; } ); + + global::callback::mouseButton->emplace_back( + [&](MouseButton button, MouseAction action, KeyModifier modifier) -> bool { + + if (action == MouseAction::Press) { + + if (mouseIsOnBrowser && button == MouseButton::Left) { + + startDragMousePosBrowser = _mousePosition; + startDragObjectPosBrowser = _skyBrowser->getScreenSpacePosition(); + currentlyDraggingBrowser = true; + return true; + } + else if (mouseIsOnTarget && button == MouseButton::Left) { + + startDragMousePosTarget = _mousePosition; + startDragObjectPosTarget = _skyTarget->getScreenSpacePosition(); + currentlyDraggingTarget = true; + return true; + } + } + else if (action == MouseAction::Release) { + if (currentlyDraggingBrowser) { + currentlyDraggingBrowser = false; + return true; + } + if (currentlyDraggingTarget) { + currentlyDraggingTarget = false; + return true; + } + } + + return false; + } + ); + + } void SkyBrowserModule::internalDeinitialize() { @@ -210,32 +259,18 @@ bool SkyBrowserModule::sendMessageToWWT(const ghoul::Dictionary& msg) { } void SkyBrowserModule::handleInteractions() { - /* - float scroll = global::navigationHandler->inputState().mouseScrollDelta(); - bool mouseIsOverBrowser = _skyBrowser->coordIsInsideBrowserScreenSpace(getMousePositionInScreenSpaceCoords()); - LINFO(std::to_string(mouseIsOverBrowser)); - - _zoomFactor = std::clamp(_zoomFactor - scroll, 0.001f, 70.0f); + /* CefStructBase event; _skyBrowser->sendMouseEvent(event, scroll, scroll); */ _threadHandleInteractions = std::thread([&] { while (_listenForInteractions) { - bool mouseIsClickedLeft = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Left); - bool mouseIsClickedRight = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Right); - if (mouseIsClickedLeft && !mouseIsClickedRight) { - dragBrowser(); + if (currentlyDraggingBrowser) { + _skyBrowser->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget); } - else { - mouseIsClickedPreviouslyLeft = false; - - } - if (mouseIsClickedRight && !mouseIsClickedLeft) { - moveTarget(); - } - else { - mouseIsClickedPreviouslyRight = false; + if (currentlyDraggingTarget) { + _skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget); } } }); @@ -248,31 +283,6 @@ glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mouse return glm::vec2((mousePos - (size / 2.0f)) * glm::vec2(1.0f,-1.0f) / (size / 2.0f)); } -void SkyBrowserModule::dragBrowser() { - // First click on browser - user is not holding down the button since last frame - if (mouseIsOnBrowser && !mouseIsClickedPreviouslyLeft) { - mouseIsClickedPreviouslyLeft = true; - startDragMousePosBrowser = _mousePosition; - startDragObjectPosBrowser = _skyBrowser->getScreenSpacePosition(); - } - else if (mouseIsClickedPreviouslyLeft) { - _skyBrowser->translate(_mousePosition - startDragMousePosBrowser, startDragObjectPosBrowser); - } -} - -void SkyBrowserModule::moveTarget() { - // First click on browser - user is not holding down the button since last frame - if (mouseIsOnTarget && !mouseIsClickedPreviouslyRight) { - mouseIsClickedPreviouslyRight = true; - startDragMousePosTarget = _mousePosition; - startDragObjectPosTarget = _skyTarget->getScreenSpacePosition(); - LINFO(glm::to_string(startDragObjectPosTarget)); - } - else if (mouseIsClickedPreviouslyRight) { - _skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget); - } -} - void SkyBrowserModule::WWTfollowCamera() { // Start a thread to enable user interaction while sending the calls to WWT @@ -289,8 +299,10 @@ 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 { @@ -323,6 +335,7 @@ ghoul::Dictionary SkyBrowserModule::createMessageForPausingWWTTime() const { return msg; } + void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget) { _skyBrowser = skyBrowser; _skyTarget = skyTarget; @@ -371,8 +384,7 @@ void SkyBrowserModule::createTarget() { "Type = 'ScreenSpaceSkyTarget'," "Identifier = 'ScreenSpaceTarget'," "Name = 'Screen Space Target'," - "FaceCamera = false ," - "Scale = 0.25" + "FaceCamera = false" "}"; openspace::global::scriptEngine->queueScript( diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 4de0833147..a6d0e9fc34 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -62,8 +62,6 @@ public: bool sendMessageToWWT(const ghoul::Dictionary& msg); void handleInteractions(); glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos); - void dragBrowser(); - void moveTarget(); void initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget); ScreenSpaceSkyBrowser* skyBrowser(); @@ -86,13 +84,12 @@ protected: glm::vec2 startDragObjectPosBrowser; glm::vec2 startDragMousePosTarget; glm::vec2 startDragObjectPosTarget; - bool mouseIsClickedPreviouslyLeft; - bool mouseIsClickedPreviouslyRight; + bool currentlyDraggingBrowser; + bool currentlyDraggingTarget; glm::vec2 _mousePosition; double _mouseScroll; bool mouseIsOnBrowser; bool mouseIsOnTarget; - }; } // namespace openspace diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index b7e794193d..b6616cb928 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -44,8 +44,7 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::followCamera"); SkyBrowserModule* module = global::moduleEngine->module(); - //ghoul::Dictionary message = module->createMessageForPausingWWTTime(); - //module->sendMessageToWWT(message); + module->WWTfollowCamera(); module->handleInteractions(); From 06ffdecc90a1577928b53c27f4c4e02726dfa41d Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 11 Mar 2021 16:19:17 +0100 Subject: [PATCH 4/5] Fix small error of dragging --- modules/skybrowser/skybrowsermodule.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index f381f0a476..ace0487eb7 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -99,7 +99,6 @@ SkyBrowserModule::SkyBrowserModule() addProperty(_zoomFactor); - global::callback::mousePosition->emplace_back( [&](double x, double y) { glm::vec2 pos = glm::vec2(static_cast(x), static_cast(y)); @@ -146,6 +145,13 @@ SkyBrowserModule::SkyBrowserModule() } else if (mouseIsOnTarget && button == MouseButton::Left) { + startDragMousePosTarget = _mousePosition; + startDragObjectPosTarget = _skyTarget->getScreenSpacePosition(); + currentlyDraggingTarget = true; + return true; + } + else if (mouseIsOnBrowser && button == MouseButton::Right) { + startDragMousePosTarget = _mousePosition; startDragObjectPosTarget = _skyTarget->getScreenSpacePosition(); currentlyDraggingTarget = true; @@ -267,7 +273,7 @@ void SkyBrowserModule::handleInteractions() { while (_listenForInteractions) { if (currentlyDraggingBrowser) { - _skyBrowser->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget); + _skyBrowser->translate(_mousePosition - startDragMousePosBrowser, startDragObjectPosBrowser); } if (currentlyDraggingTarget) { _skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget); From 3bc5d00aaaf9000826ab96023b83c303663e903f Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 11 Mar 2021 16:19:17 +0100 Subject: [PATCH 5/5] Add functionality to drag target when dragging on zoom window --- modules/skybrowser/skybrowsermodule.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index f381f0a476..ace0487eb7 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -99,7 +99,6 @@ SkyBrowserModule::SkyBrowserModule() addProperty(_zoomFactor); - global::callback::mousePosition->emplace_back( [&](double x, double y) { glm::vec2 pos = glm::vec2(static_cast(x), static_cast(y)); @@ -146,6 +145,13 @@ SkyBrowserModule::SkyBrowserModule() } else if (mouseIsOnTarget && button == MouseButton::Left) { + startDragMousePosTarget = _mousePosition; + startDragObjectPosTarget = _skyTarget->getScreenSpacePosition(); + currentlyDraggingTarget = true; + return true; + } + else if (mouseIsOnBrowser && button == MouseButton::Right) { + startDragMousePosTarget = _mousePosition; startDragObjectPosTarget = _skyTarget->getScreenSpacePosition(); currentlyDraggingTarget = true; @@ -267,7 +273,7 @@ void SkyBrowserModule::handleInteractions() { while (_listenForInteractions) { if (currentlyDraggingBrowser) { - _skyBrowser->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget); + _skyBrowser->translate(_mousePosition - startDragMousePosBrowser, startDragObjectPosBrowser); } if (currentlyDraggingTarget) { _skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget);