summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--3rdparty-notices/ARUCO-COPYING.txt35
-rw-r--r--3rdparty-notices/HEADTRACKER-LICENSE.txt32
-rw-r--r--3rdparty-notices/POINTTRACKER-COPYING.txt8
-rwxr-xr-x[-rw-r--r--]CMakeLists.txt135
-rwxr-xr-x[-rw-r--r--]facetracknoir/facetracknoir.icobin67134 -> 3758 bytes
-rwxr-xr-x[-rw-r--r--]facetracknoir/images/facetracknoir.pngbin29485 -> 14581 bytes
-rw-r--r--facetracknoir/images/trackhat-clip-left.pngbin0 -> 136647 bytes
-rw-r--r--facetracknoir/images/trackhat-clip-right.pngbin0 -> 136867 bytes
-rw-r--r--facetracknoir/images/trackhat-hat.pngbin0 -> 45281 bytes
-rw-r--r--facetracknoir/install-driver-dialog.ui41
-rw-r--r--facetracknoir/main.cpp35
-rw-r--r--facetracknoir/main.ui301
-rw-r--r--facetracknoir/options-dialog.cpp163
-rw-r--r--facetracknoir/options-dialog.hpp25
-rw-r--r--facetracknoir/settings.ui924
-rw-r--r--facetracknoir/software-update-dialog.hpp87
-rw-r--r--facetracknoir/software-update.ui118
-rw-r--r--facetracknoir/trackhat-wizard.ui189
-rw-r--r--facetracknoir/trans_calib.cpp (renamed from ftnoir_tracker_pt/trans_calib.cpp)0
-rw-r--r--facetracknoir/trans_calib.h (renamed from ftnoir_tracker_pt/trans_calib.h)0
-rw-r--r--facetracknoir/ui-res.qrc3
-rw-r--r--facetracknoir/ui.cpp103
-rw-r--r--facetracknoir/ui.h16
-rw-r--r--facetracknoir/wizard.cpp80
-rw-r--r--facetracknoir/wizard.h21
-rw-r--r--ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui300
-rw-r--r--ftnoir_filter_accela/ftnoir_filter_accela.cpp3
-rw-r--r--ftnoir_filter_accela/ftnoir_filter_accela.h31
-rw-r--r--ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp105
-rw-r--r--ftnoir_tracker_pt/FTNoIR_PT_Controls.ui1220
-rw-r--r--ftnoir_tracker_pt/ftnoir_tracker_pt.cpp68
-rw-r--r--ftnoir_tracker_pt/ftnoir_tracker_pt.qrc9
-rw-r--r--ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.cpp182
-rw-r--r--ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h51
-rw-r--r--ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h40
-rw-r--r--ftnoir_tracker_pt/point_tracker.h32
-rw-r--r--[-rwxr-xr-x]installer/opentrack-installer.iss8
-rw-r--r--macosx/make-app-bundle.sh2
-rw-r--r--macosx/opentrack.app/Contents/Info.plist6
-rw-r--r--opentrack/main-settings.hpp11
-rw-r--r--opentrack/options.hpp2
-rw-r--r--opentrack/plugin-support.hpp13
-rw-r--r--opentrack/selected-libraries.cpp18
-rw-r--r--opentrack/selected-libraries.hpp2
-rw-r--r--opentrack/tracker.cpp5
-rwxr-xr-x[-rw-r--r--]pose-widget/images/side1.pngbin26449 -> 4100 bytes
-rwxr-xr-x[-rw-r--r--]pose-widget/images/side6.pngbin26493 -> 4100 bytes
47 files changed, 1803 insertions, 2621 deletions
diff --git a/3rdparty-notices/ARUCO-COPYING.txt b/3rdparty-notices/ARUCO-COPYING.txt
deleted file mode 100644
index 24e57080..00000000
--- a/3rdparty-notices/ARUCO-COPYING.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-The ARUCO Library has been developed by the Ava group of the Univeristy of Cordoba(Spain)
-Contact to Rafael Muñoz Salinas <rmsalinas@uco.es>
-
------------------------------------------------------------------------
-
-Copyright 2011 Rafael Muñoz Salinas. All rights reserved.
-
-
-Redistribution and use in source and binary forms, with or without modification, are
-permitted provided that the following conditions are met:
-
-
- 1. Redistributions of source code must retain the above copyright notice, this list of
- conditions and the following disclaimer.
-
-
- 2. Redistributions in binary form must reproduce the above copyright notice, this list
- of conditions and the following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
-
-THIS SOFTWARE IS PROVIDED BY Rafael Muñoz Salinas ''AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Rafael Muñoz Salinas OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-The views and conclusions contained in the software and documentation are those of the
-authors and should not be interpreted as representing official policies, either expressed
-or implied, of Rafael Muñoz Salinas.
diff --git a/3rdparty-notices/HEADTRACKER-LICENSE.txt b/3rdparty-notices/HEADTRACKER-LICENSE.txt
deleted file mode 100644
index a1a778e6..00000000
--- a/3rdparty-notices/HEADTRACKER-LICENSE.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-Copyright (c) 2012-2013 Stanisław Halik <sthalik@misaki.pl>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-------------------------------------------------------------------------
-
-Credit for the head mesh:
-
-Jed Frechette submitted the mesh as a pull request.
-I cannot thank him enough!
-
-------------------------------------------------------------------------
-
-The project links against the flandmark library, written by
-Michal Uřičář and Vojtěch Franc. The library is GPL3-licensed.
-
-More info at: http://cmp.felk.cvut.cz/~uricamic/flandmark
-Github repo: https://github.com/uricamic/flandmark
-
-------------------------------------------------------------------------
-
-The projects uses OpenCV, see http://code.opencv.org for more info. \ No newline at end of file
diff --git a/3rdparty-notices/POINTTRACKER-COPYING.txt b/3rdparty-notices/POINTTRACKER-COPYING.txt
new file mode 100644
index 00000000..1edf8a19
--- /dev/null
+++ b/3rdparty-notices/POINTTRACKER-COPYING.txt
@@ -0,0 +1,8 @@
+PointTracker was released under the following notice:
+
+/* Copyright (c) 2012 Patrick Ruoff
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */ \ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 36ffbfb7..a7c64144 100644..100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -57,7 +57,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-find_package(OpenCV 3.0)
+find_package(OpenCV 3.0 REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Core Xml Network Widgets Gui QUIET)
find_package(Qt5 COMPONENTS SerialPort QUIET)
@@ -141,6 +141,10 @@ macro(opentrack_library n dir)
add_library(${n} ${link-mode} ${${n}-all})
target_link_libraries(${n} opentrack-api ${MY_QT_LIBS} opentrack-compat)
if(CMAKE_COMPILER_IS_GNUCXX AND NOT APPLE)
+ set(visibility "-fvisibility=hidden -fvisibility-inlines-hidden")
+ if (foolib_STATIC)
+ set(visibility)
+ endif()
SET_TARGET_PROPERTIES(${n} PROPERTIES
LINK_FLAGS "${foolib_LINK} ${foolib_GNU-LINK} -Wl,--as-needed -Wl,--version-script=\"${CMAKE_SOURCE_DIR}/opentrack-compat/${version-script}-version-script.txt\""
COMPILE_FLAGS "${foolib_COMPILE} ${foolib_GNU-COMPILE} -fvisibility=hidden -fvisibility-inlines-hidden"
@@ -313,9 +317,8 @@ target_link_libraries(opentrack-spline-widget ${MY_QT_LIBS})
add_library(opentrack-version STATIC ${CMAKE_BINARY_DIR}/version.cc)
opentrack_compat(opentrack-version)
-opentrack_library(opentrack-filter-accela ftnoir_filter_accela)
+opentrack_library(opentrack-filter-accela ftnoir_filter_accela STATIC TRUE)
target_link_libraries(opentrack-filter-accela opentrack-spline-widget)
-opentrack_library(opentrack-filter-ewma ftnoir_filter_ewma2)
opentrack_library(opentrack-proto-fgfs ftnoir_protocol_fg)
@@ -345,7 +348,6 @@ if(SDK_FSUIPC)
if(MSVC)
set_target_properties(opentrack-proto-fsuipc PROPERTIES LINK_FLAGS "/NODEFAULTLIB:LIBC.lib")
endif()
- #target_link_directories(${SDK_FSUIPC})
endif()
if(WIN32)
@@ -360,17 +362,13 @@ endif()
opentrack_library(opentrack-proto-udp ftnoir_protocol_ftn)
-if(WIN32)
- opentrack_library(opentrack-tracker-joystick ftnoir_tracker_joystick)
-endif()
-
-if(Qt5SerialPort_FOUND)
+if(Qt5SerialPort_FOUND AND FALSE)
opentrack_library(opentrack-tracker-hatire ftnoir_tracker_hatire)
target_link_libraries(opentrack-tracker-hatire ${Qt5SerialPort_LIBRARIES})
target_include_directories(opentrack-tracker-hatire SYSTEM PUBLIC ${Qt5SerialPort_INCLUDE_DIRS})
endif()
-if(SDK_WINE_PREFIX)
+if(SDK_WINE_PREFIX AND FALSE)
opentrack_library(opentrack-proto-wine ftnoir_protocol_wine)
target_link_libraries(opentrack-proto-wine opentrack-compat opentrack-csv)
if(NOT SDK_WINE_NO_WRAPPER)
@@ -392,118 +390,14 @@ if(SDK_WINE_PREFIX)
endif()
endif()
-opentrack_library(opentrack-tracker-udp ftnoir_tracker_udp)
-opentrack_library(opentrack-tracker-freepie-udp ftnoir_tracker_freepie-udp)
-
-if(WIN32)
- opentrack_library(opentrack-tracker-rs ftnoir_tracker_rs)
-endif()
-
if(OpenCV_FOUND)
- opentrack_library(opentrack-tracker-pt ftnoir_tracker_pt)
+ opentrack_library(opentrack-tracker-pt ftnoir_tracker_pt STATIC YES)
target_link_libraries(opentrack-tracker-pt ${OpenCV_LIBS})
target_include_directories(opentrack-tracker-pt SYSTEM PUBLIC ${OpenCV_INCLUDE_DIRS})
link_with_dinput8(opentrack-tracker-pt)
-
- if(SDK_ARUCO_LIBPATH)
- opentrack_library(opentrack-tracker-aruco ftnoir_tracker_aruco)
- target_link_libraries(opentrack-tracker-aruco ${SDK_ARUCO_LIBPATH} ${OpenCV_LIBS})
- target_include_directories(opentrack-tracker-aruco SYSTEM PUBLIC ${OpenCV_INCLUDE_DIRS})
- link_with_dinput8(opentrack-tracker-aruco)
- endif()
-
- opentrack_library(opentrack-filter-kalman ftnoir_filter_kalman)
- target_link_libraries(opentrack-filter-kalman ${OpenCV_LIBS})
- target_include_directories(opentrack-filter-kalman SYSTEM PUBLIC ${OpenCV_INCLUDE_DIRS})
-
- if(SDK_HT AND SDK_HT_FLANDMARK)
- opentrack_library(opentrack-tracker-ht ftnoir_tracker_ht)
- target_link_libraries(opentrack-tracker-ht ${SDK_HT} ${SDK_HT_FLANDMARK} ${OpenCV_LIBS})
- link_with_dinput8(opentrack-tracker-ht)
- target_include_directories(opentrack-tracker-ht SYSTEM PUBLIC ${OpenCV_INCLUDE_DIRS})
- endif()
-endif()
-
-link_with_dinput8(opentrack-tracker-joystick)
-
-if(SDK_RIFT)
- set(link-flags)
- set(c-flags)
- if(APPLE)
- set(link-flags "-framework CoreFoundation -framework CoreGraphics -framework IOKit -framework Quartz")
- set(c-flags "-fno-strict-aliasing")
- else()
- if(NOT MSVC)
- set(c-flags "-fno-strict-aliasing")
- endif()
- endif()
- opentrack_library(opentrack-tracker-rift ftnoir_tracker_rift LINK ${link-flags} COMPILE ${c-flags})
- target_include_directories(opentrack-tracker-rift SYSTEM PUBLIC ${SDK_RIFT}/Include ${SDK_RIFT}/Src)
- if(WIN32)
- if(MSVC)
- set(ext lib)
- set(p)
- else()
- set(ext a)
- set(p lib)
- endif()
- target_link_libraries(opentrack-tracker-rift ${SDK_RIFT}/${p}LibOVR.${ext} winmm setupapi ws2_32 imagehlp wbemuuid)
- else()
- if(NOT APPLE)
- target_link_libraries(opentrack-tracker-rift ${SDK_RIFT}/libLibOVR.a udev Xinerama)
- else()
- target_link_libraries(opentrack-tracker-rift ${SDK_RIFT}/libLibOVR.a)
- endif()
- endif()
-endif()
-
-if(SDK_HYDRA)
- opentrack_library(opentrack-tracker-hydra ftnoir_tracker_hydra)
- target_include_directories(opentrack-tracker-hydra SYSTEM PUBLIC ${SDK_HYDRA}/include ${SDK_HYDRA}/include/sixense_utils)
- if(WIN32)
- if(MSVC)
- set(dir lib)
- set(ext lib)
- else()
- set(dir bin)
- set(ext dll)
- endif()
- target_link_libraries(opentrack-tracker-hydra
- "${SDK_HYDRA}/${dir}/win32/release_dll/sixense.${ext}"
- #"${SDK_HYDRA}/${dir}/win32/release_dll/sixense_utils.${ext}"
- )
- install(FILES "${SDK_HYDRA}/bin/win32/release_dll/sixense.dll"
- #"${SDK_HYDRA}/bin/win32/release_dll/sixense_utils.dll"
- DESTINATION . ${opentrack-perms})
- else()
- if(SDK_HYDRA_AMD64)
- set(underscore-sixtyfour _x64)
- else()
- set(underscore-sixtyfour)
- endif()
- if(APPLE)
- set(underscore-dll _dll)
- set(soext dylib)
- set(sixense-plat osx)
- else()
- set(underscore-dll)
- set(soext so)
- set(sixense-plat linux)
- endif()
- install(FILES
- "${SDK_HYDRA}/lib/${sixense-plat}${underscore-sixtyfour}/release${underscore-dll}/libsixense${underscore-sixtyfour}.${soext}"
- #"${SDK_HYDRA}/lib/${sixense-plat}${underscore-sixtyfour}/release${underscore-dll}/libsixense_utils${underscore-sixtyfour}.${soext}"
- DESTINATION .
- )
- target_link_libraries(opentrack-tracker-hydra
- "${SDK_HYDRA}/lib/${sixense-plat}${underscore-sixtyfour}/release${underscore-dll}/libsixense${underscore-sixtyfour}.${soext}"
- #"${SDK_HYDRA}/lib/${sixense-plat}${underscore-sixtyfour}/release${underscore-dll}/libsixense_utils${underscore-sixtyfour}.${soext}"
- )
- endif()
endif()
if(UNIX OR APPLE)
- # Qxt bundled :: sorry for this, but gentoo ebuild is broken
include_directories("qxt-mini/")
if(APPLE)
set(qxt-plat mac)
@@ -526,11 +420,13 @@ else()
endif()
opentrack_module(opentrack facetracknoir)
+
if(UNIX OR APPLE)
list(APPEND opentrack-c qxt-mini/qxtglobalshortcut.h)
endif()
opentrack_qt(opentrack)
add_executable(opentrack ${opentrack-win32-executable} ${opentrack-all})
+target_link_libraries(opentrack opentrack-filter-accela opentrack-tracker-pt)
opentrack_compat(opentrack)
if(NOT WIN32)
set_target_properties(opentrack PROPERTIES SUFFIX ".bin")
@@ -544,6 +440,8 @@ endif()
if(UNIX OR APPLE)
target_link_libraries(opentrack opentrack-qxt-mini)
endif()
+target_include_directories(opentrack SYSTEM PUBLIC ${OpenCV_INCLUDE_DIRS})
+target_link_libraries(opentrack ${OpenCV_LIBS})
link_with_dinput8(opentrack)
target_link_libraries(opentrack ${MY_QT_LIBS})
@@ -575,7 +473,7 @@ install(DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty-notices DESTINATION .)
install(FILES "${CMAKE_SOURCE_DIR}/bin/freetrackclient.dll" DESTINATION . ${opentrack-perms})
install(FILES "${CMAKE_SOURCE_DIR}/bin/NPClient.dll" "${CMAKE_SOURCE_DIR}/bin/NPClient64.dll" "${CMAKE_SOURCE_DIR}/bin/TrackIR.exe" DESTINATION .
${opentrack-perms})
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/bin/settings" "${CMAKE_SOURCE_DIR}/clientfiles" DESTINATION .)
+install(DIRECTORY "${CMAKE_SOURCE_DIR}/bin/settings" DESTINATION .)
if(NOT WIN32 AND SDK_WINE_PREFIX AND NOT SDK_WINE_NO_WRAPPER)
install(FILES "${CMAKE_BINARY_DIR}/opentrack-wrapper-wine.exe.so"
@@ -592,11 +490,6 @@ if(WIN32)
install(FILES "${CMAKE_SOURCE_DIR}/bin/cleye.config" DESTINATION .)
endif()
-if(WIN32)
- install(FILES "${CMAKE_SOURCE_DIR}/ftnoir_tracker_rs/rs_impl/bin/opentrack-tracker-rs-impl.exe" DESTINATION . ${opentrack-perms})
- install(FILES "${CMAKE_SOURCE_DIR}/ftnoir_tracker_rs/redist/intel_rs_sdk_runtime_websetup_6.0.21.6598.exe" DESTINATION ./clientfiles/ ${opentrack-perms})
-endif()
-
if(APPLE)
install(CODE "
execute_process(COMMAND /bin/sh \"${CMAKE_SOURCE_DIR}/macosx/make-app-bundle.sh\"
diff --git a/facetracknoir/facetracknoir.ico b/facetracknoir/facetracknoir.ico
index 5cac8da1..b5f34db3 100644..100755
--- a/facetracknoir/facetracknoir.ico
+++ b/facetracknoir/facetracknoir.ico
Binary files differ
diff --git a/facetracknoir/images/facetracknoir.png b/facetracknoir/images/facetracknoir.png
index 85c06df6..4f17de81 100644..100755
--- a/facetracknoir/images/facetracknoir.png
+++ b/facetracknoir/images/facetracknoir.png
Binary files differ
diff --git a/facetracknoir/images/trackhat-clip-left.png b/facetracknoir/images/trackhat-clip-left.png
new file mode 100644
index 00000000..e4668cad
--- /dev/null
+++ b/facetracknoir/images/trackhat-clip-left.png
Binary files differ
diff --git a/facetracknoir/images/trackhat-clip-right.png b/facetracknoir/images/trackhat-clip-right.png
new file mode 100644
index 00000000..aeb969cd
--- /dev/null
+++ b/facetracknoir/images/trackhat-clip-right.png
Binary files differ
diff --git a/facetracknoir/images/trackhat-hat.png b/facetracknoir/images/trackhat-hat.png
new file mode 100644
index 00000000..2d5a8f4a
--- /dev/null
+++ b/facetracknoir/images/trackhat-hat.png
Binary files differ
diff --git a/facetracknoir/install-driver-dialog.ui b/facetracknoir/install-driver-dialog.ui
new file mode 100644
index 00000000..3ef3bb2f
--- /dev/null
+++ b/facetracknoir/install-driver-dialog.ui
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DriverDialog</class>
+ <widget class="QDialog" name="DriverDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>415</width>
+ <height>94</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>PS3 Eye driver missing</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The PS3 Eye driver or camera is missing. Please install the driver or plug in the camera and restart the program. Thanks!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Driver download: &lt;a href=&quot;https://mega.nz/#!QkAjnBwD!-ULu08uFwGK5hl7ugbFZfuAw2hIdFpwVtn-jewThrN8&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;mega.nz&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/facetracknoir/main.cpp b/facetracknoir/main.cpp
index a63fe54a..4e56b3df 100644
--- a/facetracknoir/main.cpp
+++ b/facetracknoir/main.cpp
@@ -2,8 +2,11 @@
# include <stdlib.h>
#endif
+#include "opentrack/opencv-camera-dialog.hpp"
+#include "wizard.h"
#include "ui.h"
#include "opentrack/options.hpp"
+#include "ui_install-driver-dialog.h"
using namespace options;
#include <QApplication>
#include <QCommandLineParser>
@@ -58,10 +61,36 @@ int main(int argc, char** argv)
QApplication::setAttribute(Qt::AA_X11InitThreads, true);
QApplication app(argc, argv);
- auto w = std::make_shared<MainWindow>();
+ {
+ QSettings s(OPENTRACK_ORG);
+ if (!s.contains("wizard-run-once"))
+ {
+ s.setValue("wizard-run-once", true);
+ auto w = std::make_shared<Wizard>();
+ w->show();
+ app.exec();
+ }
+ }
+
+ if (get_camera_names().contains("PS3Eye Camera"))
+ {
+ auto w = std::make_shared<MainWindow>();
- w->show();
- app.exec();
+ w->show();
+ app.exec();
+ }
+ else
+ {
+ struct Dialog : QDialog
+ {
+ Ui::DriverDialog dlg;
+ Dialog()
+ {
+ dlg.setupUi(this);
+ }
+ };
+ Dialog().exec();
+ }
// on MSVC crashes in atexit
#ifdef _MSC_VER
diff --git a/facetracknoir/main.ui b/facetracknoir/main.ui
index 24c3d38c..6234fc8a 100644
--- a/facetracknoir/main.ui
+++ b/facetracknoir/main.ui
@@ -7,8 +7,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>707</width>
- <height>494</height>
+ <width>693</width>
+ <height>575</height>
</rect>
</property>
<property name="windowIcon">
@@ -193,8 +193,8 @@
</property>
<property name="maximumSize">
<size>
- <width>80</width>
- <height>90</height>
+ <width>110</width>
+ <height>120</height>
</size>
</property>
</widget>
@@ -578,19 +578,41 @@
</property>
</widget>
</item>
- <item row="1" column="2">
- <widget class="QLabel" name="lblRotY_2">
+ <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="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
- <string>pitch</string>
+ <string>TZ</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="lblRotZ_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="text">
+ <string>roll</string>
</property>
</widget>
</item>
@@ -635,8 +657,8 @@
</property>
</widget>
</item>
- <item row="2" column="2">
- <widget class="QLabel" name="lblRotZ_2">
+ <item row="1" column="2">
+ <widget class="QLabel" name="lblRotY_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Minimum">
<horstretch>0</horstretch>
@@ -647,34 +669,28 @@
<enum>QFrame::Raised</enum>
</property>
<property name="text">
- <string>roll</string>
+ <string>pitch</string>
</property>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QLabel" name="lblZ_2">
- <property name="enabled">
- <bool>true</bool>
- </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="lblx">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
- <string>TZ</string>
+ <string>TX</string>
</property>
</widget>
</item>
- <item row="1" column="1">
- <widget class="QLCDNumber" name="pose_y">
+ <item row="1" column="3">
+ <widget class="QLCDNumber" name="pose_pitch">
<property name="enabled">
<bool>true</bool>
</property>
@@ -698,8 +714,8 @@
</property>
</widget>
</item>
- <item row="2" column="3">
- <widget class="QLCDNumber" name="pose_roll">
+ <item row="1" column="1">
+ <widget class="QLCDNumber" name="pose_y">
<property name="enabled">
<bool>true</bool>
</property>
@@ -723,8 +739,8 @@
</property>
</widget>
</item>
- <item row="0" column="3">
- <widget class="QLCDNumber" name="pose_yaw">
+ <item row="2" column="3">
+ <widget class="QLCDNumber" name="pose_roll">
<property name="enabled">
<bool>true</bool>
</property>
@@ -773,24 +789,8 @@
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="lblx">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <property name="text">
- <string>TX</string>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QLCDNumber" name="pose_pitch">
+ <item row="0" column="3">
+ <widget class="QLCDNumber" name="pose_yaw">
<property name="enabled">
<bool>true</bool>
</property>
@@ -850,7 +850,7 @@
<property name="verticalSpacing">
<number>0</number>
</property>
- <item row="1" column="2">
+ <item row="1" column="1">
<widget class="QGroupBox" name="groupWindows">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -881,6 +881,49 @@
<number>6</number>
</property>
<item>
+ <widget class="QGroupBox" name="groupGameProtocol">
+ <property name="title">
+ <string>Protocol</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <property name="leftMargin">
+ <number>4</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>4</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="horizontalSpacing">
+ <number>3</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QComboBox" name="iconcomboProtocol"/>
+ </item>
+ <item row="0" column="1">
+ <widget class="QToolButton" name="btnShowServerControls">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="flat" stdset="0">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
<widget class="QFrame" name="groupProfile">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
@@ -994,7 +1037,7 @@
</layout>
</widget>
</item>
- <item row="1" column="1">
+ <item row="1" column="0">
<widget class="QGroupBox" name="groupStartStop">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -1056,168 +1099,6 @@
</layout>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QFrame" name="frame_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>4</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>2</number>
- </property>
- <property name="leftMargin">
- <number>3</number>
- </property>
- <property name="topMargin">
- <number>2</number>
- </property>
- <property name="rightMargin">
- <number>3</number>
- </property>
- <property name="bottomMargin">
- <number>8</number>
- </property>
- <item>
- <widget class="QGroupBox" name="groupTrackerSource">
- <property name="title">
- <string>Tracker</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <property name="horizontalSpacing">
- <number>3</number>
- </property>
- <property name="verticalSpacing">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <widget class="QComboBox" name="iconcomboTrackerSource"/>
- </item>
- <item row="0" column="1">
- <widget class="QToolButton" name="btnShowEngineControls">
- <property name="enabled">
- <bool>true</bool>
- </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="groupGameProtocol">
- <property name="title">
- <string>Protocol</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_4">
- <property name="leftMargin">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <property name="horizontalSpacing">
- <number>3</number>
- </property>
- <property name="verticalSpacing">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <widget class="QComboBox" name="iconcomboProtocol"/>
- </item>
- <item row="0" column="1">
- <widget class="QToolButton" name="btnShowServerControls">
- <property name="enabled">
- <bool>true</bool>
- </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>0</number>
- </property>
- <property name="rightMargin">
- <number>4</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <property name="horizontalSpacing">
- <number>3</number>
- </property>
- <property name="verticalSpacing">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <widget class="QComboBox" name="iconcomboFilter"/>
- </item>
- <item row="0" column="1">
- <widget class="QToolButton" name="btnShowFilterControls">
- <property name="enabled">
- <bool>true</bool>
- </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>
</item>
@@ -1237,14 +1118,8 @@
<tabstops>
<tabstop>btnStartTracker</tabstop>
<tabstop>btnStopTracker</tabstop>
- <tabstop>iconcomboTrackerSource</tabstop>
- <tabstop>btnShowEngineControls</tabstop>
<tabstop>iconcomboProtocol</tabstop>
<tabstop>btnShowServerControls</tabstop>
- <tabstop>iconcomboFilter</tabstop>
- <tabstop>btnShowFilterControls</tabstop>
- <tabstop>profile_button</tabstop>
- <tabstop>iconcomboProfile</tabstop>
<tabstop>btnEditCurves</tabstop>
<tabstop>btnShortcuts</tabstop>
</tabstops>
diff --git a/facetracknoir/options-dialog.cpp b/facetracknoir/options-dialog.cpp
index fef2b0ca..a2dd1726 100644
--- a/facetracknoir/options-dialog.cpp
+++ b/facetracknoir/options-dialog.cpp
@@ -7,11 +7,12 @@
*/
#include "options-dialog.hpp"
+#include "ftnoir_tracker_pt/camera.h"
#include "keyboard.h"
#include <QPushButton>
#include <QLayout>
-OptionsDialog::OptionsDialog()
+OptionsDialog::OptionsDialog(State& state) : state(state), trans_calib_running(false)
{
ui.setupUi( this );
@@ -25,13 +26,6 @@ OptionsDialog::OptionsDialog()
tie_setting(s.s_main.tcomp_p, ui.tcomp_enable);
tie_setting(s.s_main.tcomp_tz, ui.tcomp_rz);
- tie_setting(s.s_main.a_x.zero, ui.pos_tx);
- tie_setting(s.s_main.a_y.zero, ui.pos_ty);
- tie_setting(s.s_main.a_z.zero, ui.pos_tz);
- tie_setting(s.s_main.a_yaw.zero, ui.pos_rx);
- tie_setting(s.s_main.a_pitch.zero, ui.pos_ry);
- tie_setting(s.s_main.a_roll.zero, ui.pos_rz);
-
tie_setting(s.s_main.a_yaw.invert, ui.invert_yaw);
tie_setting(s.s_main.a_pitch.invert, ui.invert_pitch);
tie_setting(s.s_main.a_roll.invert, ui.invert_roll);
@@ -49,8 +43,48 @@ OptionsDialog::OptionsDialog()
tie_setting(s.s_main.camera_yaw, ui.camera_yaw);
tie_setting(s.s_main.camera_pitch, ui.camera_pitch);
tie_setting(s.s_main.camera_roll, ui.camera_roll);
+
+ tie_setting(pt.camera_mode, ui.camera_mode);
+
+ tie_setting(pt.threshold, ui.threshold_slider);
- tie_setting(s.s_main.center_method, ui.center_method);
+ tie_setting(pt.min_point_size, ui.mindiam_spin);
+ tie_setting(pt.max_point_size, ui.maxdiam_spin);
+
+ tie_setting(pt.t_MH_x, ui.tx_spin);
+ tie_setting(pt.t_MH_y, ui.ty_spin);
+ tie_setting(pt.t_MH_z, ui.tz_spin);
+
+ tie_setting(pt.fov, ui.camera_fov);
+
+ tie_setting(pt.model_used, ui.model_used);
+
+ connect(ui.ewma_slider, SIGNAL(valueChanged(int)), this, SLOT(update_ewma_display(int)));
+ connect(ui.rotation_slider, SIGNAL(valueChanged(int)), this, SLOT(update_rot_display(int)));
+ connect(ui.rot_dz_slider, SIGNAL(valueChanged(int)), this, SLOT(update_rot_dz_display(int)));
+ connect(ui.translation_slider, SIGNAL(valueChanged(int)), this, SLOT(update_trans_display(int)));
+ connect(ui.trans_dz_slider, SIGNAL(valueChanged(int)), this, SLOT(update_trans_dz_display(int)));
+
+ tie_setting(acc.rot_threshold, ui.rotation_slider);
+ tie_setting(acc.trans_threshold, ui.translation_slider);
+ tie_setting(acc.ewma, ui.ewma_slider);
+ tie_setting(acc.rot_deadzone, ui.rot_dz_slider);
+ tie_setting(acc.trans_deadzone, ui.trans_dz_slider);
+
+ update_rot_display(ui.rotation_slider->value());
+ update_trans_display(ui.translation_slider->value());
+ update_ewma_display(ui.ewma_slider->value());
+ update_rot_dz_display(ui.rot_dz_slider->value());
+ update_trans_dz_display(ui.trans_dz_slider->value());
+
+ tie_setting(pt.dynamic_pose, ui.dynamic_pose);
+ tie_setting(pt.init_phase_timeout, ui.init_phase_timeout);
+ tie_setting(pt.auto_threshold, ui.auto_threshold);
+
+ connect(&timer,SIGNAL(timeout()), this,SLOT(poll_tracker_info()));
+ connect( ui.tcalib_button,SIGNAL(toggled(bool)), this,SLOT(startstop_trans_calib(bool)) );
+
+ timer.start(100);
connect(ui.bind_center, &QPushButton::pressed, [&]() -> void { bind_key(s.center.keycode, ui.center_text); });
connect(ui.bind_zero, &QPushButton::pressed, [&]() -> void { bind_key(s.zero.keycode, ui.zero_text); });
@@ -81,7 +115,9 @@ void OptionsDialog::bind_key(value<QString>& ret, QLabel* label)
void OptionsDialog::doOK() {
s.b->save();
+ pt.b->save();
s.s_main.b->save();
+ acc.b->save();
ui.game_detector->save();
this->close();
emit reload();
@@ -89,8 +125,117 @@ void OptionsDialog::doOK() {
void OptionsDialog::doCancel() {
s.b->reload();
+ pt.b->reload();
s.s_main.b->reload();
+ acc.b->reload();
ui.game_detector->revert();
close();
}
+void OptionsDialog::startstop_trans_calib(bool start)
+{
+ auto tracker = get_pt();
+ if (!tracker)
+ {
+ ui.tcalib_button->setChecked(false);
+ return;
+ }
+
+ if (start)
+ {
+ qDebug()<<"TrackerDialog:: Starting translation calibration";
+ trans_calib.reset();
+ trans_calib_running = true;
+ pt.t_MH_x = 0;
+ pt.t_MH_y = 0;
+ pt.t_MH_z = 0;
+ }
+ else
+ {
+ qDebug()<<"TrackerDialog:: Stopping translation calibration";
+ trans_calib_running = false;
+ {
+ auto tmp = trans_calib.get_estimate();
+ pt.t_MH_x = tmp[0];
+ pt.t_MH_y = tmp[1];
+ pt.t_MH_z = tmp[2];
+ }
+ }
+}
+
+void OptionsDialog::poll_tracker_info()
+{
+ auto tracker = get_pt();
+ CamInfo info;
+ if (tracker && tracker->get_cam_info(&info))
+ {
+ QString to_print;
+
+ // display caminfo
+ to_print = QString::number(info.res_x)+"x"+QString::number(info.res_y)+" @ "+QString::number(info.fps)+" FPS";
+ ui.caminfo_label->setText(to_print);
+
+ // display pointinfo
+ int n_points = tracker->get_n_points();
+ to_print = QString::number(n_points);
+ if (n_points == 3)
+ to_print += " OK!";
+ else
+ to_print += " BAD!";
+ ui.pointinfo_label->setText(to_print);
+
+ // update calibration
+ if (trans_calib_running) trans_calib_step();
+ }
+ else
+ {
+ ui.caminfo_label->setText("Tracker offline");
+ ui.pointinfo_label->setText("");
+ }
+}
+
+void OptionsDialog::trans_calib_step()
+{
+ auto tracker = get_pt();
+ if (tracker)
+ {
+ Affine X_CM = tracker->pose();
+ trans_calib.update(X_CM.R, X_CM.t);
+ }
+}
+
+Tracker_PT* OptionsDialog::get_pt()
+{
+ auto work = state.work.get();
+ if (!work)
+ return nullptr;
+ auto ptr = work->libs.pTracker;
+ if (ptr)
+ return static_cast<Tracker_PT*>(ptr.get());
+ return nullptr;
+}
+
+void OptionsDialog::update_rot_display(int value)
+{
+ ui.rot_gain->setText(QString::number((value + 1) * 10 / 100.) + "°");
+}
+
+void OptionsDialog::update_trans_display(int value)
+{
+ ui.trans_gain->setText(QString::number((value + 1) * 5 / 100.) + "mm");
+}
+
+void OptionsDialog::update_ewma_display(int value)
+{
+ ui.ewma_label->setText(QString::number(value * 2) + "ms");
+}
+
+void OptionsDialog::update_rot_dz_display(int value)
+{
+ ui.rot_dz->setText(QString::number(value * 2 / 100.) + "°");
+}
+
+void OptionsDialog::update_trans_dz_display(int value)
+{
+ ui.trans_dz->setText(QString::number(value * 1 / 100.) + "mm");
+}
diff --git a/facetracknoir/options-dialog.hpp b/facetracknoir/options-dialog.hpp
index 3ef99d06..8e71bd40 100644
--- a/facetracknoir/options-dialog.hpp
+++ b/facetracknoir/options-dialog.hpp
@@ -2,8 +2,14 @@
#include <QObject>
#include <QWidget>
+#include <QTimer>
#include "ui_settings.h"
+#include "opentrack/state.hpp"
#include "opentrack/shortcuts.h"
+#include "ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h"
+#include "facetracknoir/trans_calib.h"
+#include "ftnoir_tracker_pt/ftnoir_tracker_pt.h"
+#include "ftnoir_filter_accela/ftnoir_filter_accela.h"
class OptionsDialog: public QWidget
{
@@ -11,13 +17,30 @@ class OptionsDialog: public QWidget
signals:
void reload();
public:
- OptionsDialog();
+ OptionsDialog(State &state);
private:
Ui::UI_Settings ui;
Shortcuts::settings s;
+ settings_pt pt;
+ settings_accela acc;
+ QTimer timer;
+ State& state;
+ TranslationCalibrator trans_calib;
+ bool trans_calib_running;
+
+ Tracker_PT* get_pt();
void closeEvent(QCloseEvent *) override { doCancel(); }
private slots:
+ void update_ewma_display(int value);
+ void update_rot_display(int value);
+ void update_trans_display(int value);
+ void update_rot_dz_display(int value);
+ void update_trans_dz_display(int value);
+
void doOK();
void doCancel();
+ void startstop_trans_calib(bool start);
+ void poll_tracker_info();
+ void trans_calib_step();
void bind_key(value<QString>& ret, QLabel* label);
};
diff --git a/facetracknoir/settings.ui b/facetracknoir/settings.ui
index d87b68bf..5ab857db 100644
--- a/facetracknoir/settings.ui
+++ b/facetracknoir/settings.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>348</width>
- <height>548</height>
+ <width>440</width>
+ <height>705</height>
</rect>
</property>
<property name="windowTitle">
@@ -141,11 +141,11 @@
</widget>
</item>
<item>
- <widget class="QGroupBox" name="groupBox_9">
+ <widget class="QGroupBox" name="groupBox_911">
<property name="title">
<string>Centering method</string>
</property>
- <layout class="QGridLayout" name="gridLayout">
+ <layout class="QGridLayout" name="gridLayout111">
<item row="1" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
@@ -213,8 +213,254 @@
<attribute name="title">
<string>Camera</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
+ <layout class="QGridLayout" name="gridLayout_9">
+ <item row="3" column="0">
+ <widget class="QGroupBox" name="groupBox_6">
+ <property name="title">
+ <string>Point extraction</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QFrame" name="frame_2">
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_10">
+ <item row="1" column="1">
+ <widget class="QSlider" name="threshold_slider">
+ <property name="toolTip">
+ <string>Intensity threshold for point extraction</string>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>127</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Threshold</string>
+ </property>
+ <property name="buddy">
+ <cstring>threshold_slider</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_38">
+ <property name="text">
+ <string>Automatic threshold</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="auto_threshold">
+ <property name="text">
+ <string>Enable, slider sets point size</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_29">
+ <property name="text">
+ <string>Min size</string>
+ </property>
+ <property name="buddy">
+ <cstring>mindiam_spin</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_22">
+ <property name="text">
+ <string>Max size</string>
+ </property>
+ <property name="buddy">
+ <cstring>maxdiam_spin</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QDoubleSpinBox" name="maxdiam_spin">
+ <property name="toolTip">
+ <string>Maximum point diameter</string>
+ </property>
+ <property name="suffix">
+ <string> px</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QDoubleSpinBox" name="mindiam_spin">
+ <property name="toolTip">
+ <string>Minimum point diameter</string>
+ </property>
+ <property name="suffix">
+ <string> px</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QGroupBox" name="groupBox_11">
+ <property name="title">
+ <string>Status</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="caminfo_label">
+ <property name="text">
+ <string>Not running</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="pointinfo_label">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="groupBox_9">
+ <property name="title">
+ <string>Device</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_32">
+ <property name="text">
+ <string>Dynamic pose resolution</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="dynamic_pose">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="camera_mode">
+ <item>
+ <property name="text">
+ <string>640x480, 75 Hz</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>640x480, 60 Hz</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320x240, 189 Hz</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320x240, 120 Hz</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2511">
+ <property name="text">
+ <string>Mode</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QComboBox" name="camera_fov">
+ <item>
+ <property name="text">
+ <string>56°</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>75°</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Field of view</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_33">
+ <property name="text">
+ <string>Dynamic pose timeout</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QSpinBox" name="init_phase_timeout">
+ <property name="suffix">
+ <string> ms</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>10000</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0">
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Camera offset</string>
@@ -320,202 +566,354 @@
</layout>
</widget>
</item>
+ <item row="5" column="0">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_2">
+ <attribute name="title">
+ <string>Model</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
<item>
- <widget class="QGroupBox" name="groupBox_6">
+ <widget class="QGroupBox" name="groupBox_7">
+ <property name="styleSheet">
+ <string notr="true">QGroupBox { border: 0; }</string>
+ </property>
<property name="title">
- <string>Center pose offset</string>
+ <string/>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_6">
- <item>
- <widget class="QLabel" name="label_22">
- <property name="text">
- <string>Alter the centered position sent to games by a fixed amount.</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="margin">
- <number>2</number>
- </property>
- </widget>
- </item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <widget class="QGroupBox" name="groupBox_7">
+ <widget class="QFrame" name="frame_5">
<property name="styleSheet">
- <string notr="true">QGroupBox {
- border: 0;
-}</string>
- </property>
- <property name="title">
- <string/>
+ <string notr="true">QFrame { border: 0; }</string>
</property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
</property>
- <property name="flat">
- <bool>false</bool>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
</property>
- <property name="checkable">
- <bool>false</bool>
+ <property name="lineWidth">
+ <number>0</number>
</property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="2" column="1">
- <widget class="QDoubleSpinBox" name="pos_rz">
- <property name="suffix">
- <string> deg.</string>
+ <layout class="QGridLayout" name="gridLayout_16">
+ <property name="leftMargin">
+ <number>20</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>40</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Hat</string>
</property>
- <property name="decimals">
- <number>3</number>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="minimum">
- <double>-180.000000000000000</double>
+ <property name="minimumSize">
+ <size>
+ <width>120</width>
+ <height>108</height>
+ </size>
</property>
- <property name="maximum">
- <double>180.000000000000000</double>
+ <property name="maximumSize">
+ <size>
+ <width>120</width>
+ <height>108</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-hat.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
</property>
</widget>
</item>
- <item row="2" column="3">
- <widget class="QDoubleSpinBox" name="pos_tz">
- <property name="suffix">
- <string> cm</string>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_34">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="decimals">
- <number>3</number>
+ <property name="minimumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
</property>
- <property name="minimum">
- <double>-100.000000000000000</double>
+ <property name="maximumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
</property>
- <property name="maximum">
- <double>100.000000000000000</double>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-clip-right.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
</property>
</widget>
</item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_4">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_35">
<property name="text">
- <string>TX</string>
+ <string>Right clip</string>
</property>
</widget>
</item>
- <item row="0" column="3">
- <widget class="QDoubleSpinBox" name="pos_tx">
- <property name="suffix">
- <string> cm</string>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_36">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="decimals">
- <number>3</number>
+ <property name="minimumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
</property>
- <property name="minimum">
- <double>-100.000000000000000</double>
+ <property name="maximumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
</property>
- <property name="maximum">
- <double>100.000000000000000</double>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-clip-left.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_37">
<property name="text">
- <string>RY</string>
+ <string>Left clip</string>
</property>
</widget>
</item>
- <item row="1" column="2">
- <widget class="QLabel" name="label_5">
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_6">
+ <property name="styleSheet">
+ <string notr="true">QFrame { border: 0; }</string>
+ </property>
+ <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_17">
+ <property name="leftMargin">
+ <number>31</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_31">
<property name="text">
- <string>TY</string>
+ <string>Model used</string>
</property>
</widget>
</item>
- <item row="1" column="1">
- <widget class="QDoubleSpinBox" name="pos_ry">
- <property name="suffix">
- <string> deg.</string>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="model_used">
+ <item>
+ <property name="text">
+ <string>Cap</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Clip</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Clip left-handed</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_10">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Model position calibration</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_11">
+ <item row="0" column="0">
+ <widget class="QFrame" name="frame_3">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_12">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_61">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="decimals">
- <number>3</number>
+ <property name="text">
+ <string>x:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="tx_spin">
+ <property name="suffix">
+ <string> mm</string>
</property>
<property name="minimum">
- <double>-180.000000000000000</double>
+ <number>-65535</number>
</property>
<property name="maximum">
- <double>180.000000000000000</double>
+ <number>65536</number>
</property>
</widget>
</item>
- <item row="2" column="2">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>TZ</string>
+ <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>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_3">
<property name="text">
- <string>RZ</string>
+ <string>y:</string>
</property>
</widget>
</item>
- <item row="1" column="3">
- <widget class="QDoubleSpinBox" name="pos_ty">
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="ty_spin">
<property name="suffix">
- <string> cm</string>
- </property>
- <property name="decimals">
- <number>3</number>
+ <string> mm</string>
</property>
<property name="minimum">
- <double>-100.000000000000000</double>
+ <number>-65535</number>
</property>
<property name="maximum">
- <double>100.000000000000000</double>
+ <number>65536</number>
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_2">
+ <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>RX</string>
+ <string>z:</string>
</property>
</widget>
</item>
- <item row="0" column="1">
- <widget class="QDoubleSpinBox" name="pos_rx">
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="tz_spin">
<property name="suffix">
- <string> deg.</string>
- </property>
- <property name="decimals">
- <number>3</number>
+ <string> mm</string>
</property>
<property name="minimum">
- <double>-180.000000000000000</double>
+ <number>-65535</number>
</property>
<property name="maximum">
- <double>180.000000000000000</double>
+ <number>65536</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_59">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Only pitch and yaw during calibration.&lt;/p&gt;&lt;p&gt;Don't roll and don't translate.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="tcalib_button">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Toggle calibration</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
- <item>
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
@@ -1015,6 +1413,257 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="tab_6">
+ <attribute name="title">
+ <string>Filter</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_15">
+ <item row="0" column="0">
+ <widget class="QFrame" name="frame_4">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_14">
+ <item row="1" column="3">
+ <widget class="QSlider" name="rotation_slider">
+ <property name="maximum">
+ <number>99</number>
+ </property>
+ <property name="pageStep">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="lblSensYaw_6">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Rotation sensitivity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Smoothing</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="ewma_label">
+ <property name="minimumSize">
+ <size>
+ <width>48</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0 ms</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="rot_gain">
+ <property name="text">
+ <string>0°</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QSlider" name="ewma_slider">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="singleStep">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>25</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_27">
+ <property name="text">
+ <string>Translation deadzone</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_28">
+ <property name="text">
+ <string>Rotation deadzone</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="QSlider" name="rot_dz_slider">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="rot_dz">
+ <property name="text">
+ <string>0°</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3">
+ <widget class="QSlider" name="trans_dz_slider">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QLabel" name="trans_dz">
+ <property name="text">
+ <string>0mm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_30">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Translation sensitivity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="trans_gain">
+ <property name="text">
+ <string>0mm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QSlider" name="translation_slider">
+ <property name="maximum">
+ <number>99</number>
+ </property>
+ <property name="pageStep">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval">
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="groupBox_12">
+ <property name="title">
+ <string>GroupBox</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_13">
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_26111">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>7</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;&lt;a href=&quot;https://github.com/sthalik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br/&gt;Thanks to &lt;/span&gt;&lt;a href=&quot;https://github.com/dbaarda&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2015&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="indent">
+ <number>0</number>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Visit &lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;our wiki&lt;/span&gt;&lt;/a&gt; for description of the settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
<widget class="QWidget" name="tab_5">
<attribute name="title">
<string>Game detection</string>
@@ -1075,12 +1724,6 @@
<tabstop>camera_yaw</tabstop>
<tabstop>camera_pitch</tabstop>
<tabstop>camera_roll</tabstop>
- <tabstop>pos_rx</tabstop>
- <tabstop>pos_ry</tabstop>
- <tabstop>pos_rz</tabstop>
- <tabstop>pos_tx</tabstop>
- <tabstop>pos_ty</tabstop>
- <tabstop>pos_tz</tabstop>
<tabstop>tcomp_enable</tabstop>
<tabstop>tcomp_rz</tabstop>
<tabstop>src_yaw</tabstop>
@@ -1096,8 +1739,27 @@
<tabstop>src_z</tabstop>
<tabstop>invert_z</tabstop>
</tabstops>
- <resources/>
+ <resources>
+ <include location="ui-res.qrc"/>
+ </resources>
<connections/>
+ <designerdata>
+ <property name="gridDeltaX">
+ <number>5</number>
+ </property>
+ <property name="gridDeltaY">
+ <number>5</number>
+ </property>
+ <property name="gridSnapX">
+ <bool>true</bool>
+ </property>
+ <property name="gridSnapY">
+ <bool>true</bool>
+ </property>
+ <property name="gridVisible">
+ <bool>true</bool>
+ </property>
+ </designerdata>
<slots>
<slot>startEngineClicked()</slot>
<slot>stopEngineClicked()</slot>
diff --git a/facetracknoir/software-update-dialog.hpp b/facetracknoir/software-update-dialog.hpp
new file mode 100644
index 00000000..fe132402
--- /dev/null
+++ b/facetracknoir/software-update-dialog.hpp
@@ -0,0 +1,87 @@
+#pragma once
+
+#include <QtNetwork>
+#include <QDialog>
+#include <QSettings>
+#include <QString>
+#include <QRegExp>
+#include <functional>
+#include "ui_software-update.h"
+#include "opentrack/options.hpp"
+
+extern "C" const char* opentrack_version;
+
+class update_dialog : public QDialog
+{
+ Q_OBJECT
+public:
+ struct query
+ {
+ query(QWidget* parent) : parent(parent), qnam(parent) {}
+
+ QWidget* parent;
+ QNetworkAccessManager qnam;
+ QByteArray buf;
+ QNetworkReply* r;
+ void on_finished()
+ {
+ if (r->error() != QNetworkReply::NoError)
+ {
+ qDebug() << "update error" << r->errorString();
+ return;
+ }
+ QString str(buf);
+ QRegExp re("OPENTRACK_VERSION([a-zA-Z0-9_.-]+)");
+ int idx = re.indexIn(str);
+ if (idx != -1)
+ {
+ str = re.cap(1);
+ QSettings s(OPENTRACK_ORG);
+ QString quiet_version = s.value("quiet-update-version").toString();
+
+ if (!str.isEmpty() && str != opentrack_version && str != quiet_version)
+ {
+ qDebug() << "update version" << str;
+ update_dialog dlg(parent, *this, str);
+ dlg.show();
+ dlg.raise();
+ dlg.exec();
+ if (dlg.ui.disable_reminder->isChecked())
+ s.setValue("quiet-update-version", str);
+ }
+ }
+ buf.clear();
+ r->deleteLater();
+ }
+ void on_ready()
+ {
+ buf.append(r->readAll());
+ }
+ void maybe_show_dialog()
+ {
+ static auto uri = QStringLiteral("http://www.trackhat.org/#!opentrackversion/c1oxn");
+ r = qnam.get(QNetworkRequest(uri));
+
+ QObject::connect(r, &QNetworkReply::finished, [&]() { on_finished(); });
+ QObject::connect(r, &QNetworkReply::readyRead, [&]() { on_ready(); });
+ }
+ };
+private:
+ Ui::UpdateDialog ui;
+ query& q;
+private slots:
+ void close(QAbstractButton*)
+ {
+ QDialog::close();
+ }
+public:
+ update_dialog(QWidget* parent, query& q, const QString& new_version) : QDialog(parent), q(q)
+ {
+ ui.setupUi(this);
+ ui.ver_current->setText(const_cast<const char*>(opentrack_version));
+ ui.ver_new->setTextFormat(Qt::RichText);
+ ui.ver_new->setText("<a href='http://www.trackhat.org/#!trackhat-opentrack/c1jzc'>" + new_version + "</a>");
+ ui.ver_new->setOpenExternalLinks(true);
+ connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(close(QAbstractButton*)));
+ }
+};
diff --git a/facetracknoir/software-update.ui b/facetracknoir/software-update.ui
new file mode 100644
index 00000000..07edf66c
--- /dev/null
+++ b/facetracknoir/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/facetracknoir/trackhat-wizard.ui b/facetracknoir/trackhat-wizard.ui
new file mode 100644
index 00000000..09f68c03
--- /dev/null
+++ b/facetracknoir/trackhat-wizard.ui
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>wizard</class>
+ <widget class="QWizard" name="wizard">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>365</width>
+ <height>586</height>
+ </rect>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <property name="wizardStyle">
+ <enum>QWizard::AeroStyle</enum>
+ </property>
+ <property name="options">
+ <set>QWizard::NoCancelButton</set>
+ </property>
+ <widget class="QWizardPage" name="page_model">
+ <property name="title">
+ <string>Select a model</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QFrame" name="frame_7">
+ <property name="styleSheet">
+ <string notr="true">QFrame {
+ border: 0;
+ background: transparent;
+}</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>20</number>
+ </property>
+ <property name="bottomMargin">
+ <number>12</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_12">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>120</width>
+ <height>108</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>120</width>
+ <height>108</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-hat.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_46">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-clip-right.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_48">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>130</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="ui-res.qrc">:/images/trackhat-clip-left.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="cap_model">
+ <property name="text">
+ <string>Cap</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="clip_model">
+ <property name="text">
+ <string>Clip, right-handed</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="clip_model_left">
+ <property name="text">
+ <string>Clip, left-handed</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWizardPage" name="page_done">
+ <property name="title">
+ <string>We're all done!</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_7">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can now use your new hardware and thanks for flying TrackHat.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources>
+ <include location="ui-res.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/ftnoir_tracker_pt/trans_calib.cpp b/facetracknoir/trans_calib.cpp
index a1a4b641..a1a4b641 100644
--- a/ftnoir_tracker_pt/trans_calib.cpp
+++ b/facetracknoir/trans_calib.cpp
diff --git a/ftnoir_tracker_pt/trans_calib.h b/facetracknoir/trans_calib.h
index e20fc767..e20fc767 100644
--- a/ftnoir_tracker_pt/trans_calib.h
+++ b/facetracknoir/trans_calib.h
diff --git a/facetracknoir/ui-res.qrc b/facetracknoir/ui-res.qrc
index 030a6153..ec1c7bba 100644
--- a/facetracknoir/ui-res.qrc
+++ b/facetracknoir/ui-res.qrc
@@ -6,5 +6,8 @@
<file>images/facetracknoir.png</file>
<file>images/no-feed.png</file>
<file>images/filter-16.png</file>
+ <file>images/trackhat-clip-left.png</file>
+ <file>images/trackhat-clip-right.png</file>
+ <file>images/trackhat-hat.png</file>
</qresource>
</RCC>
diff --git a/facetracknoir/ui.cpp b/facetracknoir/ui.cpp
index d0a5e93c..ba8c5531 100644
--- a/facetracknoir/ui.cpp
+++ b/facetracknoir/ui.cpp
@@ -9,6 +9,8 @@
#include "ui.h"
#include "opentrack/tracker.h"
#include "opentrack/options.hpp"
+#include "ftnoir_tracker_pt/ftnoir_tracker_pt.h"
+#include "ftnoir_filter_accela/ftnoir_filter_accela.h"
#include "facetracknoir/new_file_dialog.h"
#include <QFileDialog>
#include <QDesktopServices>
@@ -23,7 +25,8 @@ MainWindow::MainWindow() :
pose_update_timer(this),
kbd_quit(QKeySequence("Ctrl+Q"), this),
no_feed_pixmap(":/images/no-feed.png"),
- is_refreshing_profiles(false)
+ is_refreshing_profiles(false),
+ update_query(this)
{
ui.setupUi(this);
@@ -34,41 +37,21 @@ MainWindow::MainWindow() :
connect(ui.btnEditCurves, SIGNAL(clicked()), this, SLOT(showCurveConfiguration()));
connect(ui.btnShortcuts, SIGNAL(clicked()), this, SLOT(show_options_dialog()));
- connect(ui.btnShowEngineControls, SIGNAL(clicked()), this, SLOT(showTrackerSettings()));
connect(ui.btnShowServerControls, SIGNAL(clicked()), this, SLOT(showProtocolSettings()));
- connect(ui.btnShowFilterControls, SIGNAL(clicked()), this, SLOT(showFilterSettings()));
-
- modules.filters().push_front(std::make_shared<dylib>("", dylib::Filter));
-
- for (auto x : modules.trackers())
- ui.iconcomboTrackerSource->addItem(x->icon, x->name);
for (auto x : modules.protocols())
ui.iconcomboProtocol->addItem(x->icon, x->name);
- for (auto x : modules.filters())
- ui.iconcomboFilter->addItem(x->icon, x->name);
-
refresh_config_list();
connect(&config_list_timer, SIGNAL(timeout()), this, SLOT(refresh_config_list()));
config_list_timer.start(1000 * 3);
- tie_setting(s.tracker_dll, ui.iconcomboTrackerSource);
tie_setting(s.protocol_dll, ui.iconcomboProtocol);
- tie_setting(s.filter_dll, ui.iconcomboFilter);
-
- connect(ui.iconcomboTrackerSource,
- &QComboBox::currentTextChanged,
- [&](QString) -> void { if (pTrackerDialog) pTrackerDialog = nullptr; save(); });
connect(ui.iconcomboProtocol,
&QComboBox::currentTextChanged,
[&](QString) -> void { if (pProtocolDialog) pProtocolDialog = nullptr; save(); });
- connect(ui.iconcomboFilter,
- &QComboBox::currentTextChanged,
- [&](QString) -> void { if (pFilterDialog) pFilterDialog = nullptr; save(); });
-
connect(ui.btnStartTracker, SIGNAL(clicked()), this, SLOT(startTracker()));
connect(ui.btnStopTracker, SIGNAL(clicked()), this, SLOT(stopTracker()));
connect(ui.iconcomboProfile, SIGNAL(currentTextChanged(QString)), this, SLOT(profileSelected(QString)));
@@ -110,6 +93,16 @@ MainWindow::MainWindow() :
QMessageBox::Ok, QMessageBox::NoButton);
ui.btnStartTracker->setFocus();
+
+ update_query.maybe_show_dialog();
+}
+
+void MainWindow::closeEvent(QCloseEvent *e)
+{
+ if (maybe_not_close_tracking())
+ e->ignore();
+ else
+ e->accept();
}
bool MainWindow::get_new_config_name_from_dialog(QString& ret)
@@ -247,8 +240,6 @@ void MainWindow::updateButtonState(bool running, bool inertialp)
ui.btnStartTracker->setEnabled ( not_running );
ui.btnStopTracker->setEnabled ( running );
ui.iconcomboProtocol->setEnabled ( not_running );
- ui.iconcomboFilter->setEnabled ( not_running );
- ui.iconcomboTrackerSource->setEnabled(not_running);
ui.video_frame_label->setVisible(not_running || inertialp);
ui.profile_button->setEnabled(not_running);
}
@@ -264,7 +255,7 @@ void MainWindow::startTracker() {
// tracker dtor needs run first
work = nullptr;
- libs = SelectedLibraries(ui.video_frame, current_tracker(), current_protocol(), current_filter());
+ libs = SelectedLibraries(ui.video_frame, std::make_shared<Tracker_PT>(), current_protocol(), std::make_shared<FTNoIR_Filter>());
{
double p[6] = {0,0,0, 0,0,0};
@@ -285,12 +276,6 @@ void MainWindow::startTracker() {
reload_options();
- if (pTrackerDialog)
- pTrackerDialog->register_tracker(libs.pTracker.get());
-
- if (pFilterDialog)
- pFilterDialog->register_filter(libs.pFilter.get());
-
if (pProtocolDialog)
pProtocolDialog->register_protocol(libs.pProtocol.get());
@@ -312,17 +297,9 @@ void MainWindow::stopTracker( ) {
pose_update_timer.stop();
ui.pose_display->rotateBy(0, 0, 0, 0, 0, 0);
- if (pTrackerDialog)
- pTrackerDialog->unregister_tracker();
-
if (pProtocolDialog)
pProtocolDialog->unregister_protocol();
- if (pFilterDialog)
- pFilterDialog->unregister_filter();
-
- maybe_save();
-
work = nullptr;
libs = SelectedLibraries();
@@ -379,7 +356,7 @@ void MainWindow::set_title(const QString& game_title_)
if (game_title_ != "")
game_title = " :: " + game_title_;
QString current = group::ini_filename();
- setWindowTitle(opentrack_version + QStringLiteral(" :: ") + current + game_title);
+ setWindowTitle(opentrack_version + QStringLiteral(" opentrack") + QStringLiteral(" :: ") + current + game_title);
}
void MainWindow::showHeadPose()
@@ -392,12 +369,12 @@ void MainWindow::showHeadPose()
}
template<typename t>
-bool mk_dialog(mem<dylib> lib, mem<t>& orig)
+bool mk_dialog(mem<dylib> lib, mem<t>* orig)
{
- if (orig && orig->isVisible())
+ if (*orig && (*orig)->isVisible())
{
- orig->show();
- orig->raise();
+ (*orig)->show();
+ (*orig)->raise();
return false;
}
@@ -407,34 +384,19 @@ bool mk_dialog(mem<dylib> lib, mem<t>& orig)
dialog->setWindowFlags(Qt::Dialog);
dialog->setFixedSize(dialog->size());
- orig = dialog;
+ *orig = dialog;
dialog->show();
dialog->raise();
- QObject::connect(dialog.get(), &BaseDialog::closing, [&]() -> void { orig = nullptr; });
-
return true;
}
return false;
}
-
-void MainWindow::showTrackerSettings()
-{
- if (mk_dialog(current_tracker(), pTrackerDialog) && libs.pTracker)
- pTrackerDialog->register_tracker(libs.pTracker.get());
-}
-
void MainWindow::showProtocolSettings() {
- if (mk_dialog(current_protocol(), pProtocolDialog) && libs.pProtocol)
+ if (mk_dialog(current_protocol(), &pProtocolDialog) && libs.pProtocol)
pProtocolDialog->register_protocol(libs.pProtocol.get());
}
-
-void MainWindow::showFilterSettings() {
- if (mk_dialog(current_filter(), pFilterDialog) && libs.pFilter)
- pFilterDialog->register_filter(libs.pFilter.get());
-}
-
template<typename t, typename... Args>
bool mk_window(mem<t>* place, Args... params)
{
@@ -455,7 +417,7 @@ bool mk_window(mem<t>* place, Args... params)
}
void MainWindow::show_options_dialog() {
- if (mk_window(&options_widget))
+ if (mk_window<OptionsDialog, State&>(&options_widget, static_cast<State&>(*this)))
connect(options_widget.get(), SIGNAL(reload()), this, SLOT(reload_options()));
}
@@ -463,12 +425,29 @@ void MainWindow::showCurveConfiguration() {
mk_window<MapWidget, Mappings&, main_settings&>(&mapping_widget, pose, s);
}
+bool MainWindow::maybe_not_close_tracking()
+{
+ if (work != nullptr)
+ {
+ auto btn = QMessageBox::warning(this, "Tracking active",
+ "Are you sure you want to exit? This will terminate tracking.",
+ QMessageBox::Yes, QMessageBox::No);
+ if (btn == QMessageBox::No)
+ return true;
+ }
+ return false;
+}
+
void MainWindow::exit() {
- QCoreApplication::exit(0);
+
+ if (!maybe_not_close_tracking())
+ QCoreApplication::exit(0);
}
void MainWindow::profileSelected(QString name)
{
+ maybe_save();
+
if (name == "" || is_refreshing_profiles)
return;
diff --git a/facetracknoir/ui.h b/facetracknoir/ui.h
index 91e4ebbf..4d8bb1cc 100644
--- a/facetracknoir/ui.h
+++ b/facetracknoir/ui.h
@@ -29,6 +29,7 @@
#include "curve-config.h"
#include "options-dialog.hpp"
#include "process_detector.h"
+#include "facetracknoir/software-update-dialog.hpp"
using namespace options;
@@ -45,26 +46,17 @@ class MainWindow : public QMainWindow, private State
mem<MapWidget> mapping_widget;
QShortcut kbd_quit;
QPixmap no_feed_pixmap;
- mem<IFilterDialog> pFilterDialog;
mem<IProtocolDialog> pProtocolDialog;
- mem<ITrackerDialog> pTrackerDialog;
process_detector_worker det;
QMenu profile_menu;
bool is_refreshing_profiles;
QTimer save_timer;
+ update_dialog::query update_query;
- mem<dylib> current_tracker()
- {
- return modules.trackers().value(ui.iconcomboTrackerSource->currentIndex(), nullptr);
- }
mem<dylib> current_protocol()
{
return modules.protocols().value(ui.iconcomboProtocol->currentIndex(), nullptr);
}
- mem<dylib> current_filter()
- {
- return modules.filters().value(ui.iconcomboFilter->currentIndex(), nullptr);
- }
void changeEvent(QEvent* e) override;
@@ -76,15 +68,15 @@ class MainWindow : public QMainWindow, private State
static bool get_new_config_name_from_dialog(QString &ret);
void set_profile(const QString& profile);
void maybe_save();
+ bool maybe_not_close_tracking();
+ void closeEvent(QCloseEvent *e) override;
private slots:
void _save();
void save();
void exit();
void profileSelected(QString name);
- void showTrackerSettings();
void showProtocolSettings();
- void showFilterSettings();
void show_options_dialog();
void showCurveConfiguration();
void showHeadPose();
diff --git a/facetracknoir/wizard.cpp b/facetracknoir/wizard.cpp
new file mode 100644
index 00000000..cae4f6cc
--- /dev/null
+++ b/facetracknoir/wizard.cpp
@@ -0,0 +1,80 @@
+#include "wizard.h"
+#include "opentrack/state.hpp"
+#include "ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h"
+#include "ftnoir_filter_accela/ftnoir_filter_accela.h"
+
+Wizard::Wizard() : QWizard(nullptr)
+{
+ ui.setupUi(this);
+ connect(this, SIGNAL(accepted()), this, SLOT(set_data()));
+}
+
+static constexpr double tz[][2] = {
+ { 16.5327205657959, 13.0232553482056 },
+ { 55.4535026550293, 100 },
+ { 56.8312301635742, 100 },
+ { -1, -1 },
+};
+
+static constexpr double yaw[][2] = {
+ { 10.7462686567164, 20.9302325581395 },
+ { 41.9517784118652, 180 },
+ { -1, -1 },
+};
+
+static constexpr double pitch[][2] = {
+ { 10.1262916188289, 27.6279069767442 },
+ { 32.4454649827784, 180 },
+ { -1, -1 },
+};
+
+static constexpr double roll[][2] = {
+ { 12.3995409011841, 25.9534893035889 },
+ { 54.3513221740723, 180 },
+ { -1, -1 },
+};
+
+static void set_mapping(Mapping& m, const double spline[][2])
+{
+ m.opts.altp = false;
+ m.curve.removeAllPoints();
+ for (int i = 0; spline[i][0] >= 0; i++)
+ m.curve.addPoint(QPointF(spline[i][0], spline[i][1]));
+}
+
+void Wizard::set_data()
+{
+ Model m;
+
+ if (ui.clip_model->isChecked())
+ m = ClipRight;
+ else if (ui.clip_model_left->isChecked())
+ m = ClipLeft;
+ else // ui.cap_model
+ m = Cap;
+
+ State state;
+
+ set_mapping(state.pose(TZ), tz);
+ set_mapping(state.pose(Yaw), yaw);
+ set_mapping(state.pose(Pitch), pitch);
+ set_mapping(state.pose(Roll), roll);
+ state.pose.save_mappings();
+
+ settings_pt pt;
+ pt.threshold = 31;
+ pt.min_point_size = 0;
+ pt.max_point_size = 50;
+ pt.fov = 1;
+ pt.camera_mode = 0;
+ pt.model_used = m;
+ pt.b->save();
+
+ settings_accela acc;
+ acc.ewma = 49;
+ acc.rot_threshold = 29;
+ acc.rot_deadzone = 29;
+ acc.trans_deadzone = 33;
+ acc.trans_threshold = 19;
+ acc.b->save();
+}
diff --git a/facetracknoir/wizard.h b/facetracknoir/wizard.h
new file mode 100644
index 00000000..ea848e36
--- /dev/null
+++ b/facetracknoir/wizard.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include "opentrack/options.hpp"
+#include "opentrack/main-settings.hpp"
+#include "opentrack/mappings.hpp"
+#include "ui_trackhat-wizard.h"
+#include <QObject>
+#include <QWizard>
+
+class Wizard : public QWizard
+{
+ Q_OBJECT
+ Ui_wizard ui;
+public:
+ Wizard();
+
+ enum Model { Cap = 0, ClipRight = 1, ClipLeft = 2 };
+ enum { ClipRightX = 135, ClipLeftX = -135 };
+private slots:
+ void set_data();
+};
diff --git a/ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui b/ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui
deleted file mode 100644
index 3ab9a78e..00000000
--- a/ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui
+++ /dev/null
@@ -1,300 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>AccelaUICFilterControls</class>
- <widget class="QWidget" name="AccelaUICFilterControls">
- <property name="windowModality">
- <enum>Qt::NonModal</enum>
- </property>
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>501</width>
- <height>359</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Accela filter settings</string>
- </property>
- <property name="windowIcon">
- <iconset resource="../facetracknoir/ui-res.qrc">
- <normaloff>:/images/filter-16.png</normaloff>:/images/filter-16.png</iconset>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="1" column="3">
- <widget class="QSlider" name="rotation_slider">
- <property name="maximum">
- <number>99</number>
- </property>
- <property name="pageStep">
- <number>5</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="tickPosition">
- <enum>QSlider::TicksAbove</enum>
- </property>
- <property name="tickInterval">
- <number>25</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="lblSensYaw_6">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Rotation sensitivity</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Smoothing</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="ewma_label">
- <property name="minimumSize">
- <size>
- <width>48</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>0 ms</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="rot_gain">
- <property name="text">
- <string>0°</string>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QSlider" name="ewma_slider">
- <property name="maximum">
- <number>100</number>
- </property>
- <property name="singleStep">
- <number>10</number>
- </property>
- <property name="pageStep">
- <number>25</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="tickPosition">
- <enum>QSlider::TicksAbove</enum>
- </property>
- <property name="tickInterval">
- <number>25</number>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Translation deadzone</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Rotation deadzone</string>
- </property>
- </widget>
- </item>
- <item row="4" column="3">
- <widget class="QSlider" name="rot_dz_slider">
- <property name="maximum">
- <number>100</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QLabel" name="rot_dz">
- <property name="text">
- <string>0°</string>
- </property>
- </widget>
- </item>
- <item row="6" column="3">
- <widget class="QSlider" name="trans_dz_slider">
- <property name="maximum">
- <number>100</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QLabel" name="trans_dz">
- <property name="text">
- <string>0mm</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Translation sensitivity</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QLabel" name="trans_gain">
- <property name="text">
- <string>0mm</string>
- </property>
- </widget>
- </item>
- <item row="5" column="3">
- <widget class="QSlider" name="translation_slider">
- <property name="maximum">
- <number>99</number>
- </property>
- <property name="pageStep">
- <number>5</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="tickPosition">
- <enum>QSlider::TicksAbove</enum>
- </property>
- <property name="tickInterval">
- <number>25</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string/>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="1">
- <widget class="QLabel" name="label_9">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <pointsize>7</pointsize>
- </font>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;&lt;a href=&quot;https://github.com/sthalik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br/&gt;Thanks to &lt;/span&gt;&lt;a href=&quot;https://github.com/dbaarda&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2015&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="textFormat">
- <enum>Qt::RichText</enum>
- </property>
- <property name="scaledContents">
- <bool>false</bool>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <property name="indent">
- <number>0</number>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_3">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Visit &lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;our wiki&lt;/span&gt;&lt;/a&gt; for description of the settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>buttonBox</tabstop>
- </tabstops>
- <resources>
- <include location="../facetracknoir/ui-res.qrc"/>
- </resources>
- <connections/>
- <slots>
- <slot>startEngineClicked()</slot>
- <slot>stopEngineClicked()</slot>
- <slot>cameraSettingsClicked()</slot>
- </slots>
-</ui>
diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.cpp b/ftnoir_filter_accela/ftnoir_filter_accela.cpp
index 9bac5d58..51e79ec2 100644
--- a/ftnoir_filter_accela/ftnoir_filter_accela.cpp
+++ b/ftnoir_filter_accela/ftnoir_filter_accela.cpp
@@ -124,6 +124,3 @@ void FTNoIR_Filter::filter(const double* input, double *output)
last_output[i] = output[i] = elide_nan(ret, last_output[i]);
}
}
-
-OPENTRACK_DECLARE_FILTER(FTNoIR_Filter, FilterControls, FTNoIR_FilterDll)
-
diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.h b/ftnoir_filter_accela/ftnoir_filter_accela.h
index a6f04dfa..6e36525b 100644
--- a/ftnoir_filter_accela/ftnoir_filter_accela.h
+++ b/ftnoir_filter_accela/ftnoir_filter_accela.h
@@ -5,7 +5,6 @@
* copyright notice and this permission notice appear in all copies.
*/
#pragma once
-#include "ui_ftnoir_accela_filtercontrols.h"
#include "opentrack/plugin-api.hpp"
#include "qfunctionconfigurator/functionconfig.h"
#include <atomic>
@@ -47,33 +46,3 @@ private:
double smoothed_input[6];
Timer t;
};
-
-class FilterControls: public IFilterDialog
-{
- Q_OBJECT
-public:
- FilterControls();
- void register_filter(IFilter* filter);
- void unregister_filter();
-private:
- Ui::AccelaUICFilterControls ui;
- void discard();
- void save();
- FTNoIR_Filter* accela_filter;
- settings_accela s;
-private slots:
- void doOK();
- void doCancel();
- void update_ewma_display(int value);
- void update_rot_display(int value);
- void update_trans_display(int value);
- void update_rot_dz_display(int value);
- void update_trans_dz_display(int value);
-};
-
-class FTNoIR_FilterDll : public Metadata
-{
-public:
- QString name() { return QString("Accela"); }
- QIcon icon() { return QIcon(":/images/filter-16.png"); }
-};
diff --git a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp b/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp
deleted file mode 100644
index 3400ac92..00000000
--- a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Copyright (c) 2012-2015 Stanislaw Halik
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-#include "ftnoir_filter_accela/ftnoir_filter_accela.h"
-#include <cmath>
-#include <QDebug>
-#include <algorithm>
-#include <QDoubleSpinBox>
-#include "opentrack/plugin-api.hpp"
-#include "qfunctionconfigurator/qfunctionconfigurator.h"
-#include <QDialog>
-
-FilterControls::FilterControls() :
- accela_filter(nullptr)
-{
- ui.setupUi( this );
-
- connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK()));
- connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel()));
-
- connect(ui.rotation_slider, SIGNAL(valueChanged(int)), this, SLOT(update_rot_display(int)));
- connect(ui.translation_slider, SIGNAL(valueChanged(int)), this, SLOT(update_trans_display(int)));
- connect(ui.ewma_slider, SIGNAL(valueChanged(int)), this, SLOT(update_ewma_display(int)));
- connect(ui.rot_dz_slider, SIGNAL(valueChanged(int)), this, SLOT(update_rot_dz_display(int)));
- connect(ui.trans_dz_slider, SIGNAL(valueChanged(int)), this, SLOT(update_trans_dz_display(int)));
-
- tie_setting(s.rot_threshold, ui.rotation_slider);
- tie_setting(s.trans_threshold, ui.translation_slider);
- tie_setting(s.ewma, ui.ewma_slider);
- tie_setting(s.rot_deadzone, ui.rot_dz_slider);
- tie_setting(s.trans_deadzone, ui.trans_dz_slider);
-
- update_rot_display(ui.rotation_slider->value());
- update_trans_display(ui.translation_slider->value());
- update_ewma_display(ui.ewma_slider->value());
- update_rot_dz_display(ui.rot_dz_slider->value());
- update_trans_dz_display(ui.trans_dz_slider->value());
-}
-
-void FilterControls::register_filter(IFilter* filter)
-{
- accela_filter = static_cast<FTNoIR_Filter*>(filter);
-//#define LEAKING_DEBUG
-#ifdef LEAKING_DEBUG
- auto d = new QDialog();
- auto r = new QFunctionConfigurator(d);
- r->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- r->setConfig(&accela_filter->rot, "");
- r->setFixedSize(800, 300);
- d->show();
-#endif
-}
-
-void FilterControls::unregister_filter()
-{
- accela_filter = nullptr;
-}
-
-void FilterControls::doOK() {
- save();
- this->close();
-}
-
-void FilterControls::doCancel() {
- discard();
- close();
-}
-
-void FilterControls::discard()
-{
- s.b->reload();
-}
-
-void FilterControls::save() {
- s.b->save();
-}
-
-void FilterControls::update_rot_display(int value)
-{
- ui.rot_gain->setText(QString::number((value + 1) * s.mult_rot) + "°");
-}
-
-void FilterControls::update_trans_display(int value)
-{
- ui.trans_gain->setText(QString::number((value + 1) * s.mult_trans) + "mm");
-}
-
-void FilterControls::update_ewma_display(int value)
-{
- ui.ewma_label->setText(QString::number(value * s.mult_ewma) + "ms");
-}
-
-void FilterControls::update_rot_dz_display(int value)
-{
- ui.rot_dz->setText(QString::number(value * s.mult_rot_dz) + "°");
-}
-
-void FilterControls::update_trans_dz_display(int value)
-{
- ui.trans_dz->setText(QString::number(value * s.mult_trans_dz) + "mm");
-}
-
diff --git a/ftnoir_tracker_pt/FTNoIR_PT_Controls.ui b/ftnoir_tracker_pt/FTNoIR_PT_Controls.ui
deleted file mode 100644
index 88575644..00000000
--- a/ftnoir_tracker_pt/FTNoIR_PT_Controls.ui
+++ /dev/null
@@ -1,1220 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>UICPTClientControls</class>
- <widget class="QWidget" name="UICPTClientControls">
- <property name="windowModality">
- <enum>Qt::NonModal</enum>
- </property>
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>424</width>
- <height>579</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="windowTitle">
- <string>PointTracker Settings</string>
- </property>
- <property name="windowIcon">
- <iconset resource="ftnoir_tracker_pt.qrc">
- <normaloff>:/Resources/Logo_IR.png</normaloff>:/Resources/Logo_IR.png</iconset>
- </property>
- <property name="layoutDirection">
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <layout class="QGridLayout" name="gridLayout_9">
- <property name="sizeConstraint">
- <enum>QLayout::SetFixedSize</enum>
- </property>
- <item row="0" column="0">
- <widget class="QTabWidget" name="tabWidget">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="tab_2">
- <attribute name="title">
- <string>Camera</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>Camera settings</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="3" column="0">
- <widget class="QLabel" name="label_37">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>FPS</string>
- </property>
- <property name="buddy">
- <cstring>fps_spin</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QSpinBox" name="res_y_spin">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Desired capture height</string>
- </property>
- <property name="suffix">
- <string> px</string>
- </property>
- <property name="maximum">
- <number>2000</number>
- </property>
- <property name="singleStep">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Diagonal field of view</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_36">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Width</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QSpinBox" name="fov">
- <property name="suffix">
- <string>°</string>
- </property>
- <property name="prefix">
- <string/>
- </property>
- <property name="minimum">
- <number>10</number>
- </property>
- <property name="maximum">
- <number>90</number>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QCheckBox" name="dynamic_pose">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_5">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Dynamic pose resolution</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Dynamic pose timeout</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QSpinBox" name="fps_spin">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Desired capture framerate</string>
- </property>
- <property name="suffix">
- <string> Hz</string>
- </property>
- <property name="maximum">
- <number>2000</number>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QSpinBox" name="init_phase_timeout">
- <property name="suffix">
- <string> ms</string>
- </property>
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>10000</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_41">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Height</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QSpinBox" name="res_x_spin">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Desired capture width</string>
- </property>
- <property name="suffix">
- <string> px</string>
- </property>
- <property name="maximum">
- <number>2000</number>
- </property>
- <property name="singleStep">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QComboBox" name="camdevice_combo">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumContentsLength">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Device</string>
- </property>
- <property name="buddy">
- <cstring>camdevice_combo</cstring>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Camera settings dialog</string>
- </property>
- </widget>
- </item>
- <item row="7" column="1">
- <widget class="QPushButton" name="camera_settings">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Open</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="groupBox_2">
- <property name="title">
- <string>Point extraction</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_7">
- <item row="3" column="0">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>Max size</string>
- </property>
- <property name="buddy">
- <cstring>maxdiam_spin</cstring>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Threshold</string>
- </property>
- <property name="buddy">
- <cstring>threshold_slider</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Min size</string>
- </property>
- <property name="buddy">
- <cstring>mindiam_spin</cstring>
- </property>
- </widget>
- </item>
- <item row="1" column="1" colspan="2">
- <widget class="QSlider" name="threshold_slider">
- <property name="toolTip">
- <string>Intensity threshold for point extraction</string>
- </property>
- <property name="maximum">
- <number>255</number>
- </property>
- <property name="pageStep">
- <number>1</number>
- </property>
- <property name="value">
- <number>127</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="tickPosition">
- <enum>QSlider::TicksBothSides</enum>
- </property>
- <property name="tickInterval">
- <number>25</number>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>Automatic threshold</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QCheckBox" name="auto_threshold">
- <property name="text">
- <string>Enable, slider sets point size</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QDoubleSpinBox" name="maxdiam_spin">
- <property name="toolTip">
- <string>Maximum point diameter</string>
- </property>
- <property name="suffix">
- <string> px</string>
- </property>
- <property name="decimals">
- <number>1</number>
- </property>
- <property name="singleStep">
- <double>0.100000000000000</double>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QDoubleSpinBox" name="mindiam_spin">
- <property name="toolTip">
- <string>Minimum point diameter</string>
- </property>
- <property name="suffix">
- <string> px</string>
- </property>
- <property name="decimals">
- <number>1</number>
- </property>
- <property name="singleStep">
- <double>0.100000000000000</double>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_4">
- <attribute name="title">
- <string>Model</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0">
- <widget class="QTabWidget" name="model_tabs">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="tabShape">
- <enum>QTabWidget::Rounded</enum>
- </property>
- <property name="currentIndex">
- <number>0</number>
- </property>
- <property name="usesScrollButtons">
- <bool>false</bool>
- </property>
- <property name="documentMode">
- <bool>false</bool>
- </property>
- <property name="tabsClosable">
- <bool>false</bool>
- </property>
- <widget class="QWidget" name="tab_5">
- <attribute name="title">
- <string>Clip</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_6">
- <item row="0" column="0">
- <widget class="QGroupBox" name="groupBox_8">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>331</width>
- <height>208</height>
- </size>
- </property>
- <property name="title">
- <string>Model Dimensions</string>
- </property>
- <widget class="QSpinBox" name="clip_tlength_spin">
- <property name="geometry">
- <rect>
- <x>70</x>
- <y>35</y>
- <width>100</width>
- <height>22</height>
- </rect>
- </property>
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- <widget class="QSpinBox" name="clip_bheight_spin">
- <property name="geometry">
- <rect>
- <x>150</x>
- <y>130</y>
- <width>100</width>
- <height>22</height>
- </rect>
- </property>
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- <widget class="QLabel" name="label_44">
- <property name="geometry">
- <rect>
- <x>65</x>
- <y>55</y>
- <width>71</width>
- <height>111</height>
- </rect>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="ftnoir_tracker_pt.qrc">:/Resources/clip_side.png</pixmap>
- </property>
- </widget>
- <widget class="QLabel" name="label_50">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>40</y>
- <width>46</width>
- <height>13</height>
- </rect>
- </property>
- <property name="text">
- <string>Side</string>
- </property>
- </widget>
- <widget class="QSpinBox" name="clip_blength_spin">
- <property name="geometry">
- <rect>
- <x>50</x>
- <y>160</y>
- <width>100</width>
- <height>22</height>
- </rect>
- </property>
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- <widget class="QSpinBox" name="clip_theight_spin">
- <property name="geometry">
- <rect>
- <x>150</x>
- <y>70</y>
- <width>100</width>
- <height>22</height>
- </rect>
- </property>
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- <widget class="QLabel" name="label_51">
- <property name="geometry">
- <rect>
- <x>290</x>
- <y>40</y>
- <width>46</width>
- <height>13</height>
- </rect>
- </property>
- <property name="text">
- <string>Front</string>
- </property>
- </widget>
- <widget class="QLabel" name="label_45">
- <property name="geometry">
- <rect>
- <x>300</x>
- <y>70</y>
- <width>21</width>
- <height>111</height>
- </rect>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="ftnoir_tracker_pt.qrc">:/Resources/clip_front.png</pixmap>
- </property>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_6">
- <attribute name="title">
- <string>Cap</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_14">
- <item>
- <widget class="QGroupBox" name="groupBox_9">
- <property name="minimumSize">
- <size>
- <width>331</width>
- <height>208</height>
- </size>
- </property>
- <property name="title">
- <string>Model Dimensions</string>
- </property>
- <widget class="QLabel" name="label_46">
- <property name="geometry">
- <rect>
- <x>100</x>
- <y>60</y>
- <width>111</width>
- <height>81</height>
- </rect>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="ftnoir_tracker_pt.qrc">:/Resources/cap_side.png</pixmap>
- </property>
- </widget>
- <widget class="QLabel" name="label_48">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>40</y>
- <width>46</width>
- <height>13</height>
- </rect>
- </property>
- <property name="text">
- <string>Side</string>
- </property>
- </widget>
- <widget class="QSpinBox" name="cap_length_spin">
- <property name="geometry">
- <rect>
- <x>90</x>
- <y>40</y>
- <width>101</width>
- <height>22</height>
- </rect>
- </property>
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- <widget class="QLabel" name="label_47">
- <property name="geometry">
- <rect>
- <x>220</x>
- <y>100</y>
- <width>81</width>
- <height>81</height>
- </rect>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="ftnoir_tracker_pt.qrc">:/Resources/cap_front.png</pixmap>
- </property>
- </widget>
- <widget class="QSpinBox" name="cap_width_spin">
- <property name="geometry">
- <rect>
- <x>240</x>
- <y>70</y>
- <width>81</width>
- <height>22</height>
- </rect>
- </property>
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- <widget class="QLabel" name="label_49">
- <property name="geometry">
- <rect>
- <x>240</x>
- <y>40</y>
- <width>46</width>
- <height>13</height>
- </rect>
- </property>
- <property name="text">
- <string>Front</string>
- </property>
- </widget>
- <widget class="QSpinBox" name="cap_height_spin">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>90</y>
- <width>81</width>
- <height>22</height>
- </rect>
- </property>
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_7">
- <attribute name="title">
- <string>Custom</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QGroupBox" name="groupBox_7">
- <property name="title">
- <string>Model Dimensions</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="3" column="1">
- <widget class="QLabel" name="label_57">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>z:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="5">
- <widget class="QSpinBox" name="m2y_spin">
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="label_63">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>x:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QSpinBox" name="m1x_spin">
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QSpinBox" name="m1y_spin">
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- </item>
- <item row="3" column="5">
- <widget class="QSpinBox" name="m2z_spin">
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- </item>
- <item row="1" column="5">
- <widget class="QSpinBox" name="m2x_spin">
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- </item>
- <item row="0" column="0" colspan="6">
- <widget class="QLabel" name="label_56">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Location of the two remaining model points&lt;br/&gt;with respect to the reference point in default pose&lt;/p&gt;&lt;p&gt;Use any units you want, not necessarily centimeters.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QSpinBox" name="m1z_spin">
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65535</number>
- </property>
- </widget>
- </item>
- <item row="2" column="4">
- <widget class="QLabel" name="label_70">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>y:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QLabel" name="label_67">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>x:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QLabel" name="label_64">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:16pt;&quot;&gt;P&lt;/span&gt;&lt;span style=&quot; font-size:16pt; vertical-align:sub;&quot;&gt;3&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_60">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:16pt;&quot;&gt;P&lt;/span&gt;&lt;span style=&quot; font-size:16pt; vertical-align:sub;&quot;&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- <item row="3" column="4">
- <widget class="QLabel" name="label_69">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>z:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="label_58">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>y:</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QGroupBox" name="groupBox_10">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string>Model position</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_4">
- <item row="0" column="0">
- <widget class="QFrame" name="frame_2">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_11">
- <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>x:</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QSpinBox" name="tx_spin">
- <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>y:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QSpinBox" name="ty_spin">
- <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>z:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QSpinBox" name="tz_spin">
- <property name="suffix">
- <string> mm</string>
- </property>
- <property name="minimum">
- <number>-65535</number>
- </property>
- <property name="maximum">
- <number>65536</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/model-calibration-for-PT-and-Aruco-trackers&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Instructions on the opentrack wiki&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="tcalib_button">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Toggle calibration</string>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_3">
- <attribute name="title">
- <string>About</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_8">
- <item row="0" column="0">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;FTNoIR PointTracker Plugin&lt;br/&gt;Version 1.1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;by Patrick Ruoff&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://ftnoirpt.sourceforge.net/&quot;&gt;&lt;span style=&quot; font-weight:600; text-decoration: underline; color:#0000ff;&quot;&gt;Manual (external)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="label_35">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="ftnoir_tracker_pt.qrc">:/Resources/Logo_IR.png</pixmap>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QGroupBox" name="groupBox_5">
- <property name="title">
- <string>Status</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_10">
- <item row="1" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Extracted Points:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_38">
- <property name="text">
- <string>Camera Info:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="pointinfo_label">
- <property name="minimumSize">
- <size>
- <width>50</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="caminfo_label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>120</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>tabWidget</tabstop>
- <tabstop>camdevice_combo</tabstop>
- <tabstop>res_x_spin</tabstop>
- <tabstop>res_y_spin</tabstop>
- <tabstop>fps_spin</tabstop>
- <tabstop>fov</tabstop>
- <tabstop>threshold_slider</tabstop>
- <tabstop>model_tabs</tabstop>
- <tabstop>clip_tlength_spin</tabstop>
- <tabstop>clip_theight_spin</tabstop>
- <tabstop>clip_bheight_spin</tabstop>
- <tabstop>clip_blength_spin</tabstop>
- <tabstop>cap_length_spin</tabstop>
- <tabstop>cap_width_spin</tabstop>
- <tabstop>cap_height_spin</tabstop>
- <tabstop>m1x_spin</tabstop>
- <tabstop>m1y_spin</tabstop>
- <tabstop>m1z_spin</tabstop>
- <tabstop>m2x_spin</tabstop>
- <tabstop>m2y_spin</tabstop>
- <tabstop>m2z_spin</tabstop>
- <tabstop>tx_spin</tabstop>
- <tabstop>ty_spin</tabstop>
- <tabstop>tz_spin</tabstop>
- </tabstops>
- <resources>
- <include location="ftnoir_tracker_pt.qrc"/>
- </resources>
- <connections/>
- <slots>
- <slot>startEngineClicked()</slot>
- <slot>stopEngineClicked()</slot>
- <slot>cameraSettingsClicked()</slot>
- </slots>
-</ui>
diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt.cpp b/ftnoir_tracker_pt/ftnoir_tracker_pt.cpp
index 2db5006c..9a5f11c4 100644
--- a/ftnoir_tracker_pt/ftnoir_tracker_pt.cpp
+++ b/ftnoir_tracker_pt/ftnoir_tracker_pt.cpp
@@ -51,15 +51,27 @@ void Tracker_PT::reset_command(Command command)
bool Tracker_PT::get_focal_length(float& ret)
{
+ static constexpr float pi = 3.1415926;
+ float fov_;
+ switch (s.fov)
+ {
+ default:
+ case 0:
+ fov_ = 56;
+ break;
+ case 1:
+ fov_ = 75;
+ break;
+ }
+
+ const double diag_fov = static_cast<int>(fov_) * pi / 180.f;
QMutexLocker l(&camera_mtx);
CamInfo info;
const bool res = camera.get_info(info);
if (res)
{
- static constexpr double pi = 3.14159265359;
const int w = info.res_x, h = info.res_y;
const double diag = sqrt(1. + h/(double)w * h/(double)w);
- const double diag_fov = static_cast<int>(s.fov) * pi / 180.;
const double fov = 2.*atan(tan(diag_fov/2.0)/diag);
ret = .5 / tan(.5 * fov);
return true;
@@ -144,6 +156,20 @@ nannannan: ever_success |= success;
{
Affine X_MH(cv::Matx33f::eye(), cv::Vec3f(s.t_MH_x, s.t_MH_y, s.t_MH_z)); // just copy pasted these lines from below
+ if (X_MH.t[0] == 0 && X_MH.t[1] == 0 && X_MH.t[2] == 0)
+ {
+ int m = s.model_used;
+ switch (m)
+ {
+ default:
+ // cap
+ case 0: X_MH.t[0] = 0; X_MH.t[1] = 0; X_MH.t[2] = 0; break;
+ // clip
+ case 1: X_MH.t[0] = 135; X_MH.t[1] = 0; X_MH.t[2] = 0; break;
+ // left clip
+ case 2: X_MH.t[0] = -135; X_MH.t[1] = 0; X_MH.t[2] = 0; break;
+ }
+ }
Affine X_GH = X_CM * X_MH;
cv::Vec3f p = X_GH.t; // head (center?) position in global space
cv::Vec2f p_(p[0] / p[2] * fx, p[1] / p[2] * fx); // projected to screen
@@ -184,10 +210,36 @@ void Tracker_PT::apply_settings()
{
qDebug()<<"Tracker:: Applying settings";
QMutexLocker l(&camera_mtx);
- camera.stop();
- camera.set_device_index(camera_name_to_index(s.camera_name));
- camera.set_res(s.cam_res_x, s.cam_res_y);
- camera.set_fps(s.cam_fps);
+ camera.set_device_index(camera_name_to_index("PS3Eye Camera"));
+ int res_x, res_y, cam_fps;
+ switch (s.camera_mode)
+ {
+ default:
+ case 0:
+ res_x = 640;
+ res_y = 480;
+ cam_fps = 75;
+ break;
+ case 1:
+ res_x = 640;
+ res_y = 480;
+ cam_fps = 60;
+ break;
+ case 2:
+ res_x = 320;
+ res_y = 240;
+ cam_fps = 189;
+ break;
+ case 3:
+ res_x = 320;
+ res_y = 240;
+ cam_fps = 120;
+ break;
+ }
+
+ camera.set_res(res_x, res_y);
+ camera.set_fps(cam_fps);
+ qDebug() << "camera start";
camera.start();
qDebug()<<"Tracker::apply ends";
}
@@ -241,7 +293,3 @@ void Tracker_PT::data(double *data)
data[TZ] = t[2] / 10.0;
}
}
-
-#include "ftnoir_tracker_pt_dialog.h"
-OPENTRACK_DECLARE_TRACKER(Tracker_PT, TrackerDialog_PT, TrackerDll)
-
diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt.qrc b/ftnoir_tracker_pt/ftnoir_tracker_pt.qrc
deleted file mode 100644
index a8f9a1af..00000000
--- a/ftnoir_tracker_pt/ftnoir_tracker_pt.qrc
+++ /dev/null
@@ -1,9 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>Resources/cap_front.png</file>
- <file>Resources/cap_side.png</file>
- <file>Resources/clip_front.png</file>
- <file>Resources/clip_side.png</file>
- <file>Resources/Logo_IR.png</file>
- </qresource>
-</RCC>
diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.cpp b/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.cpp
deleted file mode 100644
index b1ae2238..00000000
--- a/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/* Copyright (c) 2012 Patrick Ruoff
- * Copyright (c) 2014-2015 Stanislaw Halik <sthalik@misaki.pl>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-
-#include "ftnoir_tracker_pt_dialog.h"
-
-#include <QMessageBox>
-#include <QDebug>
-#include <opencv2/core/core.hpp>
-#include <memory>
-#include "opentrack/camera-names.hpp"
-#include <vector>
-
-//-----------------------------------------------------------------------------
-TrackerDialog_PT::TrackerDialog_PT()
- : tracker(NULL),
- timer(this),
- trans_calib_running(false)
-{
- ui.setupUi( this );
-
- ui.camdevice_combo->addItems(get_camera_names());
-
- tie_setting(s.camera_name, ui.camdevice_combo);
- tie_setting(s.cam_res_x, ui.res_x_spin);
- tie_setting(s.cam_res_y, ui.res_y_spin);
- tie_setting(s.cam_fps, ui.fps_spin);
-
- tie_setting(s.threshold, ui.threshold_slider);
-
- tie_setting(s.min_point_size, ui.mindiam_spin);
- tie_setting(s.max_point_size, ui.maxdiam_spin);
-
- tie_setting(s.clip_by, ui.clip_bheight_spin);
- tie_setting(s.clip_bz, ui.clip_blength_spin);
- tie_setting(s.clip_ty, ui.clip_theight_spin);
- tie_setting(s.clip_tz, ui.clip_tlength_spin);
-
- tie_setting(s.cap_x, ui.cap_width_spin);
- tie_setting(s.cap_y, ui.cap_height_spin);
- tie_setting(s.cap_z, ui.cap_length_spin);
-
- tie_setting(s.m01_x, ui.m1x_spin);
- tie_setting(s.m01_y, ui.m1y_spin);
- tie_setting(s.m01_z, ui.m1z_spin);
-
- tie_setting(s.m02_x, ui.m2x_spin);
- tie_setting(s.m02_y, ui.m2y_spin);
- tie_setting(s.m02_z, ui.m2z_spin);
-
- tie_setting(s.t_MH_x, ui.tx_spin);
- tie_setting(s.t_MH_y, ui.ty_spin);
- tie_setting(s.t_MH_z, ui.tz_spin);
-
- tie_setting(s.fov, ui.fov);
-
- tie_setting(s.active_model_panel, ui.model_tabs);
-
- tie_setting(s.dynamic_pose, ui.dynamic_pose);
- tie_setting(s.init_phase_timeout, ui.init_phase_timeout);
-
- tie_setting(s.auto_threshold, ui.auto_threshold);
-
- connect( ui.tcalib_button,SIGNAL(toggled(bool)), this,SLOT(startstop_trans_calib(bool)) );
-
- connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK()));
- connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel()));
-
- connect(&timer,SIGNAL(timeout()), this,SLOT(poll_tracker_info()));
- connect(ui.camera_settings, SIGNAL(pressed()), this, SLOT(camera_settings()));
- timer.start(100);
-}
-
-void TrackerDialog_PT::camera_settings()
-{
- if (tracker)
- open_camera_settings(static_cast<cv::VideoCapture*>(tracker->camera), s.camera_name, &tracker->camera_mtx);
- else
- open_camera_settings(nullptr, s.camera_name, nullptr);
-}
-
-void TrackerDialog_PT::startstop_trans_calib(bool start)
-{
- if (start)
- {
- qDebug()<<"TrackerDialog:: Starting translation calibration";
- trans_calib.reset();
- trans_calib_running = true;
- s.t_MH_x = 0;
- s.t_MH_y = 0;
- s.t_MH_z = 0;
- }
- else
- {
- qDebug()<<"TrackerDialog:: Stopping translation calibration";
- trans_calib_running = false;
- {
- auto tmp = trans_calib.get_estimate();
- s.t_MH_x = tmp[0];
- s.t_MH_y = tmp[1];
- s.t_MH_z = tmp[2];
- }
- }
-}
-
-void TrackerDialog_PT::poll_tracker_info()
-{
- CamInfo info;
- if (tracker && tracker->get_cam_info(&info))
- {
- QString to_print;
- {
- // display caminfo
- to_print = QString::number(info.res_x)+"x"+QString::number(info.res_y)+" @ "+QString::number(info.fps)+" FPS";
- }
- ui.caminfo_label->setText(to_print);
-
- // display pointinfo
- int n_points = tracker->get_n_points();
- to_print = QString::number(n_points);
- if (n_points == 3)
- to_print += " OK!";
- else
- to_print += " BAD!";
- ui.pointinfo_label->setText(to_print);
-
- // update calibration
- if (trans_calib_running) trans_calib_step();
- }
- else
- {
- ui.caminfo_label->setText("Tracker offline");
- ui.pointinfo_label->setText("");
- }
-}
-
-void TrackerDialog_PT::trans_calib_step()
-{
- if (tracker)
- {
- Affine X_CM = tracker->pose();
- trans_calib.update(X_CM.R, X_CM.t);
- }
-}
-
-void TrackerDialog_PT::save()
-{
- s.b->save();
-}
-
-void TrackerDialog_PT::doOK()
-{
- save();
- close();
-}
-
-void TrackerDialog_PT::doCancel()
-{
- s.b->reload();
- close();
-}
-
-void TrackerDialog_PT::register_tracker(ITracker *t)
-{
- qDebug()<<"TrackerDialog:: Tracker registered";
- tracker = static_cast<Tracker_PT*>(t);
- ui.tcalib_button->setEnabled(true);
- //ui.center_button->setEnabled(true);
-}
-
-void TrackerDialog_PT::unregister_tracker()
-{
- qDebug()<<"TrackerDialog:: Tracker un-registered";
- tracker = NULL;
- ui.tcalib_button->setEnabled(false);
- //ui.center_button->setEnabled(false);
-}
-
diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h b/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h
deleted file mode 100644
index 3502e227..00000000
--- a/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright (c) 2012 Patrick Ruoff
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-
-#ifndef FTNOIR_TRACKER_PT_DIALOG_H
-#define FTNOIR_TRACKER_PT_DIALOG_H
-
-#include "opentrack/plugin-api.hpp"
-#include "ftnoir_tracker_pt_settings.h"
-#include "ftnoir_tracker_pt.h"
-#include "trans_calib.h"
-#include "pt_video_widget.h"
-#include "ui_FTNoIR_PT_Controls.h"
-#include "opentrack/opencv-camera-dialog.hpp"
-
-#include <QTimer>
-
-//-----------------------------------------------------------------------------
-// The dialog that shows up when the user presses "Settings"
-class TrackerDialog_PT : public ITrackerDialog, protected camera_dialog<Tracker_PT>
-{
- Q_OBJECT
-public:
- TrackerDialog_PT();
- void register_tracker(ITracker *tracker) override;
- void unregister_tracker() override;
- void save();
- void trans_calib_step();
-
-public slots:
- void doOK();
- void doCancel();
-
- void startstop_trans_calib(bool start);
- void poll_tracker_info();
- void camera_settings();
-private:
- settings_pt s;
- Tracker_PT* tracker;
- QTimer timer;
-
- TranslationCalibrator trans_calib;
- bool trans_calib_running;
-
- Ui::UICPTClientControls ui;
-};
-
-#endif //FTNOIR_TRACKER_PT_DIALOG_H
diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h b/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h
index 85eec8f9..78626468 100644
--- a/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h
+++ b/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h
@@ -14,54 +14,28 @@ using namespace options;
struct settings_pt : opts
{
- value<QString> camera_name;
- value<int> cam_res_x,
- cam_res_y,
- cam_fps,
- threshold;
+ value<int> threshold;
value<double> min_point_size, max_point_size;
- value<int> m01_x, m01_y, m01_z;
- value<int> m02_x, m02_y, m02_z;
-
value<int> t_MH_x, t_MH_y, t_MH_z;
+ value<int> fov, camera_mode;
+ value<int> model_used;
- value<int> clip_ty, clip_tz, clip_by, clip_bz;
- value<int> active_model_panel, cap_x, cap_y, cap_z;
-
- value<int> fov;
-
value<bool> dynamic_pose;
value<int> init_phase_timeout;
value<bool> auto_threshold;
settings_pt() :
opts("tracker-pt"),
- camera_name(b, "camera-name", ""),
- cam_res_x(b, "camera-res-width", 640),
- cam_res_y(b, "camera-res-height", 480),
- cam_fps(b, "camera-fps", 30),
threshold(b, "threshold-primary", 128),
- min_point_size(b, "min-point-size", 1),
+ min_point_size(b, "min-point-size", 0),
max_point_size(b, "max-point-size", 50),
- m01_x(b, "m_01-x", 0),
- m01_y(b, "m_01-y", 0),
- m01_z(b, "m_01-z", 0),
- m02_x(b, "m_02-x", 0),
- m02_y(b, "m_02-y", 0),
- m02_z(b, "m_02-z", 0),
t_MH_x(b, "model-centroid-x", 0),
t_MH_y(b, "model-centroid-y", 0),
t_MH_z(b, "model-centroid-z", 0),
- clip_ty(b, "clip-ty", 40),
- clip_tz(b, "clip-tz", 30),
- clip_by(b, "clip-by", 70),
- clip_bz(b, "clip-bz", 80),
- active_model_panel(b, "active-model-panel", 0),
- cap_x(b, "cap-x", 40),
- cap_y(b, "cap-y", 60),
- cap_z(b, "cap-z", 100),
- fov(b, "camera-fov", 56),
+ fov(b, "camera-fov", 0),
+ camera_mode(b, "camera-mode", 0),
+ model_used(b, "model-used", 0),
dynamic_pose(b, "dynamic-pose-resolution", true),
init_phase_timeout(b, "init-phase-timeout", 500),
auto_threshold(b, "automatic-threshold", false)
diff --git a/ftnoir_tracker_pt/point_tracker.h b/ftnoir_tracker_pt/point_tracker.h
index fd002948..f4268486 100644
--- a/ftnoir_tracker_pt/point_tracker.h
+++ b/ftnoir_tracker_pt/point_tracker.h
@@ -65,8 +65,6 @@ public:
cv::Vec3f u; // unit vector perpendicular to M01,M02-plane
cv::Matx22f P;
-
- enum Model { Clip = 0, Cap = 1, Custom = 2 };
PointModel(settings_pt& s)
{
@@ -81,26 +79,32 @@ public:
float s22 = M02.dot(M02);
P = 1.0/(s11*s22-s12*s12) * cv::Matx22f(s22, -s12, -s12, s11);
}
-
+
void set_model(settings_pt& s)
{
- switch (s.active_model_panel)
+ enum { Cap = 0, ClipRight = 1, ClipLeft = 2 };
+
+ switch (s.model_used)
{
- case Clip:
- M01 = cv::Vec3f(0, static_cast<double>(s.clip_ty), -static_cast<double>(s.clip_tz));
- M02 = cv::Vec3f(0, -static_cast<double>(s.clip_by), -static_cast<double>(s.clip_bz));
- break;
+ default:
case Cap:
- M01 = cv::Vec3f(-static_cast<double>(s.cap_x), -static_cast<double>(s.cap_y), -static_cast<double>(s.cap_z));
- M02 = cv::Vec3f(static_cast<double>(s.cap_x), -static_cast<double>(s.cap_y), -static_cast<double>(s.cap_z));
+ {
+ const double x = 60, y = 100, z = 120;
+ M01 = cv::Vec3f(-x, -y, -z);
+ M02 = cv::Vec3f(x, -y, -z);
break;
- case Custom:
- M01 = cv::Vec3f(s.m01_x, s.m01_y, s.m01_z);
- M02 = cv::Vec3f(s.m02_x, s.m02_y, s.m02_z);
+ }
+ case ClipLeft:
+ case ClipRight:
+ {
+ const double a = 27, b = 43, c = 62, d = 74;
+ M01 = cv::Vec3f(0, b, -a);
+ M02 = cv::Vec3f(0, -c, -d);
break;
}
+ }
}
-
+
void get_d_order(const std::vector<cv::Vec2f>& points, int* d_order, cv::Vec2f d) const;
};
diff --git a/installer/opentrack-installer.iss b/installer/opentrack-installer.iss
index 65a1ff93..8d909a22 100755..100644
--- a/installer/opentrack-installer.iss
+++ b/installer/opentrack-installer.iss
@@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#include "../build/opentrack-version.h"
-#define MyAppName "opentrack"
+#define MyAppName "TrackHat opentrack"
#define MyAppVersion OPENTRACK_VERSION
#define MyAppPublisher "opentrack"
#define MyAppURL "http://github.com/opentrack/opentrack"
@@ -12,7 +12,7 @@
; 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={{E82E655F-BB38-403A-9883-7B01A9F2CBA6}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
@@ -23,7 +23,7 @@ AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
-OutputBaseFilename={#MyAppVersion}-win32-setup
+OutputBaseFilename={#MyAppVersion}-setup
SetupIconFile=..\facetracknoir\facetracknoir.ico
Compression=lzma2/ultra64
SolidCompression=yes
@@ -42,7 +42,7 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
-Source: "..\build\install\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs
+Source: "..\build\install\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Excludes: "opentrack-tracker-rs-impl.exe,libopentrack-tracker*.dll,libopentrack-filter-*.dll,sixense.dll,clientfiles";
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
diff --git a/macosx/make-app-bundle.sh b/macosx/make-app-bundle.sh
index 1001af4a..68037b67 100644
--- a/macosx/make-app-bundle.sh
+++ b/macosx/make-app-bundle.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-APPNAME=opentrack
+APPNAME=trackhat-opentrack
dir="$1"
test -n "$dir" || exit 1
diff --git a/macosx/opentrack.app/Contents/Info.plist b/macosx/opentrack.app/Contents/Info.plist
index 41ca402a..17e17735 100644
--- a/macosx/opentrack.app/Contents/Info.plist
+++ b/macosx/opentrack.app/Contents/Info.plist
@@ -7,9 +7,9 @@
<key>CFBundleExecutable</key>
<string>opentrack.sh</string>
<key>CFBundleIdentifier</key>
- <string>com.github.opentrack</string>
+ <string>com.github.opentrack.trackhat</string>
<key>CFBundleName</key>
- <string>opentrack</string>
+ <string>trackhat-opentrack</string>
<key>CFBundleIconFile</key>
<string>opentrack.icns</string>
<key>CFBundleVersion</key>
@@ -19,7 +19,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleDisplayName</key>
- <string>opentrack</string>
+ <string>trackhat-opentrack</string>
<key>CFBundleSignature</key>
<string>????</string>
</dict>
diff --git a/opentrack/main-settings.hpp b/opentrack/main-settings.hpp
index d1fe574d..dd61143e 100644
--- a/opentrack/main-settings.hpp
+++ b/opentrack/main-settings.hpp
@@ -16,12 +16,10 @@ using namespace options;
struct axis_opts {
pbundle b;
- value<double> zero;
value<bool> invert, altp;
value<int> src;
axis_opts(pbundle b, QString pfx, int idx) :
b(b),
- zero(b, n(pfx, "zero-pos"), 0),
invert(b, n(pfx, "invert-sign"), false),
altp(b, n(pfx, "alt-axis-sign"), false),
src(b, n(pfx, "source-index"), idx)
@@ -33,17 +31,14 @@ private:
};
struct main_settings : opts {
- value<QString> tracker_dll, filter_dll, protocol_dll;
+ value<QString> protocol_dll;
axis_opts a_x, a_y, a_z, a_yaw, a_pitch, a_roll;
value<bool> tcomp_p, tcomp_tz;
value<bool> tray_enabled;
value<int> camera_yaw, camera_pitch, camera_roll;
- value<bool> center_at_startup;
- value<int> center_method;
+ value<bool> center_at_startup, wizard_done;
main_settings() :
opts("opentrack-ui"),
- tracker_dll(b, "tracker-dll", ""),
- filter_dll(b, "filter-dll", "Accela"),
protocol_dll(b, "protocol-dll", "freetrack 2.0 Enhanced"),
a_x(b, "x", TX),
a_y(b, "y", TY),
@@ -58,6 +53,6 @@ struct main_settings : opts {
camera_pitch(b, "camera-pitch", 0),
camera_roll(b, "camera-roll", 0),
center_at_startup(b, "center-at-startup", true),
- center_method(b, "centering-method", false)
+ wizard_done(b, "wizard-done", false)
{}
};
diff --git a/opentrack/options.hpp b/opentrack/options.hpp
index f8475877..f2c09479 100644
--- a/opentrack/options.hpp
+++ b/opentrack/options.hpp
@@ -41,7 +41,7 @@ template<typename t> using mem = std::shared_ptr<t>;
#define OPENTRACK_CONFIG_FILENAME_KEY "settings-filename"
#define OPENTRACK_DEFAULT_CONFIG "default.ini"
-#define OPENTRACK_ORG "opentrack-2.3"
+#define OPENTRACK_ORG "TrackHat opentrack-2.3"
namespace options {
template<typename k, typename v>
diff --git a/opentrack/plugin-support.hpp b/opentrack/plugin-support.hpp
index 102d11c4..3a0a3420 100644
--- a/opentrack/plugin-support.hpp
+++ b/opentrack/plugin-support.hpp
@@ -53,7 +53,7 @@ extern "C" typedef void* (*OPENTRACK_CTOR_FUNPTR)(void);
extern "C" typedef Metadata* (*OPENTRACK_METADATA_FUNPTR)(void);
struct dylib {
- enum Type { Filter, Tracker, Protocol };
+ enum Type { Protocol };
dylib(const QString& filename, Type t) :
type(t),
@@ -162,17 +162,14 @@ struct dylib {
static QList<mem<dylib>> enum_libraries()
{
- const char* filters_n[] = { "opentrack-filter-*.",
- "opentrack-tracker-*.",
- "opentrack-proto-*."
- };
- const Type filters_t[] = { Filter, Tracker, Protocol };
+ const char* filters_n[] = { "opentrack-proto-*." };
+ const Type filters_t[] = { Protocol };
QDir settingsDir( QCoreApplication::applicationDirPath() );
QList<mem<dylib>> ret;
- for (int i = 0; i < 3; i++)
+ for (int i = 0; i < 1; i++)
{
QString filter = filters_n[i];
auto t = filters_t[i];
@@ -234,8 +231,6 @@ private:
struct Modules {
Modules() :
module_list(dylib::enum_libraries()),
- filter_modules(filter(dylib::Filter)),
- tracker_modules(filter(dylib::Tracker)),
protocol_modules(filter(dylib::Protocol))
{}
QList<mem<dylib>>& filters() { return filter_modules; }
diff --git a/opentrack/selected-libraries.cpp b/opentrack/selected-libraries.cpp
index 63517774..e3bac0c5 100644
--- a/opentrack/selected-libraries.cpp
+++ b/opentrack/selected-libraries.cpp
@@ -1,33 +1,25 @@
#include "opentrack/selected-libraries.hpp"
#include <QDebug>
-SelectedLibraries::SelectedLibraries(QFrame* frame, dylibptr t, dylibptr p, dylibptr f) :
+SelectedLibraries::SelectedLibraries(QFrame* frame, mem<ITracker> t, dylibptr p, mem<IFilter> f) :
pTracker(nullptr),
pFilter(nullptr),
pProtocol(nullptr),
correct(false)
{
+ pTracker = t;
pProtocol = make_dylib_instance<IProtocol>(p);
+ pFilter = f;
- if (!pProtocol)
+ if (!pTracker || !pProtocol)
{
- qDebug() << "protocol dylib load failure";
+ qDebug() << "dylib load failure";
return;
}
if(!pProtocol->correct())
{
qDebug() << "protocol load failure";
- pProtocol = nullptr;
- return;
- }
-
- pTracker = make_dylib_instance<ITracker>(t);
- pFilter = make_dylib_instance<IFilter>(f);
-
- if (!pTracker)
- {
- qDebug() << "tracker dylib load failure";
return;
}
diff --git a/opentrack/selected-libraries.hpp b/opentrack/selected-libraries.hpp
index 3719b109..7779c231 100644
--- a/opentrack/selected-libraries.hpp
+++ b/opentrack/selected-libraries.hpp
@@ -16,7 +16,7 @@ struct SelectedLibraries {
mem<ITracker> pTracker;
mem<IFilter> pFilter;
mem<IProtocol> pProtocol;
- SelectedLibraries(QFrame* frame, dylibptr t, dylibptr p, dylibptr f);
+ SelectedLibraries(QFrame* frame, mem<ITracker> t, dylibptr p, mem<IFilter> f);
SelectedLibraries() : pTracker(nullptr), pFilter(nullptr), pProtocol(nullptr), correct(false) {}
bool correct;
};
diff --git a/opentrack/tracker.cpp b/opentrack/tracker.cpp
index 6411db40..1bc28b87 100644
--- a/opentrack/tracker.cpp
+++ b/opentrack/tracker.cpp
@@ -169,7 +169,7 @@ void Tracker::logic()
double tmp[3] = { t(0) - t_b[0], t(1) - t_b[1], t(2) - t_b[2] };
t_compensate(cam, tmp, tmp, false);
rmat m_;
- switch (s.center_method)
+ switch (1)
{
case 0:
default:
@@ -210,9 +210,6 @@ void Tracker::logic()
s.tcomp_tz);
for (int i = 0; i < 6; i++)
- value(i) += m(i).opts.zero;
-
- for (int i = 0; i < 6; i++)
value[i] *= inverts[i] ? -1. : 1.;
if (zero_)
diff --git a/pose-widget/images/side1.png b/pose-widget/images/side1.png
index d7467943..1424faa3 100644..100755
--- a/pose-widget/images/side1.png
+++ b/pose-widget/images/side1.png
Binary files differ
diff --git a/pose-widget/images/side6.png b/pose-widget/images/side6.png
index eaa80d7e..1424faa3 100644..100755
--- a/pose-widget/images/side6.png
+++ b/pose-widget/images/side6.png
Binary files differ