11 #ifndef hifi_SpacemouseManager_h
12 #define hifi_SpacemouseManager_h
16 #include <controllers/UserInputMapper.h>
17 #include <controllers/InputDevice.h>
18 #include <controllers/StandardControls.h>
20 #include <plugins/InputPlugin.h>
25 #include "../../../interface/external/3dconnexionclient/include/I3dMouseParams.h"
26 #include <QAbstractNativeEventFilter>
27 #include <QAbstractEventDispatcher>
32 class MouseParameters :
public I3dMouseParam {
37 bool IsPanZoom()
const;
38 bool IsRotate()
const;
39 Speed GetSpeed()
const;
41 void SetPanZoom(
bool isPanZoom);
42 void SetRotate(
bool isRotate);
43 void SetSpeed(Speed speed);
46 Navigation GetNavigationMode()
const;
47 Pivot GetPivotMode()
const;
48 PivotVisibility GetPivotVisibility()
const;
49 bool IsLockHorizon()
const;
51 void SetLockHorizon(
bool bOn);
52 void SetNavigationMode(Navigation navigation);
53 void SetPivotMode(Pivot pivot);
54 void SetPivotVisibility(PivotVisibility visibility);
56 static bool Is3dmouseAttached();
61 MouseParameters(
const MouseParameters&);
62 const MouseParameters& operator = (
const MouseParameters&);
64 Navigation fNavigation;
66 PivotVisibility fPivotVisibility;
74 class SpacemouseManager :
public InputPlugin,
public QAbstractNativeEventFilter {
78 bool isSupported()
const override;
79 const QString getName()
const override {
return NAME; }
80 const QString getID()
const override {
return NAME; }
82 bool activate()
override;
83 void deactivate()
override;
85 void pluginFocusOutEvent()
override;
86 void pluginUpdate(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
88 bool nativeEventFilter(
const QByteArray& eventType,
void* message,
long* result)
override;
91 void Move3d(HANDLE device, std::vector<float>& motionData);
92 void On3dmouseKeyDown(HANDLE device,
int virtualKeyCode);
93 void On3dmouseKeyUp(HANDLE device,
int virtualKeyCode);
94 bool InitializeRawInput(HWND hwndTarget);
96 bool RawInputEventFilter(
void* msg,
long* result);
98 void OnRawInput(UINT nInputCode, HRAWINPUT hRawInput);
99 UINT GetRawInputBuffer(PRAWINPUT pData, PUINT pcbSize, UINT cbSizeHeader);
100 bool TranslateRawInputData(UINT nInputCode, PRAWINPUT pRawInput);
101 void On3dmouseInput();
105 TInputData() : fAxes(6) {}
108 return (0.0f == fAxes[0] && 0.0f == fAxes[1] && 0.0f == fAxes[2] &&
109 0.0f == fAxes[3] && 0.0f == fAxes[4] && 0.0f == fAxes[5]);
114 std::vector<float> fAxes;
121 std::map< HANDLE, TInputData> fDevice2Data;
122 std::map< HANDLE, unsigned long> fDevice2Keystate;
125 MouseParameters f3dMouseParams;
128 DWORD fLast3dmouseInputTime;
130 static const char* NAME;
131 friend class SpacemouseDevice;
137 #include <glm/glm.hpp>
138 #include "../../../interface/external/3dconnexionclient/include/ConnexionClientAPI.h"
140 class SpacemouseManager :
public QObject {
145 bool Is3dmouseAttached();
147 void toggleSpacemouse(
bool shouldEnable);
154 class SpacemouseDevice :
public QObject,
public controller::InputDevice {
159 enum PositionChannel {
174 typedef std::unordered_set<int> ButtonPressedMap;
175 typedef std::map<int, float> AxisStateMap;
177 float getButton(
int channel)
const;
178 float getAxis(
int channel)
const;
180 controller::Input makeInput(SpacemouseDevice::PositionChannel axis)
const;
181 controller::Input makeInput(SpacemouseDevice::ButtonChannel button)
const;
183 controller::Input::NamedPair makePair(SpacemouseDevice::PositionChannel axis,
const QString& name)
const;
184 controller::Input::NamedPair makePair(SpacemouseDevice::ButtonChannel button,
const QString& name)
const;
186 virtual controller::Input::NamedVector getAvailableInputs()
const override;
187 virtual QString getDefaultMappingConfig()
const override;
188 virtual void update(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
189 virtual void focusOutEvent()
override;
191 glm::vec3 cc_position;
192 glm::vec3 cc_rotation;
195 void setButton(
int lastButtonState);
196 void handleAxisEvent();