summaryrefslogtreecommitdiffhomepage
path: root/tracker-steamvr
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2016-11-03 23:42:02 +0100
committerStanislaw Halik <sthalik@misaki.pl>2016-11-06 12:28:26 +0100
commit049044f181414991a103ace961214c78171c284d (patch)
tree1806ff05675c62df05d9e16623ea8c7a87395ec3 /tracker-steamvr
parentad1e96c576425a4daba20073e99ec0337f193882 (diff)
tracker/steamvr: TO REBASE
Diffstat (limited to 'tracker-steamvr')
-rw-r--r--tracker-steamvr/CMakeLists.txt36
-rw-r--r--tracker-steamvr/dialog.cpp22
-rw-r--r--tracker-steamvr/dialog.ui65
-rw-r--r--tracker-steamvr/images/steamvr.pngbin0 -> 228 bytes
-rw-r--r--tracker-steamvr/steamvr.cpp131
-rw-r--r--tracker-steamvr/steamvr.hpp66
-rw-r--r--tracker-steamvr/steamvr.qrc5
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
new file mode 100644
index 00000000..30cc4621
--- /dev/null
+++ b/tracker-steamvr/images/steamvr.png
Binary files 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 <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>