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