121 lines
4.3 KiB
C++
121 lines
4.3 KiB
C++
|
#include "vrutil.h"
|
||
|
#include "util/logging.h"
|
||
|
|
||
|
namespace vrutil {
|
||
|
static bool INITIALIZED = false;
|
||
|
|
||
|
VRStatus STATUS = VRStatus::Disabled;
|
||
|
vr::IVRSystem *SYSTEM = nullptr;
|
||
|
vr::TrackedDeviceIndex_t INDEX_LEFT = ~0u;
|
||
|
vr::TrackedDeviceIndex_t INDEX_RIGHT = ~0u;
|
||
|
|
||
|
static std::string device_string(vr::TrackedDeviceIndex_t dev,
|
||
|
vr::TrackedDeviceProperty prop) {
|
||
|
uint32_t len = vr::VRSystem()->GetStringTrackedDeviceProperty(
|
||
|
dev, prop, nullptr, 0, nullptr);
|
||
|
if (len == 0) return "";
|
||
|
char *buf = new char[len];
|
||
|
vr::VRSystem()->GetStringTrackedDeviceProperty(
|
||
|
dev, prop, buf, len, nullptr);
|
||
|
std::string res = buf;
|
||
|
delete[] buf;
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
void init() {
|
||
|
if (INITIALIZED) return;
|
||
|
|
||
|
// initialize OpenVR
|
||
|
vr::EVRInitError error = vr::VRInitError_None;
|
||
|
SYSTEM = vr::VR_Init(&error, vr::VRApplication_Other);
|
||
|
if (error != vr::VRInitError_None || !SYSTEM) {
|
||
|
SYSTEM = nullptr;
|
||
|
STATUS = VRStatus::Error;
|
||
|
log_warning("vrutil", "unable to initialize: {}",
|
||
|
vr::VR_GetVRInitErrorAsEnglishDescription(error));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// get information
|
||
|
auto driver = device_string(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_TrackingSystemName_String);
|
||
|
auto serial = device_string(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_SerialNumber_String);
|
||
|
log_info("vrutil", "initialized: {} - {}", driver, serial);
|
||
|
|
||
|
// success
|
||
|
INITIALIZED = true;
|
||
|
STATUS = VRStatus::Running;
|
||
|
scan(true);
|
||
|
}
|
||
|
|
||
|
void shutdown() {
|
||
|
if (STATUS == VRStatus::Running) {
|
||
|
vr::VR_Shutdown();
|
||
|
}
|
||
|
SYSTEM = nullptr;
|
||
|
STATUS = VRStatus::Disabled;
|
||
|
}
|
||
|
|
||
|
void scan(bool log) {
|
||
|
if (STATUS != VRStatus::Running) return;
|
||
|
for (vr::TrackedDeviceIndex_t index = 0; index < vr::k_unMaxTrackedDeviceCount; ++index) {
|
||
|
auto dclass = SYSTEM->GetTrackedDeviceClass(index);
|
||
|
switch (dclass) {
|
||
|
case vr::TrackedDeviceClass_Controller: {
|
||
|
auto role = SYSTEM->GetControllerRoleForTrackedDeviceIndex(index);
|
||
|
switch (role) {
|
||
|
case vr::TrackedControllerRole_Invalid:
|
||
|
if (log) log_warning("vrutil", "invalid controller on index {}", index);
|
||
|
break;
|
||
|
case vr::TrackedControllerRole_LeftHand:
|
||
|
if (log) log_info("vrutil", "detected left controller on index {}", index);
|
||
|
INDEX_LEFT = index;
|
||
|
break;
|
||
|
case vr::TrackedControllerRole_RightHand:
|
||
|
if (log) log_info("vrutil", "detected right controller on index {}", index);
|
||
|
INDEX_RIGHT = index;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case vr::TrackedDeviceClass_GenericTracker: {
|
||
|
if (log) log_info("vrutil", "detected tracker on index {}", index);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool get_hmd_pose(vr::TrackedDevicePose_t *pose) {
|
||
|
if (STATUS != VRStatus::Running) {
|
||
|
*pose = vr::TrackedDevicePose_t {};
|
||
|
pose->bPoseIsValid = false;
|
||
|
return false;
|
||
|
}
|
||
|
SYSTEM->GetDeviceToAbsoluteTrackingPose(
|
||
|
vr::TrackingUniverseStanding,
|
||
|
0,
|
||
|
pose, 1);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool get_con_pose(vr::TrackedDeviceIndex_t index,
|
||
|
vr::TrackedDevicePose_t *pose,
|
||
|
vr::VRControllerState_t *state) {
|
||
|
if (STATUS != VRStatus::Running || index == ~0u) {
|
||
|
*state = vr::VRControllerState_t {};
|
||
|
*pose = vr::TrackedDevicePose_t {};
|
||
|
pose->bPoseIsValid = false;
|
||
|
return false;
|
||
|
}
|
||
|
SYSTEM->GetControllerStateWithPose(
|
||
|
vr::TrackingUniverseStanding,
|
||
|
index, state, sizeof(vr::VRControllerState_t), pose);
|
||
|
return true;
|
||
|
}
|
||
|
}
|