]> git.tdb.fi Git - libs/vr.git/blob - source/openvr/openvrcontroller.cpp
Add support for motion controllers
[libs/vr.git] / source / openvr / openvrcontroller.cpp
1 #include <openvr.h>
2 #include "openvrcontroller.h"
3 #include "openvrcontroller_private.h"
4 #include "openvrsystem.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace VR {
10
11 OpenVRController::OpenVRController(OpenVRSystem &s):
12         system(s),
13         index(-1)
14 {
15         name = "OpenVR Controller";
16
17         system.add_controller(*this);
18 }
19
20 OpenVRController::~OpenVRController()
21 {
22         system.remove_controller(*this);
23 }
24
25 string OpenVRController::get_button_name(unsigned btn) const
26 {
27         switch(btn)
28         {
29         case vr::k_EButton_System: return "System";
30         case vr::k_EButton_ApplicationMenu: return "Menu";
31         case vr::k_EButton_Grip: return "Grip";
32         case vr::k_EButton_Axis0: return "Trackpad";
33         case vr::k_EButton_Axis1: return "Trigger";
34         }
35
36         const char *n = vr::VRSystem()->GetButtonIdNameFromEnum(static_cast<vr::EVRButtonId>(btn));
37         if(n)
38                 return n;
39
40         return MotionController::get_button_name(btn);
41 }
42
43 string OpenVRController::get_axis_name(unsigned axis) const
44 {
45         switch(axis)
46         {
47         case 0: return "Trackpad X";
48         case 1: return "Trackpad Y";
49         case 2: return "Trigger";
50         }
51
52         return MotionController::get_axis_name(axis);
53 }
54
55 void OpenVRController::event(const Event &ev)
56 {
57         switch(ev.eventType)
58         {
59         case vr::VREvent_TrackedDeviceActivated:
60                 index = ev.trackedDeviceIndex;
61                 break;
62         case vr::VREvent_TrackedDeviceDeactivated:
63                 index = -1;
64                 break;
65         case vr::VREvent_ButtonPress:
66                 set_button_state(ev.data.controller.button, true, true);
67                 break;
68         case vr::VREvent_ButtonUnpress:
69                 set_button_state(ev.data.controller.button, false, true);
70                 break;
71         }
72 }
73
74 void OpenVRController::update()
75 {
76         if(index<0)
77                 return;
78
79         update_from_matrix(system.get_tracking_matrix(index));
80 }
81
82 void OpenVRController::update_input_state()
83 {
84         if(index<0)
85                 return;
86
87         vr::VRControllerState_t state;
88         vr::VRSystem()->GetControllerState(index, &state);
89         if(state.unPacketNum!=last_packet_number)
90         {
91                 for(unsigned i=0; i<5; ++i)
92                 {
93                         set_axis_value(i*2, state.rAxis[i].x, true);
94                         set_axis_value(i*2+1, state.rAxis[i].y, true);
95                 }
96
97                 last_packet_number = state.unPacketNum;
98         }
99 }
100
101 } // namespace VR
102 } // namespace Msp