diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2017-05-24 17:26:05 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2017-05-24 17:26:05 +0200 | 
| commit | f79bdb633abf5d6925b2851adab48ed24d3ab30a (patch) | |
| tree | fe7008693ad14d3136af515d958e5865dcf2b5f1 | |
| parent | a6c8eafcd439a9f2c10dac025ac4c58d1393a226 (diff) | |
tracker/fusion: add back "second tracker" functionality
It only took us five years to implement again, following removal
after the fork from facetracknoir.
| -rw-r--r-- | tracker-fusion/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | tracker-fusion/fusion-tracker-logo.png | bin | 0 -> 1985 bytes | |||
| -rw-r--r-- | tracker-fusion/fusion.cpp | 182 | ||||
| -rw-r--r-- | tracker-fusion/fusion.h | 59 | ||||
| -rw-r--r-- | tracker-fusion/fusion.qrc | 5 | ||||
| -rw-r--r-- | tracker-fusion/fusion.ui | 180 | ||||
| -rw-r--r-- | tracker-fusion/fusion_dialog.cpp | 2 | 
7 files changed, 429 insertions, 0 deletions
| diff --git a/tracker-fusion/CMakeLists.txt b/tracker-fusion/CMakeLists.txt new file mode 100644 index 00000000..4125d630 --- /dev/null +++ b/tracker-fusion/CMakeLists.txt @@ -0,0 +1 @@ +otr_module(tracker-fusion) diff --git a/tracker-fusion/fusion-tracker-logo.png b/tracker-fusion/fusion-tracker-logo.pngBinary files differ new file mode 100644 index 00000000..63d541e1 --- /dev/null +++ b/tracker-fusion/fusion-tracker-logo.png diff --git a/tracker-fusion/fusion.cpp b/tracker-fusion/fusion.cpp new file mode 100644 index 00000000..e8e48372 --- /dev/null +++ b/tracker-fusion/fusion.cpp @@ -0,0 +1,182 @@ +/* Copyright (c) 2017 Stanislaw Halik <sthalik@misaki.pl> + + * Permission to use, copy, modify, and/or distribute this + * software for any purpose with or without fee is hereby granted, + * provided that the above copyright notice and this permission + * notice appear in all copies. + */ + +#include "compat/ndebug-guard.hpp" +#include "fusion.h" + +#include "opentrack-library-path.h" + +#include <QDebug> +#include <QMessageBox> +#include <QApplication> + +static const QString own_name = fusion_metadata().name(); + +fusion_tracker::fusion_tracker() : +    rot_tracker_data{}, +    pos_tracker_data{}, +    other_frame(new QFrame) +{ +} + +fusion_tracker::~fusion_tracker() +{ +    rot_tracker = nullptr; +    pos_tracker = nullptr; +    rot_dylib = nullptr; +    pos_dylib = nullptr; + +    if (other_frame) +    { +        assert(other_frame->layout()); +        delete other_frame->layout(); +        other_frame = nullptr; +    } +} + +void fusion_tracker::start_tracker(QFrame* frame) +{ +    assert(!rot_tracker && !pos_tracker); +    assert(!rot_dylib && !pos_dylib); + +    fusion_settings s; +    const QString rot_tracker_name = s.rot_tracker_name; +    const QString pos_tracker_name = s.pos_tracker_name; + +    assert(rot_tracker_name != own_name); +    assert(pos_tracker_name != own_name); + +    if (rot_tracker_name.isEmpty() || pos_tracker_name.isEmpty()) +    { +        QMessageBox::warning(nullptr, +                             "Fusion tracker", "Select rotation and position trackers.", +                             QMessageBox::Close); +        other_frame = nullptr; +        return; +    } + +    if (rot_tracker_name == pos_tracker_name) +    { +        QMessageBox::warning(nullptr, +                            "Fusion tracker", "Select different trackers for rotation and position.", +                            QMessageBox::Close); +        other_frame = nullptr; +        return; +    } + +    for (auto& t : modules.trackers()) +    { +        if (t->name == rot_tracker_name) +        { +            assert(!rot_dylib); +            rot_dylib = t; +        } +        if (t->name == pos_tracker_name) +        { +            assert(!pos_dylib); +            pos_dylib = t; +        } +    } + +    rot_tracker = make_dylib_instance<ITracker>(rot_dylib); +    pos_tracker = make_dylib_instance<ITracker>(pos_dylib); + +    pos_tracker->start_tracker(frame); + +    if (frame->layout() == nullptr) +    { +        rot_tracker->start_tracker(frame); +        other_frame = nullptr; +    } +    else +    { +        rot_tracker->start_tracker(other_frame.get()); +        if (!other_frame->layout()) +            other_frame = nullptr; +    } + + +} + +void fusion_tracker::data(double *data) +{ +    if (pos_tracker && rot_tracker) +    { +        rot_tracker->data(rot_tracker_data); +        pos_tracker->data(pos_tracker_data); + +        for (unsigned k = 0; k < 3; k++) +            data[k] = pos_tracker_data[k]; +        for (unsigned k = 3; k < 6; k++) +            data[k] = rot_tracker_data[k]; +    } +} + +fusion_dialog::fusion_dialog() +{ +    ui.setupUi(this); + +    connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK())); +    connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); + +    ui.rot_tracker->addItem(""); +    ui.pos_tracker->addItem(""); + +    for (auto &m : modules.trackers()) +    { +        if (m->name == own_name) +            continue; + +        ui.rot_tracker->addItem(m->icon, m->name); +        ui.pos_tracker->addItem(m->icon, m->name); +    } + +    ui.rot_tracker->setCurrentIndex(0); +    ui.pos_tracker->setCurrentIndex(0); + +    tie_setting(s.rot_tracker_name, ui.rot_tracker); +    tie_setting(s.pos_tracker_name, ui.pos_tracker); +} + +void fusion_dialog::doOK() +{ +    const int rot_idx = ui.rot_tracker->currentIndex() - 1; +    const int pos_idx = ui.pos_tracker->currentIndex() - 1; + +    if (rot_idx == -1 || pos_idx == -1 || rot_idx == pos_idx) +    { +        QMessageBox::warning(this, +                             "Fusion tracker", +                             "Fusion tracker only works when distinct trackers are selected " +                             "for rotation and position.", +                             QMessageBox::Close); +    } + +    s.b->save(); +    close(); +} + +void fusion_dialog::doCancel() +{ +    close(); +} + +fusion_settings::fusion_settings() : +    opts("fusion-tracker"), +    rot_tracker_name(b, "rot-tracker", ""), +    pos_tracker_name(b, "pos-tracker", "") +{ +} + +has_modules::has_modules() : +    modules(OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH) +{ +} + + +OPENTRACK_DECLARE_TRACKER(fusion_tracker, fusion_dialog, fusion_metadata)
\ No newline at end of file diff --git a/tracker-fusion/fusion.h b/tracker-fusion/fusion.h new file mode 100644 index 00000000..a943fe06 --- /dev/null +++ b/tracker-fusion/fusion.h @@ -0,0 +1,59 @@ +#pragma once +#include "api/plugin-api.hpp" +#include "api/plugin-support.hpp" +#include <QFrame> +#include <QCoreApplication> + +#include "options/options.hpp" +using namespace options; + +struct fusion_settings final : opts +{ +    value<QString> rot_tracker_name; +    value<QString> pos_tracker_name; + +    fusion_settings(); +}; + +struct has_modules +{ +    Modules modules; +    has_modules(); +}; + +struct fusion_tracker : public ITracker, has_modules +{ +    fusion_tracker(); +    ~fusion_tracker() override; +    void start_tracker(QFrame *) override; +    void data(double *data) override; + +    double rot_tracker_data[6], pos_tracker_data[6]; + +    std::unique_ptr<QFrame> other_frame; +    std::shared_ptr<dylib> rot_dylib, pos_dylib; +    std::shared_ptr<ITracker> rot_tracker, pos_tracker; +}; + +#include "ui_fusion.h" + +class fusion_dialog : public ITrackerDialog, has_modules +{ +    Q_OBJECT + +    fusion_settings s; +    Ui::fusion_ui ui; +public: +    fusion_dialog(); +private slots: +    void doOK(); +    void doCancel(); +}; + +class fusion_metadata : public Metadata +{ +public: +    QString name() { return QString(QCoreApplication::translate("fusion_metadata", "Fusion")); } +    QIcon icon() { return QIcon(":/images/fusion-tracker-logo.png"); } +}; + diff --git a/tracker-fusion/fusion.qrc b/tracker-fusion/fusion.qrc new file mode 100644 index 00000000..32a5913e --- /dev/null +++ b/tracker-fusion/fusion.qrc @@ -0,0 +1,5 @@ +<RCC> +    <qresource prefix="/images"> +        <file>fusion-tracker-logo.png</file> +    </qresource> +</RCC> diff --git a/tracker-fusion/fusion.ui b/tracker-fusion/fusion.ui new file mode 100644 index 00000000..1eb8992e --- /dev/null +++ b/tracker-fusion/fusion.ui @@ -0,0 +1,180 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>fusion_ui</class> + <widget class="QWidget" name="fusion_ui"> +  <property name="windowModality"> +   <enum>Qt::NonModal</enum> +  </property> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>397</width> +    <height>180</height> +   </rect> +  </property> +  <property name="sizePolicy"> +   <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> +    <horstretch>0</horstretch> +    <verstretch>0</verstretch> +   </sizepolicy> +  </property> +  <property name="windowTitle"> +   <string>Fusion</string> +  </property> +  <property name="windowIcon"> +   <iconset> +    <normaloff>:/fusion-tracker-logo.png</normaloff>:/fusion-tracker-logo.png</iconset> +  </property> +  <property name="layoutDirection"> +   <enum>Qt::LeftToRight</enum> +  </property> +  <property name="autoFillBackground"> +   <bool>false</bool> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <widget class="QFrame" name="frame_2"> +     <property name="frameShadow"> +      <enum>QFrame::Raised</enum> +     </property> +     <layout class="QVBoxLayout" name="verticalLayout_2"> +      <item> +       <widget class="QLabel" name="label"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> +          <horstretch>0</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="text"> +         <string>Set distinct trackers for rotation and position input.</string> +        </property> +       </widget> +      </item> +      <item> +       <widget class="QLabel" name="label_4"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> +          <horstretch>0</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="text"> +         <string>Configure the trackers on the main window. It's required that they're both distinct, and both are set to something.</string> +        </property> +        <property name="wordWrap"> +         <bool>true</bool> +        </property> +       </widget> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QFrame" name="frame"> +     <property name="sizePolicy"> +      <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> +       <horstretch>0</horstretch> +       <verstretch>0</verstretch> +      </sizepolicy> +     </property> +     <layout class="QGridLayout" name="gridLayout"> +      <item row="0" column="0"> +       <widget class="QLabel" name="label_2"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> +          <horstretch>1</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="minimumSize"> +         <size> +          <width>89</width> +          <height>0</height> +         </size> +        </property> +        <property name="text"> +         <string>Rotation</string> +        </property> +       </widget> +      </item> +      <item row="0" column="1"> +       <widget class="QComboBox" name="rot_tracker"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> +          <horstretch>3</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="minimumSize"> +         <size> +          <width>266</width> +          <height>0</height> +         </size> +        </property> +       </widget> +      </item> +      <item row="1" column="0"> +       <widget class="QLabel" name="label_3"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> +          <horstretch>1</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="minimumSize"> +         <size> +          <width>89</width> +          <height>0</height> +         </size> +        </property> +        <property name="text"> +         <string>Position</string> +        </property> +       </widget> +      </item> +      <item row="1" column="1"> +       <widget class="QComboBox" name="pos_tracker"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> +          <horstretch>3</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="minimumSize"> +         <size> +          <width>266</width> +          <height>0</height> +         </size> +        </property> +       </widget> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QDialogButtonBox" name="buttonBox"> +     <property name="sizePolicy"> +      <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> +       <horstretch>0</horstretch> +       <verstretch>0</verstretch> +      </sizepolicy> +     </property> +     <property name="standardButtons"> +      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set> +     </property> +    </widget> +   </item> +  </layout> + </widget> + <resources> +  <include location="fusion.qrc"/> + </resources> + <connections/> + <slots> +  <slot>startEngineClicked()</slot> +  <slot>stopEngineClicked()</slot> +  <slot>cameraSettingsClicked()</slot> + </slots> +</ui> diff --git a/tracker-fusion/fusion_dialog.cpp b/tracker-fusion/fusion_dialog.cpp new file mode 100644 index 00000000..ca05531a --- /dev/null +++ b/tracker-fusion/fusion_dialog.cpp @@ -0,0 +1,2 @@ +#include "fusion.h" + | 
