]> git.tdb.fi Git - libs/vr.git/blob - source/openvr/openvrcontroller.cpp
Add a getter and signal to indicate if a controller is tracked
[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                 signal_tracking_state_changed.emit(true);
62                 break;
63         case vr::VREvent_TrackedDeviceDeactivated:
64                 index = -1;
65                 signal_tracking_state_changed.emit(false);
66                 break;
67         case vr::VREvent_ButtonPress:
68                 set_button_state(ev.data.controller.button, true, true);
69                 break;
70         case vr::VREvent_ButtonUnpress:
71                 set_button_state(ev.data.controller.button, false, true);
72                 break;
73         }
74 }
75
76 void OpenVRController::update()
77 {
78         if(index<0)
79                 return;
80
81         update_from_matrix(system.get_tracking_matrix(index));
82 }
83
84 void OpenVRController::update_input_state()
85 {
86         if(index<0)
87                 return;
88
89         vr::VRControllerState_t state;
90         vr::VRSystem()->GetControllerState(index, &state);
91         if(state.unPacketNum!=last_packet_number)
92         {
93                 for(unsigned i=0; i<5; ++i)
94                 {
95                         set_axis_value(i*2, state.rAxis[i].x, true);
96                         set_axis_value(i*2+1, state.rAxis[i].y, true);
97                 }
98
99                 last_packet_number = state.unPacketNum;
100         }
101 }
102
103 } // namespace VR
104 } // namespace Msp