+#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