X-Git-Url: http://git.tdb.fi/?p=libs%2Fvr.git;a=blobdiff_plain;f=source%2Fopenvr%2Fopenvrsystem.cpp;h=d631f48f8dece03c7a27c074924eafc0ded64b86;hp=ec6b418d0a455a9e5f4fb5d7273a6a6e54cc5f8b;hb=2acdfcc95c317f30e725e17f0d372fce050830ef;hpb=b6de7d24475dec8f5d6b8148a69cf8b561bc0761 diff --git a/source/openvr/openvrsystem.cpp b/source/openvr/openvrsystem.cpp index ec6b418..d631f48 100644 --- a/source/openvr/openvrsystem.cpp +++ b/source/openvr/openvrsystem.cpp @@ -23,7 +23,8 @@ namespace VR { unsigned OpenVRSystem::n_instances = 0; -OpenVRSystem::OpenVRSystem() +OpenVRSystem::OpenVRSystem(): + n_tracked_devices(0) { if(!n_instances) { @@ -39,6 +40,12 @@ OpenVRSystem::OpenVRSystem() throw runtime_error("OpenVR compositor initialization failed"); vr::VRCompositor()->SetTrackingSpace(vr::TrackingUniverseSeated); + + for(unsigned i=0; iIsTrackedDeviceConnected(i)) + n_tracked_devices = i+1; + + tracking_matrices.resize(n_tracked_devices); } OpenVRSystem::~OpenVRSystem() @@ -47,6 +54,11 @@ OpenVRSystem::~OpenVRSystem() vr::VR_Shutdown(); } +bool OpenVRSystem::is_maybe_available() +{ + return vr::VR_IsHmdPresent(); +} + void OpenVRSystem::configure_view(StereoView &view) const { vr::IVRSystem *vr_sys = vr::VRSystem(); @@ -69,6 +81,16 @@ void OpenVRSystem::configure_view(StereoView &view) const view.set_eye_matrices(convert_matrix(left), convert_matrix(right)); } +void OpenVRSystem::set_absolute_tracking(bool a) +{ + vr::VRCompositor()->SetTrackingSpace(a ? vr::TrackingUniverseStanding : vr::TrackingUniverseSeated); +} + +bool OpenVRSystem::get_absolute_tracking() const +{ + return vr::VRCompositor()->GetTrackingSpace()==vr::TrackingUniverseStanding; +} + OpenVRCamera *OpenVRSystem::create_camera(const GL::Camera &bc) { return new OpenVRCamera(*this, bc); @@ -79,15 +101,44 @@ OpenVRCombiner *OpenVRSystem::create_combiner(GL::View &v) return new OpenVRCombiner(*this, v); } +void OpenVRSystem::tick() +{ + vr::IVRSystem *vr_sys = vr::VRSystem(); + + vr::VREvent_t event; + while(vr_sys->PollNextEvent(&event, sizeof(event))) + { + if(event.eventType==vr::VREvent_TrackedDeviceActivated) + if(event.trackedDeviceIndex>=n_tracked_devices) + { + n_tracked_devices = event.trackedDeviceIndex+1; + tracking_matrices.resize(n_tracked_devices); + } + } +} + void OpenVRSystem::update_pose_matrices() { vector poses; - poses.resize(vr::k_unTrackedDeviceIndex_Hmd+1); + poses.resize(n_tracked_devices); vr::VRCompositor()->WaitGetPoses(&poses[0], poses.size(), 0, 0); - vr::TrackedDevicePose_t &hmd_pose = poses[vr::k_unTrackedDeviceIndex_Hmd]; - if(hmd_pose.bPoseIsValid) - hmd_matrix = convert_matrix(hmd_pose.mDeviceToAbsoluteTracking); + for(unsigned i=0; i=tracking_matrices.size()) + throw out_of_range("OpenVRSystem::get_tracking_matrix"); + + return tracking_matrices[index]; +} + +const GL::Matrix &OpenVRSystem::get_hmd_matrix() const +{ + return get_tracking_matrix(vr::k_unTrackedDeviceIndex_Hmd); } } // namespace VR