diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-11-03 23:42:02 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-11-06 12:28:26 +0100 |
commit | 049044f181414991a103ace961214c78171c284d (patch) | |
tree | 1806ff05675c62df05d9e16623ea8c7a87395ec3 /tracker-steamvr | |
parent | ad1e96c576425a4daba20073e99ec0337f193882 (diff) |
tracker/steamvr: TO REBASE
Diffstat (limited to 'tracker-steamvr')
-rw-r--r-- | tracker-steamvr/CMakeLists.txt | 36 | ||||
-rw-r--r-- | tracker-steamvr/dialog.cpp | 22 | ||||
-rw-r--r-- | tracker-steamvr/dialog.ui | 65 | ||||
-rw-r--r-- | tracker-steamvr/images/steamvr.png | bin | 0 -> 228 bytes | |||
-rw-r--r-- | tracker-steamvr/steamvr.cpp | 131 | ||||
-rw-r--r-- | tracker-steamvr/steamvr.hpp | 66 | ||||
-rw-r--r-- | tracker-steamvr/steamvr.qrc | 5 |
7 files changed, 325 insertions, 0 deletions
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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>dialog</class> + <widget class="QWidget" name="dialog"> + <property name="windowModality"> + <enum>Qt::NonModal</enum> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>184</width> + <height>58</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Valve SteamVR</string> + </property> + <property name="windowIcon"> + <iconset> + <normaloff>images/FaceTrackNoIR.png</normaloff>images/FaceTrackNoIR.png</iconset> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="autoFillBackground"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="1" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>No options so far</string> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> + <slots> + <slot>startEngineClicked()</slot> + <slot>stopEngineClicked()</slot> + <slot>cameraSettingsClicked()</slot> + </slots> +</ui> diff --git a/tracker-steamvr/images/steamvr.png b/tracker-steamvr/images/steamvr.png Binary files differnew file mode 100644 index 00000000..30cc4621 --- /dev/null +++ b/tracker-steamvr/images/steamvr.png 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 <cstdlib> +#include <cmath> + +#include <QMessageBox> +#include <QDebug> + +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 <openvr.h> + +#include <atomic> +#include <cmath> +#include <memory> + +#include <QString> +#include <QMutex> +#include <QMutexLocker> + +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 @@ +<RCC> + <qresource prefix="/"> + <file>images/steamvr.png</file> + </qresource> +</RCC> |