From fde01e094e34cb76e3b8aa9e1b613204c8d26d53 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Wed, 27 Jan 2016 17:47:36 +0000 Subject: [PATCH 01/23] integrate touch screen camera manipulation controls Set Avatar _driveKeys via touch manipulation --- interface/src/Application.cpp | 52 +++++++++++++++++++++++++++++++++-- interface/src/Application.h | 2 ++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c202331041..496c1c4278 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2343,6 +2343,7 @@ void Application::touchBeginEvent(QTouchEvent* event) { TouchEvent thisEvent(*event); // on touch begin, we don't compare to last event _controllerScriptingInterface->emitTouchBeginEvent(thisEvent); // send events to any registered scripts + _currentTouchEvent = thisEvent; // and we reset our current event to this event before we call our update _lastTouchEvent = thisEvent; // and we reset our last event to this event before we call our update touchUpdateEvent(event); @@ -2361,7 +2362,9 @@ void Application::touchEndEvent(QTouchEvent* event) { _altPressed = false; TouchEvent thisEvent(*event, _lastTouchEvent); _controllerScriptingInterface->emitTouchEndEvent(thisEvent); // send events to any registered scripts + _currentTouchEvent = TouchEvent(); _lastTouchEvent = thisEvent; + _lastTouchTimeout = 30; // timeout used as gestures can be misinterpreted for some frames // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isTouchCaptured()) { @@ -3154,12 +3157,55 @@ void Application::update(float deltaTime) { myAvatar->setDriveKeys(TRANSLATE_Y, userInputMapper->getActionState(controller::Action::TRANSLATE_Y)); myAvatar->setDriveKeys(TRANSLATE_X, userInputMapper->getActionState(controller::Action::TRANSLATE_X)); if (deltaTime > FLT_EPSILON) { - myAvatar->setDriveKeys(PITCH, -1.0f * userInputMapper->getActionState(controller::Action::PITCH)); - myAvatar->setDriveKeys(YAW, -1.0f * userInputMapper->getActionState(controller::Action::YAW)); + if (_currentTouchEvent.isPressed == false) { + if (_lastTouchTimeout > 0) { + --_lastTouchTimeout; // disable non-touch input for some frames to disallow interpretation as movement + } else { + myAvatar->setDriveKeys(PITCH, -1.0f * userInputMapper->getActionState(controller::Action::PITCH)); + myAvatar->setDriveKeys(YAW, -1.0f * userInputMapper->getActionState(controller::Action::YAW)); + } + } else { + const bool allowTouchPan = _lastTouchEvent.isPinching == false && _lastTouchEvent.isPinchOpening == false + && _lastTouchEvent.x - _currentTouchEvent.x != 0; + if (_lastTouchEvent.x > _currentTouchEvent.x && allowTouchPan) { + myAvatar->setDriveKeys(YAW, -1.0f); + } else if (_lastTouchEvent.x < _currentTouchEvent.x && allowTouchPan) { + myAvatar->setDriveKeys(YAW, 1.0f); + } + } myAvatar->setDriveKeys(STEP_YAW, -1.0f * userInputMapper->getActionState(controller::Action::STEP_YAW)); } } - myAvatar->setDriveKeys(ZOOM, userInputMapper->getActionState(controller::Action::TRANSLATE_CAMERA_Z)); + + if (_currentTouchEvent.isPressed == true) { + static const float TOUCH_ZOOM_THRESHOLD = 5.0f; + const float boomLength = myAvatar->getBoomLength(); + QScreen* windowScreen = getWindow()->windowHandle()->screen(); + const float dpiScale = glm::clamp((float)(windowScreen->physicalDotsPerInchY() / 100.0f), 1.0f, 10.0f) * 15.0f; // at DPI 100 divide radius by 15 + + float scaledRadius = _lastTouchEvent.radius / dpiScale; + if (scaledRadius < TOUCH_ZOOM_THRESHOLD) { + const float extraRadiusScale = TOUCH_ZOOM_THRESHOLD / scaledRadius; + scaledRadius = _lastTouchEvent.radius / (dpiScale * extraRadiusScale); + } + + if (_lastTouchEvent.isPinching == true) { + const bool boomChangeValid = boomLength - scaledRadius < 2.0f; // restrict changes to small increments to negate large jumps + if (boomChangeValid && scaledRadius < boomLength && scaledRadius > MyAvatar::ZOOM_MIN) { + myAvatar->setBoomLength(scaledRadius); + } else if (scaledRadius <= MyAvatar::ZOOM_MIN) { + _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); + myAvatar->setBoomLength(MyAvatar::ZOOM_MIN); + } + } else if (_lastTouchEvent.isPinchOpening == true) { + const bool boomChangeValid = scaledRadius - boomLength < 2.0f; // restrict changes to small increments to negate large jumps + if (boomChangeValid && scaledRadius > boomLength && scaledRadius < MyAvatar::ZOOM_MAX) { + myAvatar->setBoomLength(scaledRadius); + } + } + } else { + myAvatar->setDriveKeys(ZOOM, userInputMapper->getActionState(controller::Action::TRANSLATE_CAMERA_Z)); + } } controller::Pose leftHand = userInputMapper->getPoseState(controller::Action::LEFT_HAND); diff --git a/interface/src/Application.h b/interface/src/Application.h index d5b677302a..aed4308491 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -453,7 +453,9 @@ private: FileLogger* _logger; + TouchEvent _currentTouchEvent; TouchEvent _lastTouchEvent; + int _lastTouchTimeout; quint64 _lastNackTime; quint64 _lastSendDownstreamAudioStats; From 9d03f0eb66b71a186401340c3aad8842c9d0edc5 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 2 Feb 2016 16:24:01 +0000 Subject: [PATCH 02/23] Revert "integrate touch screen camera manipulation controls" This reverts commit 4855511512d6df09691d7d54d48a341512d92392. --- interface/src/Application.cpp | 52 ++--------------------------------- interface/src/Application.h | 2 -- 2 files changed, 3 insertions(+), 51 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 496c1c4278..c202331041 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2343,7 +2343,6 @@ void Application::touchBeginEvent(QTouchEvent* event) { TouchEvent thisEvent(*event); // on touch begin, we don't compare to last event _controllerScriptingInterface->emitTouchBeginEvent(thisEvent); // send events to any registered scripts - _currentTouchEvent = thisEvent; // and we reset our current event to this event before we call our update _lastTouchEvent = thisEvent; // and we reset our last event to this event before we call our update touchUpdateEvent(event); @@ -2362,9 +2361,7 @@ void Application::touchEndEvent(QTouchEvent* event) { _altPressed = false; TouchEvent thisEvent(*event, _lastTouchEvent); _controllerScriptingInterface->emitTouchEndEvent(thisEvent); // send events to any registered scripts - _currentTouchEvent = TouchEvent(); _lastTouchEvent = thisEvent; - _lastTouchTimeout = 30; // timeout used as gestures can be misinterpreted for some frames // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isTouchCaptured()) { @@ -3157,55 +3154,12 @@ void Application::update(float deltaTime) { myAvatar->setDriveKeys(TRANSLATE_Y, userInputMapper->getActionState(controller::Action::TRANSLATE_Y)); myAvatar->setDriveKeys(TRANSLATE_X, userInputMapper->getActionState(controller::Action::TRANSLATE_X)); if (deltaTime > FLT_EPSILON) { - if (_currentTouchEvent.isPressed == false) { - if (_lastTouchTimeout > 0) { - --_lastTouchTimeout; // disable non-touch input for some frames to disallow interpretation as movement - } else { - myAvatar->setDriveKeys(PITCH, -1.0f * userInputMapper->getActionState(controller::Action::PITCH)); - myAvatar->setDriveKeys(YAW, -1.0f * userInputMapper->getActionState(controller::Action::YAW)); - } - } else { - const bool allowTouchPan = _lastTouchEvent.isPinching == false && _lastTouchEvent.isPinchOpening == false - && _lastTouchEvent.x - _currentTouchEvent.x != 0; - if (_lastTouchEvent.x > _currentTouchEvent.x && allowTouchPan) { - myAvatar->setDriveKeys(YAW, -1.0f); - } else if (_lastTouchEvent.x < _currentTouchEvent.x && allowTouchPan) { - myAvatar->setDriveKeys(YAW, 1.0f); - } - } + myAvatar->setDriveKeys(PITCH, -1.0f * userInputMapper->getActionState(controller::Action::PITCH)); + myAvatar->setDriveKeys(YAW, -1.0f * userInputMapper->getActionState(controller::Action::YAW)); myAvatar->setDriveKeys(STEP_YAW, -1.0f * userInputMapper->getActionState(controller::Action::STEP_YAW)); } } - - if (_currentTouchEvent.isPressed == true) { - static const float TOUCH_ZOOM_THRESHOLD = 5.0f; - const float boomLength = myAvatar->getBoomLength(); - QScreen* windowScreen = getWindow()->windowHandle()->screen(); - const float dpiScale = glm::clamp((float)(windowScreen->physicalDotsPerInchY() / 100.0f), 1.0f, 10.0f) * 15.0f; // at DPI 100 divide radius by 15 - - float scaledRadius = _lastTouchEvent.radius / dpiScale; - if (scaledRadius < TOUCH_ZOOM_THRESHOLD) { - const float extraRadiusScale = TOUCH_ZOOM_THRESHOLD / scaledRadius; - scaledRadius = _lastTouchEvent.radius / (dpiScale * extraRadiusScale); - } - - if (_lastTouchEvent.isPinching == true) { - const bool boomChangeValid = boomLength - scaledRadius < 2.0f; // restrict changes to small increments to negate large jumps - if (boomChangeValid && scaledRadius < boomLength && scaledRadius > MyAvatar::ZOOM_MIN) { - myAvatar->setBoomLength(scaledRadius); - } else if (scaledRadius <= MyAvatar::ZOOM_MIN) { - _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); - myAvatar->setBoomLength(MyAvatar::ZOOM_MIN); - } - } else if (_lastTouchEvent.isPinchOpening == true) { - const bool boomChangeValid = scaledRadius - boomLength < 2.0f; // restrict changes to small increments to negate large jumps - if (boomChangeValid && scaledRadius > boomLength && scaledRadius < MyAvatar::ZOOM_MAX) { - myAvatar->setBoomLength(scaledRadius); - } - } - } else { - myAvatar->setDriveKeys(ZOOM, userInputMapper->getActionState(controller::Action::TRANSLATE_CAMERA_Z)); - } + myAvatar->setDriveKeys(ZOOM, userInputMapper->getActionState(controller::Action::TRANSLATE_CAMERA_Z)); } controller::Pose leftHand = userInputMapper->getPoseState(controller::Action::LEFT_HAND); diff --git a/interface/src/Application.h b/interface/src/Application.h index aed4308491..d5b677302a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -453,9 +453,7 @@ private: FileLogger* _logger; - TouchEvent _currentTouchEvent; TouchEvent _lastTouchEvent; - int _lastTouchTimeout; quint64 _lastNackTime; quint64 _lastSendDownstreamAudioStats; From 087e2e7f66d57e61a1c7d394fe3dc9435096b0a4 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 2 Feb 2016 18:05:17 +0000 Subject: [PATCH 03/23] revise touchscreen camera control manipulation Touchscreen camera control is now via a touchscreen device. Input must be enabled with the menu option. Currently supports dragging and gesturing to control avatar camera. Gesturing is handled by integration of the Qt implementation. --- .../resources/controllers/touchscreen.json | 24 ++++ interface/src/Application.cpp | 24 +++- interface/src/Application.h | 3 + libraries/gl/src/gl/GLWidget.cpp | 2 + .../src/input-plugins/InputPlugin.cpp | 2 + .../src/input-plugins/KeyboardMouseDevice.cpp | 67 +++++----- .../src/input-plugins/KeyboardMouseDevice.h | 4 + .../src/input-plugins/TouchscreenDevice.cpp | 119 ++++++++++++++++++ .../src/input-plugins/TouchscreenDevice.h | 81 ++++++++++++ tests/controllers/src/main.cpp | 4 + 10 files changed, 299 insertions(+), 31 deletions(-) create mode 100644 interface/resources/controllers/touchscreen.json create mode 100644 libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp create mode 100644 libraries/input-plugins/src/input-plugins/TouchscreenDevice.h diff --git a/interface/resources/controllers/touchscreen.json b/interface/resources/controllers/touchscreen.json new file mode 100644 index 0000000000..041259bd36 --- /dev/null +++ b/interface/resources/controllers/touchscreen.json @@ -0,0 +1,24 @@ +{ + "name": "Touchscreen to Actions", + "channels": [ + + { "from": "Touchscreen.GesturePinchOut", "to": "Actions.BoomOut", "filters": [ { "type": "scale", "scale": 0.02 } ]}, + { "from": "Touchscreen.GesturePinchIn", "to": "Actions.BoomIn", "filters": [ { "type": "scale", "scale": 0.02 } ]}, + + { "from": { "makeAxis" : [ + [ "Touchscreen.DragLeft" ], + [ "Touchscreen.DragRight" ] + ] + }, + "to": "Actions.Yaw" + }, + + { "from": { "makeAxis" : [ + [ "Touchscreen.DragUp" ], + [ "Touchscreen.DragDown" ] + ] + }, + "to": "Actions.Pitch" + } + ] +} diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c202331041..40bef91ba5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -862,8 +862,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : userInputMapper->registerDevice(_applicationStateDevice); - // Setup the keyboardMouseDevice and the user input mapper with the default bindings + // Setup the _keyboardMouseDevice, _touchscreenDevice and the user input mapper with the default bindings userInputMapper->registerDevice(_keyboardMouseDevice->getInputDevice()); + userInputMapper->registerDevice(_touchscreenDevice->getInputDevice()); userInputMapper->loadDefaultMapping(userInputMapper->getStandardDeviceID()); // force the model the look at the correct directory (weird order of operations issue) @@ -1308,6 +1309,9 @@ void Application::initializeUi() { if (name == KeyboardMouseDevice::NAME) { _keyboardMouseDevice = std::dynamic_pointer_cast(inputPlugin); } + if (name == TouchscreenDevice::NAME) { + _touchscreenDevice = std::dynamic_pointer_cast(inputPlugin); + } } updateInputModes(); } @@ -1790,6 +1794,9 @@ bool Application::event(QEvent* event) { case QEvent::TouchUpdate: touchUpdateEvent(static_cast(event)); return true; + case QEvent::Gesture: + touchGestureEvent((QGestureEvent*)event); + return true; case QEvent::Wheel: wheelEvent(static_cast(event)); return true; @@ -2336,6 +2343,9 @@ void Application::touchUpdateEvent(QTouchEvent* event) { if (Menu::getInstance()->isOptionChecked(KeyboardMouseDevice::NAME)) { _keyboardMouseDevice->touchUpdateEvent(event); } + if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + _touchscreenDevice->touchUpdateEvent(event); + } } void Application::touchBeginEvent(QTouchEvent* event) { @@ -2354,6 +2364,9 @@ void Application::touchBeginEvent(QTouchEvent* event) { if (Menu::getInstance()->isOptionChecked(KeyboardMouseDevice::NAME)) { _keyboardMouseDevice->touchBeginEvent(event); } + if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + _touchscreenDevice->touchBeginEvent(event); + } } @@ -2371,10 +2384,19 @@ void Application::touchEndEvent(QTouchEvent* event) { if (Menu::getInstance()->isOptionChecked(KeyboardMouseDevice::NAME)) { _keyboardMouseDevice->touchEndEvent(event); } + if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + _touchscreenDevice->touchEndEvent(event); + } // put any application specific touch behavior below here.. } +void Application::touchGestureEvent(QGestureEvent* event) { + if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + _touchscreenDevice->touchGestureEvent(event); + } +} + void Application::wheelEvent(QWheelEvent* event) { _altPressed = false; _controllerScriptingInterface->emitWheelEvent(event); // send events to any registered scripts diff --git a/interface/src/Application.h b/interface/src/Application.h index d5b677302a..26df5c8b0c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -376,6 +377,7 @@ private: void touchBeginEvent(QTouchEvent* event); void touchEndEvent(QTouchEvent* event); void touchUpdateEvent(QTouchEvent* event); + void touchGestureEvent(QGestureEvent* event); void wheelEvent(QWheelEvent* event); void dropEvent(QDropEvent* event); @@ -421,6 +423,7 @@ private: std::shared_ptr _applicationStateDevice; // Default ApplicationDevice reflecting the state of different properties of the session std::shared_ptr _keyboardMouseDevice; // Default input device, the good old keyboard mouse and maybe touchpad + std::shared_ptr _touchscreenDevice; // the good old touchscreen AvatarUpdate* _avatarUpdate {nullptr}; SimpleMovingAverage _avatarSimsPerSecond {10}; int _avatarSimsPerSecondReport {0}; diff --git a/libraries/gl/src/gl/GLWidget.cpp b/libraries/gl/src/gl/GLWidget.cpp index c67dec1e51..8618fad58c 100644 --- a/libraries/gl/src/gl/GLWidget.cpp +++ b/libraries/gl/src/gl/GLWidget.cpp @@ -43,6 +43,7 @@ int GLWidget::getDeviceHeight() const { void GLWidget::initializeGL() { setAttribute(Qt::WA_AcceptTouchEvents); + grabGesture(Qt::PinchGesture); setAcceptDrops(true); // Note, we *DO NOT* want Qt to automatically swap buffers for us. This results in the "ringing" bug mentioned in WL#19514 when we're throttling the framerate. setAutoBufferSwap(false); @@ -76,6 +77,7 @@ bool GLWidget::event(QEvent* event) { case QEvent::TouchBegin: case QEvent::TouchEnd: case QEvent::TouchUpdate: + case QEvent::Gesture: case QEvent::Wheel: case QEvent::DragEnter: case QEvent::Drop: diff --git a/libraries/input-plugins/src/input-plugins/InputPlugin.cpp b/libraries/input-plugins/src/input-plugins/InputPlugin.cpp index 4d59adb602..28c1d3e0e0 100644 --- a/libraries/input-plugins/src/input-plugins/InputPlugin.cpp +++ b/libraries/input-plugins/src/input-plugins/InputPlugin.cpp @@ -13,11 +13,13 @@ #include #include "KeyboardMouseDevice.h" +#include "TouchscreenDevice.h" // TODO migrate to a DLL model where plugins are discovered and loaded at runtime by the PluginManager class InputPluginList getInputPlugins() { InputPlugin* PLUGIN_POOL[] = { new KeyboardMouseDevice(), + new TouchscreenDevice(), nullptr }; diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp index c3d2f7c51c..6457f923a7 100755 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp @@ -19,6 +19,7 @@ #include const QString KeyboardMouseDevice::NAME = "Keyboard/Mouse"; +bool KeyboardMouseDevice::_enableMouse = true; void KeyboardMouseDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { _inputDevice->update(deltaTime, inputCalibrationData, jointsCaptured); @@ -58,28 +59,32 @@ void KeyboardMouseDevice::keyReleaseEvent(QKeyEvent* event) { } void KeyboardMouseDevice::mousePressEvent(QMouseEvent* event, unsigned int deviceID) { - auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); - auto result = _inputDevice->_buttonPressedMap.insert(input.getChannel()); - if (!result.second) { - // key pressed again ? without catching the release event ? - } - _lastCursor = event->pos(); - _mousePressTime = usecTimestampNow(); - _mouseMoved = false; + if (_enableMouse) { + auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); + auto result = _inputDevice->_buttonPressedMap.insert(input.getChannel()); + if (!result.second) { + // key pressed again ? without catching the release event ? + } + _lastCursor = event->pos(); + _mousePressTime = usecTimestampNow(); + _mouseMoved = false; - eraseMouseClicked(); + eraseMouseClicked(); + } } void KeyboardMouseDevice::mouseReleaseEvent(QMouseEvent* event, unsigned int deviceID) { - auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); - _inputDevice->_buttonPressedMap.erase(input.getChannel()); + if (_enableMouse) { + auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); + _inputDevice->_buttonPressedMap.erase(input.getChannel()); - // if we pressed and released at the same location within a small time window, then create a "_CLICKED" - // input for this button we might want to add some small tolerance to this so if you do a small drag it - // till counts as a clicked. - static const int CLICK_TIME = USECS_PER_MSEC * 500; // 500 ms to click - if (!_mouseMoved && (usecTimestampNow() - _mousePressTime < CLICK_TIME)) { - _inputDevice->_buttonPressedMap.insert(_inputDevice->makeInput((Qt::MouseButton) event->button(), true).getChannel()); + // if we pressed and released at the same location within a small time window, then create a "_CLICKED" + // input for this button we might want to add some small tolerance to this so if you do a small drag it + // still counts as a click. + static const int CLICK_TIME = USECS_PER_MSEC * 500; // 500 ms to click + if (!_mouseMoved && (usecTimestampNow() - _mousePressTime < CLICK_TIME)) { + _inputDevice->_buttonPressedMap.insert(_inputDevice->makeInput((Qt::MouseButton) event->button(), true).getChannel()); + } } } @@ -90,22 +95,24 @@ void KeyboardMouseDevice::eraseMouseClicked() { } void KeyboardMouseDevice::mouseMoveEvent(QMouseEvent* event, unsigned int deviceID) { - QPoint currentPos = event->pos(); - QPoint currentMove = currentPos - _lastCursor; + if (_enableMouse) { + QPoint currentPos = event->pos(); + QPoint currentMove = currentPos - _lastCursor; - _inputDevice->_axisStateMap[MOUSE_AXIS_X_POS] = (currentMove.x() > 0 ? currentMove.x() : 0.0f); - _inputDevice->_axisStateMap[MOUSE_AXIS_X_NEG] = (currentMove.x() < 0 ? -currentMove.x() : 0.0f); - // Y mouse is inverted positive is pointing up the screen - _inputDevice->_axisStateMap[MOUSE_AXIS_Y_POS] = (currentMove.y() < 0 ? -currentMove.y() : 0.0f); - _inputDevice->_axisStateMap[MOUSE_AXIS_Y_NEG] = (currentMove.y() > 0 ? currentMove.y() : 0.0f); + _inputDevice->_axisStateMap[MOUSE_AXIS_X_POS] = (currentMove.x() > 0 ? currentMove.x() : 0.0f); + _inputDevice->_axisStateMap[MOUSE_AXIS_X_NEG] = (currentMove.x() < 0 ? -currentMove.x() : 0.0f); + // Y mouse is inverted positive is pointing up the screen + _inputDevice->_axisStateMap[MOUSE_AXIS_Y_POS] = (currentMove.y() < 0 ? -currentMove.y() : 0.0f); + _inputDevice->_axisStateMap[MOUSE_AXIS_Y_NEG] = (currentMove.y() > 0 ? currentMove.y() : 0.0f); - // FIXME - this has the characteristic that it will show large jumps when you move the cursor - // outside of the application window, because we don't get MouseEvents when the cursor is outside - // of the application window. - _lastCursor = currentPos; - _mouseMoved = true; + // FIXME - this has the characteristic that it will show large jumps when you move the cursor + // outside of the application window, because we don't get MouseEvents when the cursor is outside + // of the application window. + _lastCursor = currentPos; + _mouseMoved = true; - eraseMouseClicked(); + eraseMouseClicked(); + } } void KeyboardMouseDevice::wheelEvent(QWheelEvent* event) { diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h index 55ca9a1704..3cbb2a9244 100644 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h @@ -85,6 +85,8 @@ public: void touchUpdateEvent(const QTouchEvent* event); void wheelEvent(QWheelEvent* event); + + static void enableMouse(bool enableMouse) { _enableMouse = enableMouse; } static const QString NAME; @@ -123,6 +125,8 @@ protected: bool _isTouching = false; std::chrono::high_resolution_clock _clock; std::chrono::high_resolution_clock::time_point _lastTouchTime; + + static bool _enableMouse; }; #endif // hifi_KeyboardMouseDevice_h diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp new file mode 100644 index 0000000000..987ff2cac4 --- /dev/null +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -0,0 +1,119 @@ +// +// TouchscreenDevice.cpp +// input-plugins/src/input-plugins +// +// Created by Triplelexx on 01/31/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "TouchscreenDevice.h" +#include "KeyboardMouseDevice.h" + +#include +#include +#include +#include + +#include +#include +#include + +const QString TouchscreenDevice::NAME = "Touchscreen"; + +void TouchscreenDevice::pluginUpdate(float deltaTime, bool jointsCaptured) { + _inputDevice->update(deltaTime, jointsCaptured); + + // at DPI 100 use these arbitrary values to divide dragging distance + static const float DPI_SCALE_X = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0f), 1.0f, 10.0f) + * 600.0f; + static const float DPI_SCALE_Y = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchY() / 100.0f), 1.0f, 10.0f) + * 200.0f; + + float distanceScaleX, distanceScaleY; + if (_touchPointCount == 1) { + if (_firstTouchVec.x < _currentTouchVec.x) { + distanceScaleX = (_currentTouchVec.x - _firstTouchVec.x) / DPI_SCALE_X; + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_POS).getChannel()] = distanceScaleX; + } else if (_firstTouchVec.x > _currentTouchVec.x) { + distanceScaleX = (_firstTouchVec.x - _currentTouchVec.x) / DPI_SCALE_X; + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_NEG).getChannel()] = distanceScaleX; + } + // Y axis is inverted, positive is pointing up the screen + if (_firstTouchVec.y > _currentTouchVec.y) { + distanceScaleY = (_firstTouchVec.y - _currentTouchVec.y) / DPI_SCALE_Y; + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_POS).getChannel()] = distanceScaleY; + } else if (_firstTouchVec.y < _currentTouchVec.y) { + distanceScaleY = (_currentTouchVec.y - _firstTouchVec.y) / DPI_SCALE_Y; + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_NEG).getChannel()] = distanceScaleY; + } + } +} + +void TouchscreenDevice::InputDevice::update(float deltaTime, bool jointsCaptured) { + _axisStateMap.clear(); +} + +void TouchscreenDevice::InputDevice::focusOutEvent() { +} + +void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { + const QTouchEvent::TouchPoint& point = event->touchPoints().at(0); + _firstTouchVec = glm::vec2(point.pos().x(), point.pos().y()); + KeyboardMouseDevice::enableMouse(false); +} + +void TouchscreenDevice::touchEndEvent(const QTouchEvent* event) { + _touchPointCount = 0; + KeyboardMouseDevice::enableMouse(true); +} + +void TouchscreenDevice::touchUpdateEvent(const QTouchEvent* event) { + const QTouchEvent::TouchPoint& point = event->touchPoints().at(0); + _currentTouchVec = glm::vec2(point.pos().x(), point.pos().y()); + _touchPointCount = event->touchPoints().count(); +} + +void TouchscreenDevice::touchGestureEvent(const QGestureEvent* event) { + // pinch gesture + if (QGesture* gesture = event->gesture(Qt::PinchGesture)) { + QPinchGesture* pinch = static_cast(gesture); + qreal scaleFactor = pinch->totalScaleFactor(); + if (scaleFactor > _lastPinchScale && scaleFactor != 0) { + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_POS).getChannel()] = 1.0f; + } else if (scaleFactor != 0) { + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_NEG).getChannel()] = 1.0f; + } + _lastPinchScale = scaleFactor; + } +} + +controller::Input TouchscreenDevice::InputDevice::makeInput(TouchscreenDevice::TouchAxisChannel axis) const { + return controller::Input(_deviceID, axis, controller::ChannelType::AXIS); +} + +controller::Input TouchscreenDevice::InputDevice::makeInput(TouchscreenDevice::TouchGestureAxisChannel gesture) const { + return controller::Input(_deviceID, gesture, controller::ChannelType::AXIS); +} + +controller::Input::NamedVector TouchscreenDevice::InputDevice::getAvailableInputs() const { + using namespace controller; + static QVector availableInputs; + static std::once_flag once; + std::call_once(once, [&] { + availableInputs.append(Input::NamedPair(makeInput(TOUCH_AXIS_X_POS), "DragRight")); + availableInputs.append(Input::NamedPair(makeInput(TOUCH_AXIS_X_NEG), "DragLeft")); + availableInputs.append(Input::NamedPair(makeInput(TOUCH_AXIS_Y_POS), "DragUp")); + availableInputs.append(Input::NamedPair(makeInput(TOUCH_AXIS_Y_NEG), "DragDown")); + + availableInputs.append(Input::NamedPair(makeInput(TOUCH_GESTURE_PINCH_POS), "GesturePinchOut")); + availableInputs.append(Input::NamedPair(makeInput(TOUCH_GESTURE_PINCH_NEG), "GesturePinchIn")); + }); + return availableInputs; +} + +QString TouchscreenDevice::InputDevice::getDefaultMappingConfig() const { + static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/touchscreen.json"; + return MAPPING_JSON; +} \ No newline at end of file diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h new file mode 100644 index 0000000000..c0d1ec0112 --- /dev/null +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -0,0 +1,81 @@ +// +// TouchscreenDevice.h +// input-plugins/src/input-plugins +// +// Created by Triplelexx on 1/31/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_TouchscreenDevice_h +#define hifi_TouchscreenDevice_h + +#include +#include "InputPlugin.h" + +class QTouchEvent; +class QGestureEvent; + +class TouchscreenDevice : public InputPlugin { + Q_OBJECT +public: + + enum TouchAxisChannel { + TOUCH_AXIS_X_POS = 0, + TOUCH_AXIS_X_NEG, + TOUCH_AXIS_Y_POS, + TOUCH_AXIS_Y_NEG, + }; + + enum TouchGestureAxisChannel { + TOUCH_GESTURE_PINCH_POS = TOUCH_AXIS_Y_NEG + 1, + TOUCH_GESTURE_PINCH_NEG, + }; + + // Plugin functions + virtual bool isSupported() const override { return true; } + virtual bool isJointController() const override { return false; } + virtual const QString& getName() const override { return NAME; } + + virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } + virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override; + + void touchBeginEvent(const QTouchEvent* event); + void touchEndEvent(const QTouchEvent* event); + void touchUpdateEvent(const QTouchEvent* event); + void touchGestureEvent(const QGestureEvent* event); + + static const QString NAME; + +protected: + + class InputDevice : public controller::InputDevice { + public: + InputDevice() : controller::InputDevice("Touchscreen") {} + private: + // Device functions + virtual controller::Input::NamedVector getAvailableInputs() const override; + virtual QString getDefaultMappingConfig() const override; + virtual void update(float deltaTime, bool jointsCaptured) override; + virtual void focusOutEvent() override; + + controller::Input makeInput(TouchAxisChannel axis) const; + controller::Input makeInput(TouchGestureAxisChannel gesture) const; + + friend class TouchscreenDevice; + }; + +public: + const std::shared_ptr& getInputDevice() const { return _inputDevice; } + +protected: + qreal _lastPinchScale; + glm::vec2 _firstTouchVec; + glm::vec2 _currentTouchVec; + int _touchPointCount; + std::shared_ptr _inputDevice { std::make_shared() }; +}; + +#endif // hifi_TouchscreenDevice_h diff --git a/tests/controllers/src/main.cpp b/tests/controllers/src/main.cpp index 13b6b51d82..41746be9d8 100644 --- a/tests/controllers/src/main.cpp +++ b/tests/controllers/src/main.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -153,6 +154,9 @@ int main(int argc, char** argv) { if (name == KeyboardMouseDevice::NAME) { userInputMapper->registerDevice(std::dynamic_pointer_cast(inputPlugin)->getInputDevice()); } + if (name == TouchscreenDevice::NAME) { + userInputMapper->registerDevice(std::dynamic_pointer_cast(inputPlugin)->getInputDevice()); + } inputPlugin->pluginUpdate(0, calibrationData, false); } rootContext->setContextProperty("Controllers", new MyControllerScriptingInterface()); From 9db45c01cc9560bf480f3d6e5b6f49c13ac4e271 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Wed, 3 Feb 2016 00:13:45 +0000 Subject: [PATCH 04/23] indentation fixes caught some inconsistencies --- .../src/input-plugins/TouchscreenDevice.cpp | 27 +++++++++---------- .../src/input-plugins/TouchscreenDevice.h | 6 ++--- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 987ff2cac4..788a75dc76 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -76,17 +76,16 @@ void TouchscreenDevice::touchUpdateEvent(const QTouchEvent* event) { } void TouchscreenDevice::touchGestureEvent(const QGestureEvent* event) { - // pinch gesture - if (QGesture* gesture = event->gesture(Qt::PinchGesture)) { - QPinchGesture* pinch = static_cast(gesture); - qreal scaleFactor = pinch->totalScaleFactor(); - if (scaleFactor > _lastPinchScale && scaleFactor != 0) { - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_POS).getChannel()] = 1.0f; - } else if (scaleFactor != 0) { - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_NEG).getChannel()] = 1.0f; - } - _lastPinchScale = scaleFactor; - } + if (QGesture* gesture = event->gesture(Qt::PinchGesture)) { + QPinchGesture* pinch = static_cast(gesture); + qreal scaleFactor = pinch->totalScaleFactor(); + if (scaleFactor > _lastPinchScale && scaleFactor != 0) { + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_POS).getChannel()] = 1.0f; + } else if (scaleFactor != 0) { + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_NEG).getChannel()] = 1.0f; + } + _lastPinchScale = scaleFactor; + } } controller::Input TouchscreenDevice::InputDevice::makeInput(TouchscreenDevice::TouchAxisChannel axis) const { @@ -94,7 +93,7 @@ controller::Input TouchscreenDevice::InputDevice::makeInput(TouchscreenDevice::T } controller::Input TouchscreenDevice::InputDevice::makeInput(TouchscreenDevice::TouchGestureAxisChannel gesture) const { - return controller::Input(_deviceID, gesture, controller::ChannelType::AXIS); + return controller::Input(_deviceID, gesture, controller::ChannelType::AXIS); } controller::Input::NamedVector TouchscreenDevice::InputDevice::getAvailableInputs() const { @@ -107,8 +106,8 @@ controller::Input::NamedVector TouchscreenDevice::InputDevice::getAvailableInput availableInputs.append(Input::NamedPair(makeInput(TOUCH_AXIS_Y_POS), "DragUp")); availableInputs.append(Input::NamedPair(makeInput(TOUCH_AXIS_Y_NEG), "DragDown")); - availableInputs.append(Input::NamedPair(makeInput(TOUCH_GESTURE_PINCH_POS), "GesturePinchOut")); - availableInputs.append(Input::NamedPair(makeInput(TOUCH_GESTURE_PINCH_NEG), "GesturePinchIn")); + availableInputs.append(Input::NamedPair(makeInput(TOUCH_GESTURE_PINCH_POS), "GesturePinchOut")); + availableInputs.append(Input::NamedPair(makeInput(TOUCH_GESTURE_PINCH_NEG), "GesturePinchIn")); }); return availableInputs; } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index c0d1ec0112..8cc59c2532 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -31,7 +31,7 @@ public: enum TouchGestureAxisChannel { TOUCH_GESTURE_PINCH_POS = TOUCH_AXIS_Y_NEG + 1, - TOUCH_GESTURE_PINCH_NEG, + TOUCH_GESTURE_PINCH_NEG, }; // Plugin functions @@ -45,7 +45,7 @@ public: void touchBeginEvent(const QTouchEvent* event); void touchEndEvent(const QTouchEvent* event); void touchUpdateEvent(const QTouchEvent* event); - void touchGestureEvent(const QGestureEvent* event); + void touchGestureEvent(const QGestureEvent* event); static const QString NAME; @@ -62,7 +62,7 @@ protected: virtual void focusOutEvent() override; controller::Input makeInput(TouchAxisChannel axis) const; - controller::Input makeInput(TouchGestureAxisChannel gesture) const; + controller::Input makeInput(TouchGestureAxisChannel gesture) const; friend class TouchscreenDevice; }; From b291e32b7cd35ca73f2befeccbd1fd66f8840cac Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Fri, 19 Feb 2016 13:54:13 +0000 Subject: [PATCH 05/23] update TouchscreenDevice pass inputCalibrationData to update --- libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp | 2 +- libraries/input-plugins/src/input-plugins/TouchscreenDevice.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 788a75dc76..6abf2a9fae 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -51,7 +51,7 @@ void TouchscreenDevice::pluginUpdate(float deltaTime, bool jointsCaptured) { } } -void TouchscreenDevice::InputDevice::update(float deltaTime, bool jointsCaptured) { +void TouchscreenDevice::InputDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { _axisStateMap.clear(); } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index 8cc59c2532..568dedf7b4 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -40,7 +40,7 @@ public: virtual const QString& getName() const override { return NAME; } virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } - virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override; + virtual void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) override; void touchBeginEvent(const QTouchEvent* event); void touchEndEvent(const QTouchEvent* event); From 742f741095712595b3e318f33a8d80a60781eaea Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Sun, 21 Feb 2016 21:27:21 +0000 Subject: [PATCH 06/23] update TouchscreenDevice again added passing of inputCalibrationData missed from last commit --- .../input-plugins/src/input-plugins/TouchscreenDevice.cpp | 4 ++-- libraries/input-plugins/src/input-plugins/TouchscreenDevice.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 6abf2a9fae..8fb1f6bd0a 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -22,8 +22,8 @@ const QString TouchscreenDevice::NAME = "Touchscreen"; -void TouchscreenDevice::pluginUpdate(float deltaTime, bool jointsCaptured) { - _inputDevice->update(deltaTime, jointsCaptured); +void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { + _inputDevice->update(deltaTime, inputCalibrationData, jointsCaptured); // at DPI 100 use these arbitrary values to divide dragging distance static const float DPI_SCALE_X = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0f), 1.0f, 10.0f) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index 568dedf7b4..acd7d89333 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -58,7 +58,7 @@ protected: // Device functions virtual controller::Input::NamedVector getAvailableInputs() const override; virtual QString getDefaultMappingConfig() const override; - virtual void update(float deltaTime, bool jointsCaptured) override; + virtual void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) override; virtual void focusOutEvent() override; controller::Input makeInput(TouchAxisChannel axis) const; From fb242be50fc986c61fabee75b3b91f13db1992f3 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Sun, 3 Apr 2016 22:59:48 +0100 Subject: [PATCH 07/23] resolved merge conflict got to stick to command line, this should have been added with add command at merge.... --- interface/src/Application.h | 73 ++++++++++--------- .../src/procedural/ProceduralSkybox.slv | 39 ---------- 2 files changed, 39 insertions(+), 73 deletions(-) delete mode 100644 libraries/procedural/src/procedural/ProceduralSkybox.slv diff --git a/interface/src/Application.h b/interface/src/Application.h index 96887e300d..6eaab7039c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -41,7 +41,6 @@ #include #include -#include "avatar/AvatarUpdate.h" #include "avatar/MyAvatar.h" #include "Bookmarks.h" #include "Camera.h" @@ -52,7 +51,6 @@ #include "render/Engine.h" #include "scripting/ControllerScriptingInterface.h" #include "scripting/DialogsManagerScriptingInterface.h" -#include "ui/ApplicationCompositor.h" #include "ui/ApplicationOverlay.h" #include "ui/AudioStatsDialog.h" #include "ui/BandwidthDialog.h" @@ -68,6 +66,7 @@ class GLCanvas; class FaceTracker; class MainWindow; class AssetUpload; +class CompositorHelper; namespace controller { class StateController; @@ -121,9 +120,12 @@ public: QSize getDeviceSize() const; bool hasFocus() const; + void showCursor(const QCursor& cursor); + bool isThrottleRendering() const; Camera* getCamera() { return &_myCamera; } + const Camera* getCamera() const { return &_myCamera; } // Represents the current view frustum of the avatar. ViewFrustum* getViewFrustum(); const ViewFrustum* getViewFrustum() const; @@ -148,8 +150,8 @@ public: ApplicationOverlay& getApplicationOverlay() { return _applicationOverlay; } const ApplicationOverlay& getApplicationOverlay() const { return _applicationOverlay; } - ApplicationCompositor& getApplicationCompositor() { return _compositor; } - const ApplicationCompositor& getApplicationCompositor() const { return _compositor; } + CompositorHelper& getApplicationCompositor() const; + Overlays& getOverlays() { return _overlays; } bool isForeground() const { return _isForeground; } @@ -210,31 +212,31 @@ public: render::EnginePointer getRenderEngine() override { return _renderEngine; } gpu::ContextPointer getGPUContext() const { return _gpuContext; } + virtual void pushPreRenderLambda(void* key, std::function func) override; + const QRect& getMirrorViewRect() const { return _mirrorViewRect; } void updateMyAvatarLookAtPosition(); - AvatarUpdate* getAvatarUpdater() { return _avatarUpdate; } float getAvatarSimrate(); void setAvatarSimrateSample(float sample); float getAverageSimsPerSecond(); - void fakeMouseEvent(QMouseEvent* event); - signals: void svoImportRequested(const QString& url); void checkBackgroundDownloads(); - void domainConnectionRefused(const QString& reason); void fullAvatarURLChanged(const QString& newValue, const QString& modelName); void beforeAboutToQuit(); void activeDisplayPluginChanged(); + void uploadRequest(QString path); + public slots: QVector pasteEntities(float x, float y, float z); - bool exportEntities(const QString& filename, const QVector& entityIDs); + bool exportEntities(const QString& filename, const QVector& entityIDs, const glm::vec3* givenOffset = nullptr); bool exportEntities(const QString& filename, float x, float y, float z, float scale); bool importEntities(const QString& url); @@ -243,6 +245,7 @@ public slots: Q_INVOKABLE void loadScriptURLDialog(); void toggleLogDialog(); void toggleRunningScriptsWidget(); + void toggleAssetServerWidget(QString filePath = ""); void handleLocalServerConnection(); void readArgumentsFromLocalSocket(); @@ -251,11 +254,6 @@ public slots: void openUrl(const QUrl& url); - void setAvatarUpdateThreading(); - void setAvatarUpdateThreading(bool isThreaded); - void setRawAvatarUpdateThreading(); - void setRawAvatarUpdateThreading(bool isThreaded); - void resetSensors(bool andReload = false); void setActiveFaceTracker(); @@ -271,40 +269,41 @@ public slots: void cycleCamera(); void cameraMenuChanged(); + void toggleOverlays(); + void setOverlaysVisible(bool visible); void reloadResourceCaches(); + void updateHeartbeat(); + void crashApplication(); + void deadlockApplication(); void rotationModeChanged(); void runTests(); private slots: + void showDesktop(); void clearDomainOctreeDetails(); void idle(uint64_t now); void aboutToQuit(); - void connectedToDomain(const QString& hostname); + void resettingDomain(); void audioMuteToggled(); void faceTrackerMuteToggled(); void activeChanged(Qt::ApplicationState state); - void domainSettingsReceived(const QJsonObject& domainSettingsObject); - void handleDomainConnectionDeniedPacket(QSharedPointer message); - void notifyPacketVersionMismatch(); void loadSettings(); void saveSettings(); - + bool acceptSnapshot(const QString& urlString); bool askToSetAvatarUrl(const QString& url); bool askToLoadScript(const QString& scriptFilenameOrURL); - bool askToUploadAsset(const QString& asset); - void modelUploadFinished(AssetUpload* upload, const QString& hash); bool askToWearAvatarAttachmentUrl(const QString& url); void displayAvatarAttachmentWarning(const QString& message) const; @@ -314,6 +313,7 @@ private slots: void domainChanged(const QString& domainHostname); void updateWindowTitle(); void nodeAdded(SharedNodePointer node); + void nodeActivated(SharedNodePointer node); void nodeKilled(SharedNodePointer node); void packetSent(quint64 length); void updateDisplayMode(); @@ -325,12 +325,8 @@ private: void cleanupBeforeQuit(); - void emptyLocalCache(); - void update(float deltaTime); - void setPalmData(Hand* hand, const controller::Pose& pose, float deltaTime, HandData::Hand whichHand, float triggerValue); - // Various helper functions called during update() void updateLOD(); void updateThreads(float deltaTime); @@ -352,7 +348,6 @@ private: void checkSkeleton(); void initializeAcceptedFiles(); - int getRenderAmbientLight() const; void displaySide(RenderArgs* renderArgs, Camera& whichCamera, bool selfAvatarOnly = false); @@ -386,16 +381,18 @@ private: void maybeToggleMenuVisible(QMouseEvent* event); - bool _dependencyManagerIsSetup; + MainWindow* _window; + QElapsedTimer& _sessionRunTimer; + + bool _previousSessionCrashed; OffscreenGLCanvas* _offscreenContext { nullptr }; DisplayPluginPointer _displayPlugin; + std::mutex _displayPluginLock; InputPluginList _activeInputPlugins; bool _activatingDisplayPlugin { false }; - QMap _lockedFramebufferMap; - - MainWindow* _window; + QMap _lockedFramebufferMap; QUndoStack _undoStack; UndoStackScriptingInterface _undoStackScriptingInterface; @@ -425,7 +422,6 @@ private: std::shared_ptr _applicationStateDevice; // Default ApplicationDevice reflecting the state of different properties of the session std::shared_ptr _keyboardMouseDevice; // Default input device, the good old keyboard mouse and maybe touchpad std::shared_ptr _touchscreenDevice; // the good old touchscreen - AvatarUpdate* _avatarUpdate {nullptr}; SimpleMovingAverage _avatarSimsPerSecond {10}; int _avatarSimsPerSecondReport {0}; quint64 _lastAvatarSimsPerSecondUpdate {0}; @@ -476,7 +472,6 @@ private: typedef bool (Application::* AcceptURLMethod)(const QString &); static const QHash _acceptedExtensions; - QList _domainConnectionRefusals; glm::uvec2 _renderResolution; int _maxOctreePPS = DEFAULT_MAX_OCTREE_PPS; @@ -489,7 +484,6 @@ private: Overlays _overlays; ApplicationOverlay _applicationOverlay; - ApplicationCompositor _compositor; OverlayConductor _overlayConductor; DialogsManagerScriptingInterface* _dialogsManagerScriptingInterface = new DialogsManagerScriptingInterface(); @@ -512,10 +506,21 @@ private: int _avatarAttachmentRequest = 0; bool _settingsLoaded { false }; - bool _pendingPaint { false }; QTimer* _idleTimer { nullptr }; bool _fakedMouseEvent { false }; + + void checkChangeCursor(); + mutable QMutex _changeCursorLock { QMutex::Recursive }; + QCursor _desiredCursor{ Qt::BlankCursor }; + bool _cursorNeedsChanging { false }; + + QThread* _deadlockWatchdogThread; + + std::map> _preRenderLambdas; + std::mutex _preRenderLambdasLock; + + std::atomic _processOctreeStatsCounter { 0 }; }; #endif // hifi_Application_h diff --git a/libraries/procedural/src/procedural/ProceduralSkybox.slv b/libraries/procedural/src/procedural/ProceduralSkybox.slv deleted file mode 100644 index 810afb1033..0000000000 --- a/libraries/procedural/src/procedural/ProceduralSkybox.slv +++ /dev/null @@ -1,39 +0,0 @@ -<@include gpu/Config.slh@> -<$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// skybox.vert -// vertex shader -// -// Created by Sam Gateau on 5/5/2015. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -<@include gpu/Transform.slh@> - -<$declareStandardTransform()$> - -out vec3 _normal; - -void main(void) { - const float depth = 0.0; - const vec4 UNIT_QUAD[4] = vec4[4]( - vec4(-1.0, -1.0, depth, 1.0), - vec4(1.0, -1.0, depth, 1.0), - vec4(-1.0, 1.0, depth, 1.0), - vec4(1.0, 1.0, depth, 1.0) - ); - vec4 inPosition = UNIT_QUAD[gl_VertexID]; - - // standard transform - TransformCamera cam = getTransformCamera(); - vec3 clipDir = vec3(inPosition.xy, 0.0); - vec3 eyeDir; - <$transformClipToEyeDir(cam, clipDir, eyeDir)$> - <$transformEyeToWorldDir(cam, eyeDir, _normal)$> - - // Position is supposed to come in clip space - gl_Position = vec4(inPosition.xy, 0.0, 1.0); -} \ No newline at end of file From bc0ea315343c564d8978671f8c0db660df42e3bb Mon Sep 17 00:00:00 2001 From: Lexx Date: Mon, 4 Apr 2016 00:32:05 +0100 Subject: [PATCH 08/23] Rename Skybox.slf to skybox.slf --- libraries/model/src/model/{Skybox.slf => skybox.slf} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename libraries/model/src/model/{Skybox.slf => skybox.slf} (100%) diff --git a/libraries/model/src/model/Skybox.slf b/libraries/model/src/model/skybox.slf similarity index 100% rename from libraries/model/src/model/Skybox.slf rename to libraries/model/src/model/skybox.slf From 0b313afd74757d195eceeb60352ed17e2ab7fcd8 Mon Sep 17 00:00:00 2001 From: Lexx Date: Mon, 4 Apr 2016 00:32:20 +0100 Subject: [PATCH 09/23] Rename Skybox.slv to skybox.slv --- libraries/model/src/model/{Skybox.slv => skybox.slv} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename libraries/model/src/model/{Skybox.slv => skybox.slv} (99%) diff --git a/libraries/model/src/model/Skybox.slv b/libraries/model/src/model/skybox.slv similarity index 99% rename from libraries/model/src/model/Skybox.slv rename to libraries/model/src/model/skybox.slv index 810afb1033..5df1aa0a4a 100755 --- a/libraries/model/src/model/Skybox.slv +++ b/libraries/model/src/model/skybox.slv @@ -36,4 +36,4 @@ void main(void) { // Position is supposed to come in clip space gl_Position = vec4(inPosition.xy, 0.0, 1.0); -} \ No newline at end of file +} From b5d50e8b3f21824a3c11b85e98d2093f72ce74b3 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 5 Apr 2016 00:35:12 +0100 Subject: [PATCH 10/23] attempt at resolving build warnings make both values operated on double before casting --- libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 8fb1f6bd0a..be42957eb8 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -26,9 +26,7 @@ void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCal _inputDevice->update(deltaTime, inputCalibrationData, jointsCaptured); // at DPI 100 use these arbitrary values to divide dragging distance - static const float DPI_SCALE_X = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0f), 1.0f, 10.0f) * 600.0f; - static const float DPI_SCALE_Y = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchY() / 100.0f), 1.0f, 10.0f) * 200.0f; float distanceScaleX, distanceScaleY; From 3501749896d161c3efc3a490e77dca7ac2baf119 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 5 Apr 2016 00:37:14 +0100 Subject: [PATCH 11/23] attempt at resolving build warning make both values operated on double before casting --- libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index be42957eb8..f8da94e5e6 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -26,7 +26,9 @@ void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCal _inputDevice->update(deltaTime, inputCalibrationData, jointsCaptured); // at DPI 100 use these arbitrary values to divide dragging distance + static const float DPI_SCALE_X = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0), 1.0f, 10.0f) * 600.0f; + static const float DPI_SCALE_Y = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchY() / 100.0), 1.0f, 10.0f) * 200.0f; float distanceScaleX, distanceScaleY; From 6542604d1307234167e5a5e0ab67aadd37475773 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Fri, 24 Jun 2016 05:19:28 +0100 Subject: [PATCH 12/23] resolve conflicts with TouchscreenDevice updated to master --- interface/src/Application.cpp | 2 +- .../input-plugins/src/input-plugins/TouchscreenDevice.cpp | 8 +++++--- .../input-plugins/src/input-plugins/TouchscreenDevice.h | 5 ++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2d1dc64bcb..7858679583 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1593,7 +1593,7 @@ void Application::initializeUi() { if (KeyboardMouseDevice::NAME == inputPlugin->getName()) { _keyboardMouseDevice = std::dynamic_pointer_cast(inputPlugin); } - if (name == TouchscreenDevice::NAME) { + if (TouchscreenDevice::NAME == inputPlugin->getName()) { _touchscreenDevice = std::dynamic_pointer_cast(inputPlugin); } } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index f8da94e5e6..16b5947426 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -22,8 +22,10 @@ const QString TouchscreenDevice::NAME = "Touchscreen"; -void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { - _inputDevice->update(deltaTime, inputCalibrationData, jointsCaptured); +void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { + auto userInputMapper = DependencyManager::get(); + userInputMapper->withLock([&, this]() { + _inputDevice->update(deltaTime, inputCalibrationData); // at DPI 100 use these arbitrary values to divide dragging distance static const float DPI_SCALE_X = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0), 1.0f, 10.0f) @@ -51,7 +53,7 @@ void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCal } } -void TouchscreenDevice::InputDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { +void TouchscreenDevice::InputDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { _axisStateMap.clear(); } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index acd7d89333..772776348f 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -36,11 +36,10 @@ public: // Plugin functions virtual bool isSupported() const override { return true; } - virtual bool isJointController() const override { return false; } virtual const QString& getName() const override { return NAME; } virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } - virtual void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) override; + virtual void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override; void touchBeginEvent(const QTouchEvent* event); void touchEndEvent(const QTouchEvent* event); @@ -58,7 +57,7 @@ protected: // Device functions virtual controller::Input::NamedVector getAvailableInputs() const override; virtual QString getDefaultMappingConfig() const override; - virtual void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) override; + virtual void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override; virtual void focusOutEvent() override; controller::Input makeInput(TouchAxisChannel axis) const; From 8928854820c6f13302e094ac305a43b55dd066af Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Fri, 24 Jun 2016 05:20:47 +0100 Subject: [PATCH 13/23] lost change --- libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 16b5947426..9430f1d23a 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -26,6 +26,7 @@ void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCal auto userInputMapper = DependencyManager::get(); userInputMapper->withLock([&, this]() { _inputDevice->update(deltaTime, inputCalibrationData); + }); // at DPI 100 use these arbitrary values to divide dragging distance static const float DPI_SCALE_X = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0), 1.0f, 10.0f) From 90cd335bdabcc1d3e7679da0b3d7a0ef0fc5868b Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Fri, 24 Jun 2016 10:48:25 +0100 Subject: [PATCH 14/23] missed a brace --- tests/controllers/src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/controllers/src/main.cpp b/tests/controllers/src/main.cpp index dbb17fd63f..1a4f8742e9 100644 --- a/tests/controllers/src/main.cpp +++ b/tests/controllers/src/main.cpp @@ -92,7 +92,7 @@ public: virtual QOpenGLContext* getPrimaryContext() override { return nullptr; } virtual ui::Menu* getPrimaryMenu() override { return nullptr; } virtual bool isForeground() const override { return true; } - virtual DisplayPluginPointer getActiveDisplayPlugin() const override { return DisplayPluginPointer(); } + virtual DisplayPluginPointer getActiveDisplayPlugin() const override { return DisplayPluginPointer(); } }; class MyControllerScriptingInterface : public controller::ScriptingInterface { @@ -144,6 +144,7 @@ int main(int argc, char** argv) { auto userInputMapper = DependencyManager::get(); if (name == KeyboardMouseDevice::NAME) { userInputMapper->registerDevice(std::dynamic_pointer_cast(inputPlugin)->getInputDevice()); + } if (name == TouchscreenDevice::NAME) { userInputMapper->registerDevice(std::dynamic_pointer_cast(inputPlugin)->getInputDevice()); } From aae3555b63c964e6a484bdcd0dfcecac83b18b92 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Mon, 27 Jun 2016 21:01:06 +0100 Subject: [PATCH 15/23] update TouchscreenDevice * fix threading issue with zoom gesture * KeyboardMouseDevice touchpad disabled to prevent interference * device supported based on QTouchDevice::devices().count() --- interface/src/Application.cpp | 13 +- .../src/input-plugins/KeyboardMouseDevice.cpp | 117 +++++++++--------- .../src/input-plugins/KeyboardMouseDevice.h | 4 +- .../src/input-plugins/TouchscreenDevice.cpp | 21 ++-- .../src/input-plugins/TouchscreenDevice.h | 6 +- 5 files changed, 84 insertions(+), 77 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7858679583..7680112462 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -961,7 +961,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : // Setup the _keyboardMouseDevice, _touchscreenDevice and the user input mapper with the default bindings userInputMapper->registerDevice(_keyboardMouseDevice->getInputDevice()); - userInputMapper->registerDevice(_touchscreenDevice->getInputDevice()); + // if the _touchscreenDevice is not supported it will not be registered + if (_touchscreenDevice) { + userInputMapper->registerDevice(_touchscreenDevice->getInputDevice()); + } // force the model the look at the correct directory (weird order of operations issue) scriptEngines->setScriptsLocation(scriptEngines->getScriptsLocation()); @@ -2712,7 +2715,7 @@ void Application::touchUpdateEvent(QTouchEvent* event) { if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->touchUpdateEvent(event); } - if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + if (_touchscreenDevice->isActive()) { _touchscreenDevice->touchUpdateEvent(event); } } @@ -2733,7 +2736,7 @@ void Application::touchBeginEvent(QTouchEvent* event) { if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->touchBeginEvent(event); } - if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + if (_touchscreenDevice->isActive()) { _touchscreenDevice->touchBeginEvent(event); } @@ -2753,7 +2756,7 @@ void Application::touchEndEvent(QTouchEvent* event) { if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->touchEndEvent(event); } - if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + if (_touchscreenDevice->isActive()) { _touchscreenDevice->touchEndEvent(event); } @@ -2761,7 +2764,7 @@ void Application::touchEndEvent(QTouchEvent* event) { } void Application::touchGestureEvent(QGestureEvent* event) { - if (Menu::getInstance()->isOptionChecked(TouchscreenDevice::NAME)) { + if (_touchscreenDevice->isActive()) { _touchscreenDevice->touchGestureEvent(event); } } diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp index cc4117ffc0..550d127198 100755 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp @@ -19,7 +19,7 @@ #include const QString KeyboardMouseDevice::NAME = "Keyboard/Mouse"; -bool KeyboardMouseDevice::_enableMouse = true; +bool KeyboardMouseDevice::_enableTouchpad = true; void KeyboardMouseDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { auto userInputMapper = DependencyManager::get(); @@ -62,32 +62,28 @@ void KeyboardMouseDevice::keyReleaseEvent(QKeyEvent* event) { } void KeyboardMouseDevice::mousePressEvent(QMouseEvent* event) { - if (_enableMouse) { - auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); - auto result = _inputDevice->_buttonPressedMap.insert(input.getChannel()); - if (!result.second) { - // key pressed again ? without catching the release event ? - } - _lastCursor = event->pos(); - _mousePressTime = usecTimestampNow(); - _mouseMoved = false; - - eraseMouseClicked(); + auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); + auto result = _inputDevice->_buttonPressedMap.insert(input.getChannel()); + if (!result.second) { + // key pressed again ? without catching the release event ? } + _lastCursor = event->pos(); + _mousePressTime = usecTimestampNow(); + _mouseMoved = false; + + eraseMouseClicked(); } void KeyboardMouseDevice::mouseReleaseEvent(QMouseEvent* event) { - if (_enableMouse) { - auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); - _inputDevice->_buttonPressedMap.erase(input.getChannel()); + auto input = _inputDevice->makeInput((Qt::MouseButton) event->button()); + _inputDevice->_buttonPressedMap.erase(input.getChannel()); - // if we pressed and released at the same location within a small time window, then create a "_CLICKED" - // input for this button we might want to add some small tolerance to this so if you do a small drag it - // still counts as a click. - static const int CLICK_TIME = USECS_PER_MSEC * 500; // 500 ms to click - if (!_mouseMoved && (usecTimestampNow() - _mousePressTime < CLICK_TIME)) { - _inputDevice->_buttonPressedMap.insert(_inputDevice->makeInput((Qt::MouseButton) event->button(), true).getChannel()); - } + // if we pressed and released at the same location within a small time window, then create a "_CLICKED" + // input for this button we might want to add some small tolerance to this so if you do a small drag it + // still counts as a click. + static const int CLICK_TIME = USECS_PER_MSEC * 500; // 500 ms to click + if (!_mouseMoved && (usecTimestampNow() - _mousePressTime < CLICK_TIME)) { + _inputDevice->_buttonPressedMap.insert(_inputDevice->makeInput((Qt::MouseButton) event->button(), true).getChannel()); } } @@ -98,24 +94,22 @@ void KeyboardMouseDevice::eraseMouseClicked() { } void KeyboardMouseDevice::mouseMoveEvent(QMouseEvent* event) { - if (_enableMouse) { - QPoint currentPos = event->pos(); - QPoint currentMove = currentPos - _lastCursor; + QPoint currentPos = event->pos(); + QPoint currentMove = currentPos - _lastCursor; - _inputDevice->_axisStateMap[MOUSE_AXIS_X_POS] = (currentMove.x() > 0 ? currentMove.x() : 0.0f); - _inputDevice->_axisStateMap[MOUSE_AXIS_X_NEG] = (currentMove.x() < 0 ? -currentMove.x() : 0.0f); - // Y mouse is inverted positive is pointing up the screen - _inputDevice->_axisStateMap[MOUSE_AXIS_Y_POS] = (currentMove.y() < 0 ? -currentMove.y() : 0.0f); - _inputDevice->_axisStateMap[MOUSE_AXIS_Y_NEG] = (currentMove.y() > 0 ? currentMove.y() : 0.0f); + _inputDevice->_axisStateMap[MOUSE_AXIS_X_POS] = (currentMove.x() > 0 ? currentMove.x() : 0.0f); + _inputDevice->_axisStateMap[MOUSE_AXIS_X_NEG] = (currentMove.x() < 0 ? -currentMove.x() : 0.0f); + // Y mouse is inverted positive is pointing up the screen + _inputDevice->_axisStateMap[MOUSE_AXIS_Y_POS] = (currentMove.y() < 0 ? -currentMove.y() : 0.0f); + _inputDevice->_axisStateMap[MOUSE_AXIS_Y_NEG] = (currentMove.y() > 0 ? currentMove.y() : 0.0f); - // FIXME - this has the characteristic that it will show large jumps when you move the cursor - // outside of the application window, because we don't get MouseEvents when the cursor is outside - // of the application window. - _lastCursor = currentPos; - _mouseMoved = true; + // FIXME - this has the characteristic that it will show large jumps when you move the cursor + // outside of the application window, because we don't get MouseEvents when the cursor is outside + // of the application window. + _lastCursor = currentPos; + _mouseMoved = true; - eraseMouseClicked(); - } + eraseMouseClicked(); } void KeyboardMouseDevice::wheelEvent(QWheelEvent* event) { @@ -139,34 +133,41 @@ glm::vec2 evalAverageTouchPoints(const QList& points) { } void KeyboardMouseDevice::touchBeginEvent(const QTouchEvent* event) { - _isTouching = event->touchPointStates().testFlag(Qt::TouchPointPressed); - _lastTouch = evalAverageTouchPoints(event->touchPoints()); - _lastTouchTime = _clock.now(); + if (_enableTouchpad) { + _isTouching = event->touchPointStates().testFlag(Qt::TouchPointPressed); + _lastTouch = evalAverageTouchPoints(event->touchPoints()); + _lastTouchTime = _clock.now(); + } } void KeyboardMouseDevice::touchEndEvent(const QTouchEvent* event) { - _isTouching = false; - _lastTouch = evalAverageTouchPoints(event->touchPoints()); - _lastTouchTime = _clock.now(); + if (_enableTouchpad) { + _isTouching = false; + _lastTouch = evalAverageTouchPoints(event->touchPoints()); + _lastTouchTime = _clock.now(); + } } void KeyboardMouseDevice::touchUpdateEvent(const QTouchEvent* event) { - auto currentPos = evalAverageTouchPoints(event->touchPoints()); - _lastTouchTime = _clock.now(); - - if (!_isTouching) { - _isTouching = event->touchPointStates().testFlag(Qt::TouchPointPressed); - } else { - auto currentMove = currentPos - _lastTouch; - - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_POS).getChannel()] = (currentMove.x > 0 ? currentMove.x : 0.0f); - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_NEG).getChannel()] = (currentMove.x < 0 ? -currentMove.x : 0.0f); - // Y mouse is inverted positive is pointing up the screen - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_POS).getChannel()] = (currentMove.y < 0 ? -currentMove.y : 0.0f); - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_NEG).getChannel()] = (currentMove.y > 0 ? currentMove.y : 0.0f); - } + if (_enableTouchpad) { + auto currentPos = evalAverageTouchPoints(event->touchPoints()); + _lastTouchTime = _clock.now(); - _lastTouch = currentPos; + if (!_isTouching) { + _isTouching = event->touchPointStates().testFlag(Qt::TouchPointPressed); + } + else { + auto currentMove = currentPos - _lastTouch; + + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_POS).getChannel()] = (currentMove.x > 0 ? currentMove.x : 0.0f); + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_NEG).getChannel()] = (currentMove.x < 0 ? -currentMove.x : 0.0f); + // Y mouse is inverted positive is pointing up the screen + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_POS).getChannel()] = (currentMove.y < 0 ? -currentMove.y : 0.0f); + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_NEG).getChannel()] = (currentMove.y > 0 ? currentMove.y : 0.0f); + } + + _lastTouch = currentPos; + } } controller::Input KeyboardMouseDevice::InputDevice::makeInput(Qt::Key code) const { diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h index fc2ad44a6d..d88c410ade 100644 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h @@ -85,7 +85,7 @@ public: void wheelEvent(QWheelEvent* event); - static void enableMouse(bool enableMouse) { _enableMouse = enableMouse; } + static void enableTouchpad(bool enableTouchpad) { _enableTouchpad = enableTouchpad; } static const QString NAME; @@ -125,7 +125,7 @@ protected: std::chrono::high_resolution_clock _clock; std::chrono::high_resolution_clock::time_point _lastTouchTime; - static bool _enableMouse; + static bool _enableTouchpad; }; #endif // hifi_KeyboardMouseDevice_h diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 9430f1d23a..8e3eea4cf6 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -51,6 +51,13 @@ void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCal distanceScaleY = (_currentTouchVec.y - _firstTouchVec.y) / DPI_SCALE_Y; _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_NEG).getChannel()] = distanceScaleY; } + } else if (_touchPointCount == 2) { + if (_scaleFactor > _lastPinchScale && _scaleFactor != 0) { + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_POS).getChannel()] = 1.0f; + } else if (_scaleFactor != 0) { + _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_NEG).getChannel()] = 1.0f; + } + _lastPinchScale = _scaleFactor; } } @@ -64,12 +71,12 @@ void TouchscreenDevice::InputDevice::focusOutEvent() { void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { const QTouchEvent::TouchPoint& point = event->touchPoints().at(0); _firstTouchVec = glm::vec2(point.pos().x(), point.pos().y()); - KeyboardMouseDevice::enableMouse(false); + KeyboardMouseDevice::enableTouchpad(false); } void TouchscreenDevice::touchEndEvent(const QTouchEvent* event) { _touchPointCount = 0; - KeyboardMouseDevice::enableMouse(true); + KeyboardMouseDevice::enableTouchpad(true); } void TouchscreenDevice::touchUpdateEvent(const QTouchEvent* event) { @@ -81,13 +88,7 @@ void TouchscreenDevice::touchUpdateEvent(const QTouchEvent* event) { void TouchscreenDevice::touchGestureEvent(const QGestureEvent* event) { if (QGesture* gesture = event->gesture(Qt::PinchGesture)) { QPinchGesture* pinch = static_cast(gesture); - qreal scaleFactor = pinch->totalScaleFactor(); - if (scaleFactor > _lastPinchScale && scaleFactor != 0) { - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_POS).getChannel()] = 1.0f; - } else if (scaleFactor != 0) { - _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_NEG).getChannel()] = 1.0f; - } - _lastPinchScale = scaleFactor; + _scaleFactor = pinch->totalScaleFactor(); } } @@ -118,4 +119,4 @@ controller::Input::NamedVector TouchscreenDevice::InputDevice::getAvailableInput QString TouchscreenDevice::InputDevice::getDefaultMappingConfig() const { static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/touchscreen.json"; return MAPPING_JSON; -} \ No newline at end of file +} diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index 772776348f..53dba19b00 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -14,6 +14,7 @@ #include #include "InputPlugin.h" +#include class QTouchEvent; class QGestureEvent; @@ -32,10 +33,10 @@ public: enum TouchGestureAxisChannel { TOUCH_GESTURE_PINCH_POS = TOUCH_AXIS_Y_NEG + 1, TOUCH_GESTURE_PINCH_NEG, - }; + }; // Plugin functions - virtual bool isSupported() const override { return true; } + virtual bool isSupported() const override { return QTouchDevice::devices().count() > 0; } virtual const QString& getName() const override { return NAME; } virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } @@ -71,6 +72,7 @@ public: protected: qreal _lastPinchScale; + qreal _scaleFactor; glm::vec2 _firstTouchVec; glm::vec2 _currentTouchVec; int _touchPointCount; From 480b1a1263c83225496004cda781c1872f458b83 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Mon, 27 Jun 2016 21:06:06 +0100 Subject: [PATCH 16/23] extra line in KeyboardMouse Device there's 2 blank lines at the end of the file --- .../input-plugins/src/input-plugins/KeyboardMouseDevice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp index 550d127198..6edaddb24a 100755 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp @@ -255,4 +255,3 @@ QString KeyboardMouseDevice::InputDevice::getDefaultMappingConfig() const { static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/keyboardMouse.json"; return MAPPING_JSON; } - From ab52fc5b3cd244e87729aecb116f57ba127de6cb Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Mon, 27 Jun 2016 21:42:32 +0100 Subject: [PATCH 17/23] json indentation fix --- interface/resources/controllers/touchscreen.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/resources/controllers/touchscreen.json b/interface/resources/controllers/touchscreen.json index 041259bd36..284a7a3914 100644 --- a/interface/resources/controllers/touchscreen.json +++ b/interface/resources/controllers/touchscreen.json @@ -2,8 +2,8 @@ "name": "Touchscreen to Actions", "channels": [ - { "from": "Touchscreen.GesturePinchOut", "to": "Actions.BoomOut", "filters": [ { "type": "scale", "scale": 0.02 } ]}, - { "from": "Touchscreen.GesturePinchIn", "to": "Actions.BoomIn", "filters": [ { "type": "scale", "scale": 0.02 } ]}, + { "from": "Touchscreen.GesturePinchOut", "to": "Actions.BoomOut", "filters": [ { "type": "scale", "scale": 0.02 } ] }, + { "from": "Touchscreen.GesturePinchIn", "to": "Actions.BoomIn", "filters": [ { "type": "scale", "scale": 0.02 } ] }, { "from": { "makeAxis" : [ [ "Touchscreen.DragLeft" ], @@ -13,7 +13,7 @@ "to": "Actions.Yaw" }, - { "from": { "makeAxis" : [ + { "from": { "makeAxis" : [ [ "Touchscreen.DragUp" ], [ "Touchscreen.DragDown" ] ] From 19b6a04175bf302ff2056a0db2917d232741bdcd Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Mon, 27 Jun 2016 23:33:12 +0100 Subject: [PATCH 18/23] indentation causing some issue is this resolved? Hard to tell. --- interface/resources/controllers/touchscreen.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/interface/resources/controllers/touchscreen.json b/interface/resources/controllers/touchscreen.json index 284a7a3914..1b4e9723ce 100644 --- a/interface/resources/controllers/touchscreen.json +++ b/interface/resources/controllers/touchscreen.json @@ -1,18 +1,17 @@ { "name": "Touchscreen to Actions", "channels": [ - { "from": "Touchscreen.GesturePinchOut", "to": "Actions.BoomOut", "filters": [ { "type": "scale", "scale": 0.02 } ] }, { "from": "Touchscreen.GesturePinchIn", "to": "Actions.BoomIn", "filters": [ { "type": "scale", "scale": 0.02 } ] }, - + { "from": { "makeAxis" : [ - [ "Touchscreen.DragLeft" ], - [ "Touchscreen.DragRight" ] - ] - }, + [ "Touchscreen.DragLeft" ], + [ "Touchscreen.DragRight" ] + ] + }, "to": "Actions.Yaw" }, - + { "from": { "makeAxis" : [ [ "Touchscreen.DragUp" ], [ "Touchscreen.DragDown" ] From cc6dca853c98cd3e6136f2aeaef17ba2e24d4cda Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 28 Jun 2016 16:47:13 +0100 Subject: [PATCH 19/23] change TouchScreenDevice based on CR feedback * device support is based on detection of QTouchDevice::TouchScreen * DPI scale is calculated using the screen that generates the touch event --- .../src/input-plugins/TouchscreenDevice.cpp | 33 +++++++++++++------ .../src/input-plugins/TouchscreenDevice.h | 4 ++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 8e3eea4cf6..10bca75e0a 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -22,33 +23,36 @@ const QString TouchscreenDevice::NAME = "Touchscreen"; +bool TouchscreenDevice::isSupported() const { + for (auto touchDevice : QTouchDevice::devices()) { + if (touchDevice->type() == QTouchDevice::TouchScreen) { + return true; + } + } + return false; +} + void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { auto userInputMapper = DependencyManager::get(); userInputMapper->withLock([&, this]() { _inputDevice->update(deltaTime, inputCalibrationData); }); - // at DPI 100 use these arbitrary values to divide dragging distance - static const float DPI_SCALE_X = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0), 1.0f, 10.0f) - * 600.0f; - static const float DPI_SCALE_Y = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchY() / 100.0), 1.0f, 10.0f) - * 200.0f; - float distanceScaleX, distanceScaleY; if (_touchPointCount == 1) { if (_firstTouchVec.x < _currentTouchVec.x) { - distanceScaleX = (_currentTouchVec.x - _firstTouchVec.x) / DPI_SCALE_X; + distanceScaleX = (_currentTouchVec.x - _firstTouchVec.x) / _screenDPIScale.x; _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_POS).getChannel()] = distanceScaleX; } else if (_firstTouchVec.x > _currentTouchVec.x) { - distanceScaleX = (_firstTouchVec.x - _currentTouchVec.x) / DPI_SCALE_X; + distanceScaleX = (_firstTouchVec.x - _currentTouchVec.x) / _screenDPIScale.x; _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_NEG).getChannel()] = distanceScaleX; } // Y axis is inverted, positive is pointing up the screen if (_firstTouchVec.y > _currentTouchVec.y) { - distanceScaleY = (_firstTouchVec.y - _currentTouchVec.y) / DPI_SCALE_Y; + distanceScaleY = (_firstTouchVec.y - _currentTouchVec.y) / _screenDPIScale.y; _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_POS).getChannel()] = distanceScaleY; } else if (_firstTouchVec.y < _currentTouchVec.y) { - distanceScaleY = (_currentTouchVec.y - _firstTouchVec.y) / DPI_SCALE_Y; + distanceScaleY = (_currentTouchVec.y - _firstTouchVec.y) / _screenDPIScale.y; _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_NEG).getChannel()] = distanceScaleY; } } else if (_touchPointCount == 2) { @@ -72,6 +76,15 @@ void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { const QTouchEvent::TouchPoint& point = event->touchPoints().at(0); _firstTouchVec = glm::vec2(point.pos().x(), point.pos().y()); KeyboardMouseDevice::enableTouchpad(false); + if (_screenDPI != event->window()->screen()->physicalDotsPerInch()) { + // at DPI 100 use these arbitrary values to divide dragging distance + // the value is clamped from 1 to 10 so up to 1000 DPI would be supported atm + _screenDPIScale.x = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0), 1.0f, 10.0f) + * 600.0f; + _screenDPIScale.y = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchY() / 100.0), 1.0f, 10.0f) + * 200.0f; + _screenDPI = event->window()->screen()->physicalDotsPerInch(); + } } void TouchscreenDevice::touchEndEvent(const QTouchEvent* event) { diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index 53dba19b00..b354b7e9ec 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -36,7 +36,7 @@ public: }; // Plugin functions - virtual bool isSupported() const override { return QTouchDevice::devices().count() > 0; } + virtual bool isSupported() const override; virtual const QString& getName() const override { return NAME; } virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } @@ -73,6 +73,8 @@ public: protected: qreal _lastPinchScale; qreal _scaleFactor; + qreal _screenDPI; + glm::vec2 _screenDPIScale; glm::vec2 _firstTouchVec; glm::vec2 _currentTouchVec; int _touchPointCount; From efdee523fbdb8e266e081de5c91b523697cb9304 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 28 Jun 2016 17:57:38 +0100 Subject: [PATCH 20/23] coding standard fix and renaming --- interface/resources/controllers/touchscreen.json | 2 +- .../src/input-plugins/KeyboardMouseDevice.cpp | 11 +++++------ .../src/input-plugins/KeyboardMouseDevice.h | 4 ++-- .../src/input-plugins/TouchscreenDevice.cpp | 12 ++++++------ .../src/input-plugins/TouchscreenDevice.h | 2 +- 5 files changed, 15 insertions(+), 16 deletions(-) diff --git a/interface/resources/controllers/touchscreen.json b/interface/resources/controllers/touchscreen.json index 1b4e9723ce..21362ce8fb 100644 --- a/interface/resources/controllers/touchscreen.json +++ b/interface/resources/controllers/touchscreen.json @@ -12,7 +12,7 @@ "to": "Actions.Yaw" }, - { "from": { "makeAxis" : [ + { "from": { "makeAxis" : [ [ "Touchscreen.DragUp" ], [ "Touchscreen.DragDown" ] ] diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp index 6edaddb24a..56894efc4c 100755 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp @@ -19,7 +19,7 @@ #include const QString KeyboardMouseDevice::NAME = "Keyboard/Mouse"; -bool KeyboardMouseDevice::_enableTouchpad = true; +bool KeyboardMouseDevice::_enableTouch = true; void KeyboardMouseDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { auto userInputMapper = DependencyManager::get(); @@ -133,7 +133,7 @@ glm::vec2 evalAverageTouchPoints(const QList& points) { } void KeyboardMouseDevice::touchBeginEvent(const QTouchEvent* event) { - if (_enableTouchpad) { + if (_enableTouch) { _isTouching = event->touchPointStates().testFlag(Qt::TouchPointPressed); _lastTouch = evalAverageTouchPoints(event->touchPoints()); _lastTouchTime = _clock.now(); @@ -141,7 +141,7 @@ void KeyboardMouseDevice::touchBeginEvent(const QTouchEvent* event) { } void KeyboardMouseDevice::touchEndEvent(const QTouchEvent* event) { - if (_enableTouchpad) { + if (_enableTouch) { _isTouching = false; _lastTouch = evalAverageTouchPoints(event->touchPoints()); _lastTouchTime = _clock.now(); @@ -149,14 +149,13 @@ void KeyboardMouseDevice::touchEndEvent(const QTouchEvent* event) { } void KeyboardMouseDevice::touchUpdateEvent(const QTouchEvent* event) { - if (_enableTouchpad) { + if (_enableTouch) { auto currentPos = evalAverageTouchPoints(event->touchPoints()); _lastTouchTime = _clock.now(); if (!_isTouching) { _isTouching = event->touchPointStates().testFlag(Qt::TouchPointPressed); - } - else { + } else { auto currentMove = currentPos - _lastTouch; _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_POS).getChannel()] = (currentMove.x > 0 ? currentMove.x : 0.0f); diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h index d88c410ade..2fdecf0bba 100644 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h @@ -85,7 +85,7 @@ public: void wheelEvent(QWheelEvent* event); - static void enableTouchpad(bool enableTouchpad) { _enableTouchpad = enableTouchpad; } + static void enableTouch(bool enableTouch) { _enableTouch = enableTouch; } static const QString NAME; @@ -125,7 +125,7 @@ protected: std::chrono::high_resolution_clock _clock; std::chrono::high_resolution_clock::time_point _lastTouchTime; - static bool _enableTouchpad; + static bool _enableTouch; }; #endif // hifi_KeyboardMouseDevice_h diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 10bca75e0a..e9553c1785 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -56,12 +56,12 @@ void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCal _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_NEG).getChannel()] = distanceScaleY; } } else if (_touchPointCount == 2) { - if (_scaleFactor > _lastPinchScale && _scaleFactor != 0) { + if (_pinchScale > _lastPinchScale && _pinchScale != 0) { _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_POS).getChannel()] = 1.0f; - } else if (_scaleFactor != 0) { + } else if (_pinchScale != 0) { _inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_GESTURE_PINCH_NEG).getChannel()] = 1.0f; } - _lastPinchScale = _scaleFactor; + _lastPinchScale = _pinchScale; } } @@ -75,7 +75,7 @@ void TouchscreenDevice::InputDevice::focusOutEvent() { void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { const QTouchEvent::TouchPoint& point = event->touchPoints().at(0); _firstTouchVec = glm::vec2(point.pos().x(), point.pos().y()); - KeyboardMouseDevice::enableTouchpad(false); + KeyboardMouseDevice::enableTouch(false); if (_screenDPI != event->window()->screen()->physicalDotsPerInch()) { // at DPI 100 use these arbitrary values to divide dragging distance // the value is clamped from 1 to 10 so up to 1000 DPI would be supported atm @@ -89,7 +89,7 @@ void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { void TouchscreenDevice::touchEndEvent(const QTouchEvent* event) { _touchPointCount = 0; - KeyboardMouseDevice::enableTouchpad(true); + KeyboardMouseDevice::enableTouch(true); } void TouchscreenDevice::touchUpdateEvent(const QTouchEvent* event) { @@ -101,7 +101,7 @@ void TouchscreenDevice::touchUpdateEvent(const QTouchEvent* event) { void TouchscreenDevice::touchGestureEvent(const QGestureEvent* event) { if (QGesture* gesture = event->gesture(Qt::PinchGesture)) { QPinchGesture* pinch = static_cast(gesture); - _scaleFactor = pinch->totalScaleFactor(); + _pinchScale = pinch->totalScaleFactor(); } } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index b354b7e9ec..f89f247ce8 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -72,7 +72,7 @@ public: protected: qreal _lastPinchScale; - qreal _scaleFactor; + qreal _pinchScale; qreal _screenDPI; glm::vec2 _screenDPIScale; glm::vec2 _firstTouchVec; From 97e90ed798625bb9b06a81cefc32453a70cd310f Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Wed, 29 Jun 2016 03:45:54 +0100 Subject: [PATCH 21/23] TouchscreenDevice DPI scaling now handled via JSON mapping do the arbitrary scaling in the mapping file --- interface/resources/controllers/touchscreen.json | 4 ++-- .../input-plugins/src/input-plugins/TouchscreenDevice.cpp | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/interface/resources/controllers/touchscreen.json b/interface/resources/controllers/touchscreen.json index 21362ce8fb..5b2ff62a8d 100644 --- a/interface/resources/controllers/touchscreen.json +++ b/interface/resources/controllers/touchscreen.json @@ -9,7 +9,7 @@ [ "Touchscreen.DragRight" ] ] }, - "to": "Actions.Yaw" + "to": "Actions.Yaw", "filters": [ { "type": "scale", "scale": 0.12 } ] }, { "from": { "makeAxis" : [ @@ -17,7 +17,7 @@ [ "Touchscreen.DragDown" ] ] }, - "to": "Actions.Pitch" + "to": "Actions.Pitch", "filters": [ { "type": "scale", "scale": 0.04 } ] } ] } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index e9553c1785..271a3bb732 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -77,12 +77,6 @@ void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { _firstTouchVec = glm::vec2(point.pos().x(), point.pos().y()); KeyboardMouseDevice::enableTouch(false); if (_screenDPI != event->window()->screen()->physicalDotsPerInch()) { - // at DPI 100 use these arbitrary values to divide dragging distance - // the value is clamped from 1 to 10 so up to 1000 DPI would be supported atm - _screenDPIScale.x = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchX() / 100.0), 1.0f, 10.0f) - * 600.0f; - _screenDPIScale.y = glm::clamp((float)(qApp->primaryScreen()->physicalDotsPerInchY() / 100.0), 1.0f, 10.0f) - * 200.0f; _screenDPI = event->window()->screen()->physicalDotsPerInch(); } } From 2c56d29a68e508020941794f8a5bb17b65013d14 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Wed, 29 Jun 2016 03:47:20 +0100 Subject: [PATCH 22/23] git add seemed to miss a change use event window, not primaryScreen --- libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 271a3bb732..12e990757d 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -77,6 +77,8 @@ void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { _firstTouchVec = glm::vec2(point.pos().x(), point.pos().y()); KeyboardMouseDevice::enableTouch(false); if (_screenDPI != event->window()->screen()->physicalDotsPerInch()) { + _screenDPIScale.x = (float)event->window()->screen()->physicalDotsPerInchX(); + _screenDPIScale.y = (float)event->window()->screen()->physicalDotsPerInchY(); _screenDPI = event->window()->screen()->physicalDotsPerInch(); } } From 9b993b266528bee8a4b39c7e93b791ceb417ebff Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Wed, 29 Jun 2016 03:58:17 +0100 Subject: [PATCH 23/23] store pointer to event->window()->screen() save the planet! --- .../src/input-plugins/TouchscreenDevice.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp index 12e990757d..64f02b5df3 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.cpp @@ -76,10 +76,11 @@ void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) { const QTouchEvent::TouchPoint& point = event->touchPoints().at(0); _firstTouchVec = glm::vec2(point.pos().x(), point.pos().y()); KeyboardMouseDevice::enableTouch(false); - if (_screenDPI != event->window()->screen()->physicalDotsPerInch()) { - _screenDPIScale.x = (float)event->window()->screen()->physicalDotsPerInchX(); - _screenDPIScale.y = (float)event->window()->screen()->physicalDotsPerInchY(); - _screenDPI = event->window()->screen()->physicalDotsPerInch(); + QScreen* eventScreen = event->window()->screen(); + if (_screenDPI != eventScreen->physicalDotsPerInch()) { + _screenDPIScale.x = (float)eventScreen->physicalDotsPerInchX(); + _screenDPIScale.y = (float)eventScreen->physicalDotsPerInchY(); + _screenDPI = eventScreen->physicalDotsPerInch(); } }