From 1fa6e294e7bc7e262e450c34cc93502b72ef1029 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 19 Feb 2016 17:49:33 -0800 Subject: [PATCH] allow mouse to move outside of the overlay extents --- interface/src/ui/ApplicationCompositor.cpp | 25 ++++++++++++++++------ interface/src/ui/ApplicationCompositor.h | 6 +++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index 6c073be175..7f456acc2b 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -38,11 +38,12 @@ static const float reticleSize = TWO_PI / 100.0f; static const float CURSOR_PIXEL_SIZE = 32.0f; -static const float DEFAULT_HMD_UI_ANGULAR_SIZE_IN_RADIANS = (DEFAULT_HMD_UI_ANGULAR_SIZE / 180.0f) * PI; +static const float DEFAULT_HMD_UI_VERT_ANGULAR_SIZE_IN_RADIANS = (DEFAULT_HMD_UI_VERT_ANGULAR_SIZE / 180.0f) * PI; static const float DEFAULT_HMD_UI_HORZ_ANGULAR_SIZE_IN_RADIANS = (DEFAULT_HMD_UI_HORZ_ANGULAR_SIZE / 180.0f) * PI; -static const float MOUSE_PITCH_RANGE = DEFAULT_HMD_UI_ANGULAR_SIZE_IN_RADIANS; -static const float MOUSE_YAW_RANGE = VIRTUAL_SCREEN_SIZE_X / VIRTUAL_SCREEN_SIZE_Y * DEFAULT_HMD_UI_ANGULAR_SIZE_IN_RADIANS; -static const glm::vec2 MOUSE_RANGE(MOUSE_YAW_RANGE, MOUSE_PITCH_RANGE); + +//static const float MOUSE_PITCH_RANGE = DEFAULT_HMD_UI_ANGULAR_SIZE_IN_RADIANS; +//static const float MOUSE_YAW_RANGE = VIRTUAL_SCREEN_SIZE_X / VIRTUAL_SCREEN_SIZE_Y * DEFAULT_HMD_UI_ANGULAR_SIZE_IN_RADIANS; +//static const glm::vec2 MOUSE_RANGE(MOUSE_YAW_RANGE, MOUSE_PITCH_RANGE); static gpu::BufferPointer _hemiVertices; static gpu::BufferPointer _hemiIndices; @@ -378,10 +379,22 @@ glm::vec2 ApplicationCompositor::getReticlePosition() { } return toGlm(QCursor::pos()); } + void ApplicationCompositor::setReticlePosition(glm::vec2 position, bool sendFakeEvent) { if (qApp->isHMDMode()) { - glm::vec2 maxReticlePosition = qApp->getUiSize(); - _reticlePositionInHMD = glm::clamp(position, vec2(0), maxReticlePosition); + const float MOUSE_EXTENTS_VERT_ANGULAR_SIZE = 170.0f; // 5deg from poles + const float MOUSE_EXTENTS_VERT_PIXELS = VIRTUAL_SCREEN_SIZE_Y * (MOUSE_EXTENTS_VERT_ANGULAR_SIZE / DEFAULT_HMD_UI_VERT_ANGULAR_SIZE); + const float MOUSE_EXTENTS_HORZ_ANGULAR_SIZE = 360.0f; // full sphere + const float MOUSE_EXTENTS_HORZ_PIXELS = VIRTUAL_SCREEN_SIZE_X * (MOUSE_EXTENTS_HORZ_ANGULAR_SIZE / DEFAULT_HMD_UI_HORZ_ANGULAR_SIZE); + + glm::vec2 maxOverlayPosition = qApp->getUiSize(); + float extaPixelsX = (MOUSE_EXTENTS_HORZ_PIXELS - maxOverlayPosition.x) / 2.0f; + float extaPixelsY = (MOUSE_EXTENTS_VERT_PIXELS - maxOverlayPosition.y) / 2.0f; + glm::vec2 mouseExtra { extaPixelsX, extaPixelsY }; + glm::vec2 minMouse = vec2(0) - mouseExtra; + glm::vec2 maxMouse = maxOverlayPosition + mouseExtra; + + _reticlePositionInHMD = glm::clamp(position, minMouse, maxMouse); if (sendFakeEvent) { // in HMD mode we need to fake our mouse moves... diff --git a/interface/src/ui/ApplicationCompositor.h b/interface/src/ui/ApplicationCompositor.h index 7523204f50..db8f42881e 100644 --- a/interface/src/ui/ApplicationCompositor.h +++ b/interface/src/ui/ApplicationCompositor.h @@ -35,7 +35,7 @@ const float MAGNIFY_MULT = 2.0f; const int VIRTUAL_SCREEN_SIZE_X = 3840; const int VIRTUAL_SCREEN_SIZE_Y = 1536; const float DEFAULT_HMD_UI_HORZ_ANGULAR_SIZE = 180.0f; -const float DEFAULT_HMD_UI_ANGULAR_SIZE = DEFAULT_HMD_UI_HORZ_ANGULAR_SIZE * (float)VIRTUAL_SCREEN_SIZE_Y / (float)VIRTUAL_SCREEN_SIZE_X; +const float DEFAULT_HMD_UI_VERT_ANGULAR_SIZE = DEFAULT_HMD_UI_HORZ_ANGULAR_SIZE * (float)VIRTUAL_SCREEN_SIZE_Y / (float)VIRTUAL_SCREEN_SIZE_X; // Handles the drawing of the overlays to the screen // TODO, move divide up the rendering, displaying and input handling @@ -115,8 +115,8 @@ private: QString _hoverItemDescription; quint64 _hoverItemEnterUsecs { 0 }; - float _hmdUIAngularSize { DEFAULT_HMD_UI_ANGULAR_SIZE }; - float _textureFov { glm::radians(DEFAULT_HMD_UI_ANGULAR_SIZE) }; + float _hmdUIAngularSize { DEFAULT_HMD_UI_VERT_ANGULAR_SIZE }; + float _textureFov { glm::radians(DEFAULT_HMD_UI_VERT_ANGULAR_SIZE) }; float _textureAspectRatio { 1.0f }; int _hemiVerticesID { GeometryCache::UNKNOWN_ID };