X-Git-Url: http://git.tdb.fi/?p=libs%2Fvr.git;a=blobdiff_plain;f=source%2Fopenvr%2Fopenvrcontroller.cpp;fp=source%2Fopenvr%2Fopenvrcontroller.cpp;h=9ab957de11c5d5fe41031902548fed66c503253c;hp=0000000000000000000000000000000000000000;hb=774cc129d93a0001c36434f47ec0614c653824be;hpb=2acdfcc95c317f30e725e17f0d372fce050830ef diff --git a/source/openvr/openvrcontroller.cpp b/source/openvr/openvrcontroller.cpp new file mode 100644 index 0000000..9ab957d --- /dev/null +++ b/source/openvr/openvrcontroller.cpp @@ -0,0 +1,102 @@ +#include +#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(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