diff options
47 files changed, 1050 insertions, 1767 deletions
diff --git a/compat/camera-names.cpp b/compat/camera-names.cpp index b9511037..5813990d 100644 --- a/compat/camera-names.cpp +++ b/compat/camera-names.cpp @@ -103,8 +103,8 @@ std::vector<std::tuple<QString, int>> get_camera_names() { QString str = prop_to_qstring(pPropBag, L"FriendlyName"); QString path = device_path_from_qstring(prop_to_qstring(pPropBag, L"DevicePath")); - if (!path.isNull()) - str += QStringLiteral(" [%1]").arg(path); + //if (!path.isNull()) + // str += QStringLiteral(" [%1]").arg(path); ret.push_back({ str, (int)ret.size() }); } pPropBag->Release(); diff --git a/gui/images/THgriddy.png b/gui/images/THgriddy.png Binary files differnew file mode 100644 index 00000000..c69ae632 --- /dev/null +++ b/gui/images/THgriddy.png diff --git a/gui/images/griddyNoLogo.png b/gui/images/griddyNoLogo.png Binary files differnew file mode 100644 index 00000000..83b844c0 --- /dev/null +++ b/gui/images/griddyNoLogo.png diff --git a/gui/images/griddyNoLogoWhite.png b/gui/images/griddyNoLogoWhite.png Binary files differnew file mode 100644 index 00000000..897e478f --- /dev/null +++ b/gui/images/griddyNoLogoWhite.png diff --git a/gui/images/griddyWhite.png b/gui/images/griddyWhite.png Binary files differnew file mode 100644 index 00000000..6cf4aea1 --- /dev/null +++ b/gui/images/griddyWhite.png diff --git a/gui/images/newcogicon.png b/gui/images/newcogicon.png Binary files differnew file mode 100644 index 00000000..f8da1a69 --- /dev/null +++ b/gui/images/newcogicon.png diff --git a/gui/images/newmapicon.png b/gui/images/newmapicon.png Binary files differnew file mode 100644 index 00000000..52163e69 --- /dev/null +++ b/gui/images/newmapicon.png diff --git a/gui/images/newsetticon.png b/gui/images/newsetticon.png Binary files differnew file mode 100644 index 00000000..935c1143 --- /dev/null +++ b/gui/images/newsetticon.png diff --git a/gui/images/opentrack.png b/gui/images/opentrack.png Binary files differindex 39359782..48cbe812 100644 --- a/gui/images/opentrack.png +++ b/gui/images/opentrack.png diff --git a/gui/images/trackingshape.png b/gui/images/trackingshape.png Binary files differnew file mode 100644 index 00000000..f8e5f26a --- /dev/null +++ b/gui/images/trackingshape.png diff --git a/gui/init.cpp b/gui/init.cpp index b54a085e..431ad04c 100644 --- a/gui/init.cpp +++ b/gui/init.cpp @@ -37,6 +37,9 @@ using namespace options; extern "C" __declspec(dllimport) unsigned __cdecl _controlfp(unsigned, unsigned); #endif +extern "C" OTR_GENERIC_EXPORT bool opentrack_using_dark_theme; +bool opentrack_using_dark_theme = false; + static void set_fp_mask() { #if defined OTR_ARCH_DENORM_DAZ @@ -188,6 +191,7 @@ static void apply_dark_windows_theme_if_needed() qApp->setPalette(darkPalette); qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + opentrack_using_dark_theme = true; } } @@ -345,4 +349,3 @@ int otr_main(int argc, char** argv, std::function<std::unique_ptr<QWidget>()> co return ret; } - diff --git a/gui/opentrack-res.qrc b/gui/opentrack-res.qrc index b4d7b4a5..987c7c55 100644 --- a/gui/opentrack-res.qrc +++ b/gui/opentrack-res.qrc @@ -1,12 +1,16 @@ <RCC> - <qresource prefix="/"> - <file>images/tools.png</file> - <file>images/settings16.png</file> - <file>images/curves.png</file> - <file>images/opentrack.png</file> - <file>images/no-feed.png</file> - <file>images/filter-16.png</file> - <file>images/tracking-not-started.png</file> - <file>images/english.png</file> - </qresource> + <qresource prefix="/"> + <file>images/newcogicon.png</file> + <file>images/newmapicon.png</file> + <file>images/newsetticon.png</file> + <file>images/THgriddy.png</file> + <file>images/tools.png</file> + <file>images/settings16.png</file> + <file>images/curves.png</file> + <file>images/opentrack.png</file> + <file>images/no-feed.png</file> + <file>images/filter-16.png</file> + <file>images/tracking-not-started.png</file> + <file>images/english.png</file> + </qresource> </RCC> diff --git a/installer/opentrack-installer.iss b/installer/opentrack-installer.iss index 7bb5ced1..01478557 100644 --- a/installer/opentrack-installer.iss +++ b/installer/opentrack-installer.iss @@ -2,17 +2,17 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #include "../build/opentrack-version.hxx" -#define MyAppName "opentrack" +#define MyAppName "TrackHat opentrack v3" #define MyAppVersion OPENTRACK_VERSION -#define MyAppPublisher "opentrack" -#define MyAppURL "http://github.com/opentrack/opentrack" +#define MyAppPublisher "TrackHat" +#define MyAppURL "https://www.trackhat.org/trackhat-opentrack" #define MyAppExeName "opentrack.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{63F53541-A29E-4B53-825A-9B6F876A2BD6} +AppId={{B12AD35E-8D24-4BC3-8F9B-72A19BD41326} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} @@ -49,6 +49,6 @@ Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] -Filename: "{app}\{#MyAppExeName}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; +Filename: "{app}\{#MyAppExeName}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; [Code] diff --git a/opentrack/defs.hpp b/opentrack/defs.hpp index b2f0c467..f7ccc197 100644 --- a/opentrack/defs.hpp +++ b/opentrack/defs.hpp @@ -1,16 +1,17 @@ #pragma once -//#define UI_FORCED_TRACKER "pt" -//#define UI_FORCED_FILTER "accela" +#define UI_FORCED_TRACKER "neuralnet" +#define UI_FORCED_FILTER "accela" -//#define UI_NO_TRACKER_COMBOBOX -//#define UI_NO_FILTER_COMBOBOX +#define UI_NO_TRACKER_COMBOBOX +#define UI_NO_FILTER_COMBOBOX -//#define UI_NO_TRACKER_SETTINGS_BUTTON -//#define UI_NO_FILTER_SETTINGS_BUTTON +#define UI_NO_TRACKER_SETTINGS_BUTTON +#define UI_NO_FILTER_SETTINGS_BUTTON -//#define UI_NO_RAW_DATA -//#define UI_NO_GAME_DATA +#define UI_NO_RAW_DATA +#define UI_NO_GAME_DATA //#define UI_NO_VIDEO_FEED +#define UI_COMPACT_VIDEO_FEED //define UI_ACCELA_OLD_STAIRCASE diff --git a/opentrack/lang/nl_NL.ts b/opentrack/lang/nl_NL.ts index 7a465820..aad3532b 100644 --- a/opentrack/lang/nl_NL.ts +++ b/opentrack/lang/nl_NL.ts @@ -13,39 +13,34 @@ </message> </context> <context> - <name>main_window</name> - <message> - <source>Raw tracker data</source> - <translation type="unfinished"></translation> - </message> + <name>UpdateDialog</name> <message> - <source>Z</source> + <source>Dialog</source> <translation type="unfinished"></translation> </message> <message> - <source>Pitch</source> + <source>Software update released</source> <translation type="unfinished"></translation> </message> <message> - <source>Y</source> + <source>Current version:</source> <translation type="unfinished"></translation> </message> <message> - <source>X</source> + <source>TextLabel</source> <translation type="unfinished"></translation> </message> <message> - <source>Roll</source> + <source>Released version:</source> <translation type="unfinished"></translation> </message> <message> - <source>Yaw</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Game data</source> + <source>Don't remind me again about this version</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>main_window</name> <message> <source>Profile</source> <translation type="unfinished"></translation> @@ -71,22 +66,10 @@ <translation type="unfinished"></translation> </message> <message> - <source>Input</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>🔨</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Output</source> <translation type="unfinished"></translation> </message> <message> - <source>Filter</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Running as root is bad</source> <translation type="unfinished"></translation> </message> @@ -174,6 +157,10 @@ Exiting now.</source> <source>Don't run as root to remove these annoying messages.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Preview</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>new_file_dialog</name> diff --git a/opentrack/lang/ru_RU.ts b/opentrack/lang/ru_RU.ts index 684a8212..3a0cad0d 100644 --- a/opentrack/lang/ru_RU.ts +++ b/opentrack/lang/ru_RU.ts @@ -13,6 +13,33 @@ </message> </context> <context> + <name>UpdateDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Software update released</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Current version:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>TextLabel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Released version:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Don't remind me again about this version</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>main_window</name> <message> <source>Create new empty config</source> @@ -87,38 +114,6 @@ Exiting now.</source> <translation> :: </translation> </message> <message> - <source>Raw tracker data</source> - <translation>Исходные данные</translation> - </message> - <message> - <source>Z</source> - <translation>Z</translation> - </message> - <message> - <source>Pitch</source> - <translation>Pitch</translation> - </message> - <message> - <source>Y</source> - <translation>Y</translation> - </message> - <message> - <source>X</source> - <translation>X</translation> - </message> - <message> - <source>Roll</source> - <translation>Roll</translation> - </message> - <message> - <source>Yaw</source> - <translation>Yaw</translation> - </message> - <message> - <source>Game data</source> - <translation>Игровые данные</translation> - </message> - <message> <source>Profile</source> <translation>Профиль</translation> </message> @@ -139,22 +134,10 @@ Exiting now.</source> <translation>Остановить</translation> </message> <message> - <source>Input</source> - <translation>Источник данных</translation> - </message> - <message> - <source>🔨</source> - <translation></translation> - </message> - <message> <source>Output</source> <translation>Выходной интерфейс</translation> </message> <message> - <source>Filter</source> - <translation>Фильтрация/сглаживание</translation> - </message> - <message> <source>Running as root is bad</source> <translation type="unfinished"></translation> </message> @@ -178,6 +161,10 @@ Exiting now.</source> <source>Don't run as root to remove these annoying messages.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Preview</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>new_file_dialog</name> diff --git a/opentrack/lang/stub.ts b/opentrack/lang/stub.ts index 04555dd0..de72e075 100644 --- a/opentrack/lang/stub.ts +++ b/opentrack/lang/stub.ts @@ -13,39 +13,34 @@ </message> </context> <context> - <name>main_window</name> - <message> - <source>Raw tracker data</source> - <translation type="unfinished"></translation> - </message> + <name>UpdateDialog</name> <message> - <source>Z</source> + <source>Dialog</source> <translation type="unfinished"></translation> </message> <message> - <source>Pitch</source> + <source>Software update released</source> <translation type="unfinished"></translation> </message> <message> - <source>Y</source> + <source>Current version:</source> <translation type="unfinished"></translation> </message> <message> - <source>X</source> + <source>TextLabel</source> <translation type="unfinished"></translation> </message> <message> - <source>Roll</source> + <source>Released version:</source> <translation type="unfinished"></translation> </message> <message> - <source>Yaw</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Game data</source> + <source>Don't remind me again about this version</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>main_window</name> <message> <source>Profile</source> <translation type="unfinished"></translation> @@ -71,22 +66,10 @@ <translation type="unfinished"></translation> </message> <message> - <source>Input</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>🔨</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Output</source> <translation type="unfinished"></translation> </message> <message> - <source>Filter</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Running as root is bad</source> <translation type="unfinished"></translation> </message> @@ -174,6 +157,10 @@ Exiting now.</source> <source>Don't run as root to remove these annoying messages.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Preview</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>new_file_dialog</name> diff --git a/opentrack/lang/zh_CN.ts b/opentrack/lang/zh_CN.ts index 15609d70..bdd69ff8 100644 --- a/opentrack/lang/zh_CN.ts +++ b/opentrack/lang/zh_CN.ts @@ -13,39 +13,34 @@ </message> </context> <context> - <name>main_window</name> - <message> - <source>Raw tracker data</source> - <translation>跟踪器原始数据</translation> - </message> - <message> - <source>Z</source> - <translation></translation> - </message> + <name>UpdateDialog</name> <message> - <source>Pitch</source> - <translation>仰俯</translation> + <source>Dialog</source> + <translation type="unfinished"></translation> </message> <message> - <source>Y</source> - <translation></translation> + <source>Software update released</source> + <translation type="unfinished"></translation> </message> <message> - <source>X</source> - <translation></translation> + <source>Current version:</source> + <translation type="unfinished"></translation> </message> <message> - <source>Roll</source> - <translation>横滚</translation> + <source>TextLabel</source> + <translation type="unfinished"></translation> </message> <message> - <source>Yaw</source> - <translation>偏航</translation> + <source>Released version:</source> + <translation type="unfinished"></translation> </message> <message> - <source>Game data</source> - <translation>游戏得到的数据</translation> + <source>Don't remind me again about this version</source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>main_window</name> <message> <source>Profile</source> <translation>配置文件</translation> @@ -71,22 +66,10 @@ <translation>停止</translation> </message> <message> - <source>Input</source> - <translation>输入</translation> - </message> - <message> - <source>🔨</source> - <translation></translation> - </message> - <message> <source>Output</source> <translation>输出</translation> </message> <message> - <source>Filter</source> - <translation>过滤器</translation> - </message> - <message> <source>Running as root is bad</source> <translation>以管理员运行不是什么好主意</translation> </message> @@ -178,6 +161,10 @@ Exiting now.</source> <source> :: </source> <translation></translation> </message> + <message> + <source>Preview</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>new_file_dialog</name> diff --git a/opentrack/main-window.hpp b/opentrack/main-window.hpp index 1dcbd0eb..c0724a35 100644 --- a/opentrack/main-window.hpp +++ b/opentrack/main-window.hpp @@ -35,6 +35,8 @@ #include "ui_main-window.h" +class update_query; + class main_window final : public QMainWindow, private State { Q_DECLARE_TR_FUNCTIONS(main_window) @@ -84,6 +86,8 @@ class main_window final : public QMainWindow, private State qt_signal<void> toggle_tracker { this, &main_window::toggle_tracker_, Qt::QueuedConnection }; qt_signal<void> restart_tracker { this, &main_window::restart_tracker_, Qt::QueuedConnection }; + std::unique_ptr<update_query> updater; + public: void init_dylibs(); void init_tray_menu(); @@ -118,6 +122,9 @@ public: void show_pose(); void show_pose_(const double* mapped, const double* raw); void set_title(const QString& game_title = QString()); +#ifdef UI_COMPACT_VIDEO_FEED + void toggle_video_preview(bool value); +#endif void start_tracker_(); void stop_tracker_(); diff --git a/opentrack/main-window.ui b/opentrack/main-window.ui index 32c9f57a..2452acd1 100644 --- a/opentrack/main-window.ui +++ b/opentrack/main-window.ui @@ -7,8 +7,8 @@ <rect> <x>0</x> <y>0</y> - <width>655</width> - <height>502</height> + <width>320</width> + <height>416</height> </rect> </property> <property name="sizePolicy"> @@ -17,12 +17,6 @@ <verstretch>0</verstretch> </sizepolicy> </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>500</height> - </size> - </property> <property name="windowIcon"> <iconset resource="../gui/opentrack-res.qrc"> <normaloff>:/images/opentrack.png</normaloff>:/images/opentrack.png</iconset> @@ -38,7 +32,7 @@ <verstretch>0</verstretch> </sizepolicy> </property> - <layout class="QGridLayout" name="gridLayout_2"> + <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> <number>0</number> </property> @@ -46,13 +40,13 @@ <number>0</number> </property> <property name="rightMargin"> - <number>9</number> + <number>0</number> </property> <property name="bottomMargin"> - <number>9</number> + <number>0</number> </property> - <item row="0" column="0"> - <widget class="QFrame" name="video_feed"> + <item alignment="Qt::AlignHCenter|Qt::AlignVCenter"> + <widget class="QWidget" name="frame_parent" native="true"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> @@ -65,16 +59,7 @@ <height>240</height> </size> </property> - <property name="maximumSize"> - <size> - <width>320</width> - <height>240</height> - </size> - </property> - <property name="lineWidth"> - <number>0</number> - </property> - <widget class="QFrame" name="video_frame"> + <widget class="pose_widget" name="pose_display" native="true"> <property name="geometry"> <rect> <x>0</x> @@ -89,19 +74,29 @@ <verstretch>0</verstretch> </sizepolicy> </property> - <property name="minimumSize"> - <size> + </widget> + <widget class="QWidget" name="video_frame_parent" native="true"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> <width>320</width> <height>240</height> - </size> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="maximumSize"> + <property name="minimumSize"> <size> <width>320</width> <height>240</height> </size> </property> - <widget class="QLabel" name="video_frame_label"> + <widget class="QFrame" name="video_frame"> <property name="geometry"> <rect> <x>0</x> @@ -116,884 +111,246 @@ <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="font"> - <font> - <family>Candara</family> - <pointsize>37</pointsize> - <weight>50</weight> - <bold>false</bold> - <kerning>true</kerning> - </font> - </property> - <property name="text"> - <string/> - </property> - <property name="pixmap"> - <pixmap resource="../gui/opentrack-res.qrc">:/images/tracking-not-started.png</pixmap> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap"> - <bool>true</bool> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> </property> </widget> </widget> + <widget class="QCheckBox" name="preview_checkbox"> + <property name="geometry"> + <rect> + <x>250</x> + <y>220</y> + <width>67</width> + <height>18</height> + </rect> + </property> + <property name="text"> + <string>Preview</string> + </property> + </widget> + <zorder>video_frame_parent</zorder> + <zorder>pose_display</zorder> + <zorder>preview_checkbox</zorder> </widget> </item> - <item row="0" column="1"> - <widget class="pose_widget" name="pose_display" native="true"> + <item> + <widget class="QWidget" name="widget" native="true"> <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="minimumSize"> - <size> - <width>320</width> - <height>240</height> - </size> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QGroupBox" name="box_raw_headpose"> - <property name="minimumSize"> - <size> - <width>316</width> - <height>0</height> - </size> - </property> - <property name="title"> - <string>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> + <layout class="QGridLayout" name="gridLayout"> <property name="bottomMargin"> <number>0</number> </property> - <property name="spacing"> - <number>0</number> + <property name="horizontalSpacing"> + <number>9</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="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="0"> - <widget class="QLabel" name="lblZ_4"> - <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>Z</string> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QLabel" name="lblRotY_4"> - <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="1" column="3"> - <widget class="QLCDNumber" name="raw_pitch"> - <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="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="0"> - <widget class="QLabel" name="lblY_4"> - <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>Y</string> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="lblX_4"> - <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>X</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="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="2"> - <widget class="QLabel" name="lblRotZ_4"> - <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_4"> + <widget class="QPushButton" name="btnShortcuts"> <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <sizepolicy hsizetype="Minimum" 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="1" column="1"> - <widget class="QLCDNumber" name="raw_y"> - <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="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="3"> - <widget class="QLCDNumber" name="raw_roll"> - <property name="enabled"> - <bool>true</bool> + <string>Options</string> </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="raw_z"> - <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="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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> - </layout> - </widget> - </item> - <item row="1" column="1"> - <widget class="QGroupBox" name="box_mapped_headpose"> - <property name="minimumSize"> - <size> - <width>316</width> - <height>0</height> - </size> - </property> - <property name="title"> - <string>Game data</string> - </property> - <layout class="QGridLayout" name="gridLayout_14"> - <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="1" column="3"> - <widget class="QLCDNumber" name="pose_pitch"> - <property name="enabled"> - <bool>true</bool> + <property name="icon"> + <iconset resource="../gui/opentrack-res.qrc"> + <normaloff>:/images/newcogicon.png</normaloff>:/images/newcogicon.png</iconset> </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="iconSize"> + <size> + <width>80</width> + <height>24</height> + </size> </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>X</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>Y</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="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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>Z</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="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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="3"> - <widget class="QLCDNumber" name="pose_roll"> - <property name="enabled"> - <bool>true</bool> - </property> + <widget class="QGroupBox" name="groupProto"> <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="font"> - <font> - <stylestrategy>NoAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </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> - </layout> - </widget> - </item> - <item row="2" column="1"> - <widget class="QWidget" name="groupControls" native="true"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> - <horstretch>4</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>315</width> - <height>0</height> - </size> - </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="spacing"> - <number>4</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="QWidget" name="groupProfile" native="true"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="title"> + <string>Output</string> </property> <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="spacing"> - <number>0</number> - </property> <property name="leftMargin"> <number>4</number> </property> <property name="topMargin"> - <number>0</number> + <number>4</number> </property> <property name="rightMargin"> <number>4</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>6</number> </property> <item> - <widget class="QToolButton" name="profile_button"> - <property name="enabled"> - <bool>true</bool> - </property> + <widget class="QComboBox" name="iconcomboProtocol"> <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> - <property name="text"> - <string>Profile</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> + <enum>Qt::TabFocus</enum> </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - <property name="arrowType"> - <enum>Qt::DownArrow</enum> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum> </property> </widget> </item> <item> - <widget class="QComboBox" name="iconcomboProfile"> + <widget class="QToolButton" name="btnShowServerControls"> + <property name="enabled"> + <bool>true</bool> + </property> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="minimumSize"> - <size> - <width>245</width> - <height>0</height> - </size> + <property name="font"> + <font> + <family>DejaVu Sans</family> + <stylestrategy>PreferAntialias</stylestrategy> + <kerning>false</kerning> + </font> </property> <property name="focusPolicy"> <enum>Qt::StrongFocus</enum> </property> - <property name="maxVisibleItems"> - <number>20</number> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../gui/opentrack-res.qrc"> + <normaloff>:/images/newsetticon.png</normaloff>:/images/newsetticon.png</iconset> + </property> + <property name="flat" stdset="0"> + <bool>false</bool> </property> </widget> </item> </layout> </widget> </item> - <item> - <widget class="QWidget" name="groupOptions" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_2"> + <item row="0" column="1"> + <widget class="QGroupBox" name="groupProfile"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Profile</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_3"> <property name="leftMargin"> <number>4</number> </property> <property name="topMargin"> - <number>0</number> + <number>4</number> </property> <property name="rightMargin"> <number>4</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>6</number> </property> <item> - <widget class="QPushButton" name="btnShortcuts"> + <widget class="QToolButton" name="profile_button"> + <property name="enabled"> + <bool>true</bool> + </property> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Minimum"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> + <property name="focusPolicy"> + <enum>Qt::StrongFocus</enum> + </property> <property name="text"> - <string>Options</string> + <string/> </property> - <property name="icon"> - <iconset resource="../gui/opentrack-res.qrc"> - <normaloff>:/images/tools.png</normaloff>:/images/tools.png</iconset> + <property name="popupMode"> + <enum>QToolButton::InstantPopup</enum> </property> - <property name="iconSize"> - <size> - <width>80</width> - <height>24</height> - </size> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonIconOnly</enum> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="arrowType"> + <enum>Qt::DownArrow</enum> </property> </widget> </item> <item> - <widget class="QPushButton" name="btnEditCurves"> + <widget class="QComboBox" name="iconcomboProfile"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Minimum"> - <horstretch>0</horstretch> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Maximum"> + <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Mapping</string> - </property> - <property name="icon"> - <iconset resource="../gui/opentrack-res.qrc"> - <normaloff>:/images/curves.png</normaloff>:/images/curves.png</iconset> + <property name="focusPolicy"> + <enum>Qt::StrongFocus</enum> </property> - <property name="iconSize"> - <size> - <width>80</width> - <height>24</height> - </size> + <property name="maxVisibleItems"> + <number>20</number> </property> </widget> </item> </layout> </widget> </item> + <item row="1" column="1"> + <widget class="QPushButton" name="btnEditCurves"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Mapping</string> + </property> + <property name="icon"> + <iconset resource="../gui/opentrack-res.qrc"> + <normaloff>:/images/newmapicon.png</normaloff>:/images/newmapicon.png</iconset> + </property> + <property name="iconSize"> + <size> + <width>80</width> + <height>24</height> + </size> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QWidget" name="widget_2" native="true"> + <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QGroupBox" name="groupStartStop"> <property name="sizePolicy"> @@ -1002,16 +359,10 @@ <verstretch>0</verstretch> </sizepolicy> </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> <property name="title"> <string>Tracking</string> </property> - <layout class="QHBoxLayout" name="horizontalLayout_4"> + <layout class="QHBoxLayout" name="horizontalLayout_5"> <property name="spacing"> <number>7</number> </property> @@ -1019,13 +370,13 @@ <number>4</number> </property> <property name="topMargin"> - <number>4</number> + <number>3</number> </property> <property name="rightMargin"> <number>4</number> </property> <property name="bottomMargin"> - <number>4</number> + <number>0</number> </property> <item> <widget class="QToolButton" name="btnStartTracker"> @@ -1086,246 +437,6 @@ </layout> </widget> </item> - <item row="2" column="0"> - <widget class="QWidget" name="modules" native="true"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>310</width> - <height>0</height> - </size> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>4</number> - </property> - <property name="leftMargin"> - <number>4</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="QGroupBox" name="groupTracker"> - <property name="title"> - <string>Input</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <property name="leftMargin"> - <number>4</number> - </property> - <property name="topMargin"> - <number>4</number> - </property> - <property name="rightMargin"> - <number>4</number> - </property> - <property name="bottomMargin"> - <number>4</number> - </property> - <property name="horizontalSpacing"> - <number>6</number> - </property> - <property name="verticalSpacing"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QComboBox" name="iconcomboTrackerSource"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::TabFocus</enum> - </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="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <family>DejaVu Sans</family> - <stylestrategy>PreferAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </property> - <property name="focusPolicy"> - <enum>Qt::ClickFocus</enum> - </property> - <property name="text"> - <string>🔨</string> - </property> - <property name="flat" stdset="0"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupProto"> - <property name="title"> - <string>Output</string> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <property name="leftMargin"> - <number>4</number> - </property> - <property name="topMargin"> - <number>4</number> - </property> - <property name="rightMargin"> - <number>4</number> - </property> - <property name="bottomMargin"> - <number>4</number> - </property> - <property name="horizontalSpacing"> - <number>6</number> - </property> - <property name="verticalSpacing"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QComboBox" name="iconcomboProtocol"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::TabFocus</enum> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QToolButton" name="btnShowServerControls"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <family>DejaVu Sans</family> - <stylestrategy>PreferAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </property> - <property name="focusPolicy"> - <enum>Qt::ClickFocus</enum> - </property> - <property name="text"> - <string>🔨</string> - </property> - <property name="flat" stdset="0"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupFilter"> - <property name="title"> - <string>Filter</string> - </property> - <layout class="QGridLayout" name="gridLayout_3"> - <property name="leftMargin"> - <number>4</number> - </property> - <property name="topMargin"> - <number>4</number> - </property> - <property name="rightMargin"> - <number>4</number> - </property> - <property name="bottomMargin"> - <number>4</number> - </property> - <property name="horizontalSpacing"> - <number>6</number> - </property> - <property name="verticalSpacing"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QComboBox" name="iconcomboFilter"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::TabFocus</enum> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QToolButton" name="btnShowFilterControls"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <family>DejaVu Sans</family> - <stylestrategy>PreferAntialias</stylestrategy> - <kerning>false</kerning> - </font> - </property> - <property name="focusPolicy"> - <enum>Qt::ClickFocus</enum> - </property> - <property name="text"> - <string>🔨</string> - </property> - <property name="flat" stdset="0"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - </item> </layout> </widget> </widget> @@ -1336,6 +447,17 @@ <header>pose-widget/pose-widget.hpp</header> </customwidget> </customwidgets> + <tabstops> + <tabstop>btnStartTracker</tabstop> + <tabstop>btnStopTracker</tabstop> + <tabstop>btnShortcuts</tabstop> + <tabstop>btnEditCurves</tabstop> + <tabstop>iconcomboProtocol</tabstop> + <tabstop>btnShowServerControls</tabstop> + <tabstop>profile_button</tabstop> + <tabstop>iconcomboProfile</tabstop> + <tabstop>preview_checkbox</tabstop> + </tabstops> <resources> <include location="../gui/opentrack-res.qrc"/> </resources> diff --git a/opentrack/opentrack.ico b/opentrack/opentrack.ico Binary files differindex 5cac8da1..b5f34db3 100644 --- a/opentrack/opentrack.ico +++ b/opentrack/opentrack.ico diff --git a/opentrack/software-update-dialog.cpp b/opentrack/software-update-dialog.cpp new file mode 100644 index 00000000..778814c3 --- /dev/null +++ b/opentrack/software-update-dialog.cpp @@ -0,0 +1,66 @@ +#include "software-update-dialog.hpp" +#include "opentrack-org.hxx" + +update_dialog::update_dialog(QWidget* parent, update_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='https://www.trackhat.org/trackhat-opentrack'>" + new_version + "</a>"); + ui.ver_new->setOpenExternalLinks(true); + connect(ui.buttonBox, &QDialogButtonBox::clicked, this, &update_dialog::close); +} + +void update_query::on_finished() +{ + if (!t.isActive()) + return; + t.stop(); + if (r->error() != QNetworkReply::NoError) + { + qDebug() << "updater: error" << r->error() << r->errorString(); + return; + } + QString str(buf); + QRegExp re("SOFTWARE-UPDATE-V3: ([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() << "updater: new version" << str; + update_dialog dlg(qobject_cast<QWidget*>(parent()), *this, str); + dlg.show(); + dlg.raise(); + dlg.exec(); + if (dlg.ui.disable_reminder->isChecked()) + s.setValue("quiet-update-version", str); + } + } + else + { + if (buf.isEmpty()) + qDebug() << "updater: empty response"; + else + qDebug() << "updater: can't parse response"; + } + buf.clear(); + r->deleteLater(); +} + +void update_query::maybe_show_dialog() +{ + t.stop(); + t.setSingleShot(true); + t.start(1000 * 10); + + r = qnam.get(QNetworkRequest(QStringLiteral("https://www.trackhat.org/thotv3-version"))); + + QObject::connect(r, &QIODevice::readyRead, this, &update_query::on_ready); + QObject::connect(r, &QNetworkReply::finished, this, &update_query::on_finished); +} diff --git a/opentrack/software-update-dialog.hpp b/opentrack/software-update-dialog.hpp new file mode 100644 index 00000000..1e150e62 --- /dev/null +++ b/opentrack/software-update-dialog.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include <QtNetwork> +#include <QDialog> +#include <QTimer> +#include "ui_software-update.h" + +extern "C" const char* const opentrack_version; + +class update_query final : public QObject +{ + Q_OBJECT +public: + explicit update_query(QWidget* parent) : QObject{parent} {} + + QNetworkReply* r = nullptr; + QNetworkAccessManager qnam{this}; + QByteArray buf; + QTimer t{this}; + + void on_finished(); + void on_ready() { buf.append(r->readAll()); } + void maybe_show_dialog(); +}; + +class update_dialog : QDialog +{ + Q_OBJECT + friend class update_query; +private: + Ui::UpdateDialog ui; + update_query& q; + update_dialog(QWidget* parent, update_query& q, const QString& new_version); +}; diff --git a/opentrack/software-update.ui b/opentrack/software-update.ui new file mode 100644 index 00000000..07edf66c --- /dev/null +++ b/opentrack/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/pose-widget/images/grid-dark.png b/pose-widget/images/grid-dark.png Binary files differnew file mode 100644 index 00000000..8665fc30 --- /dev/null +++ b/pose-widget/images/grid-dark.png diff --git a/pose-widget/images/grid-light.png b/pose-widget/images/grid-light.png Binary files differnew file mode 100644 index 00000000..83b844c0 --- /dev/null +++ b/pose-widget/images/grid-light.png diff --git a/pose-widget/images/side1.png b/pose-widget/images/side1.png Binary files differindex 2955bc01..f8e5f26a 100644 --- a/pose-widget/images/side1.png +++ b/pose-widget/images/side1.png diff --git a/pose-widget/images/side6.png b/pose-widget/images/side6.png Binary files differindex 3bae0e50..d60c4acd 100644 --- a/pose-widget/images/side6.png +++ b/pose-widget/images/side6.png diff --git a/pose-widget/pose-widget.cpp b/pose-widget/pose-widget.cpp index ac3aa74a..51d86609 100644 --- a/pose-widget/pose-widget.cpp +++ b/pose-widget/pose-widget.cpp @@ -8,6 +8,7 @@ #include "pose-widget.hpp" #include "compat/check-visible.hpp" #include "compat/math.hpp" +#include "opentrack/defs.hpp" #include <QPainter> #include <QtEvents> @@ -21,6 +22,7 @@ namespace pose_widget_impl { pose_widget::pose_widget(QWidget* parent) : QWidget(parent) { QPainter p; + p.setRenderHint(QPainter::SmoothPixmapTransform); #ifdef TEST //draw rectangle frame around of Octopus, only if TEST defined p.begin(&front); @@ -38,17 +40,29 @@ pose_widget::pose_widget(QWidget* parent) : QWidget(parent) shine.fill(QColor(255,255,255)); p.begin(&shine); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); - p.drawImage(QPointF(0,0), front); + p.drawImage(QPointF(0,0), front); p.end(); //draw Octopus shadow shadow.fill(QColor(0,0,0)); p.begin(&shadow); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); - p.drawImage(QPointF(0,0), front); + p.drawImage(QPointF(0,0), front); p.end(); mirror.setFocusPolicy(Qt::NoFocus); + +#ifdef UI_COMPACT_VIDEO_FEED + mirror.setVisible(false); +#endif +} + +void pose_widget::set_grid_background(bool dark_theme) +{ + if (dark_theme) + background = QImage(":/images/grid-dark.png"); + else + background = QImage(":/images/grid-light.png"); } void pose_widget::present(double yaw, double pitch, double roll, double x, double y, double z) @@ -89,6 +103,8 @@ void pose_widget::paintEvent(QPaintEvent*) { p.fillRect(rect(), palette().brush(backgroundRole())); + if (!background.isNull()) + p.drawImage(rect(), background); // draw axes p.save(); p.setPen(QPen(Qt::gray, 1, Qt::SolidLine)); diff --git a/pose-widget/pose-widget.hpp b/pose-widget/pose-widget.hpp index 9152e960..53ecc644 100644 --- a/pose-widget/pose-widget.hpp +++ b/pose-widget/pose-widget.hpp @@ -27,6 +27,7 @@ public: explicit pose_widget(QWidget *parent = nullptr); void present(double xAngle, double yAngle, double zAngle, double x, double y, double z); QCheckBox mirror{"Mirror", this}; + void set_grid_background(bool dark_theme); private: void resizeEvent(QResizeEvent *event) override; void paintEvent(QPaintEvent*) override; @@ -35,6 +36,8 @@ private: QImage front{QImage{":/images/side1.png"}.convertToFormat(QImage::Format_ARGB32)}; QImage back {QImage{":/images/side6.png"}.convertToFormat(QImage::Format_ARGB32) .mirrored(true,false)}; + QImage background; + QImage shine {QImage{front.width(), front.height(), QImage::Format_ARGB32}}; QImage shadow{QImage{front.width(), front.height(), QImage::Format_ARGB32}}; }; diff --git a/pose-widget/posewidget.qrc b/pose-widget/posewidget.qrc index e799432f..636151e0 100644 --- a/pose-widget/posewidget.qrc +++ b/pose-widget/posewidget.qrc @@ -2,5 +2,7 @@ <qresource prefix="/"> <file>images/side1.png</file> <file>images/side6.png</file> + <file>images/grid-light.png</file> + <file>images/grid-dark.png</file> </qresource> </RCC> diff --git a/proto-ft/ftnoir_protocol_ft.h b/proto-ft/ftnoir_protocol_ft.h index a07747d9..6ac1619f 100644 --- a/proto-ft/ftnoir_protocol_ft.h +++ b/proto-ft/ftnoir_protocol_ft.h @@ -86,6 +86,6 @@ class freetrackDll : public Metadata Q_OBJECT public: - QString name() { return tr("freetrack 2.0 Enhanced"); } + QString name() { return tr("freetrack"); } QIcon icon() { return QIcon(":/images/freetrack.png"); } }; diff --git a/proto-ft/lang/nl_NL.ts b/proto-ft/lang/nl_NL.ts index c8603973..9128805a 100644 --- a/proto-ft/lang/nl_NL.ts +++ b/proto-ft/lang/nl_NL.ts @@ -99,7 +99,7 @@ Starting tracking will again overwrite the DLL locations.</source> <context> <name>freetrackDll</name> <message> - <source>freetrack 2.0 Enhanced</source> + <source>freetrack</source> <translation type="unfinished"></translation> </message> </context> diff --git a/proto-ft/lang/ru_RU.ts b/proto-ft/lang/ru_RU.ts index a6433fd5..0a40fc3c 100644 --- a/proto-ft/lang/ru_RU.ts +++ b/proto-ft/lang/ru_RU.ts @@ -101,7 +101,7 @@ Starting tracking will again overwrite the DLL locations.</source> <context> <name>freetrackDll</name> <message> - <source>freetrack 2.0 Enhanced</source> + <source>freetrack</source> <translation type="unfinished"></translation> </message> </context> diff --git a/proto-ft/lang/stub.ts b/proto-ft/lang/stub.ts index ac88d895..5de7b5bf 100644 --- a/proto-ft/lang/stub.ts +++ b/proto-ft/lang/stub.ts @@ -99,7 +99,7 @@ Starting tracking will again overwrite the DLL locations.</source> <context> <name>freetrackDll</name> <message> - <source>freetrack 2.0 Enhanced</source> + <source>freetrack</source> <translation type="unfinished"></translation> </message> </context> diff --git a/proto-ft/lang/zh_CN.ts b/proto-ft/lang/zh_CN.ts index 7706d27c..e7db98a1 100644 --- a/proto-ft/lang/zh_CN.ts +++ b/proto-ft/lang/zh_CN.ts @@ -99,7 +99,7 @@ Starting tracking will again overwrite the DLL locations.</source> <context> <name>freetrackDll</name> <message> - <source>freetrack 2.0 Enhanced</source> + <source>freetrack</source> <translation type="unfinished"></translation> </message> </context> diff --git a/todo.md b/todo.md new file mode 100644 index 00000000..ff82bf04 --- /dev/null +++ b/todo.md @@ -0,0 +1,22 @@ +### todo + +- [x] set default exposure and gain for the v2 sensor +- [x] barf on v2 sensor not found +- [x] add .ini +- [x] change the logo +- [x] add the pose widget background + +### time + +- 32 hours for the v1 sensor +- 2023-01-05: 2 hours doing the UI +- 2023-01-16: 1.5 hours adding video preview +- 2023-01-20: 1 hour fixing the preview bug +- 2023-01-20: .5 hours doing the last few tweaks +- 2023-01-23: 1 hour exposure presets +- 2023-01-26: .5 hours add pose widget grid lines +- 2023-01-27: .5 hours update exposure while tracking +- 2023-02-01: 1 hour fixing dumb camera exposure bug +- 2023-02-27: 1 hour adding back non-trackhat camera support +- 2023-02-27: .5 hours adding back the updater & git version +- 2023-02-27: .5 hours expose only a subset of all nn options diff --git a/tracker-neuralnet/ftnoir_tracker_neuralnet.h b/tracker-neuralnet/ftnoir_tracker_neuralnet.h index 3548335e..d44a9953 100644 --- a/tracker-neuralnet/ftnoir_tracker_neuralnet.h +++ b/tracker-neuralnet/ftnoir_tracker_neuralnet.h @@ -20,6 +20,7 @@ #include "compat/timer.hpp" #include "video/camera.hpp" #include "cv/affine.hpp" +#include "video-opencv/settings.hpp" #include <QObject> #include <QThread> @@ -31,6 +32,7 @@ #include <memory> #include <cinttypes> #include <array> +#include <optional> #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> @@ -151,7 +153,7 @@ private: QMutex mtx_ = {}; // Protects the pose std::optional<QuatPose> last_pose_ = {}; - Affine last_pose_affine_ = {}; + std::optional<Affine> last_pose_affine_ = {}; Preview preview_; std::unique_ptr<cv_video_widget> video_widget_; @@ -175,6 +177,8 @@ private: Ui::Form ui_; Settings settings_; + dshow_camera_settings cs_; + // Calibration code mostly taken from point tracker QTimer calib_timer_; TranslationCalibrator trans_calib_; diff --git a/tracker-neuralnet/lang/nl_NL.ts b/tracker-neuralnet/lang/nl_NL.ts index dbcd3c8c..52a7c174 100644 --- a/tracker-neuralnet/lang/nl_NL.ts +++ b/tracker-neuralnet/lang/nl_NL.ts @@ -8,26 +8,10 @@ <translation>Tracker-instellingen</translation> </message> <message> - <source>Frames per second</source> - <translation>Frames per seconde</translation> - </message> - <message> - <source>Camera name</source> - <translation>Cameranaam</translation> - </message> - <message> - <source>Diagonal FOV</source> - <translation>Diagonale FOV</translation> - </message> - <message> <source>Camera settings</source> <translation>Camera-instellingen</translation> </message> <message> - <source>Camera Configuration</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Head Center Offset</source> <translation type="unfinished"></translation> </message> @@ -57,11 +41,11 @@ Don't roll or change position.</source> <translation type="unfinished"></translation> </message> <message> - <source>Show Network Input</source> + <source>Exposure preset</source> <translation type="unfinished"></translation> </message> <message> - <source>MJPEG</source> + <source>Camera Configuration</source> <translation type="unfinished"></translation> </message> <message> @@ -69,47 +53,39 @@ Don't roll or change position.</source> <translation type="unfinished"></translation> </message> <message> - <source>ROI Smoothing Alpha</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>ROI Zoom</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Thread Count</source> + <source>Number of threads. Can be used to balance the CPU load between the game and the tracker.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resolution</source> + <source>ROI Smoothing Alpha</source> <translation type="unfinished"></translation> </message> <message> - <source>Field of view. Needed to transform the pose to world coordinates.</source> + <source>ROI Zoom</source> <translation type="unfinished"></translation> </message> <message> - <source>Requested video frame rate. Actual setting may not be supported by the camera.</source> + <source>Show the image patch that the pose estimation model sees.</source> <translation type="unfinished"></translation> </message> <message> - <source>The requested resolution for cases where the camera delivers maximum frame rate only for a particular resolution. The image may still be downscaled to the internal resolution.</source> + <source>Show Network Input</source> <translation type="unfinished"></translation> </message> <message> - <source>Number of threads. Can be used to balance the CPU load between the game and the tracker.</source> + <source>Amount of smoothing of the face region coordinates. Can help stabilize the pose.</source> <translation type="unfinished"></translation> </message> <message> - <source>Show the image patch that the pose estimation model sees.</source> + <source>Thread Count</source> <translation type="unfinished"></translation> </message> <message> - <source>Amount of smoothing of the face region coordinates. Can help stabilize the pose.</source> + <source>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</source> <translation type="unfinished"></translation> </message> <message> - <source>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</source> + <source>Camera override</source> <translation type="unfinished"></translation> </message> </context> diff --git a/tracker-neuralnet/lang/stub.ts b/tracker-neuralnet/lang/stub.ts index 4cde86a9..5936d630 100644 --- a/tracker-neuralnet/lang/stub.ts +++ b/tracker-neuralnet/lang/stub.ts @@ -8,26 +8,10 @@ <translation type="unfinished"></translation> </message> <message> - <source>Diagonal FOV</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Camera settings</source> <translation type="unfinished"></translation> </message> <message> - <source>Frames per second</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Camera name</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Camera Configuration</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Head Center Offset</source> <translation type="unfinished"></translation> </message> @@ -57,11 +41,11 @@ Don't roll or change position.</source> <translation type="unfinished"></translation> </message> <message> - <source>Show Network Input</source> + <source>Exposure preset</source> <translation type="unfinished"></translation> </message> <message> - <source>MJPEG</source> + <source>Camera Configuration</source> <translation type="unfinished"></translation> </message> <message> @@ -69,47 +53,39 @@ Don't roll or change position.</source> <translation type="unfinished"></translation> </message> <message> - <source>ROI Smoothing Alpha</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>ROI Zoom</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Thread Count</source> + <source>Number of threads. Can be used to balance the CPU load between the game and the tracker.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resolution</source> + <source>ROI Smoothing Alpha</source> <translation type="unfinished"></translation> </message> <message> - <source>Field of view. Needed to transform the pose to world coordinates.</source> + <source>ROI Zoom</source> <translation type="unfinished"></translation> </message> <message> - <source>Requested video frame rate. Actual setting may not be supported by the camera.</source> + <source>Show the image patch that the pose estimation model sees.</source> <translation type="unfinished"></translation> </message> <message> - <source>The requested resolution for cases where the camera delivers maximum frame rate only for a particular resolution. The image may still be downscaled to the internal resolution.</source> + <source>Show Network Input</source> <translation type="unfinished"></translation> </message> <message> - <source>Number of threads. Can be used to balance the CPU load between the game and the tracker.</source> + <source>Amount of smoothing of the face region coordinates. Can help stabilize the pose.</source> <translation type="unfinished"></translation> </message> <message> - <source>Show the image patch that the pose estimation model sees.</source> + <source>Thread Count</source> <translation type="unfinished"></translation> </message> <message> - <source>Amount of smoothing of the face region coordinates. Can help stabilize the pose.</source> + <source>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</source> <translation type="unfinished"></translation> </message> <message> - <source>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</source> + <source>Camera override</source> <translation type="unfinished"></translation> </message> </context> diff --git a/tracker-neuralnet/lang/zh_CN.ts b/tracker-neuralnet/lang/zh_CN.ts index c3a91211..13dc34cf 100644 --- a/tracker-neuralnet/lang/zh_CN.ts +++ b/tracker-neuralnet/lang/zh_CN.ts @@ -8,26 +8,10 @@ <translation type="unfinished"></translation> </message> <message> - <source>Diagonal FOV</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Camera name</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Frames per second</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Camera settings</source> <translation type="unfinished"></translation> </message> <message> - <source>Camera Configuration</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Head Center Offset</source> <translation type="unfinished"></translation> </message> @@ -57,11 +41,11 @@ Don't roll or change position.</source> <translation type="unfinished"></translation> </message> <message> - <source>Show Network Input</source> + <source>Exposure preset</source> <translation type="unfinished"></translation> </message> <message> - <source>MJPEG</source> + <source>Camera Configuration</source> <translation type="unfinished"></translation> </message> <message> @@ -69,47 +53,39 @@ Don't roll or change position.</source> <translation type="unfinished"></translation> </message> <message> - <source>ROI Smoothing Alpha</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>ROI Zoom</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Thread Count</source> + <source>Number of threads. Can be used to balance the CPU load between the game and the tracker.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resolution</source> + <source>ROI Smoothing Alpha</source> <translation type="unfinished"></translation> </message> <message> - <source>Field of view. Needed to transform the pose to world coordinates.</source> + <source>ROI Zoom</source> <translation type="unfinished"></translation> </message> <message> - <source>Requested video frame rate. Actual setting may not be supported by the camera.</source> + <source>Show the image patch that the pose estimation model sees.</source> <translation type="unfinished"></translation> </message> <message> - <source>The requested resolution for cases where the camera delivers maximum frame rate only for a particular resolution. The image may still be downscaled to the internal resolution.</source> + <source>Show Network Input</source> <translation type="unfinished"></translation> </message> <message> - <source>Number of threads. Can be used to balance the CPU load between the game and the tracker.</source> + <source>Amount of smoothing of the face region coordinates. Can help stabilize the pose.</source> <translation type="unfinished"></translation> </message> <message> - <source>Show the image patch that the pose estimation model sees.</source> + <source>Thread Count</source> <translation type="unfinished"></translation> </message> <message> - <source>Amount of smoothing of the face region coordinates. Can help stabilize the pose.</source> + <source>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</source> <translation type="unfinished"></translation> </message> <message> - <source>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</source> + <source>Camera override</source> <translation type="unfinished"></translation> </message> </context> diff --git a/tracker-neuralnet/models/head-pose.onnx b/tracker-neuralnet/models/head-pose.onnx Binary files differindex dcb55dcc..d70dfa49 100644 --- a/tracker-neuralnet/models/head-pose.onnx +++ b/tracker-neuralnet/models/head-pose.onnx diff --git a/tracker-neuralnet/neuralnet-trackercontrols.ui b/tracker-neuralnet/neuralnet-trackercontrols.ui index 750e6ef3..9fa74b32 100644 --- a/tracker-neuralnet/neuralnet-trackercontrols.ui +++ b/tracker-neuralnet/neuralnet-trackercontrols.ui @@ -9,223 +9,14 @@ <rect> <x>0</x> <y>0</y> - <width>671</width> - <height>357</height> + <width>654</width> + <height>253</height> </rect> </property> <property name="windowTitle"> <string>Tracker settings</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="2" column="0"> - <widget class="QGroupBox" name="groupBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="autoFillBackground"> - <bool>true</bool> - </property> - <property name="title"> - <string>Camera Configuration</string> - </property> - <property name="flat"> - <bool>false</bool> - </property> - <property name="checkable"> - <bool>false</bool> - </property> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="spacing"> - <number>10</number> - </property> - <property name="bottomMargin"> - <number>8</number> - </property> - <item> - <layout class="QGridLayout" name="gridLayout_3"> - <property name="sizeConstraint"> - <enum>QLayout::SetDefaultConstraint</enum> - </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> - <property name="horizontalSpacing"> - <number>0</number> - </property> - <property name="verticalSpacing"> - <number>2</number> - </property> - <item row="0" column="1"> - <widget class="QComboBox" name="cameraName"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_9"> - <property name="text"> - <string>Diagonal FOV</string> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_10"> - <property name="text"> - <string>Camera name</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="cameraFOV"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Field of view. Needed to transform the pose to world coordinates.</string> - </property> - <property name="locale"> - <locale language="English" country="UnitedStates"/> - </property> - <property name="minimum"> - <number>35</number> - </property> - <property name="maximum"> - <number>90</number> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QComboBox" name="resolution"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>The requested resolution for cases where the camera delivers maximum frame rate only for a particular resolution. The image may still be downscaled to the internal resolution.</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="resolution_label"> - <property name="text"> - <string>Resolution</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QGridLayout" name="gridLayout_6"> - <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="horizontalSpacing"> - <number>0</number> - </property> - <property name="verticalSpacing"> - <number>2</number> - </property> - <item row="4" column="1"> - <widget class="QComboBox" name="cameraFPS"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Requested video frame rate. Actual setting may not be supported by the camera.</string> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_12"> - <property name="text"> - <string>Frames per second</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QCheckBox" name="use_mjpeg"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_11"> - <property name="text"> - <string>MJPEG</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QPushButton" name="camera_settings"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Camera settings</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - <item row="9" column="0"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> <item row="5" column="0"> <widget class="QGroupBox" name="tuningOptionsBox"> <property name="sizePolicy"> @@ -247,8 +38,8 @@ <string>Tuning / Debug</string> </property> <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="10"> - <widget class="Line" name="line_2"> + <item row="0" column="4"> + <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> @@ -267,33 +58,6 @@ </property> </widget> </item> - <item row="0" column="4"> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - </widget> - </item> - <item row="0" column="8"> - <widget class="QLabel" name="roiFilterAlphaLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>ROI Smoothing Alpha</string> - </property> - </widget> - </item> - <item row="0" column="11"> - <widget class="QLabel" name="roiZoomLabel"> - <property name="text"> - <string>ROI Zoom</string> - </property> - </widget> - </item> <item row="0" column="2"> <widget class="Line" name="line_3"> <property name="orientation"> @@ -301,19 +65,22 @@ </property> </widget> </item> - <item row="0" column="3"> - <widget class="QCheckBox" name="showNetworkInput"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> + <item row="0" column="12"> + <widget class="QDoubleSpinBox" name="roiZoom"> <property name="toolTip"> - <string>Show the image patch that the pose estimation model sees.</string> + <string>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</string> </property> - <property name="text"> - <string>Show Network Input</string> + <property name="minimum"> + <double>0.100000000000000</double> + </property> + <property name="maximum"> + <double>2.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.010000000000000</double> + </property> + <property name="value"> + <double>1.000000000000000</double> </property> </widget> </item> @@ -351,29 +118,53 @@ </property> </widget> </item> - <item row="0" column="0"> - <widget class="QLabel" name="threadCountLabel"> + <item row="0" column="11"> + <widget class="QLabel" name="roiZoomLabel"> <property name="text"> - <string>Thread Count</string> + <string>ROI Zoom</string> </property> </widget> </item> - <item row="0" column="12"> - <widget class="QDoubleSpinBox" name="roiZoom"> - <property name="toolTip"> - <string>Zoom factor for the face region. Applied before the patch is fed into the pose estimation model. There is a sweet spot near 1.</string> + <item row="0" column="8"> + <widget class="QLabel" name="roiFilterAlphaLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="minimum"> - <double>0.100000000000000</double> + <property name="text"> + <string>ROI Smoothing Alpha</string> </property> - <property name="maximum"> - <double>2.000000000000000</double> + </widget> + </item> + <item row="0" column="3"> + <widget class="QCheckBox" name="showNetworkInput"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="singleStep"> - <double>0.010000000000000</double> + <property name="toolTip"> + <string>Show the image patch that the pose estimation model sees.</string> </property> - <property name="value"> - <double>1.000000000000000</double> + <property name="text"> + <string>Show Network Input</string> + </property> + </widget> + </item> + <item row="0" column="10"> + <widget class="Line" name="line_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="threadCountLabel"> + <property name="text"> + <string>Thread Count</string> </property> </widget> </item> @@ -393,218 +184,373 @@ </layout> </widget> </item> - <item row="4" column="0"> - <widget class="QGroupBox" name="groupBox_10"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <item row="10" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> + </widget> + </item> + <item row="8" column="0"> + <widget class="QLabel" name="resolution_display"> <property name="autoFillBackground"> <bool>true</bool> </property> - <property name="title"> - <string>Head Center Offset</string> + <property name="frameShape"> + <enum>QFrame::Panel</enum> </property> - <layout class="QGridLayout" name="gridLayout_5"> - <item row="0" column="0"> - <widget class="QFrame" name="frame_4"> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="text"> + <string notr="true"/> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QWidget" name="widget" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="bottomMargin"> + <number>0</number> + </property> + <item alignment="Qt::AlignTop"> + <widget class="QGroupBox" name="groupBox"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>16777215</height> - </size> + <property name="autoFillBackground"> + <bool>true</bool> </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> + <property name="title"> + <string>Camera Configuration</string> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> + <property name="flat"> + <bool>false</bool> </property> - <layout class="QGridLayout" name="gridLayout_11"> - <property name="sizeConstraint"> - <enum>QLayout::SetDefaultConstraint</enum> + <property name="checkable"> + <bool>false</bool> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>10</number> </property> - <property name="verticalSpacing"> - <number>0</number> + <property name="bottomMargin"> + <number>8</number> </property> - <item row="1" column="1"> - <widget class="QSpinBox" name="ty_spin"> - <property name="maximumSize"> - <size> - <width>150</width> - <height>16777215</height> - </size> - </property> - <property name="suffix"> - <string> mm</string> - </property> - <property name="minimum"> - <number>-65535</number> - </property> - <property name="maximum"> - <number>65536</number> - </property> - </widget> - </item> - <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> - <property name="text"> - <string>Right</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QSpinBox" name="tz_spin"> - <property name="maximumSize"> - <size> - <width>150</width> - <height>16777215</height> - </size> - </property> - <property name="suffix"> - <string> mm</string> - </property> - <property name="minimum"> - <number>-65535</number> - </property> - <property name="maximum"> - <number>65536</number> - </property> - </widget> - </item> - <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="text"> - <string>Forward</string> + <item> + <layout class="QGridLayout" name="gridLayout_3"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QSpinBox" name="tx_spin"> - <property name="maximumSize"> - <size> - <width>150</width> - <height>16777215</height> - </size> + <property name="leftMargin"> + <number>0</number> </property> - <property name="suffix"> - <string> mm</string> + <property name="topMargin"> + <number>0</number> </property> - <property name="minimum"> - <number>-65535</number> + <property name="rightMargin"> + <number>0</number> </property> - <property name="maximum"> - <number>65536</number> + <property name="bottomMargin"> + <number>0</number> </property> - </widget> - </item> - <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 name="horizontalSpacing"> + <number>16</number> </property> - <property name="text"> - <string>Up</string> + <property name="verticalSpacing"> + <number>2</number> </property> - </widget> + <item row="0" column="1"> + <widget class="QComboBox" name="cameraName"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Camera override</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QComboBox" name="exposure_preset"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Exposure preset</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QPushButton" name="camera_settings"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Camera settings</string> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> </item> - <item row="0" column="1"> - <widget class="QFrame" name="frame_5"> + <item alignment="Qt::AlignTop"> + <widget class="QGroupBox" name="groupBox_10"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="minimumSize"> - <size> - <width>260</width> - <height>0</height> - </size> + <property name="autoFillBackground"> + <bool>true</bool> </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> + <property name="title"> + <string>Head Center Offset</string> </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QLabel" name="label_59"> - <property name="text"> - <string>Use only yaw and pitch while calibrating. -Don't roll or change position.</string> + <layout class="QGridLayout" name="gridLayout_5"> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QFrame" name="frame_4"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>16777215</height> + </size> </property> - <property name="wordWrap"> - <bool>true</bool> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> </property> - <property name="openExternalLinks"> - <bool>false</bool> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> </property> + <layout class="QGridLayout" name="gridLayout_11"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="verticalSpacing"> + <number>0</number> + </property> + <item row="1" column="1"> + <widget class="QSpinBox" name="ty_spin"> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="suffix"> + <string> mm</string> + </property> + <property name="minimum"> + <number>-65535</number> + </property> + <property name="maximum"> + <number>65536</number> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="tx_spin"> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="suffix"> + <string> mm</string> + </property> + <property name="minimum"> + <number>-65535</number> + </property> + <property name="maximum"> + <number>65536</number> + </property> + </widget> + </item> + <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>Up</string> + </property> + </widget> + </item> + <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="text"> + <string>Forward</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QSpinBox" name="tz_spin"> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="suffix"> + <string> mm</string> + </property> + <property name="minimum"> + <number>-65535</number> + </property> + <property name="maximum"> + <number>65536</number> + </property> + </widget> + </item> + <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> + <property name="text"> + <string>Right</string> + </property> + </widget> + </item> + </layout> </widget> </item> - <item> - <widget class="QLabel" name="sample_count_display"> + <item row="0" column="1"> + <widget class="QFrame" name="frame_5"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> + <property name="minimumSize"> + <size> + <width>260</width> + <height>0</height> + </size> + </property> <property name="frameShape"> - <enum>QFrame::Panel</enum> + <enum>QFrame::NoFrame</enum> </property> <property name="frameShadow"> - <enum>QFrame::Sunken</enum> - </property> - <property name="text"> - <string/> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="tcalib_button"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Start calibration</string> - </property> - <property name="checkable"> - <bool>true</bool> + <enum>QFrame::Raised</enum> </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="topMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_59"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Use only yaw and pitch while calibrating. +Don't roll or change position.</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="openExternalLinks"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="sample_count_display"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>QFrame::Panel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="text"> + <string/> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="tcalib_button"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Start calibration</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> </widget> </item> </layout> @@ -613,24 +559,32 @@ Don't roll or change position.</string> </layout> </widget> </item> - <item row="8" column="0"> - <widget class="QLabel" name="resolution_display"> - <property name="autoFillBackground"> - <bool>true</bool> - </property> - <property name="frameShape"> - <enum>QFrame::Panel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Sunken</enum> + <item row="9" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> </property> - <property name="text"> - <string notr="true"/> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>0</height> + </size> </property> - </widget> + </spacer> </item> </layout> </widget> + <tabstops> + <tabstop>cameraName</tabstop> + <tabstop>tx_spin</tabstop> + <tabstop>ty_spin</tabstop> + <tabstop>tz_spin</tabstop> + <tabstop>tcalib_button</tabstop> + <tabstop>threadCount</tabstop> + <tabstop>showNetworkInput</tabstop> + <tabstop>roiFilterAlpha</tabstop> + <tabstop>roiZoom</tabstop> + </tabstops> <resources/> <connections/> <designerdata> diff --git a/variant/default/_variant.cmake b/variant/default/_variant.cmake index ffa795d0..f972806e 100644 --- a/variant/default/_variant.cmake +++ b/variant/default/_variant.cmake @@ -1,11 +1,11 @@ function(otr_init_variant) set_property(GLOBAL PROPERTY opentrack-variant "default") - set_property(GLOBAL PROPERTY opentrack-ident "opentrack-2.3") + set_property(GLOBAL PROPERTY opentrack-ident "trackhat-v3") set(subprojects - "tracker-*" + "tracker-neuralnet" "proto-*" - "filter-*" + "filter-accela" "options" "api" "compat" @@ -23,7 +23,7 @@ function(otr_init_variant) "migration" "main-window" "video" - "video-*" + "video-opencv" "opentrack" ) diff --git a/video-opencv/impl-camera.cpp b/video-opencv/impl-camera.cpp index 662eceb2..afd76310 100644 --- a/video-opencv/impl-camera.cpp +++ b/video-opencv/impl-camera.cpp @@ -1,6 +1,7 @@ #include "impl.hpp" #include "compat/sleep.hpp" #include "video-property-page.hpp" +#include <QDebug> namespace opencv_camera_impl { @@ -30,6 +31,34 @@ bool cam::is_open() return !!cap; } +void cam::set_exposure(bool write) +{ + auto e = *s.exposure; + if (e != exposure) + switch (e) + { + case exposure_preset::near: cap->set(cv::CAP_PROP_EXPOSURE, -5); qDebug() << "near"; break; + case exposure_preset::far: cap->set(cv::CAP_PROP_EXPOSURE, -4); qDebug() << "far"; break; + default: break; + } + + if (s.exposure != exposure_preset::ignored) + { + constexpr struct { + int prop, value; + } props[] = { + { cv::CAP_PROP_AUTO_EXPOSURE, 0 }, + { cv::CAP_PROP_BRIGHTNESS, 0 }, + { cv::CAP_PROP_SHARPNESS, 3 }, + }; + for (const auto [prop, value] : props) + cap->set(prop, value); + } + + if (write) + exposure = e; +} + bool cam::start(info& args) { stop(); @@ -46,6 +75,8 @@ bool cam::start(info& args) if (args.use_mjpeg) cap->set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G')); + set_exposure(false); + if (!cap->isOpened()) goto fail; @@ -82,6 +113,8 @@ bool cam::get_frame_() portable::sleep(50); } + set_exposure(true); + return false; } diff --git a/video-opencv/impl.hpp b/video-opencv/impl.hpp index ed5499b0..8e61989e 100644 --- a/video-opencv/impl.hpp +++ b/video-opencv/impl.hpp @@ -8,6 +8,7 @@ #pragma once #include "video/camera.hpp" +#include "settings.hpp" #include <optional> #include <opencv2/videoio.hpp> @@ -43,13 +44,17 @@ static constexpr int video_capture_backend = bool is_open() override; std::tuple<const frame&, bool> get_frame() override; bool show_dialog() override; + void set_exposure(bool write); bool get_frame_(); + dshow_camera_settings s; + std::optional<cv::VideoCapture> cap; cv::Mat mat; frame frame_; int idx = -1; + exposure_preset exposure = exposure_preset::ignored; }; } // ns opencv_camera_impl diff --git a/video-opencv/settings.hpp b/video-opencv/settings.hpp new file mode 100644 index 00000000..a4f70c25 --- /dev/null +++ b/video-opencv/settings.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "options/value.hpp" +using namespace options; + +enum class exposure_preset : int { + near, far, ignored, + DEFAULT = near, +}; + +struct dshow_camera_settings final { + bundle b = make_bundle("video-camera"); + value<exposure_preset> exposure{b, "exposure-preset", exposure_preset::near}; +}; |