]> git.tdb.fi Git - libs/vr.git/blobdiff - source/openvr/openvrcontroller.cpp
Add support for motion controllers
[libs/vr.git] / source / openvr / openvrcontroller.cpp
diff --git a/source/openvr/openvrcontroller.cpp b/source/openvr/openvrcontroller.cpp
new file mode 100644 (file)
index 0000000..9ab957d
--- /dev/null
@@ -0,0 +1,102 @@
+#include <openvr.h>
+#include "openvrcontroller.h"
+#include "openvrcontroller_private.h"
+#include "openvrsystem.h"
+
+using namespace std;
+
+namespace Msp {
+namespace VR {
+
+OpenVRController::OpenVRController(OpenVRSystem &s):
+       system(s),
+       index(-1)
+{
+       name = "OpenVR Controller";
+
+       system.add_controller(*this);
+}
+
+OpenVRController::~OpenVRController()
+{
+       system.remove_controller(*this);
+}
+
+string OpenVRController::get_button_name(unsigned btn) const
+{
+       switch(btn)
+       {
+       case vr::k_EButton_System: return "System";
+       case vr::k_EButton_ApplicationMenu: return "Menu";
+       case vr::k_EButton_Grip: return "Grip";
+       case vr::k_EButton_Axis0: return "Trackpad";
+       case vr::k_EButton_Axis1: return "Trigger";
+       }
+
+       const char *n = vr::VRSystem()->GetButtonIdNameFromEnum(static_cast<vr::EVRButtonId>(btn));
+       if(n)
+               return n;
+
+       return MotionController::get_button_name(btn);
+}
+
+string OpenVRController::get_axis_name(unsigned axis) const
+{
+       switch(axis)
+       {
+       case 0: return "Trackpad X";
+       case 1: return "Trackpad Y";
+       case 2: return "Trigger";
+       }
+
+       return MotionController::get_axis_name(axis);
+}
+
+void OpenVRController::event(const Event &ev)
+{
+       switch(ev.eventType)
+       {
+       case vr::VREvent_TrackedDeviceActivated:
+               index = ev.trackedDeviceIndex;
+               break;
+       case vr::VREvent_TrackedDeviceDeactivated:
+               index = -1;
+               break;
+       case vr::VREvent_ButtonPress:
+               set_button_state(ev.data.controller.button, true, true);
+               break;
+       case vr::VREvent_ButtonUnpress:
+               set_button_state(ev.data.controller.button, false, true);
+               break;
+       }
+}
+
+void OpenVRController::update()
+{
+       if(index<0)
+               return;
+
+       update_from_matrix(system.get_tracking_matrix(index));
+}
+
+void OpenVRController::update_input_state()
+{
+       if(index<0)
+               return;
+
+       vr::VRControllerState_t state;
+       vr::VRSystem()->GetControllerState(index, &state);
+       if(state.unPacketNum!=last_packet_number)
+       {
+               for(unsigned i=0; i<5; ++i)
+               {
+                       set_axis_value(i*2, state.rAxis[i].x, true);
+                       set_axis_value(i*2+1, state.rAxis[i].y, true);
+               }
+
+               last_packet_number = state.unPacketNum;
+       }
+}
+
+} // namespace VR
+} // namespace Msp