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