diff options
47 files changed, 1802 insertions, 2613 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 67064d76..b48ac0cf 100644..100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,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) @@ -112,6 +112,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" @@ -280,9 +284,8 @@ set_target_properties(opentrack-version PROPERTIES      COMPILE_DEFINITIONS      "OPENTRACK_VERSION=\"${OPENTRACK__COMMIT}\"") -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) @@ -312,7 +315,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) @@ -327,17 +329,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) @@ -359,118 +357,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) @@ -493,11 +387,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") @@ -511,6 +407,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}) @@ -542,7 +440,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" @@ -559,11 +457,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.icoBinary files differ index 5cac8da1..b5f34db3 100644..100755 --- a/facetracknoir/facetracknoir.ico +++ b/facetracknoir/facetracknoir.ico diff --git a/facetracknoir/images/facetracknoir.png b/facetracknoir/images/facetracknoir.pngBinary files differ index 85c06df6..4f17de81 100644..100755 --- a/facetracknoir/images/facetracknoir.png +++ b/facetracknoir/images/facetracknoir.png diff --git a/facetracknoir/images/trackhat-clip-left.png b/facetracknoir/images/trackhat-clip-left.pngBinary files differ new file mode 100644 index 00000000..e4668cad --- /dev/null +++ b/facetracknoir/images/trackhat-clip-left.png diff --git a/facetracknoir/images/trackhat-clip-right.png b/facetracknoir/images/trackhat-clip-right.pngBinary files differ new file mode 100644 index 00000000..aeb969cd --- /dev/null +++ b/facetracknoir/images/trackhat-clip-right.png diff --git a/facetracknoir/images/trackhat-hat.png b/facetracknoir/images/trackhat-hat.pngBinary files differ new file mode 100644 index 00000000..2d5a8f4a --- /dev/null +++ b/facetracknoir/images/trackhat-hat.png 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><html><head/><body><p>The PS3 Eye driver or camera is missing. Please install the driver or plug in the camera and restart the program. Thanks!</p></body></html></string> +     </property> +     <property name="wordWrap"> +      <bool>true</bool> +     </property> +    </widget> +   </item> +   <item> +    <widget class="QLabel" name="label_2"> +     <property name="text"> +      <string><html><head/><body><p>Driver download: <a href="https://mega.nz/#!QkAjnBwD!-ULu08uFwGK5hl7ugbFZfuAw2hIdFpwVtn-jewThrN8"><span style=" text-decoration: underline; color:#0000ff;">mega.nz</span></a></p></body></html></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 45483a68..8425299b 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..5a32daf6 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="1"> +              <widget class="QSpinBox" name="mindiam_spin"> +               <property name="toolTip"> +                <string>Minimum point diameter</string> +               </property> +               <property name="suffix"> +                <string> px</string> +               </property> +               <property name="maximum"> +                <number>1024</number> +               </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="QSpinBox" name="maxdiam_spin"> +               <property name="toolTip"> +                <string>Maximum point diameter</string> +               </property> +               <property name="suffix"> +                <string> px</string> +               </property> +               <property name="maximum"> +                <number>1024</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> +             <string notr="true">QFrame { border: 0; }</string>              </property> -            <property name="title"> -             <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="minimumSize"> +                <size> +                 <width>130</width> +                 <height>130</height> +                </size>                 </property> -               <property name="decimals"> -                <number>3</number> +               <property name="maximumSize"> +                <size> +                 <width>130</width> +                 <height>130</height> +                </size>                 </property> -               <property name="minimum"> -                <double>-100.000000000000000</double> +               <property name="text"> +                <string/>                 </property> -               <property name="maximum"> -                <double>100.000000000000000</double> +               <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="text"> +                <string>x:</string>                 </property> -               <property name="decimals"> -                <number>3</number> +              </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><html><head/><body><p>Only pitch and yaw during calibration.</p><p>Don't roll and don't translate.</p></body></html></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><html><head/><body><p align="justify"><br/><span style=" font-size:10pt;">Accela by </span><a href="https://github.com/sthalik"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Stanisław Halik</span></a><span style=" font-size:10pt;"><br/>Thanks to </span><a href="https://github.com/dbaarda"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Donovan Baarda</span></a></p><p align="right"><span style=" font-size:10pt;">2012-2015</span></p><p align="right"><br/></p></body></html></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><html><head/><body><p>Visit <a href="https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3"><span style=" text-decoration: underline; color:#0000ff;">our wiki</span></a> for description of the settings.</p></body></html></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..d6353396 --- /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" volatile 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 != const_cast<const char*>(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><html><head/><body><p>You can now use your new hardware and thanks for flying TrackHat.</p></body></html></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><html><head/><body><p align="justify"><br/><span style=" font-size:10pt;">Accela by </span><a href="https://github.com/sthalik"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Stanisław Halik</span></a><span style=" font-size:10pt;"><br/>Thanks to </span><a href="https://github.com/dbaarda"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Donovan Baarda</span></a></p><p align="right"><span style=" font-size:10pt;">2012-2015</span></p><p align="right"><br/></p></body></html></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><html><head/><body><p>Visit <a href="https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3"><span style=" text-decoration: underline; color:#0000ff;">our wiki</span></a> for description of the settings.</p></body></html></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 ab5fda07..84bd68c8 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela.cpp @@ -107,6 +107,3 @@ void FTNoIR_Filter::filter(const double* input, double *output)          last_output[i] = output[i] = ret;      }  } - -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 318cf909..360ca7f3 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> @@ -46,33 +45,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 acdbda78..00000000 --- a/ftnoir_tracker_pt/FTNoIR_PT_Controls.ui +++ /dev/null @@ -1,1214 +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="1"> -           <widget class="QSpinBox" name="maxdiam_spin"> -            <property name="toolTip"> -             <string>Maximum point diameter</string> -            </property> -            <property name="suffix"> -             <string> px</string> -            </property> -            <property name="maximum"> -             <number>1024</number> -            </property> -           </widget> -          </item> -          <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="2" column="1"> -           <widget class="QSpinBox" name="mindiam_spin"> -            <property name="toolTip"> -             <string>Minimum point diameter</string> -            </property> -            <property name="suffix"> -             <string> px</string> -            </property> -            <property name="maximum"> -             <number>1024</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="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> -         </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><html><head/><body><p>Location of the two remaining model points<br/>with respect to the reference point in default pose</p><p>Use any units you want, not necessarily centimeters.</p></body></html></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><html><head/><body><p><span style=" font-size:16pt;">P</span><span style=" font-size:16pt; vertical-align:sub;">3</span></p></body></html></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><html><head/><body><p><span style=" font-size:16pt;">P</span><span style=" font-size:16pt; vertical-align:sub;">2</span></p></body></html></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><html><head/><body><p><a href="https://github.com/opentrack/opentrack/wiki/model-calibration-for-PT-and-Aruco-trackers"><span style=" text-decoration: underline; color:#0000ff;">Instructions on the opentrack wiki</span></a></p></body></html></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><html><head/><body><p><span style=" font-weight:600;">FTNoIR PointTracker Plugin<br/>Version 1.1</span></p><p><span style=" font-weight:600;">by Patrick Ruoff</span></p><p><a href="http://ftnoirpt.sourceforge.net/"><span style=" font-weight:600; text-decoration: underline; color:#0000ff;">Manual (external)</span></a></p></body></html></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 19d1bd7f..7b70d4eb 100644 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt.cpp +++ b/ftnoir_tracker_pt/ftnoir_tracker_pt.cpp @@ -50,15 +50,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; @@ -114,6 +126,20 @@ void Tracker_PT::run()              {                  Affine X_CM = pose();                  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 @@ -154,10 +180,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";  } @@ -211,7 +263,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 da7a6113..00000000 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.cpp +++ /dev/null @@ -1,181 +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. - */ - -#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 57e68d0e..91086dfd 100644 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h +++ b/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h @@ -13,55 +13,29 @@ 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,                 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", 10),          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 cdcf2998..df938237 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 8fd054b4..8a9a0511 100644 --- a/opentrack/tracker.cpp +++ b/opentrack/tracker.cpp @@ -124,7 +124,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: @@ -159,9 +159,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.pngBinary files differ index d7467943..1424faa3 100644..100755 --- a/pose-widget/images/side1.png +++ b/pose-widget/images/side1.png diff --git a/pose-widget/images/side6.png b/pose-widget/images/side6.pngBinary files differ index eaa80d7e..1424faa3 100644..100755 --- a/pose-widget/images/side6.png +++ b/pose-widget/images/side6.png | 
