From 049044f181414991a103ace961214c78171c284d Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 3 Nov 2016 23:42:02 +0100 Subject: tracker/steamvr: TO REBASE --- tracker-steamvr/CMakeLists.txt | 36 ++++++++++ tracker-steamvr/dialog.cpp | 22 +++++++ tracker-steamvr/dialog.ui | 65 ++++++++++++++++++ tracker-steamvr/images/steamvr.png | Bin 0 -> 228 bytes tracker-steamvr/steamvr.cpp | 131 +++++++++++++++++++++++++++++++++++++ tracker-steamvr/steamvr.hpp | 66 +++++++++++++++++++ tracker-steamvr/steamvr.qrc | 5 ++ 7 files changed, 325 insertions(+) create mode 100644 tracker-steamvr/CMakeLists.txt create mode 100644 tracker-steamvr/dialog.cpp create mode 100644 tracker-steamvr/dialog.ui create mode 100644 tracker-steamvr/images/steamvr.png create mode 100644 tracker-steamvr/steamvr.cpp create mode 100644 tracker-steamvr/steamvr.hpp create mode 100644 tracker-steamvr/steamvr.qrc (limited to 'tracker-steamvr') diff --git a/tracker-steamvr/CMakeLists.txt b/tracker-steamvr/CMakeLists.txt new file mode 100644 index 00000000..33194c23 --- /dev/null +++ b/tracker-steamvr/CMakeLists.txt @@ -0,0 +1,36 @@ +set(steamvr-dir "") +set(steamvr-dll "") +set(steamvr-lib "") + +if(LINUX AND opentrack-64bit) + set(steamvr-dir "linux64") + set(steamvr-dll "libopenvr_api.so") + set(steamvr-lib "${steamvr-dll}") +endif() + +if(WIN32) + if(opentrack-64bit) + set(steamvr-dir "win64") + else() + set(steamvr-dir "win32") + endif() + set(steamvr-dll "openvr_api.dll") + set(steamvr-lib "openvr_api.lib") +endif() + +if(APPLE AND NOT opentrack-64bit) + set(steamvr-dir "osx32") + set(steamvr-dll "libopenvr_api.dylib") + set(steamvr-lib "${steamvr-dll}") +endif() + +if(steamvr-dll) + SET(SDK_VALVE_STEAMVR "" CACHE PATH "Valve's SteamVR") + if(SDK_VALVE_STEAMVR) + opentrack_boilerplate(opentrack-tracker-steamvr) + + target_include_directories(opentrack-tracker-steamvr SYSTEM PUBLIC "${SDK_VALVE_STEAMVR}/headers") + target_link_libraries(opentrack-tracker-steamvr "${SDK_VALVE_STEAMVR}/lib/${steamvr-dir}/${steamvr-lib}") + install(FILES "${SDK_VALVE_STEAMVR}/bin/${steamvr-dir}/${steamvr-dll}" DESTINATION "${opentrack-hier-pfx}") + endif() +endif() diff --git a/tracker-steamvr/dialog.cpp b/tracker-steamvr/dialog.cpp new file mode 100644 index 00000000..2e672ca4 --- /dev/null +++ b/tracker-steamvr/dialog.cpp @@ -0,0 +1,22 @@ +#include "steamvr.hpp" +#include "api/plugin-api.hpp" + +dialog::dialog() +{ + ui.setupUi(this); + + connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK())); + connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); +} + +void dialog::doOK() +{ + s.b->save(); + close(); +} + +void dialog::doCancel() +{ + close(); +} + diff --git a/tracker-steamvr/dialog.ui b/tracker-steamvr/dialog.ui new file mode 100644 index 00000000..c3fa36c0 --- /dev/null +++ b/tracker-steamvr/dialog.ui @@ -0,0 +1,65 @@ + + + dialog + + + Qt::NonModal + + + + 0 + 0 + 184 + 58 + + + + + 0 + 0 + + + + Valve SteamVR + + + + images/FaceTrackNoIR.pngimages/FaceTrackNoIR.png + + + Qt::LeftToRight + + + false + + + + + + + 0 + 0 + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + No options so far + + + + + + + + + startEngineClicked() + stopEngineClicked() + cameraSettingsClicked() + + diff --git a/tracker-steamvr/images/steamvr.png b/tracker-steamvr/images/steamvr.png new file mode 100644 index 00000000..30cc4621 Binary files /dev/null and b/tracker-steamvr/images/steamvr.png differ diff --git a/tracker-steamvr/steamvr.cpp b/tracker-steamvr/steamvr.cpp new file mode 100644 index 00000000..55eebc37 --- /dev/null +++ b/tracker-steamvr/steamvr.cpp @@ -0,0 +1,131 @@ +/* Copyright: "i couldn't care less what anyone does with the 5 lines of code i wrote" - mm0zct */ +#include "steamvr.hpp" +#include "api/plugin-api.hpp" +#include "compat/util.hpp" +#include "compat/simple-mat.hpp" + +#include +#include + +#include +#include + +void steamvr::vr_deleter() +{ + static std::atomic_flag atexit_done = ATOMIC_FLAG_INIT; + + if (atexit_done.test_and_set(std::memory_order_seq_cst)) + { + std::atexit(vr::VR_Shutdown); + } +} + +steamvr::vr_t steamvr::vr_init(error_t& error) +{ + error = error_t::VRInitError_Unknown; + + // the background type would surely confuse users + vr_t vr = vr::VR_Init(&error, vr::EVRApplicationType::VRApplication_Other); + + if (vr) + vr_deleter(); + + return vr; +} + +QString steamvr::strerror(error_t error) +{ + const char* str(vr::VR_GetVRInitErrorAsSymbol(error)); + return QString(str ? str : "No description"); +} + +steamvr::steamvr() : vr(nullptr) +{ +} + +steamvr::~steamvr() +{ +} + +void steamvr::start_tracker(QFrame*) +{ + error_t e(error_t::VRInitError_Unknown); + vr = vr_init(e); + + if (!vr) + { + QMessageBox::warning(nullptr, "Valve SteamVR init error", strerror(e), QMessageBox::Close, QMessageBox::NoButton); + return; + } + + bool ok = false; + + for (unsigned k = 0; k < vr::k_unMaxTrackedDeviceCount; k++) + if (vr->GetTrackedDeviceClass(k) == vr::ETrackedDeviceClass::TrackedDeviceClass_HMD) + { + ok = true; + break; + } + + if (!ok) + { + QMessageBox::warning(nullptr, "Valve SteamVR init warning", "No HMD connected", QMessageBox::Close, QMessageBox::NoButton); + return; + } +} + +void steamvr::data(double* data) +{ + if (vr) + { + using m = float[3][4]; + vr::TrackedDevicePose_t devices[vr::k_unMaxTrackedDeviceCount] = {}; + + vr->GetDeviceToAbsoluteTrackingPose(vr::ETrackingUniverseOrigin::TrackingUniverseStanding, 0, + devices, vr::k_unMaxTrackedDeviceCount); + + for (unsigned k = 0; k < vr::k_unMaxTrackedDeviceCount; k++) + { + using namespace euler; + + if (!devices[k].bPoseIsValid) + continue; + + if (vr->GetTrackedDeviceClass(k) != vr::ETrackedDeviceClass::TrackedDeviceClass_HMD) + continue; + + const m& M = devices[k].mDeviceToAbsoluteTracking.m; + + static constexpr double c[3] { -1, 1, -1 }; + + for (unsigned i = 0; i < 3; i++) + data[i] = double(M[i][3]) * c[i] * 100; + + static constexpr unsigned indices[3] = {Roll, Yaw, Pitch}; + + rmat r(M[0][0], M[1][0], M[2][0], + M[0][1], M[1][1], M[2][1], + M[0][2], M[1][2], M[2][2]); + + euler_t ypr(rmat_to_euler(r)); + + for (unsigned i = 0; i < 3; i++) + data[indices[i]] = 180/M_PI * ypr(i); + + for (unsigned i = 0; i < 3; i++) + data[i+3] *= c[i]; + + goto done; + } + + qDebug() << "steamvr: no device with pose found"; + +done: + (void)0; // expects statement after label + } +} + +void dialog::register_tracker(ITracker*) {} +void dialog::unregister_tracker() {} + +OPENTRACK_DECLARE_TRACKER(steamvr, dialog, metadata) diff --git a/tracker-steamvr/steamvr.hpp b/tracker-steamvr/steamvr.hpp new file mode 100644 index 00000000..2947f3f1 --- /dev/null +++ b/tracker-steamvr/steamvr.hpp @@ -0,0 +1,66 @@ +#pragma once +#include "api/plugin-api.hpp" +#include "ui_dialog.h" +#include "compat/util.hpp" +#include "options/options.hpp" + +#include + +#include +#include +#include + +#include +#include +#include + +using namespace options; + +struct settings : opts +{ + settings() : opts("valve-steamvr") {} +}; + +class steamvr : public ITracker +{ +public: + steamvr(); + ~steamvr() override; + void start_tracker(QFrame *) override; + void data(double *data) override; +private: + using error_t = vr::EVRInitError; + using vr_t = vr::IVRSystem*; + + vr_t vr; + + settings s; + static void vr_deleter(); + static vr_t vr_init(error_t& error); + static QString strerror(error_t error); +}; + +class dialog : public ITrackerDialog +{ + Q_OBJECT +public: + dialog(); + + void register_tracker(ITracker *) override; + void unregister_tracker() override; +private: + Ui::dialog ui; + settings s; + vr::IVRSystem* vr; +private slots: + void doOK(); + void doCancel(); +}; + +class metadata : public Metadata +{ +public: + QString name() { return QString(QCoreApplication::translate("metadata", "Valve SteamVR")); } + QIcon icon() { return QIcon(":/images/rift_tiny.png"); } +}; + diff --git a/tracker-steamvr/steamvr.qrc b/tracker-steamvr/steamvr.qrc new file mode 100644 index 00000000..58b91ee5 --- /dev/null +++ b/tracker-steamvr/steamvr.qrc @@ -0,0 +1,5 @@ + + + images/steamvr.png + + -- cgit v1.2.3