mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-26 03:55:08 +02:00
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
This commit is contained in:
parent
19b6a04175
commit
cc6dca853c
2 changed files with 26 additions and 11 deletions
|
@ -14,6 +14,7 @@
|
||||||
#include <QtGui/QTouchEvent>
|
#include <QtGui/QTouchEvent>
|
||||||
#include <QGestureEvent>
|
#include <QGestureEvent>
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
|
#include <QWindow>
|
||||||
#include <QScreen>
|
#include <QScreen>
|
||||||
|
|
||||||
#include <controllers/UserInputMapper.h>
|
#include <controllers/UserInputMapper.h>
|
||||||
|
@ -22,33 +23,36 @@
|
||||||
|
|
||||||
const QString TouchscreenDevice::NAME = "Touchscreen";
|
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) {
|
void TouchscreenDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) {
|
||||||
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
||||||
userInputMapper->withLock([&, this]() {
|
userInputMapper->withLock([&, this]() {
|
||||||
_inputDevice->update(deltaTime, inputCalibrationData);
|
_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;
|
float distanceScaleX, distanceScaleY;
|
||||||
if (_touchPointCount == 1) {
|
if (_touchPointCount == 1) {
|
||||||
if (_firstTouchVec.x < _currentTouchVec.x) {
|
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;
|
_inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_POS).getChannel()] = distanceScaleX;
|
||||||
} else if (_firstTouchVec.x > _currentTouchVec.x) {
|
} 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;
|
_inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_X_NEG).getChannel()] = distanceScaleX;
|
||||||
}
|
}
|
||||||
// Y axis is inverted, positive is pointing up the screen
|
// Y axis is inverted, positive is pointing up the screen
|
||||||
if (_firstTouchVec.y > _currentTouchVec.y) {
|
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;
|
_inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_POS).getChannel()] = distanceScaleY;
|
||||||
} else if (_firstTouchVec.y < _currentTouchVec.y) {
|
} 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;
|
_inputDevice->_axisStateMap[_inputDevice->makeInput(TOUCH_AXIS_Y_NEG).getChannel()] = distanceScaleY;
|
||||||
}
|
}
|
||||||
} else if (_touchPointCount == 2) {
|
} else if (_touchPointCount == 2) {
|
||||||
|
@ -72,6 +76,15 @@ void TouchscreenDevice::touchBeginEvent(const QTouchEvent* event) {
|
||||||
const QTouchEvent::TouchPoint& point = event->touchPoints().at(0);
|
const QTouchEvent::TouchPoint& point = event->touchPoints().at(0);
|
||||||
_firstTouchVec = glm::vec2(point.pos().x(), point.pos().y());
|
_firstTouchVec = glm::vec2(point.pos().x(), point.pos().y());
|
||||||
KeyboardMouseDevice::enableTouchpad(false);
|
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) {
|
void TouchscreenDevice::touchEndEvent(const QTouchEvent* event) {
|
||||||
|
|
|
@ -36,7 +36,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
// Plugin functions
|
// 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 const QString& getName() const override { return NAME; }
|
||||||
|
|
||||||
virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); }
|
virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); }
|
||||||
|
@ -73,6 +73,8 @@ public:
|
||||||
protected:
|
protected:
|
||||||
qreal _lastPinchScale;
|
qreal _lastPinchScale;
|
||||||
qreal _scaleFactor;
|
qreal _scaleFactor;
|
||||||
|
qreal _screenDPI;
|
||||||
|
glm::vec2 _screenDPIScale;
|
||||||
glm::vec2 _firstTouchVec;
|
glm::vec2 _firstTouchVec;
|
||||||
glm::vec2 _currentTouchVec;
|
glm::vec2 _currentTouchVec;
|
||||||
int _touchPointCount;
|
int _touchPointCount;
|
||||||
|
|
Loading…
Reference in a new issue