summaryrefslogtreecommitdiffhomepage
path: root/gui
diff options
context:
space:
mode:
Diffstat (limited to 'gui')
-rw-r--r--gui/CMakeLists.txt2
-rwxr-xr-x[-rw-r--r--]gui/facetracknoir.icobin67134 -> 3758 bytes
-rwxr-xr-x[-rw-r--r--]gui/images/facetracknoir.pngbin29485 -> 14581 bytes
-rw-r--r--gui/images/trackhat-clip-left.pngbin0 -> 1318 bytes
-rw-r--r--gui/images/trackhat-clip-right.pngbin0 -> 1349 bytes
-rw-r--r--gui/images/trackhat-hat.pngbin0 -> 2150 bytes
-rw-r--r--gui/install-driver-dialog.ui41
-rw-r--r--gui/main.cpp35
-rw-r--r--gui/main.ui1455
-rw-r--r--gui/options-dialog.cpp163
-rw-r--r--gui/options-dialog.hpp27
-rw-r--r--gui/settings.ui1188
-rw-r--r--gui/software-update-dialog.hpp87
-rw-r--r--gui/software-update.ui118
-rw-r--r--gui/trackhat-wizard.ui189
-rw-r--r--gui/trans_calib.cpp41
-rw-r--r--gui/trans_calib.h39
-rw-r--r--gui/ui-res.qrc3
-rw-r--r--gui/ui.cpp112
-rw-r--r--gui/ui.h18
-rw-r--r--gui/wizard.cpp81
-rw-r--r--gui/wizard.h21
22 files changed, 2354 insertions, 1266 deletions
diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt
index d34ea981..778cbf08 100644
--- a/gui/CMakeLists.txt
+++ b/gui/CMakeLists.txt
@@ -24,6 +24,8 @@ target_link_libraries(opentrack
opentrack-api
opentrack-compat
opentrack-version
+ # trackhat
+ opentrack-tracker-pt opentrack-filter-accela
)
link_with_dinput8(opentrack)
diff --git a/gui/facetracknoir.ico b/gui/facetracknoir.ico
index 5cac8da1..b5f34db3 100644..100755
--- a/gui/facetracknoir.ico
+++ b/gui/facetracknoir.ico
Binary files differ
diff --git a/gui/images/facetracknoir.png b/gui/images/facetracknoir.png
index 85c06df6..4f17de81 100644..100755
--- a/gui/images/facetracknoir.png
+++ b/gui/images/facetracknoir.png
Binary files differ
diff --git a/gui/images/trackhat-clip-left.png b/gui/images/trackhat-clip-left.png
new file mode 100644
index 00000000..cdde2160
--- /dev/null
+++ b/gui/images/trackhat-clip-left.png
Binary files differ
diff --git a/gui/images/trackhat-clip-right.png b/gui/images/trackhat-clip-right.png
new file mode 100644
index 00000000..59f8ae71
--- /dev/null
+++ b/gui/images/trackhat-clip-right.png
Binary files differ
diff --git a/gui/images/trackhat-hat.png b/gui/images/trackhat-hat.png
new file mode 100644
index 00000000..252c2e6b
--- /dev/null
+++ b/gui/images/trackhat-hat.png
Binary files differ
diff --git a/gui/install-driver-dialog.ui b/gui/install-driver-dialog.ui
new file mode 100644
index 00000000..3ef3bb2f
--- /dev/null
+++ b/gui/install-driver-dialog.ui
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DriverDialog</class>
+ <widget class="QDialog" name="DriverDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>415</width>
+ <height>94</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>PS3 Eye driver missing</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The PS3 Eye driver or camera is missing. Please install the driver or plug in the camera and restart the program. Thanks!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Driver download: &lt;a href=&quot;https://mega.nz/#!QkAjnBwD!-ULu08uFwGK5hl7ugbFZfuAw2hIdFpwVtn-jewThrN8&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;mega.nz&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/gui/main.cpp b/gui/main.cpp
index 3ae01404..43a8b0c6 100644
--- a/gui/main.cpp
+++ b/gui/main.cpp
@@ -2,7 +2,10 @@
# include <stdlib.h>
#endif
+#include "opentrack/opencv-camera-dialog.hpp"
+#include "wizard.h"
#include "ui.h"
+#include "ui_install-driver-dialog.h"
#include "opentrack-compat/options.hpp"
using namespace options;
#include <QApplication>
@@ -58,10 +61,36 @@ int main(int argc, char** argv)
QApplication::setAttribute(Qt::AA_X11InitThreads, true);
QApplication app(argc, argv);
- auto w = std::make_shared<MainWindow>();
+ {
+ QSettings s(OPENTRACK_ORG);
+ if (!s.contains("wizard-run-once"))
+ {
+ s.setValue("wizard-run-once", true);
+ auto w = std::make_shared<Wizard>();
+ w->show();
+ app.exec();
+ }
+ }
+
+ if (get_camera_names().contains("PS3Eye Camera"))
+ {
+ auto w = std::make_shared<MainWindow>();
- w->show();
- app.exec();
+ w->show();
+ app.exec();
+ }
+ else
+ {
+ struct Dialog : QDialog
+ {
+ Ui::DriverDialog dlg;
+ Dialog()
+ {
+ dlg.setupUi(this);
+ }
+ };
+ Dialog().exec();
+ }
// on MSVC crashes in atexit
#ifdef _MSC_VER
diff --git a/gui/main.ui b/gui/main.ui
index 3a034ab0..6c605262 100644
--- a/gui/main.ui
+++ b/gui/main.ui
@@ -7,10 +7,16 @@
<rect>
<x>0</x>
<y>0</y>
- <width>652</width>
- <height>498</height>
+ <width>738</width>
+ <height>463</height>
</rect>
</property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="windowIcon">
<iconset resource="ui-res.qrc">
<normaloff>:/images/facetracknoir.png</normaloff>:/images/facetracknoir.png</iconset>
@@ -53,26 +59,11 @@
<property name="lineWidth">
<number>0</number>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
<widget class="QFrame" name="top">
<property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -94,138 +85,23 @@
<number>0</number>
</property>
<property name="bottomMargin">
- <number>4</number>
+ <number>0</number>
</property>
<item>
<widget class="QFrame" name="video_feed">
<property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>320</width>
- <height>240</height>
- </size>
- </property>
- <widget class="QFrame" name="video_frame">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>320</width>
- <height>240</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <widget class="QLabel" name="video_frame_label">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>320</width>
- <height>240</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>320</width>
- <height>240</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>320</width>
- <height>240</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="ui-res.qrc">:/images/no-feed.png</pixmap>
- </property>
- <property name="scaledContents">
- <bool>false</bool>
- </property>
- </widget>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="GLWidget" name="pose_display" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
- <width>320</width>
- <height>240</height>
+ <width>384</width>
+ <height>288</height>
</size>
</property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="top_display">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="lineWidth">
- <number>0</number>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <property name="spacing">
- <number>6</number>
- </property>
- <property name="leftMargin">
- <number>5</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>6</number>
- </property>
- <item>
- <widget class="QGroupBox" name="box_raw_headpose">
- <property name="sizePolicy">
- <sizepolicy hsizetype="MinimumExpanding" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string notr="true">Raw tracker data</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_12">
+ <layout class="QGridLayout" name="gridLayout_5" rowstretch="0">
<property name="leftMargin">
<number>0</number>
</property>
@@ -241,586 +117,450 @@
<property name="spacing">
<number>0</number>
</property>
- <item row="0" column="3">
- <widget class="QLCDNumber" name="raw_yaw">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>1</number>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Outline</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="lblZ_4">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>TZ</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLabel" name="lblRotY_4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>pitch</string>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QLCDNumber" name="raw_pitch">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>1</number>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Outline</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="lblY_4">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>TY</string>
- </property>
- </widget>
- </item>
<item row="0" column="0">
- <widget class="QLabel" name="lblX_4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>TX</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLCDNumber" name="raw_x">
- <property name="enabled">
- <bool>true</bool>
- </property>
+ <widget class="QFrame" name="video_frame">
<property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>1</number>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Outline</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLabel" name="lblRotZ_4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>roll</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="lblRotX_4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>yaw</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLCDNumber" name="raw_y">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>1</number>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Outline</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="3">
- <widget class="QLCDNumber" name="raw_roll">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>1</number>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Outline</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLCDNumber" name="raw_z">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>1</number>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Outline</enum>
- </property>
+ <widget class="QLabel" name="video_frame_label">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>384</width>
+ <height>288</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>384</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>384</width>
+ <height>288</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/no-feed.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
- <widget class="QGroupBox" name="box_mapped_headpose">
- <property name="sizePolicy">
- <sizepolicy hsizetype="MinimumExpanding" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
+ <widget class="QFrame" name="frame_5">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
</property>
- <property name="title">
- <string notr="true">Game data</string>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
</property>
- <layout class="QGridLayout" name="gridLayout_14">
+ <layout class="QVBoxLayout" name="verticalLayout_4">
<property name="leftMargin">
- <number>0</number>
+ <number>6</number>
</property>
<property name="topMargin">
- <number>0</number>
+ <number>2</number>
</property>
<property name="rightMargin">
- <number>0</number>
+ <number>2</number>
</property>
<property name="bottomMargin">
- <number>0</number>
- </property>
- <property name="spacing">
- <number>0</number>
+ <number>2</number>
</property>
- <item row="1" column="3">
- <widget class="QLCDNumber" name="pose_pitch">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QLCDNumber" name="pose_yaw">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLCDNumber" name="pose_z">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="lblx">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>TX</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="lblY_2">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>TY</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLCDNumber" name="pose_x">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
+ <item>
+ <widget class="QFrame" name="frame_4">
+ <property name="styleSheet">
+ <string notr="true">QFrame
+{
+ border-color: #000;
+ border: 1px solid;
+ background-color: #ccc;
+}</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLabel" name="lblRotY_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>pitch</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLabel" name="lblRotZ_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>roll</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="lblRotX_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>yaw</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="lblZ_2">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
- <property name="text">
- <string>TZ</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLCDNumber" name="pose_y">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
- </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="GLWidget" name="pose_display" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>320</width>
+ <height>127</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
- <item row="2" column="3">
- <widget class="QLCDNumber" name="pose_roll">
- <property name="enabled">
- <bool>true</bool>
- </property>
+ <item>
+ <widget class="QGroupBox" name="box_raw_headpose">
<property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="smallDecimalPoint">
- <bool>true</bool>
- </property>
- <property name="digitCount">
- <number>4</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
+ <property name="title">
+ <string notr="true">Raw tracker data</string>
</property>
+ <layout class="QGridLayout" name="gridLayout_12">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="3">
+ <widget class="QLCDNumber" name="raw_yaw">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="smallDecimalPoint">
+ <bool>true</bool>
+ </property>
+ <property name="digitCount">
+ <number>4</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Outline</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="lblZ_4">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="text">
+ <string>TZ</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="lblRotY_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="text">
+ <string>pitch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLCDNumber" name="raw_pitch">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="smallDecimalPoint">
+ <bool>true</bool>
+ </property>
+ <property name="digitCount">
+ <number>4</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Outline</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="lblY_4">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="text">
+ <string>TY</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="lblX_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="text">
+ <string>TX</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLCDNumber" name="raw_x">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="smallDecimalPoint">
+ <bool>true</bool>
+ </property>
+ <property name="digitCount">
+ <number>4</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Outline</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="lblRotZ_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="text">
+ <string>roll</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="lblRotX_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="text">
+ <string>yaw</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLCDNumber" name="raw_y">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="smallDecimalPoint">
+ <bool>true</bool>
+ </property>
+ <property name="digitCount">
+ <number>4</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Outline</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QLCDNumber" name="raw_roll">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="smallDecimalPoint">
+ <bool>true</bool>
+ </property>
+ <property name="digitCount">
+ <number>4</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Outline</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLCDNumber" name="raw_z">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="smallDecimalPoint">
+ <bool>true</bool>
+ </property>
+ <property name="digitCount">
+ <number>4</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Outline</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
</layout>
@@ -829,7 +569,7 @@
</layout>
</widget>
</item>
- <item>
+ <item row="1" column="0">
<widget class="QFrame" name="bottom_controls">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -853,124 +593,37 @@
<property name="spacing">
<number>6</number>
</property>
- <item row="0" column="1">
- <widget class="QFrame" name="groupWindows">
+ <item row="0" column="0">
+ <widget class="QFrame" name="frame_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>4</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="lineWidth">
- <number>0</number>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
- <number>3</number>
+ <number>8</number>
</property>
<property name="leftMargin">
- <number>0</number>
+ <number>3</number>
</property>
<property name="topMargin">
- <number>0</number>
+ <number>2</number>
</property>
<property name="rightMargin">
- <number>0</number>
+ <number>3</number>
</property>
<property name="bottomMargin">
- <number>0</number>
+ <number>8</number>
</property>
<item>
- <widget class="QFrame" name="groupProfile">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <widget class="QToolButton" name="profile_button">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Profile</string>
- </property>
- <property name="popupMode">
- <enum>QToolButton::InstantPopup</enum>
- </property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonTextBesideIcon</enum>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- <property name="arrowType">
- <enum>Qt::DownArrow</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="iconcomboProfile">
- <property name="maxVisibleItems">
- <number>20</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="btnShortcuts">
- <property name="text">
- <string>Options</string>
- </property>
- <property name="icon">
- <iconset resource="ui-res.qrc">
- <normaloff>:/images/tools.png</normaloff>:/images/tools.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>80</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="btnEditCurves">
- <property name="text">
- <string>Mapping</string>
- </property>
- <property name="icon">
- <iconset resource="ui-res.qrc">
- <normaloff>:/images/curves.png</normaloff>:/images/curves.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>80</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
<widget class="QGroupBox" name="groupStartStop">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -981,10 +634,7 @@
<property name="title">
<string notr="true">Controls</string>
</property>
- <property name="flat">
- <bool>true</bool>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
<property name="spacing">
<number>8</number>
</property>
@@ -992,18 +642,18 @@
<number>0</number>
</property>
<property name="topMargin">
- <number>8</number>
+ <number>4</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
- <number>9</number>
+ <number>0</number>
</property>
<item>
<widget class="QToolButton" name="btnStartTracker">
<property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -1019,7 +669,7 @@
<bool>false</bool>
</property>
<property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -1035,93 +685,58 @@
</layout>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QFrame" name="frame_2">
+ <item row="0" column="1">
+ <widget class="QFrame" name="groupWindows">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>4</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
+ <property name="lineWidth">
+ <number>0</number>
</property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>2</number>
- </property>
+ <layout class="QGridLayout" name="gridLayout_6">
<property name="leftMargin">
- <number>3</number>
+ <number>0</number>
</property>
<property name="topMargin">
- <number>2</number>
+ <number>0</number>
</property>
<property name="rightMargin">
- <number>3</number>
+ <number>0</number>
</property>
<property name="bottomMargin">
- <number>8</number>
+ <number>0</number>
</property>
- <item>
- <widget class="QGroupBox" name="groupTrackerSource">
- <property name="title">
- <string>Tracker</string>
+ <item row="0" column="0">
+ <widget class="QFrame" name="groupProfile">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <layout class="QGridLayout" name="gridLayout">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
<property name="leftMargin">
- <number>4</number>
+ <number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
<number>0</number>
</property>
- <property name="horizontalSpacing">
- <number>3</number>
- </property>
- <property name="verticalSpacing">
+ <property name="bottomMargin">
<number>0</number>
</property>
- <item row="0" column="0">
- <widget class="QComboBox" name="iconcomboTrackerSource">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QToolButton" name="btnShowEngineControls">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="flat" stdset="0">
- <bool>false</bool>
- </property>
- </widget>
- </item>
</layout>
</widget>
</item>
- <item>
+ <item row="1" column="0">
<widget class="QGroupBox" name="groupGameProtocol">
<property name="title">
<string>Protocol</string>
@@ -1145,27 +760,14 @@
<property name="verticalSpacing">
<number>0</number>
</property>
- <item row="0" column="0">
- <widget class="QComboBox" name="iconcomboProtocol">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
+ <item row="1" column="0">
+ <widget class="QComboBox" name="iconcomboProtocol"/>
</item>
- <item row="0" column="1">
+ <item row="1" column="1">
<widget class="QToolButton" name="btnShowServerControls">
<property name="enabled">
<bool>true</bool>
</property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
<property name="text">
<string>...</string>
</property>
@@ -1177,62 +779,114 @@
</layout>
</widget>
</item>
- <item>
- <widget class="QGroupBox" name="groupFilter">
- <property name="title">
- <string>Filter</string>
+ <item row="2" column="0">
+ <widget class="QFrame" name="frame_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <layout class="QGridLayout" name="gridLayout_3">
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <property name="spacing">
+ <number>0</number>
+ </property>
<property name="leftMargin">
- <number>4</number>
+ <number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
<number>0</number>
</property>
- <property name="horizontalSpacing">
- <number>3</number>
- </property>
- <property name="verticalSpacing">
+ <property name="bottomMargin">
<number>0</number>
</property>
- <item row="0" column="0">
- <widget class="QComboBox" name="iconcomboFilter">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QToolButton" name="btnShowFilterControls">
+ <item>
+ <widget class="QToolButton" name="profile_button">
<property name="enabled">
<bool>true</bool>
</property>
+ <property name="text">
+ <string>Profile</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::DownArrow</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="iconcomboProfile">
<property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="flat" stdset="0">
- <bool>false</bool>
+ <property name="maxVisibleItems">
+ <number>20</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
+ <item row="3" column="0">
+ <widget class="QPushButton" name="btnEditCurves">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Mapping</string>
+ </property>
+ <property name="icon">
+ <iconset resource="ui-res.qrc">
+ <normaloff>:/images/curves.png</normaloff>:/images/curves.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>80</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QPushButton" name="btnShortcuts">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Options</string>
+ </property>
+ <property name="icon">
+ <iconset resource="ui-res.qrc">
+ <normaloff>:/images/tools.png</normaloff>:/images/tools.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>80</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -1254,16 +908,9 @@
</customwidgets>
<tabstops>
<tabstop>btnStopTracker</tabstop>
- <tabstop>iconcomboTrackerSource</tabstop>
- <tabstop>btnShowEngineControls</tabstop>
<tabstop>iconcomboProtocol</tabstop>
<tabstop>btnShowServerControls</tabstop>
- <tabstop>iconcomboFilter</tabstop>
- <tabstop>btnShowFilterControls</tabstop>
- <tabstop>profile_button</tabstop>
- <tabstop>iconcomboProfile</tabstop>
<tabstop>btnShortcuts</tabstop>
- <tabstop>btnEditCurves</tabstop>
<tabstop>profile_button</tabstop>
<tabstop>iconcomboProfile</tabstop>
</tabstops>
diff --git a/gui/options-dialog.cpp b/gui/options-dialog.cpp
index e1324ccc..1e734135 100644
--- a/gui/options-dialog.cpp
+++ b/gui/options-dialog.cpp
@@ -7,6 +7,7 @@
*/
#include "options-dialog.hpp"
+#include "tracker-pt/camera.h"
#include "keyboard.h"
#include <QPushButton>
#include <QLayout>
@@ -30,9 +31,11 @@ static QString kopts_to_string(const key_opts& kopts)
}
OptionsDialog::OptionsDialog(main_settings& main,
+ State& state,
std::function<void()> register_global_keys,
std::function<void(bool)> pause_keybindings) :
main(main),
+ state(state),
register_global_keys(register_global_keys),
pause_keybindings(pause_keybindings)
{
@@ -45,16 +48,51 @@ OptionsDialog::OptionsDialog(main_settings& main,
tie_setting(main.center_at_startup, ui.center_at_startup);
+ tie_setting(pt.camera_mode, ui.camera_mode);
+
+ tie_setting(pt.threshold, ui.threshold_slider);
+
+ tie_setting(pt.min_point_size, ui.mindiam_spin);
+ tie_setting(pt.max_point_size, ui.maxdiam_spin);
+
+ tie_setting(pt.t_MH_x, ui.tx_spin);
+ tie_setting(pt.t_MH_y, ui.ty_spin);
+ tie_setting(pt.t_MH_z, ui.tz_spin);
+
+ tie_setting(pt.fov, ui.camera_fov);
+
+ tie_setting(pt.model_used, ui.model_used);
+
+ connect(ui.ewma_slider, SIGNAL(valueChanged(int)), this, SLOT(update_ewma_display(int)));
+ connect(ui.rotation_slider, SIGNAL(valueChanged(int)), this, SLOT(update_rot_display(int)));
+ connect(ui.rot_dz_slider, SIGNAL(valueChanged(int)), this, SLOT(update_rot_dz_display(int)));
+ connect(ui.translation_slider, SIGNAL(valueChanged(int)), this, SLOT(update_trans_display(int)));
+ connect(ui.trans_dz_slider, SIGNAL(valueChanged(int)), this, SLOT(update_trans_dz_display(int)));
+
+ tie_setting(acc.rot_threshold, ui.rotation_slider);
+ tie_setting(acc.trans_threshold, ui.translation_slider);
+ tie_setting(acc.ewma, ui.ewma_slider);
+ tie_setting(acc.rot_deadzone, ui.rot_dz_slider);
+ tie_setting(acc.trans_deadzone, ui.trans_dz_slider);
+
+ update_rot_display(ui.rotation_slider->value());
+ update_trans_display(ui.translation_slider->value());
+ update_ewma_display(ui.ewma_slider->value());
+ update_rot_dz_display(ui.rot_dz_slider->value());
+ update_trans_dz_display(ui.trans_dz_slider->value());
+
+ tie_setting(pt.dynamic_pose, ui.dynamic_pose);
+ tie_setting(pt.init_phase_timeout, ui.init_phase_timeout);
+ tie_setting(pt.auto_threshold, ui.auto_threshold);
+
+ connect(&timer,SIGNAL(timeout()), this,SLOT(poll_tracker_info()));
+ connect( ui.tcalib_button,SIGNAL(toggled(bool)), this,SLOT(startstop_trans_calib(bool)) );
+
+ timer.start(100);
+
tie_setting(main.tcomp_p, ui.tcomp_enable);
tie_setting(main.tcomp_tz, ui.tcomp_rz);
- tie_setting(main.a_x.zero, ui.pos_tx);
- tie_setting(main.a_y.zero, ui.pos_ty);
- tie_setting(main.a_z.zero, ui.pos_tz);
- tie_setting(main.a_yaw.zero, ui.pos_rx);
- tie_setting(main.a_pitch.zero, ui.pos_ry);
- tie_setting(main.a_roll.zero, ui.pos_rz);
-
tie_setting(main.a_yaw.invert, ui.invert_yaw);
tie_setting(main.a_pitch.invert, ui.invert_pitch);
tie_setting(main.a_roll.invert, ui.invert_roll);
@@ -130,6 +168,8 @@ void OptionsDialog::bind_key(key_opts& kopts, QLabel* label)
}
void OptionsDialog::doOK() {
+ pt.b->save();
+ acc.b->save();
main.b->save();
ui.game_detector->save();
this->close();
@@ -137,8 +177,117 @@ void OptionsDialog::doOK() {
}
void OptionsDialog::doCancel() {
+ pt.b->reload();
+ acc.b->reload();
main.b->reload();
ui.game_detector->revert();
close();
}
+void OptionsDialog::startstop_trans_calib(bool start)
+{
+ auto tracker = get_pt();
+ if (!tracker)
+ {
+ ui.tcalib_button->setChecked(false);
+ return;
+ }
+
+ if (start)
+ {
+ qDebug()<<"TrackerDialog:: Starting translation calibration";
+ trans_calib.reset();
+ trans_calib_running = true;
+ pt.t_MH_x = 0;
+ pt.t_MH_y = 0;
+ pt.t_MH_z = 0;
+ }
+ else
+ {
+ qDebug()<<"TrackerDialog:: Stopping translation calibration";
+ trans_calib_running = false;
+ {
+ auto tmp = trans_calib.get_estimate();
+ pt.t_MH_x = tmp[0];
+ pt.t_MH_y = tmp[1];
+ pt.t_MH_z = tmp[2];
+ }
+ }
+}
+
+void OptionsDialog::poll_tracker_info()
+{
+ auto tracker = get_pt();
+ CamInfo info;
+ if (tracker && tracker->get_cam_info(&info))
+ {
+ QString to_print;
+
+ // display caminfo
+ to_print = QString::number(info.res_x)+"x"+QString::number(info.res_y)+" @ "+QString::number(info.fps)+" FPS";
+ ui.caminfo_label->setText(to_print);
+
+ // display pointinfo
+ int n_points = tracker->get_n_points();
+ to_print = QString::number(n_points);
+ if (n_points == 3)
+ to_print += " OK!";
+ else
+ to_print += " BAD!";
+ ui.pointinfo_label->setText(to_print);
+
+ // update calibration
+ if (trans_calib_running) trans_calib_step();
+ }
+ else
+ {
+ ui.caminfo_label->setText("Tracker offline");
+ ui.pointinfo_label->setText("");
+ }
+}
+
+void OptionsDialog::trans_calib_step()
+{
+ auto tracker = get_pt();
+ if (tracker)
+ {
+ Affine X_CM = tracker->pose();
+ trans_calib.update(X_CM.R, X_CM.t);
+ }
+}
+
+Tracker_PT* OptionsDialog::get_pt()
+{
+ auto work = state.work.get();
+ if (!work)
+ return nullptr;
+ auto ptr = work->libs.pTracker;
+ if (ptr)
+ return static_cast<Tracker_PT*>(ptr.get());
+ return nullptr;
+}
+
+void OptionsDialog::update_rot_display(int value)
+{
+ ui.rot_gain->setText(QString::number((value + 1) * 10 / 100.) + "°");
+}
+
+void OptionsDialog::update_trans_display(int value)
+{
+ ui.trans_gain->setText(QString::number((value + 1) * 5 / 100.) + "mm");
+}
+
+void OptionsDialog::update_ewma_display(int value)
+{
+ ui.ewma_label->setText(QString::number(value * 2) + "ms");
+}
+
+void OptionsDialog::update_rot_dz_display(int value)
+{
+ ui.rot_dz->setText(QString::number(value * 2 / 100.) + "°");
+}
+
+void OptionsDialog::update_trans_dz_display(int value)
+{
+ ui.trans_dz->setText(QString::number(value * 1 / 100.) + "mm");
+}
diff --git a/gui/options-dialog.hpp b/gui/options-dialog.hpp
index 7700162b..f333c690 100644
--- a/gui/options-dialog.hpp
+++ b/gui/options-dialog.hpp
@@ -1,7 +1,15 @@
#pragma once
+#include <QObject>
+#include <QWidget>
+#include <QTimer>
#include "ui_settings.h"
+#include "opentrack/state.hpp"
#include "opentrack/shortcuts.h"
+#include "tracker-pt/ftnoir_tracker_pt_settings.h"
+#include "trans_calib.h"
+#include "tracker-pt/ftnoir_tracker_pt.h"
+#include "filter-accela/ftnoir_filter_accela.h"
#include <QObject>
#include <QWidget>
#include <functional>
@@ -12,15 +20,32 @@ class OptionsDialog: public QWidget
signals:
void reload();
public:
- OptionsDialog(main_settings& main, std::function<void()> register_global_keys, std::function<void(bool)> pause_keybindings);
+ OptionsDialog(main_settings& main, State& state, std::function<void()> register_global_keys, std::function<void(bool)> pause_keybindings);
private:
main_settings& main;
+ State& state;
std::function<void()> register_global_keys;
std::function<void(bool)> pause_keybindings;
Ui::UI_Settings ui;
+ settings_pt pt;
+ settings_accela acc;
+ QTimer timer;
+ TranslationCalibrator trans_calib;
+ bool trans_calib_running;
+
+ Tracker_PT* get_pt();
void closeEvent(QCloseEvent *) override { doCancel(); }
private slots:
+ void update_ewma_display(int value);
+ void update_rot_display(int value);
+ void update_trans_display(int value);
+ void update_rot_dz_display(int value);
+ void update_trans_dz_display(int value);
+
void doOK();
void doCancel();
+ void startstop_trans_calib(bool start);
+ void poll_tracker_info();
+ void trans_calib_step();
void bind_key(key_opts &kopts, QLabel* label);
};
diff --git a/gui/settings.ui b/gui/settings.ui
index 3a5de399..b00e0960 100644
--- a/gui/settings.ui
+++ b/gui/settings.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>381</width>
- <height>603</height>
+ <width>428</width>
+ <height>525</height>
</rect>
</property>
<property name="windowTitle">
@@ -23,7 +23,7 @@
<property name="autoFillBackground">
<bool>false</bool>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_5">
+ <layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
@@ -33,14 +33,41 @@
<attribute name="title">
<string>Shortcuts</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
+ <layout class="QGridLayout" name="gridLayout_9">
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="center_at_startup">
+ <property name="text">
+ <string>Center at startup</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="trayp">
+ <property name="text">
+ <string>Minimize to tray</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
<widget class="QGroupBox" name="groupBox_8">
<property name="title">
<string>Global shortcuts</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_8">
- <item>
+ <layout class="QGridLayout" name="gridLayout_15">
+ <item row="0" column="0">
<widget class="QLabel" name="label_23">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
@@ -56,41 +83,21 @@
</property>
</widget>
</item>
- <item>
+ <item row="1" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="styleSheet">
<string notr="true">QGroupBox { border: 0; }</string>
</property>
<layout class="QGridLayout" name="gridLayout_8">
- <item row="8" column="2">
- <widget class="QPushButton" name="bind_stop">
- <property name="text">
- <string>Bind</string>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QLabel" name="textLabel2_7">
- <property name="text">
- <string>Start tracking</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QLabel" name="textLabel2_8">
+ <item row="6" column="1">
+ <widget class="QLabel" name="zero_text">
<property name="text">
- <string>Stop tracking</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
+ <string/>
</property>
</widget>
</item>
- <item row="0" column="1">
- <widget class="QLabel" name="center_text">
+ <item row="5" column="1">
+ <widget class="QLabel" name="toggle_text">
<property name="text">
<string/>
</property>
@@ -106,17 +113,20 @@
</property>
</widget>
</item>
- <item row="5" column="1">
- <widget class="QLabel" name="toggle_text">
+ <item row="0" column="2">
+ <widget class="QPushButton" name="bind_center">
<property name="text">
- <string/>
+ <string>Bind</string>
</property>
</widget>
</item>
- <item row="6" column="1">
- <widget class="QLabel" name="zero_text">
+ <item row="5" column="0">
+ <widget class="QLabel" name="textLabel2_5">
<property name="text">
- <string/>
+ <string>Toggle</string>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
</property>
</widget>
</item>
@@ -130,41 +140,44 @@
</property>
</widget>
</item>
- <item row="0" column="2">
- <widget class="QPushButton" name="bind_center">
+ <item row="6" column="2">
+ <widget class="QPushButton" name="bind_zero">
<property name="text">
<string>Bind</string>
</property>
</widget>
</item>
- <item row="5" column="0">
- <widget class="QLabel" name="textLabel2_5">
+ <item row="5" column="2">
+ <widget class="QPushButton" name="bind_toggle">
<property name="text">
- <string>Toggle</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
+ <string>Bind</string>
</property>
</widget>
</item>
- <item row="6" column="2">
- <widget class="QPushButton" name="bind_zero">
+ <item row="7" column="0">
+ <widget class="QLabel" name="textLabel2_7">
<property name="text">
- <string>Bind</string>
+ <string>Start tracking</string>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
</property>
</widget>
</item>
- <item row="5" column="2">
- <widget class="QPushButton" name="bind_toggle">
+ <item row="0" column="1">
+ <widget class="QLabel" name="center_text">
<property name="text">
- <string>Bind</string>
+ <string/>
</property>
</widget>
</item>
- <item row="7" column="2">
- <widget class="QPushButton" name="bind_start">
+ <item row="8" column="0">
+ <widget class="QLabel" name="textLabel2_8">
<property name="text">
- <string>Bind</string>
+ <string>Stop tracking</string>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
</property>
</widget>
</item>
@@ -178,6 +191,20 @@
</property>
</widget>
</item>
+ <item row="7" column="2">
+ <widget class="QPushButton" name="bind_start">
+ <property name="text">
+ <string>Bind</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="2">
+ <widget class="QPushButton" name="bind_stop">
+ <property name="text">
+ <string>Bind</string>
+ </property>
+ </widget>
+ </item>
<item row="9" column="2">
<widget class="QPushButton" name="bind_toggle_tracking">
<property name="text">
@@ -212,12 +239,12 @@
</layout>
</widget>
</item>
- <item>
- <widget class="QGroupBox" name="groupBox_9">
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="groupBox_9111">
<property name="title">
<string>Centering method</string>
</property>
- <layout class="QGridLayout" name="gridLayout">
+ <layout class="QGridLayout" name="gridLayout111">
<item row="1" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
@@ -252,140 +279,254 @@
</layout>
</widget>
</item>
- <item>
- <widget class="QCheckBox" name="center_at_startup">
- <property name="text">
- <string>Center at startup</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="trayp">
- <property name="text">
- <string>Minimize to tray</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Camera</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout_3">
+ <layout class="QVBoxLayout" name="verticalLayout_10">
<item>
- <widget class="QGroupBox" name="groupBox_5">
+ <widget class="QGroupBox" name="groupBox_9">
<property name="title">
- <string>Camera offset</string>
+ <string>Device</string>
</property>
- <layout class="QGridLayout" name="gridLayout_6">
+ <layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
- <widget class="QLabel" name="label_17">
+ <widget class="QLabel" name="label_32">
<property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify an angle for off-center camera as a basis for which direction is which, avoiding axis interconnect. Also see &lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/choosing-camera-offset&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;description on wiki&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>Dynamic pose resolution</string>
</property>
- <property name="alignment">
- <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="dynamic_pose">
+ <property name="text">
+ <string/>
</property>
- <property name="wordWrap">
- <bool>true</bool>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="camera_mode">
+ <item>
+ <property name="text">
+ <string>640x480, 75 Hz</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>640x480, 60 Hz</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320x240, 189 Hz</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320x240, 120 Hz</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2511">
+ <property name="text">
+ <string>Mode</string>
</property>
- <property name="margin">
- <number>2</number>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QComboBox" name="camera_fov">
+ <item>
+ <property name="text">
+ <string>56°</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>75°</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Field of view</string>
</property>
- <property name="openExternalLinks">
- <bool>true</bool>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_33">
+ <property name="text">
+ <string>Dynamic pose timeout</string>
</property>
</widget>
</item>
- <item row="3" column="0" alignment="Qt::AlignLeft">
- <widget class="QGroupBox" name="groupBox_3">
- <property name="styleSheet">
- <string notr="true">QGroupBox
-{
- border: 0;
-}</string>
+ <item row="3" column="1">
+ <widget class="QSpinBox" name="init_phase_timeout">
+ <property name="suffix">
+ <string> ms</string>
</property>
- <layout class="QGridLayout" name="gridLayout_7">
- <item row="2" column="0">
- <widget class="QLabel" name="label_21">
- <property name="text">
- <string>Roll</string>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>10000</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_6">
+ <property name="title">
+ <string>Point extraction</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="topMargin">
+ <number>4</number>
+ </property>
+ <property name="bottomMargin">
+ <number>4</number>
+ </property>
+ <item>
+ <widget class="QFrame" name="frame_2">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_10">
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>6</number>
+ </property>
+ <item row="1" column="1">
+ <widget class="QSlider" name="threshold_slider">
+ <property name="toolTip">
+ <string>Intensity threshold for point extraction</string>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>127</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
</property>
</widget>
</item>
- <item row="2" column="1">
- <widget class="QSpinBox" name="camera_roll">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Threshold</string>
</property>
- <property name="minimum">
- <number>-180</number>
+ <property name="buddy">
+ <cstring>threshold_slider</cstring>
</property>
- <property name="maximum">
- <number>180</number>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_38">
+ <property name="text">
+ <string>Automatic threshold</string>
</property>
</widget>
</item>
<item row="0" column="1">
- <widget class="QSpinBox" name="camera_yaw">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
+ <widget class="QCheckBox" name="auto_threshold">
+ <property name="text">
+ <string>Enable, slider sets point size</string>
</property>
- <property name="minimum">
- <number>-180</number>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_29">
+ <property name="text">
+ <string>Min size</string>
</property>
- <property name="maximum">
- <number>180</number>
+ <property name="buddy">
+ <cstring>mindiam_spin</cstring>
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_19">
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_22">
<property name="text">
- <string>Pitch</string>
+ <string>Max size</string>
+ </property>
+ <property name="buddy">
+ <cstring>maxdiam_spin</cstring>
</property>
</widget>
</item>
- <item row="1" column="1">
- <widget class="QSpinBox" name="camera_pitch">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
+ <item row="0" column="3">
+ <widget class="QDoubleSpinBox" name="maxdiam_spin">
+ <property name="toolTip">
+ <string>Maximum point diameter</string>
</property>
- <property name="minimum">
- <number>-180</number>
+ <property name="suffix">
+ <string> px</string>
</property>
- <property name="maximum">
- <number>180</number>
+ <property name="decimals">
+ <number>1</number>
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_18">
- <property name="text">
- <string>Yaw</string>
+ <item row="0" column="1">
+ <widget class="QDoubleSpinBox" name="mindiam_spin">
+ <property name="toolTip">
+ <string>Minimum point diameter</string>
+ </property>
+ <property name="suffix">
+ <string> px</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
</property>
</widget>
</item>
@@ -396,179 +537,341 @@
</widget>
</item>
<item>
- <widget class="QGroupBox" name="groupBox_6">
+ <widget class="QGroupBox" name="groupBox_11">
<property name="title">
- <string>Center pose offset</string>
+ <string>Status</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_6">
+ <layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QLabel" name="label_22">
+ <widget class="QLabel" name="caminfo_label">
<property name="text">
- <string>Alter the centered position sent to games by a fixed amount.</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="margin">
- <number>2</number>
+ <string>Not running</string>
</property>
</widget>
</item>
<item>
- <widget class="QGroupBox" name="groupBox_7">
- <property name="styleSheet">
- <string notr="true">QGroupBox {
- border: 0;
-}</string>
- </property>
- <property name="title">
+ <widget class="QLabel" name="pointinfo_label">
+ <property name="text">
<string/>
</property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_2">
+ <attribute name="title">
+ <string>Model</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="groupBox_6111">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QFrame { border: 0; }</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_17">
+ <property name="leftMargin">
+ <number>31</number>
+ </property>
+ <property name="topMargin">
+ <number>4</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="model_used">
+ <property name="sizeAdjustPolicy">
+ <enum>QComboBox::AdjustToMinimumContentsLength</enum>
</property>
- <property name="flat">
- <bool>false</bool>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
</property>
- <property name="checkable">
- <bool>false</bool>
+ <item>
+ <property name="text">
+ <string>Cap</string>
+ </property>
+ <property name="icon">
+ <iconset resource="ui-res.qrc">
+ <normaloff>:/images/trackhat-hat.png</normaloff>:/images/trackhat-hat.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Clip</string>
+ </property>
+ <property name="icon">
+ <iconset resource="ui-res.qrc">
+ <normaloff>:/images/trackhat-clip-right.png</normaloff>:/images/trackhat-clip-right.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Clip left-handed</string>
+ </property>
+ <property name="icon">
+ <iconset resource="ui-res.qrc">
+ <normaloff>:/images/trackhat-clip-left.png</normaloff>:/images/trackhat-clip-left.png</iconset>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_31">
+ <property name="text">
+ <string>Model used</string>
</property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="2" column="1">
- <widget class="QDoubleSpinBox" name="pos_rz">
- <property name="suffix">
- <string> deg.</string>
- </property>
- <property name="decimals">
- <number>3</number>
- </property>
- <property name="minimum">
- <double>-180.000000000000000</double>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_10">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Model position calibration</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_11">
+ <item row="0" column="0">
+ <widget class="QFrame" name="frame_3">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_12">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_61">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="maximum">
- <double>180.000000000000000</double>
+ <property name="text">
+ <string>x:</string>
</property>
</widget>
</item>
- <item row="2" column="3">
- <widget class="QDoubleSpinBox" name="pos_tz">
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="tx_spin">
<property name="suffix">
- <string> cm</string>
- </property>
- <property name="decimals">
- <number>3</number>
+ <string> mm</string>
</property>
<property name="minimum">
- <double>-100.000000000000000</double>
+ <number>-65535</number>
</property>
<property name="maximum">
- <double>100.000000000000000</double>
+ <number>65536</number>
</property>
</widget>
</item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_4">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_62">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text">
- <string>TX</string>
+ <string>y:</string>
</property>
</widget>
</item>
- <item row="0" column="3">
- <widget class="QDoubleSpinBox" name="pos_tx">
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="ty_spin">
<property name="suffix">
- <string> cm</string>
- </property>
- <property name="decimals">
- <number>3</number>
+ <string> mm</string>
</property>
<property name="minimum">
- <double>-100.000000000000000</double>
+ <number>-65535</number>
</property>
<property name="maximum">
- <double>100.000000000000000</double>
+ <number>65536</number>
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>RY</string>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_66">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLabel" name="label_5">
<property name="text">
- <string>TY</string>
+ <string>z:</string>
</property>
</widget>
</item>
- <item row="1" column="1">
- <widget class="QDoubleSpinBox" name="pos_ry">
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="tz_spin">
<property name="suffix">
- <string> deg.</string>
- </property>
- <property name="decimals">
- <number>3</number>
+ <string> mm</string>
</property>
<property name="minimum">
- <double>-180.000000000000000</double>
+ <number>-65535</number>
</property>
<property name="maximum">
- <double>180.000000000000000</double>
+ <number>65536</number>
</property>
</widget>
</item>
- <item row="2" column="2">
- <widget class="QLabel" name="label_6">
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_59">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Only pitch and yaw during calibration.&lt;/p&gt;&lt;p&gt;Don't roll and don't translate.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="tcalib_button">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Toggle calibration</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_5">
+ <property name="title">
+ <string>Camera offset</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_6">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_17">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify an angle for off-center camera as a basis for which direction is which, avoiding axis interconnect. Also see &lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/choosing-camera-offset&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;description on wiki&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" alignment="Qt::AlignLeft">
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="styleSheet">
+ <string notr="true">QGroupBox
+{
+ border: 0;
+}</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_7">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_21">
<property name="text">
- <string>TZ</string>
+ <string>Roll</string>
</property>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>RZ</string>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="camera_roll">
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="minimum">
+ <number>-180</number>
+ </property>
+ <property name="maximum">
+ <number>180</number>
</property>
</widget>
</item>
- <item row="1" column="3">
- <widget class="QDoubleSpinBox" name="pos_ty">
- <property name="suffix">
- <string> cm</string>
- </property>
- <property name="decimals">
- <number>3</number>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="camera_yaw">
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
</property>
<property name="minimum">
- <double>-100.000000000000000</double>
+ <number>-180</number>
</property>
<property name="maximum">
- <double>100.000000000000000</double>
+ <number>180</number>
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_2">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_19">
<property name="text">
- <string>RX</string>
+ <string>Pitch</string>
</property>
</widget>
</item>
- <item row="0" column="1">
- <widget class="QDoubleSpinBox" name="pos_rx">
- <property name="suffix">
- <string> deg.</string>
- </property>
- <property name="decimals">
- <number>3</number>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="camera_pitch">
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
</property>
<property name="minimum">
- <double>-180.000000000000000</double>
+ <number>-180</number>
</property>
<property name="maximum">
- <double>180.000000000000000</double>
+ <number>180</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_18">
+ <property name="text">
+ <string>Yaw</string>
</property>
</widget>
</item>
@@ -579,14 +882,14 @@
</widget>
</item>
<item>
- <spacer name="verticalSpacer_2">
+ <spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
- <height>40</height>
+ <height>10</height>
</size>
</property>
</spacer>
@@ -655,7 +958,7 @@
</layout>
</widget>
</item>
- <item alignment="Qt::AlignTop">
+ <item>
<widget class="QGroupBox" name="groupBox_4">
<property name="maximumSize">
<size>
@@ -1090,6 +1393,345 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="tab_6">
+ <attribute name="title">
+ <string>Filter</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <widget class="QFrame" name="frame_4">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_14">
+ <item row="1" column="3">
+ <widget class="QSlider" name="rotation_slider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>99</number>
+ </property>
+ <property name="pageStep">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>24</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="lblSensYaw_6">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Rotation sensitivity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Smoothing</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="ewma_label">
+ <property name="minimumSize">
+ <size>
+ <width>48</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0 ms</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="rot_gain">
+ <property name="text">
+ <string>0°</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QSlider" name="ewma_slider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="singleStep">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>25</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>24</number>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_27">
+ <property name="text">
+ <string>Translation deadzone</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_28">
+ <property name="text">
+ <string>Rotation deadzone</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="QSlider" name="rot_dz_slider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>24</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="rot_dz">
+ <property name="text">
+ <string>0°</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3">
+ <widget class="QSlider" name="trans_dz_slider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>24</number>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QLabel" name="trans_dz">
+ <property name="text">
+ <string>0mm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_30">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Translation sensitivity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="trans_gain">
+ <property name="text">
+ <string>0mm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QSlider" name="translation_slider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>99</number>
+ </property>
+ <property name="pageStep">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>24</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_12">
+ <property name="title">
+ <string/>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_13">
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_26111">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>7</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;&lt;a href=&quot;https://github.com/sthalik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br/&gt;Thanks to &lt;/span&gt;&lt;a href=&quot;https://github.com/dbaarda&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2015&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="indent">
+ <number>0</number>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Visit &lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;our wiki&lt;/span&gt;&lt;/a&gt; for description of the settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
<widget class="QWidget" name="tab_5">
<attribute name="title">
<string>Game detection</string>
@@ -1101,9 +1743,6 @@
<string>Game detection</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
- <item row="1" column="0">
- <widget class="process_detector" name="game_detector" native="true"/>
- </item>
<item row="0" column="0">
<widget class="QLabel" name="label_24">
<property name="sizePolicy">
@@ -1120,6 +1759,9 @@
</property>
</widget>
</item>
+ <item row="1" column="0">
+ <widget class="process_detector" name="game_detector" native="true"/>
+ </item>
</layout>
</widget>
</item>
@@ -1147,15 +1789,6 @@
<tabstop>tabWidget</tabstop>
<tabstop>center_at_startup</tabstop>
<tabstop>trayp</tabstop>
- <tabstop>camera_yaw</tabstop>
- <tabstop>camera_pitch</tabstop>
- <tabstop>camera_roll</tabstop>
- <tabstop>pos_rx</tabstop>
- <tabstop>pos_ry</tabstop>
- <tabstop>pos_rz</tabstop>
- <tabstop>pos_tx</tabstop>
- <tabstop>pos_ty</tabstop>
- <tabstop>pos_tz</tabstop>
<tabstop>tcomp_enable</tabstop>
<tabstop>tcomp_rz</tabstop>
<tabstop>src_yaw</tabstop>
@@ -1171,8 +1804,27 @@
<tabstop>src_z</tabstop>
<tabstop>invert_z</tabstop>
</tabstops>
- <resources/>
+ <resources>
+ <include location="ui-res.qrc"/>
+ </resources>
<connections/>
+ <designerdata>
+ <property name="gridDeltaX">
+ <number>5</number>
+ </property>
+ <property name="gridDeltaY">
+ <number>5</number>
+ </property>
+ <property name="gridSnapX">
+ <bool>true</bool>
+ </property>
+ <property name="gridSnapY">
+ <bool>true</bool>
+ </property>
+ <property name="gridVisible">
+ <bool>true</bool>
+ </property>
+ </designerdata>
<slots>
<slot>startEngineClicked()</slot>
<slot>stopEngineClicked()</slot>
diff --git a/gui/software-update-dialog.hpp b/gui/software-update-dialog.hpp
new file mode 100644
index 00000000..21d92ecc
--- /dev/null
+++ b/gui/software-update-dialog.hpp
@@ -0,0 +1,87 @@
+#pragma once
+
+#include <QtNetwork>
+#include <QDialog>
+#include <QSettings>
+#include <QString>
+#include <QRegExp>
+#include <functional>
+#include "ui_software-update.h"
+#include "opentrack-compat/options.hpp"
+
+extern "C" const char* opentrack_version;
+
+class update_dialog : public QDialog
+{
+ Q_OBJECT
+public:
+ struct query
+ {
+ query(QWidget* parent) : parent(parent), qnam(parent) {}
+
+ QWidget* parent;
+ QNetworkAccessManager qnam;
+ QByteArray buf;
+ QNetworkReply* r;
+ void on_finished()
+ {
+ if (r->error() != QNetworkReply::NoError)
+ {
+ qDebug() << "update error" << r->errorString();
+ return;
+ }
+ QString str(buf);
+ QRegExp re("OPENTRACK_VERSION([a-zA-Z0-9_.-]+)");
+ int idx = re.indexIn(str);
+ if (idx != -1)
+ {
+ str = re.cap(1);
+ QSettings s(OPENTRACK_ORG);
+ QString quiet_version = s.value("quiet-update-version").toString();
+
+ if (!str.isEmpty() && str != opentrack_version && str != quiet_version)
+ {
+ qDebug() << "update version" << str;
+ update_dialog dlg(parent, *this, str);
+ dlg.show();
+ dlg.raise();
+ dlg.exec();
+ if (dlg.ui.disable_reminder->isChecked())
+ s.setValue("quiet-update-version", str);
+ }
+ }
+ buf.clear();
+ r->deleteLater();
+ }
+ void on_ready()
+ {
+ buf.append(r->readAll());
+ }
+ void maybe_show_dialog()
+ {
+ static auto uri = QStringLiteral("http://www.trackhat.org/#!opentrackversion/c1oxn");
+ r = qnam.get(QNetworkRequest(uri));
+
+ QObject::connect(r, &QNetworkReply::finished, [&]() { on_finished(); });
+ QObject::connect(r, &QNetworkReply::readyRead, [&]() { on_ready(); });
+ }
+ };
+private:
+ Ui::UpdateDialog ui;
+ query& q;
+private slots:
+ void close(QAbstractButton*)
+ {
+ QDialog::close();
+ }
+public:
+ update_dialog(QWidget* parent, query& q, const QString& new_version) : QDialog(parent), q(q)
+ {
+ ui.setupUi(this);
+ ui.ver_current->setText(const_cast<const char*>(opentrack_version));
+ ui.ver_new->setTextFormat(Qt::RichText);
+ ui.ver_new->setText("<a href='http://www.trackhat.org/#!trackhat-opentrack/c1jzc'>" + new_version + "</a>");
+ ui.ver_new->setOpenExternalLinks(true);
+ connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(close(QAbstractButton*)));
+ }
+};
diff --git a/gui/software-update.ui b/gui/software-update.ui
new file mode 100644
index 00000000..07edf66c
--- /dev/null
+++ b/gui/software-update.ui
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UpdateDialog</class>
+ <widget class="QDialog" name="UpdateDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>385</width>
+ <height>187</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Software update released</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>12</number>
+ </property>
+ <property name="topMargin">
+ <number>12</number>
+ </property>
+ <property name="rightMargin">
+ <number>12</number>
+ </property>
+ <property name="bottomMargin">
+ <number>12</number>
+ </property>
+ <property name="spacing">
+ <number>12</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Current version:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="ver_current">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Released version:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="ver_new">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QCheckBox" name="disable_reminder">
+ <property name="text">
+ <string>Don't remind me again about this version</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/gui/trackhat-wizard.ui b/gui/trackhat-wizard.ui
new file mode 100644
index 00000000..09f68c03
--- /dev/null
+++ b/gui/trackhat-wizard.ui
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>wizard</class>
+ <widget class="QWizard" name="wizard">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>365</width>
+ <height>586</height>
+ </rect>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <property name="wizardStyle">
+ <enum>QWizard::AeroStyle</enum>
+ </property>
+ <property name="options">
+ <set>QWizard::NoCancelButton</set>
+ </property>
+ <widget class="QWizardPage" name="page_model">
+ <property name="title">
+ <string>Select a model</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QFrame" name="frame_7">
+ <property name="styleSheet">
+ <string notr="true">QFrame {
+ border: 0;
+ background: transparent;
+}</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>20</number>
+ </property>
+ <property name="bottomMargin">
+ <number>12</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_12">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>120</width>
+ <height>108</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>120</width>
+ <height>108</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-hat.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_46">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-clip-right.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_48">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-clip-left.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="cap_model">
+ <property name="text">
+ <string>Cap</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="clip_model">
+ <property name="text">
+ <string>Clip, right-handed</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="clip_model_left">
+ <property name="text">
+ <string>Clip, left-handed</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWizardPage" name="page_done">
+ <property name="title">
+ <string>We're all done!</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_7">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can now use your new hardware and thanks for flying TrackHat.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources>
+ <include location="ui-res.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/gui/trans_calib.cpp b/gui/trans_calib.cpp
new file mode 100644
index 00000000..a1a4b641
--- /dev/null
+++ b/gui/trans_calib.cpp
@@ -0,0 +1,41 @@
+/* Copyright (c) 2012 Patrick Ruoff
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#include "trans_calib.h"
+
+TranslationCalibrator::TranslationCalibrator()
+{
+ reset();
+}
+
+void TranslationCalibrator::reset()
+{
+ P = cv::Matx66f::zeros();
+ y = cv::Vec6f(0,0,0, 0,0,0);
+}
+
+void TranslationCalibrator::update(const cv::Matx33f& R_CM_k, const cv::Vec3f& t_CM_k)
+{
+ cv::Matx<float, 6,3> H_k_T = cv::Matx<float, 6,3>::zeros();
+ for (int i=0; i<3; ++i) {
+ for (int j=0; j<3; ++j) {
+ H_k_T(i,j) = R_CM_k(j,i);
+ }
+ }
+ for (int i=0; i<3; ++i)
+ {
+ H_k_T(3+i,i) = 1.0;
+ }
+ P += H_k_T * H_k_T.t();
+ y += H_k_T * t_CM_k;
+}
+
+cv::Vec3f TranslationCalibrator::get_estimate()
+{
+ cv::Vec6f x = P.inv() * y;
+ return cv::Vec3f(-x[0], -x[1], -x[2]);
+}
diff --git a/gui/trans_calib.h b/gui/trans_calib.h
new file mode 100644
index 00000000..e20fc767
--- /dev/null
+++ b/gui/trans_calib.h
@@ -0,0 +1,39 @@
+/* Copyright (c) 2012 Patrick Ruoff
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#ifndef TRANSCALIB_H
+#define TRANSCALIB_H
+
+#include <opencv2/core/core.hpp>
+
+//-----------------------------------------------------------------------------
+// Calibrates the translation from head to model = t_MH
+// by recursive least squares /
+// kalman filter in information form with identity noise covariance
+// measurement equation when head position = t_CH is fixed:
+// (R_CM_k , Id)*(-t_MH, t_CH) = t_CM_k
+
+class TranslationCalibrator
+{
+public:
+ TranslationCalibrator();
+
+ // reset the calibration process
+ void reset();
+
+ // update the current estimate
+ void update(const cv::Matx33f& R_CM_k, const cv::Vec3f& t_CM_k);
+
+ // get the current estimate for t_MH
+ cv::Vec3f get_estimate();
+
+private:
+ cv::Matx66f P; // normalized precision matrix = inverse covariance
+ cv::Vec6f y; // P*(-t_MH, t_CH)
+};
+
+#endif //TRANSCALIB_H
diff --git a/gui/ui-res.qrc b/gui/ui-res.qrc
index 030a6153..ec1c7bba 100644
--- a/gui/ui-res.qrc
+++ b/gui/ui-res.qrc
@@ -6,5 +6,8 @@
<file>images/facetracknoir.png</file>
<file>images/no-feed.png</file>
<file>images/filter-16.png</file>
+ <file>images/trackhat-clip-left.png</file>
+ <file>images/trackhat-clip-right.png</file>
+ <file>images/trackhat-hat.png</file>
</qresource>
</RCC>
diff --git a/gui/ui.cpp b/gui/ui.cpp
index 31bce40b..09739b92 100644
--- a/gui/ui.cpp
+++ b/gui/ui.cpp
@@ -8,6 +8,8 @@
#include "ui.h"
#include "opentrack/tracker.h"
+#include "tracker-pt/ftnoir_tracker_pt.h"
+#include "filter-accela/ftnoir_filter_accela.h"
#include "opentrack-compat/options.hpp"
#include "new_file_dialog.h"
#include <QFileDialog>
@@ -23,7 +25,8 @@ MainWindow::MainWindow() :
pose_update_timer(this),
kbd_quit(QKeySequence("Ctrl+Q"), this),
is_refreshing_profiles(false),
- keys_paused(false)
+ keys_paused(false),
+ update_query(this)
{
ui.setupUi(this);
@@ -33,41 +36,21 @@ MainWindow::MainWindow() :
connect(ui.btnEditCurves, SIGNAL(clicked()), this, SLOT(showCurveConfiguration()));
connect(ui.btnShortcuts, SIGNAL(clicked()), this, SLOT(show_options_dialog()));
- connect(ui.btnShowEngineControls, SIGNAL(clicked()), this, SLOT(showTrackerSettings()));
connect(ui.btnShowServerControls, SIGNAL(clicked()), this, SLOT(showProtocolSettings()));
- connect(ui.btnShowFilterControls, SIGNAL(clicked()), this, SLOT(showFilterSettings()));
-
- modules.filters().push_front(std::make_shared<dylib>("", dylib::Filter));
-
- for (auto x : modules.trackers())
- ui.iconcomboTrackerSource->addItem(x->icon, x->name);
for (auto x : modules.protocols())
ui.iconcomboProtocol->addItem(x->icon, x->name);
- for (auto x : modules.filters())
- ui.iconcomboFilter->addItem(x->icon, x->name);
-
refresh_config_list();
connect(&config_list_timer, SIGNAL(timeout()), this, SLOT(refresh_config_list()));
config_list_timer.start(1000 * 3);
- tie_setting(s.tracker_dll, ui.iconcomboTrackerSource);
tie_setting(s.protocol_dll, ui.iconcomboProtocol);
- tie_setting(s.filter_dll, ui.iconcomboFilter);
-
- connect(ui.iconcomboTrackerSource,
- &QComboBox::currentTextChanged,
- [&](QString) -> void { if (pTrackerDialog) pTrackerDialog = nullptr; save(); });
connect(ui.iconcomboProtocol,
&QComboBox::currentTextChanged,
[&](QString) -> void { if (pProtocolDialog) pProtocolDialog = nullptr; save(); });
- connect(ui.iconcomboFilter,
- &QComboBox::currentTextChanged,
- [&](QString) -> void { if (pFilterDialog) pFilterDialog = nullptr; save(); });
-
connect(ui.btnStartTracker, SIGNAL(clicked()), this, SLOT(startTracker()));
connect(ui.btnStopTracker, SIGNAL(clicked()), this, SLOT(stopTracker()));
connect(ui.iconcomboProfile, SIGNAL(currentTextChanged(QString)), this, SLOT(profileSelected(QString)));
@@ -125,6 +108,16 @@ MainWindow::MainWindow() :
connect(this, &MainWindow::emit_minimized, this, &MainWindow::mark_minimized, Qt::QueuedConnection);
ui.btnStartTracker->setFocus();
+
+ update_query.maybe_show_dialog();
+}
+
+void MainWindow::closeEvent(QCloseEvent *e)
+{
+ if (maybe_not_close_tracking())
+ e->ignore();
+ else
+ e->accept();
}
void MainWindow::register_shortcuts()
@@ -278,8 +271,6 @@ void MainWindow::updateButtonState(bool running, bool inertialp)
ui.btnStartTracker->setEnabled ( not_running );
ui.btnStopTracker->setEnabled ( running );
ui.iconcomboProtocol->setEnabled ( not_running );
- ui.iconcomboFilter->setEnabled ( not_running );
- ui.iconcomboTrackerSource->setEnabled(not_running);
ui.video_frame_label->setVisible(not_running || inertialp);
ui.profile_button->setEnabled(not_running);
}
@@ -298,7 +289,7 @@ void MainWindow::startTracker() {
// tracker dtor needs run first
work = nullptr;
- libs = SelectedLibraries(ui.video_frame, current_tracker(), current_protocol(), current_filter());
+ libs = SelectedLibraries(ui.video_frame, std::make_shared<Tracker_PT>(), current_protocol(), std::make_shared<FTNoIR_Filter>());
{
double p[6] = {0,0,0, 0,0,0};
@@ -319,12 +310,6 @@ void MainWindow::startTracker() {
reload_options();
- if (pTrackerDialog)
- pTrackerDialog->register_tracker(libs.pTracker.get());
-
- if (pFilterDialog)
- pFilterDialog->register_filter(libs.pFilter.get());
-
if (pProtocolDialog)
pProtocolDialog->register_protocol(libs.pProtocol.get());
@@ -349,17 +334,9 @@ void MainWindow::stopTracker() {
pose_update_timer.stop();
ui.pose_display->rotateBy(0, 0, 0, 0, 0, 0);
- if (pTrackerDialog)
- pTrackerDialog->unregister_tracker();
-
if (pProtocolDialog)
pProtocolDialog->unregister_protocol();
- if (pFilterDialog)
- pFilterDialog->unregister_filter();
-
- maybe_save();
-
work = nullptr;
libs = SelectedLibraries();
@@ -382,11 +359,10 @@ void MainWindow::display_pose(const double *mapped, const double *raw)
if (mapping_widget)
mapping_widget->update();
- double mapped_[6], raw_[6];
+ double raw_[6];
for (int i = 0; i < 6; i++)
{
- mapped_[i] = (int) mapped[i];
raw_[i] = (int) raw[i];
}
@@ -397,13 +373,6 @@ void MainWindow::display_pose(const double *mapped, const double *raw)
ui.raw_pitch->display(raw_[Pitch]);
ui.raw_roll->display(raw_[Roll]);
- ui.pose_x->display(mapped_[TX]);
- ui.pose_y->display(mapped_[TY]);
- ui.pose_z->display(mapped_[TZ]);
- ui.pose_yaw->display(mapped_[Yaw]);
- ui.pose_pitch->display(mapped_[Pitch]);
- ui.pose_roll->display(mapped_[Roll]);
-
QString game_title;
if (libs.pProtocol)
game_title = libs.pProtocol->game_name();
@@ -416,7 +385,7 @@ void MainWindow::set_title(const QString& game_title_)
if (game_title_ != "")
game_title = " :: " + game_title_;
QString current = group::ini_filename();
- setWindowTitle(opentrack_version + QStringLiteral(" :: ") + current + game_title);
+ setWindowTitle(opentrack_version + QStringLiteral(" opentrack") + QStringLiteral(" :: ") + current + game_title);
}
void MainWindow::showHeadPose()
@@ -432,12 +401,12 @@ void MainWindow::showHeadPose()
}
template<typename t>
-bool mk_dialog(mem<dylib> lib, mem<t>& orig)
+bool mk_dialog(mem<dylib> lib, mem<t>* orig)
{
- if (orig && orig->isVisible())
+ if (*orig && (*orig)->isVisible())
{
- orig->show();
- orig->raise();
+ (*orig)->show();
+ (*orig)->raise();
return false;
}
@@ -447,33 +416,18 @@ bool mk_dialog(mem<dylib> lib, mem<t>& orig)
dialog->setWindowFlags(Qt::Dialog);
dialog->setFixedSize(dialog->size());
- orig = dialog;
+ *orig = dialog;
dialog->show();
- QObject::connect(dialog.get(), &plugin_api::detail::BaseDialog::closing, [&]() -> void { orig = nullptr; });
-
return true;
}
return false;
}
-
-void MainWindow::showTrackerSettings()
-{
- if (mk_dialog(current_tracker(), pTrackerDialog) && libs.pTracker)
- pTrackerDialog->register_tracker(libs.pTracker.get());
-}
-
void MainWindow::showProtocolSettings() {
- if (mk_dialog(current_protocol(), pProtocolDialog) && libs.pProtocol)
+ if (mk_dialog(current_protocol(), &pProtocolDialog) && libs.pProtocol)
pProtocolDialog->register_protocol(libs.pProtocol.get());
}
-
-void MainWindow::showFilterSettings() {
- if (mk_dialog(current_filter(), pFilterDialog) && libs.pFilter)
- pFilterDialog->register_filter(libs.pFilter.get());
-}
-
template<typename t, typename... Args>
bool mk_window(mem<t>* place, Args&&... params)
{
@@ -495,6 +449,7 @@ bool mk_window(mem<t>* place, Args&&... params)
void MainWindow::show_options_dialog() {
if (mk_window(&options_widget,
s,
+ *this,
[&]() -> void { register_shortcuts(); },
[&](bool flag) -> void { keys_paused = flag; }))
connect(options_widget.get(), SIGNAL(reload()), this, SLOT(reload_options()));
@@ -504,12 +459,29 @@ void MainWindow::showCurveConfiguration() {
mk_window(&mapping_widget, pose, s);
}
+bool MainWindow::maybe_not_close_tracking()
+{
+ if (work != nullptr)
+ {
+ auto btn = QMessageBox::warning(this, "Tracking active",
+ "Are you sure you want to exit? This will terminate tracking.",
+ QMessageBox::Yes, QMessageBox::No);
+ if (btn == QMessageBox::No)
+ return true;
+ }
+ return false;
+}
+
void MainWindow::exit() {
- QCoreApplication::exit(0);
+
+ if (!maybe_not_close_tracking())
+ QCoreApplication::exit(0);
}
void MainWindow::profileSelected(QString name)
{
+ maybe_save();
+
if (name == "" || is_refreshing_profiles)
return;
diff --git a/gui/ui.h b/gui/ui.h
index 6dbcf962..42a85e47 100644
--- a/gui/ui.h
+++ b/gui/ui.h
@@ -32,10 +32,11 @@
#include "curve-config.h"
#include "options-dialog.hpp"
#include "process_detector.h"
+#include "software-update-dialog.hpp"
using namespace options;
-class MainWindow : public QMainWindow, private State
+class MainWindow : public QMainWindow, public State
{
Q_OBJECT
@@ -49,27 +50,18 @@ class MainWindow : public QMainWindow, private State
mem<OptionsDialog> options_widget;
mem<MapWidget> mapping_widget;
QShortcut kbd_quit;
- mem<IFilterDialog> pFilterDialog;
mem<IProtocolDialog> pProtocolDialog;
- mem<ITrackerDialog> pTrackerDialog;
process_detector_worker det;
QMenu profile_menu;
bool is_refreshing_profiles;
volatile bool keys_paused;
QTimer save_timer;
+ update_dialog::query update_query;
- mem<dylib> current_tracker()
- {
- return modules.trackers().value(ui.iconcomboTrackerSource->currentIndex(), nullptr);
- }
mem<dylib> current_protocol()
{
return modules.protocols().value(ui.iconcomboProtocol->currentIndex(), nullptr);
}
- mem<dylib> current_filter()
- {
- return modules.filters().value(ui.iconcomboFilter->currentIndex(), nullptr);
- }
void changeEvent(QEvent* e) override;
@@ -81,6 +73,8 @@ class MainWindow : public QMainWindow, private State
static bool get_new_config_name_from_dialog(QString &ret);
void set_profile(const QString& profile);
void maybe_save();
+ bool maybe_not_close_tracking();
+ void closeEvent(QCloseEvent *e) override;
void register_shortcuts();
private slots:
void _save();
@@ -88,9 +82,7 @@ private slots:
void exit();
void profileSelected(QString name);
- void showTrackerSettings();
void showProtocolSettings();
- void showFilterSettings();
void show_options_dialog();
void showCurveConfiguration();
void showHeadPose();
diff --git a/gui/wizard.cpp b/gui/wizard.cpp
new file mode 100644
index 00000000..cf987ecb
--- /dev/null
+++ b/gui/wizard.cpp
@@ -0,0 +1,81 @@
+#include "wizard.h"
+#include "opentrack/state.hpp"
+#include "tracker-pt/ftnoir_tracker_pt_settings.h"
+#include "filter-accela/ftnoir_filter_accela.h"
+
+Wizard::Wizard() : QWizard(nullptr)
+{
+ ui.setupUi(this);
+ connect(this, SIGNAL(accepted()), this, SLOT(set_data()));
+}
+
+static constexpr double tz[][2] = {
+ { 16.5327205657959, 13.0232553482056 },
+ { 55.4535026550293, 100 },
+ { 56.8312301635742, 100 },
+ { -1, -1 },
+};
+
+static constexpr double yaw[][2] = {
+ { 10.7462686567164, 20.9302325581395 },
+ { 30, 115 },
+ { 41.9517784118652, 180 },
+ { -1, -1 },
+};
+
+static constexpr double pitch[][2] = {
+ { 10.1262916188289, 27.6279069767442 },
+ { 32.4454649827784, 180 },
+ { -1, -1 },
+};
+
+static constexpr double roll[][2] = {
+ { 12.3995409011841, 25.9534893035889 },
+ { 54.3513221740723, 180 },
+ { -1, -1 },
+};
+
+static void set_mapping(Mapping& m, const double spline[][2])
+{
+ m.opts.altp = false;
+ m.curve.removeAllPoints();
+ for (int i = 0; spline[i][0] >= 0; i++)
+ m.curve.addPoint(QPointF(spline[i][0], spline[i][1]));
+}
+
+void Wizard::set_data()
+{
+ Model m;
+
+ if (ui.clip_model->isChecked())
+ m = ClipRight;
+ else if (ui.clip_model_left->isChecked())
+ m = ClipLeft;
+ else // ui.cap_model
+ m = Cap;
+
+ State state;
+
+ set_mapping(state.pose(TZ), tz);
+ set_mapping(state.pose(Yaw), yaw);
+ set_mapping(state.pose(Pitch), pitch);
+ set_mapping(state.pose(Roll), roll);
+ state.pose.save_mappings();
+
+ settings_pt pt;
+ pt.threshold = 31;
+ pt.min_point_size = 0;
+ pt.max_point_size = 50;
+ pt.fov = 1;
+ pt.camera_mode = 0;
+ pt.model_used = m;
+ pt.b->save();
+
+ settings_accela acc;
+ acc.ewma = 49;
+ acc.rot_threshold = 29;
+ acc.rot_deadzone = 29;
+ acc.trans_deadzone = 33;
+ acc.trans_threshold = 19;
+ acc.b->save();
+}
diff --git a/gui/wizard.h b/gui/wizard.h
new file mode 100644
index 00000000..9d359172
--- /dev/null
+++ b/gui/wizard.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include "opentrack-compat/options.hpp"
+#include "opentrack/main-settings.hpp"
+#include "opentrack/mappings.hpp"
+#include "ui_trackhat-wizard.h"
+#include <QObject>
+#include <QWizard>
+
+class Wizard : public QWizard
+{
+ Q_OBJECT
+ Ui_wizard ui;
+public:
+ Wizard();
+
+ enum Model { Cap = 0, ClipRight = 1, ClipLeft = 2 };
+ enum { ClipRightX = 135, ClipLeftX = -135 };
+private slots:
+ void set_data();
+};