9 #ifndef hifi__OculusControllerManager
10 #define hifi__OculusControllerManager
13 #include <unordered_set>
16 #include <GLMHelpers.h>
18 #include <SettingHandle.h>
19 #include <controllers/InputDevice.h>
20 #include <plugins/InputPlugin.h>
24 class OculusControllerManager :
public InputPlugin {
28 bool isSupported()
const override;
29 const QString getName()
const override {
return NAME; }
30 bool isHandController()
const override {
return _touch !=
nullptr; }
31 bool isHeadController()
const override {
return true; }
32 bool configurable()
override {
return true; }
33 QString configurationLayout()
override;
34 QStringList getSubdeviceNames()
override;
35 void setConfigurationSettings(
const QJsonObject configurationSetting)
override;
36 QJsonObject configurationSettings()
override;
38 bool activate()
override;
39 void deactivate()
override;
41 void pluginFocusOutEvent()
override;
42 void pluginUpdate(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
45 void stopHapticPulse(
bool leftHand);
48 class OculusInputDevice :
public controller::InputDevice {
50 OculusInputDevice(OculusControllerManager& parent,
const QString& name) : controller::InputDevice(name), _parent(parent) {}
52 OculusControllerManager& _parent;
53 friend class OculusControllerManager;
56 class RemoteDevice :
public OculusInputDevice {
58 using Pointer = std::shared_ptr<RemoteDevice>;
59 RemoteDevice(OculusControllerManager& parent) : OculusInputDevice(parent,
"OculusRemote") {}
61 controller::Input::NamedVector getAvailableInputs()
const override;
62 QString getDefaultMappingConfig()
const override;
63 void update(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
64 void focusOutEvent()
override;
66 friend class OculusControllerManager;
69 class TouchDevice :
public OculusInputDevice {
71 using Pointer = std::shared_ptr<TouchDevice>;
72 TouchDevice(OculusControllerManager& parent) : OculusInputDevice(parent,
"OculusTouch") {}
74 controller::Input::NamedVector getAvailableInputs()
const override;
75 QString getDefaultMappingConfig()
const override;
76 void update(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
77 void focusOutEvent()
override;
79 bool triggerHapticPulse(
float strength,
float duration, uint16_t index)
override;
82 void stopHapticPulse(
bool leftHand);
83 void handlePose(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData,
84 ovrHandType hand,
const ovrPoseStatef& handPose);
85 void handleRotationForUntrackedHand(
const controller::InputCalibrationData& inputCalibrationData,
86 ovrHandType hand,
const ovrPoseStatef& handPose);
87 void handleHeadPose(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData,
88 const ovrPoseStatef& headPose);
90 int _trackedControllers { 0 };
93 using Locker = std::unique_lock<std::recursive_mutex>;
95 void withLock(F&& f) { Locker locker(_lock); f(); }
97 float _leftHapticDuration { 0.0f };
98 float _leftHapticStrength { 0.0f };
99 float _rightHapticDuration { 0.0f };
100 float _rightHapticStrength { 0.0f };
101 mutable std::recursive_mutex _lock;
102 std::map<int, bool> _lostTracking;
103 std::map<int, quint64> _regainTrackingDeadline;
104 std::map<int, ovrPoseStatef> _lastControllerPose;
106 friend class OculusControllerManager;
109 void checkForConnectedDevices();
112 ovrInputState _remoteInputState {};
113 ovrInputState _touchInputState {};
114 RemoteDevice::Pointer _remote;
115 TouchDevice::Pointer _touch;
116 static const char* NAME;