Add functionality to drag target

This commit is contained in:
Ylva Selling
2021-03-11 14:00:12 +01:00
parent c16ee0698f
commit ebcbce56f5
7 changed files with 107 additions and 28 deletions

View File

@@ -18,7 +18,7 @@ namespace openspace {
void sendMouseEvent(CefStructBase<CefMouseEventTraits> event, int x, int y) const;
glm::vec2 getUpperRightCornerScreenSpace();
glm::vec2 getLowerLeftCornerScreenSpace();
bool coordIsInsideBrowserScreenSpace(glm::vec2 coord);
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
private:
};

View File

@@ -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<ghoul::opengl::Texture> _texture;

View File

@@ -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<float>(x), static_cast<float>(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(

View File

@@ -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;
};

View File

@@ -57,7 +57,7 @@ namespace openspace::skybrowser::luascriptfunctions {
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser"));
ScreenSpaceSkyTarget* target = dynamic_cast<ScreenSpaceSkyTarget*>(global::renderEngine->screenSpaceRenderable("Target"));
ScreenSpaceSkyTarget* target = dynamic_cast<ScreenSpaceSkyTarget*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceTarget"));
module->initializeBrowser(browser, target);
module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0));
module->checkIfTargetExist();

View File

@@ -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;

View File

@@ -24,6 +24,8 @@
#include <glm/gtx/string_cast.hpp>
#include <ghoul/filesystem/filesystem.h>
#include <openspace/engine/windowdelegate.h>
#include <glm/gtx/matrix_decompose.hpp>
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;
}
}