12 #ifndef hifi_TouchscreenVirtualPadDevice_h
13 #define hifi_TouchscreenVirtualPadDevice_h
15 #include <controllers/InputDevice.h>
16 #include "InputPlugin.h"
17 #include <QtGui/qtouchdevice.h>
18 #if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
19 #include <QtGui/QList>
21 #include <QTouchEvent>
22 #include <QtCore/QList>
24 #include "VirtualPadManager.h"
29 class TouchscreenVirtualPadDevice :
public InputPlugin {
34 virtual void init()
override;
35 virtual void resize();
36 virtual bool isSupported()
const override;
37 virtual const QString getName()
const override {
return NAME; }
39 bool isHandController()
const override {
return false; }
41 virtual void pluginFocusOutEvent()
override { _inputDevice->focusOutEvent(); }
42 virtual void pluginUpdate(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
44 void touchBeginEvent(
const QTouchEvent* event);
45 void touchEndEvent(
const QTouchEvent* event);
46 void touchUpdateEvent(
const QTouchEvent* event);
47 void touchGestureEvent(
const QGestureEvent* event);
49 static const char* NAME;
51 int _viewTouchUpdateCount;
52 enum TouchAxisChannel {
59 enum TouchButtonChannel {
66 class InputDevice :
public controller::InputDevice {
68 InputDevice() : controller::InputDevice(
"TouchscreenVirtualPad") {}
71 virtual controller::Input::NamedVector getAvailableInputs()
const override;
72 virtual QString getDefaultMappingConfig()
const override;
74 virtual bool triggerHapticPulse(
float strength,
float duration, uint16_t index)
override;
75 virtual void update(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
76 virtual void focusOutEvent()
override;
78 friend class TouchscreenVirtualPadDevice;
80 controller::Input makeInput(TouchAxisChannel axis)
const;
81 controller::Input makeInput(TouchButtonChannel button)
const;
85 const std::shared_ptr<InputDevice>& getInputDevice()
const {
return _inputDevice; }
96 class TouchscreenButton {
99 TouchscreenButton() {};
101 TouchscreenButton(TouchButtonChannel channelIn, TouchType touchTypeIn,
float buttonRadiusIn, glm::vec2 buttonPositionIn,
102 std::shared_ptr<InputDevice> inputDeviceIn);
104 void touchBegin(glm::vec2 touchPoint);
105 void touchUpdate(glm::vec2 touchPoint);
107 bool touchBeginIsValid(glm::vec2 touchPoint);
109 bool hasValidTouch {
false };
113 int _candidatePointIdx { -1 };
114 bool _found {
false };
115 void resetEventValues();
117 glm::vec2 buttonPosition;
120 TouchButtonChannel channel;
122 std::shared_ptr<InputDevice> _inputDevice;
126 class TouchscreenButtonsManager {
129 TouchscreenButtonsManager();
131 QVector<TouchscreenButton> buttons;
133 void addButton(TouchscreenButton button);
135 return buttons.size();
138 void resetEventValues();
139 bool processOngoingTouch(glm::vec2 thisPoint,
int thisPointId);
140 bool findStartingTouchPointCandidate(glm::vec2 thisPoint,
int thisPointId,
int thisPointIdx, std::map<int, TouchType> &globalUnusedTouches);
141 void saveUnusedTouches(std::map<int, TouchType> &unusedTouchesInEvent, glm::vec2 thisPoint,
int thisPointId);
142 void processBeginOrEnd(glm::vec2 thisPoint,
const QList<QTouchEvent::TouchPoint>& tPoints, std::map<int, TouchType> globalUnusedTouches);
144 void endTouchForAll();
145 bool touchBeginInvalidForAllButtons(glm::vec2 touchPoint);
148 float _lastPinchScale;
151 qreal _screenDPIProvided;
152 glm::vec2 _screenDPIScale;
154 bool _moveHasValidTouch;
155 glm::vec2 _moveRefTouchPoint;
156 glm::vec2 _moveCurrentTouchPoint;
157 int _moveCurrentTouchId;
159 bool _viewHasValidTouch;
160 glm::vec2 _viewRefTouchPoint;
161 glm::vec2 _viewCurrentTouchPoint;
162 int _viewCurrentTouchId;
164 std::map<int, TouchType> _unusedTouches;
166 int _touchPointCount;
167 int _screenWidthCenter;
168 std::shared_ptr<InputDevice> _inputDevice { std::make_shared<InputDevice>() };
171 glm::vec2 _fixedCenterPosition;
173 float _fixedRadiusForCalc;
174 int _extraBottomMargin {0};
178 TouchscreenButtonsManager _buttonsManager;
180 void moveTouchBegin(glm::vec2 touchPoint);
181 void moveTouchUpdate(glm::vec2 touchPoint);
183 bool moveTouchBeginIsValid(glm::vec2 touchPoint);
185 void viewTouchBegin(glm::vec2 touchPoint);
186 void viewTouchUpdate(glm::vec2 touchPoint);
188 bool viewTouchBeginIsValid(glm::vec2 touchPoint);
190 void setupControlsPositions(VirtualPad::Manager& virtualPadManager,
bool force =
false);
192 void processInputDeviceForMove(VirtualPad::Manager& virtualPadManager);
193 glm::vec2 clippedPointInCircle(
float radius, glm::vec2 origin, glm::vec2 touchPoint);
195 void processUnusedTouches(std::map<int, TouchType> unusedTouchesInEvent);
197 void processInputDeviceForView();
200 void debugPoints(
const QTouchEvent* event, QString who);