diff options
Diffstat (limited to 'facetracknoir')
-rw-r--r-- | facetracknoir/curve-config.cpp | 2 | ||||
-rw-r--r-- | facetracknoir/curve-config.h | 2 | ||||
-rw-r--r-- | facetracknoir/export.hpp | 7 | ||||
-rw-r--r-- | facetracknoir/facetracknoir.cpp | 146 | ||||
-rw-r--r-- | facetracknoir/facetracknoir.h | 86 | ||||
-rw-r--r-- | facetracknoir/main-settings.hpp | 59 | ||||
-rw-r--r-- | facetracknoir/mappings.hpp | 88 | ||||
-rw-r--r-- | facetracknoir/options.h | 392 | ||||
-rw-r--r-- | facetracknoir/plugin-api.hpp | 11 | ||||
-rw-r--r-- | facetracknoir/plugin-qt-api.hpp | 63 | ||||
-rw-r--r-- | facetracknoir/plugin-support.cpp | 145 | ||||
-rw-r--r-- | facetracknoir/plugin-support.h | 43 | ||||
-rw-r--r-- | facetracknoir/pose.hpp | 44 | ||||
-rw-r--r-- | facetracknoir/qcopyable-mutex.hpp | 37 | ||||
-rw-r--r-- | facetracknoir/quat.hpp | 66 | ||||
-rw-r--r-- | facetracknoir/timer.hpp | 68 | ||||
-rw-r--r-- | facetracknoir/tracker.cpp | 187 | ||||
-rw-r--r-- | facetracknoir/tracker.h | 48 |
18 files changed, 102 insertions, 1392 deletions
diff --git a/facetracknoir/curve-config.cpp b/facetracknoir/curve-config.cpp index 57cea7a4..ebf43a8d 100644 --- a/facetracknoir/curve-config.cpp +++ b/facetracknoir/curve-config.cpp @@ -1,6 +1,6 @@ #include "./facetracknoir.h" #include "./curve-config.h" -#include "./main-settings.hpp" +#include "opentrack/main-settings.hpp" MapWidget::MapWidget(Mappings& m, main_settings& s, QWidget *parent) : QWidget(parent, Qt::Dialog), m(m) diff --git a/facetracknoir/curve-config.h b/facetracknoir/curve-config.h index d485c4ff..244cf6df 100644 --- a/facetracknoir/curve-config.h +++ b/facetracknoir/curve-config.h @@ -1,6 +1,6 @@ #pragma once #include <QWidget> -#include "./mappings.hpp" +#include "opentrack/mappings.hpp" #include "ui_ftnoir_curves.h" class MapWidget: public QWidget diff --git a/facetracknoir/export.hpp b/facetracknoir/export.hpp deleted file mode 100644 index 8c8bdc69..00000000 --- a/facetracknoir/export.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -#ifdef _WIN32 -# define OPENTRACK_LINKAGE __declspec(dllexport) -#else -# define OPENTRACK_LINKAGE -#endif -#define OPENTRACK_EXPORT __attribute__ ((visibility ("default"))) OPENTRACK_LINKAGE diff --git a/facetracknoir/facetracknoir.cpp b/facetracknoir/facetracknoir.cpp index 37fbd214..76d7af19 100644 --- a/facetracknoir/facetracknoir.cpp +++ b/facetracknoir/facetracknoir.cpp @@ -23,74 +23,24 @@ *********************************************************************************/ #include "facetracknoir.h" #include "shortcuts.h" -#include "tracker.h" +#include "opentrack/tracker.h" #include "curve-config.h" #include <QFileDialog> -#if defined(__APPLE__) -# define SONAME "dylib" -#elif defined(_WIN32) -# define SONAME "dll" -#else -# define SONAME "so" -#endif - -#include <iostream> - -#ifdef _MSC_VER -# error "No support for MSVC anymore" -#else -# define LIB_PREFIX "lib" -#endif - -static bool get_metadata(ptr<DynamicLibrary> lib, QString& name, QIcon& icon) -{ - Metadata* meta; - if (!lib->Metadata || ((meta = lib->Metadata()), !meta)) - return false; - name = meta->name(); - icon = meta->icon(); - delete meta; - return true; -} - -static void fill_combobox(const QString& filter, QList<ptr<DynamicLibrary>>& list, QComboBox& cbx) -{ - QDir settingsDir( QCoreApplication::applicationDirPath() ); - QStringList filenames = settingsDir.entryList( QStringList() << (LIB_PREFIX + filter + SONAME), QDir::Files, QDir::Name ); - for ( int i = 0; i < filenames.size(); i++) { - QIcon icon; - QString longName; - QString str = filenames.at(i); - auto lib = std::make_shared<DynamicLibrary>(str); - qDebug() << "Loading" << str; - std::cout.flush(); - if (!get_metadata(lib, longName, icon)) - continue; - list.push_back(lib); - cbx.addItem(icon, longName); - } -} - FaceTrackNoIR::FaceTrackNoIR() : QMainWindow(nullptr), - tracker(nullptr), -#if defined(_WIN32) - keybindingWorker(NULL), -#else - keyCenter(this), - keyToggle(this), -#endif b(bundle("opentrack-ui")), s(b), + #if defined(_WIN32) + keybindingWorker(NULL), + #else + keyCenter(this), + keyToggle(this), + #endif pose(std::vector<axis_opts*>{&s.a_x, &s.a_y, &s.a_z, &s.a_yaw, &s.a_pitch, &s.a_roll}), timUpdateHeadPose(this), - pTrackerDialog(nullptr), - pProtocolDialog(nullptr), - pFilterDialog(nullptr), - shortcuts_widget(nullptr), - mapping_widget(nullptr), kbd_quit(QKeySequence("Ctrl+Q"), this), - no_feed_pixmap(":/uielements/no-feed.png") + no_feed_pixmap(":/uielements/no-feed.png"), + module_list(dylib::enum_libraries()) { ui.setupUi(this); setFixedSize(size()); @@ -98,9 +48,7 @@ FaceTrackNoIR::FaceTrackNoIR() : QMainWindow(nullptr), updateButtonState(false, false); QDir::setCurrent(QCoreApplication::applicationDirPath()); - - fill_profile_cbx(); - + connect(ui.btnLoad, SIGNAL(clicked()), this, SLOT(open())); connect(ui.btnSave, SIGNAL(clicked()), this, SLOT(save())); connect(ui.btnSaveAs, SIGNAL(clicked()), this, SLOT(saveAs())); @@ -111,12 +59,14 @@ FaceTrackNoIR::FaceTrackNoIR() : QMainWindow(nullptr), connect(ui.btnShowServerControls, SIGNAL(clicked()), this, SLOT(showServerControls())); connect(ui.btnShowFilterControls, SIGNAL(clicked()), this, SLOT(showFilterControls())); - dlopen_filters.push_back(nullptr); + filter_modules.push_back(nullptr); ui.iconcomboFilter->addItem(QIcon(), ""); - - fill_combobox("opentrack-proto-*.", dlopen_protocols, *ui.iconcomboProtocol); - fill_combobox("opentrack-tracker-*.", dlopen_trackers, *ui.iconcomboTrackerSource); - fill_combobox("opentrack-filter-*.", dlopen_filters, *ui.iconcomboFilter); + + fill_combobox(dylib::Tracker, module_list, tracker_modules, ui.iconcomboTrackerSource); + fill_combobox(dylib::Protocol, module_list, protocol_modules, ui.iconcomboProtocol); + fill_combobox(dylib::Filter, module_list, filter_modules, ui.iconcomboFilter); + + fill_profile_combobox(); tie_setting(s.tracker_dll, ui.iconcomboTrackerSource); tie_setting(s.protocol_dll, ui.iconcomboProtocol); @@ -137,12 +87,24 @@ FaceTrackNoIR::FaceTrackNoIR() : QMainWindow(nullptr), kbd_quit.setEnabled(true); } -FaceTrackNoIR::~FaceTrackNoIR() { - +FaceTrackNoIR::~FaceTrackNoIR() +{ stopTracker(); save(); } +void FaceTrackNoIR::fill_combobox(dylib::Type t, QList<ptr<dylib>> list, QList<ptr<dylib>>& out_list, QComboBox* cbx) +{ + for (auto x : list) + { + if (t && t == x->type) + { + cbx->addItem(x->icon, x->name); + out_list.append(x); + } + } +} + QFrame* FaceTrackNoIR::video_frame() { return ui.video_frame; } @@ -163,7 +125,7 @@ void FaceTrackNoIR::open() { QSettings settings("opentrack"); settings.setValue ("SettingsFile", QFileInfo(fileName).absoluteFilePath()); } - fill_profile_cbx(); + fill_profile_combobox(); loadSettings(); } } @@ -219,7 +181,7 @@ void FaceTrackNoIR::saveAs() save(); } - fill_profile_cbx(); + fill_profile_combobox(); } void FaceTrackNoIR::load_mappings() { @@ -231,6 +193,24 @@ void FaceTrackNoIR::loadSettings() { load_mappings(); } +extern "C" volatile const char* opentrack_version; + +void FaceTrackNoIR::fill_profile_combobox() +{ + QSettings settings("opentrack"); + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + + "/settings/default.ini" ).toString(); + qDebug() << "Config file now" << currentFile; + QFileInfo pathInfo ( currentFile ); + setWindowTitle(QString( const_cast<const char*>(opentrack_version) + QStringLiteral(" :: ")) + pathInfo.fileName()); + QDir settingsDir( pathInfo.dir() ); + auto iniFileList = settingsDir.entryList( QStringList { "*.ini" } , QDir::Files, QDir::Name ); + ui.iconcomboProfile->clear(); + for (auto x : iniFileList) + ui.iconcomboProfile->addItem(QIcon(":/images/settings16.png"), x); + ui.iconcomboProfile->setCurrentText(pathInfo.fileName()); +} + void FaceTrackNoIR::updateButtonState(bool running, bool inertialp) { bool not_running = !running; @@ -313,6 +293,7 @@ void FaceTrackNoIR::stopTracker( ) { } tracker = nullptr; + libs = SelectedLibraries(); updateButtonState(false, false); } @@ -356,7 +337,7 @@ void FaceTrackNoIR::showHeadPose() void FaceTrackNoIR::showTrackerSettings() { - ptr<DynamicLibrary> lib = dlopen_trackers.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); + ptr<dylib> lib = tracker_modules.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); if (lib) { pTrackerDialog = ptr<ITrackerDialog>(reinterpret_cast<ITrackerDialog*>(lib->Dialog())); @@ -367,7 +348,7 @@ void FaceTrackNoIR::showTrackerSettings() } void FaceTrackNoIR::showServerControls() { - ptr<DynamicLibrary> lib = dlopen_protocols.value(ui.iconcomboProtocol->currentIndex(), nullptr); + ptr<dylib> lib = protocol_modules.value(ui.iconcomboProtocol->currentIndex(), nullptr); if (lib) { pProtocolDialog = ptr<IProtocolDialog>(reinterpret_cast<IProtocolDialog*>(lib->Dialog())); @@ -377,7 +358,7 @@ void FaceTrackNoIR::showServerControls() { } void FaceTrackNoIR::showFilterControls() { - ptr<DynamicLibrary> lib = dlopen_filters.value(ui.iconcomboFilter->currentIndex(), nullptr); + ptr<dylib> lib = filter_modules.value(ui.iconcomboFilter->currentIndex(), nullptr); if (lib) { pFilterDialog = ptr<IFilterDialog>(reinterpret_cast<IFilterDialog*>(lib->Dialog())); @@ -403,23 +384,6 @@ void FaceTrackNoIR::exit() { extern "C" volatile const char* opentrack_version; -void FaceTrackNoIR::fill_profile_cbx() -{ - QSettings settings("opentrack"); - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString(); - qDebug() << "Config file now" << currentFile; - QFileInfo pathInfo ( currentFile ); - setWindowTitle(QString( const_cast<const char*>(opentrack_version) + QStringLiteral(" :: ")) + pathInfo.fileName()); - QDir settingsDir( pathInfo.dir() ); - QStringList filters; - filters << "*.ini"; - auto iniFileList = settingsDir.entryList( filters, QDir::Files, QDir::Name ); - ui.iconcomboProfile->clear(); - for ( int i = 0; i < iniFileList.size(); i++) - ui.iconcomboProfile->addItem(QIcon(":/images/settings16.png"), iniFileList.at(i)); - ui.iconcomboProfile->setCurrentText(pathInfo.fileName()); -} - void FaceTrackNoIR::profileSelected(int index) { QSettings settings("opentrack"); diff --git a/facetracknoir/facetracknoir.h b/facetracknoir/facetracknoir.h index fd5ccebb..0c5d902f 100644 --- a/facetracknoir/facetracknoir.h +++ b/facetracknoir/facetracknoir.h @@ -44,10 +44,10 @@ #include "ui_facetracknoir.h" -#include "./options.h" -#include "./main-settings.hpp" -#include "./plugin-support.h" -#include "./tracker.h" +#include "opentrack/options.hpp" +#include "opentrack/main-settings.hpp" +#include "opentrack/plugin-support.h" +#include "opentrack/tracker.h" #include "./shortcuts.h" #include "./curve-config.h" @@ -56,27 +56,16 @@ using namespace options; class FaceTrackNoIR : public QMainWindow { Q_OBJECT - public: - FaceTrackNoIR(); - ~FaceTrackNoIR(); - - QFrame *video_frame(); + pbundle b; + main_settings s; ptr<Tracker> tracker; - void bindKeyboardShortcuts(); - - // XXX this shit stinks -sh 20141004 - // TODO move to separate class representing running tracker state - ptr<DynamicLibrary> current_tracker() { - return dlopen_trackers.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); - } - ptr<DynamicLibrary> current_protocol() { - return dlopen_protocols.value(ui.iconcomboProtocol->currentIndex(), nullptr); - } - ptr<DynamicLibrary> current_filter() { - return dlopen_filters.value(ui.iconcomboFilter->currentIndex(), nullptr); - } - + + // XXX move kbd handling into class its own -sh 20141019 +#ifndef _WIN32 + void bind_keyboard_shortcut(QxtGlobalShortcut&, key_opts& k); +#endif +private: #if defined(_WIN32) Key keyCenter; Key keyToggle; @@ -85,12 +74,6 @@ public: QxtGlobalShortcut keyCenter; QxtGlobalShortcut keyToggle; #endif - pbundle b; - main_settings s; -public slots: - void shortcutRecentered(); - void shortcutToggled(); -private: // XXX move the shit outta the _widget_, establish a class // for running tracker state, etc -sh 20141014 Mappings pose; @@ -104,23 +87,42 @@ private: ptr<QWidget> shortcuts_widget; ptr<MapWidget> mapping_widget; + + QShortcut kbd_quit; + QPixmap no_feed_pixmap; + + QList<ptr<dylib>> filter_modules; + QList<ptr<dylib>> tracker_modules; + QList<ptr<dylib>> protocol_modules; + + QList<ptr<dylib>> module_list; + + // XXX this shit stinks -sh 20141004 + // TODO move to separate class representing running tracker state + ptr<dylib> current_tracker() + { + return tracker_modules.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); + } + ptr<dylib> current_protocol() + { + return protocol_modules.value(ui.iconcomboProtocol->currentIndex(), nullptr); + } + ptr<dylib> current_filter() + { + return filter_modules.value(ui.iconcomboFilter->currentIndex(), nullptr); + } void createIconGroupBox(); void loadSettings(); void updateButtonState(bool running, bool inertialp); - QList<ptr<DynamicLibrary>> dlopen_filters; - QList<ptr<DynamicLibrary>> dlopen_trackers; - QList<ptr<DynamicLibrary>> dlopen_protocols; - - QShortcut kbd_quit; - QPixmap no_feed_pixmap; + void fill_combobox(dylib::Type t, QList<ptr<dylib>> list, QList<ptr<dylib> > &out_list, QComboBox* cbx); + void fill_profile_combobox(); -#ifndef _WIN32 - void bind_keyboard_shortcut(QxtGlobalShortcut&, key_opts& k); -#endif - void fill_profile_cbx(); - + QFrame *video_frame(); +public slots: + void shortcutRecentered(); + void shortcutToggled(); private slots: void open(); void save(); @@ -139,8 +141,10 @@ private slots: void startTracker(); void stopTracker(); - public: + FaceTrackNoIR(); + ~FaceTrackNoIR(); void save_mappings(); void load_mappings(); + void bindKeyboardShortcuts(); }; diff --git a/facetracknoir/main-settings.hpp b/facetracknoir/main-settings.hpp deleted file mode 100644 index 0a1fb968..00000000 --- a/facetracknoir/main-settings.hpp +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include <QString> -#include "facetracknoir/options.h" -using namespace options; - -struct key_opts { - value<int> key_index; - value<bool> ctrl, alt, shift; - key_opts(pbundle b, const QString& name) : - key_index(b, QString("key-index-%1").arg(name), 0), - ctrl(b, QString("key-ctrl-%1").arg(name), 0), - alt(b, QString("key-alt-%1").arg(name), 0), - shift(b, QString("key-shift-%1").arg(name), 0) - {} -}; - -struct axis_opts { - value<double> zero; - value<bool> invert, altp; - value<int> src; - axis_opts(pbundle b, QString pfx, int idx) : - zero(b, n(pfx, "zero-pos"), 0), - invert(b, n(pfx, "invert-axis"), false), - altp(b, n(pfx, "alt-axis-sign"), false), - src(b, n(pfx, "source-index"), idx) - {} -private: - static inline QString n(QString pfx, QString name) { - return QString("%1-%2").arg(pfx, name); - } -}; - -struct main_settings { - pbundle b; - key_opts center_key; - key_opts toggle_key; - value<QString> tracker_dll, tracker2_dll, filter_dll, protocol_dll; - axis_opts a_x, a_y, a_z, a_yaw, a_pitch, a_roll; - value<bool> tcomp_p, tcomp_tz, dingp; - main_settings(pbundle b) : - b(b), - center_key(b, "center"), - toggle_key(b, "toggle"), - tracker_dll(b, "tracker-dll", ""), - tracker2_dll(b, "tracker2-dll", ""), - filter_dll(b, "filter-dll", ""), - protocol_dll(b, "protocol-dll", ""), - a_x(b, "x", TX), - a_y(b, "y", TY), - a_z(b, "z", TZ), - a_yaw(b, "yaw", Yaw), - a_pitch(b, "pitch", Pitch), - a_roll(b, "roll", Roll), - tcomp_p(b, "compensate-translation", true), - tcomp_tz(b, "compensate-translation-disable-z-axis", false), - dingp(b, "ding", true) - {} -}; diff --git a/facetracknoir/mappings.hpp b/facetracknoir/mappings.hpp deleted file mode 100644 index 5953ed1e..00000000 --- a/facetracknoir/mappings.hpp +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -#include <QSettings> -#include "options.h" -using namespace options; -#include "../qfunctionconfigurator/functionconfig.h" -#include "main-settings.hpp" - -class Mapping { -public: - Mapping(QString primary, - QString secondary, - int maxInput1, - int maxOutput1, - int maxInput2, - int maxOutput2, - axis_opts& opts) : - curve(maxInput1, maxOutput1), - curveAlt(maxInput2, maxOutput2), - opts(opts), - name1(primary), - name2(secondary) - { - // XXX TODO move all this qsettings boilerplate into a single header -sh 20141004 - QSettings settings("opentrack"); - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString(); - QSettings iniFile(currentFile, QSettings::IniFormat); - curve.loadSettings(iniFile, primary); - curveAlt.loadSettings(iniFile, secondary); - } - Map curve; - Map curveAlt; - axis_opts& opts; - QString name1, name2; -}; - -class Mappings { -private: - Mapping axes[6]; -public: - Mappings(std::vector<axis_opts*> opts) : - axes { - Mapping("tx","tx_alt", 100, 100, 100, 100, *opts[TX]), - Mapping("ty","ty_alt", 100, 100, 100, 100, *opts[TY]), - Mapping("tz","tz_alt", 100, 100, 100, 100, *opts[TZ]), - Mapping("rx", "rx_alt", 180, 180, 180, 180, *opts[Yaw]), - Mapping("ry", "ry_alt", 180, 180, 180, 180, *opts[Pitch]), - Mapping("rz", "rz_alt", 180, 180, 180, 180, *opts[Roll]) - } - {} - - inline Mapping& operator()(int i) { return axes[i]; } - inline const Mapping& operator()(int i) const { return axes[i]; } - - void load_mappings() - { - QSettings settings("opentrack"); - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString(); - QSettings iniFile( currentFile, QSettings::IniFormat ); - - for (int i = 0; i < 6; i++) - { - axes[i].curve.loadSettings(iniFile, axes[i].name1); - axes[i].curveAlt.loadSettings(iniFile, axes[i].name2); - } - } - void save_mappings() - { - QSettings settings("opentrack"); - QString currentFile = settings.value("SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini").toString(); - QSettings iniFile(currentFile, QSettings::IniFormat); - - for (int i = 0; i < 6; i++) - { - axes[i].curve.saveSettings(iniFile, axes[i].name1); - axes[i].curveAlt.saveSettings(iniFile, axes[i].name2); - } - } - - void invalidate_unsaved() - { - for (int i = 0; i < 6; i++) - { - axes[i].curve.invalidate_unsaved_settings(); - axes[i].curveAlt.invalidate_unsaved_settings(); - } - } -}; diff --git a/facetracknoir/options.h b/facetracknoir/options.h deleted file mode 100644 index 9f14b62a..00000000 --- a/facetracknoir/options.h +++ /dev/null @@ -1,392 +0,0 @@ -/* Copyright (c) 2013-2014 Stanislaw Halik - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - */ - -#pragma once - -#include <memory> -#include <tuple> -#include <map> -#include <string> - -#include <QObject> -#include <QSettings> -#include <QString> -#include <QVariant> -#include <QMutex> -#include <QMutexLocker> -#include <QWidget> -#include <QComboBox> -#include <QCheckBox> -#include <QDoubleSpinBox> -#include <QSpinBox> -#include <QSlider> -#include <QLineEdit> -#include <QLabel> -#include <QCoreApplication> - -#include <cinttypes> - -#include <QDebug> - -namespace options { - template<typename k, typename v> - using map = std::map<k, v>; - using std::string; - - template<typename t> - // don't elide usages of the function, qvariant default implicit - // conversion results in nonsensical runtime behavior -sh - inline t qcruft_to_t (const QVariant& datum); - - template<> - inline int qcruft_to_t<int>(const QVariant& t) - { - return t.toInt(); - } - - template<> - inline QString qcruft_to_t<QString>(const QVariant& t) - { - return t.toString(); - } - - template<> - inline bool qcruft_to_t<bool>(const QVariant& t) - { - return t.toBool(); - } - - template<> - inline double qcruft_to_t<double>(const QVariant& t) - { - return t.toDouble(); - } - - template<> - inline QVariant qcruft_to_t<QVariant>(const QVariant& t) - { - return t; - } - - // snapshot of qsettings group at given time - class group { - private: - map<string, QVariant> kvs; - string name; - static const QString ini_pathname() - { - QSettings settings(group::org); - return settings.value("SettingsFile", - QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString(); - } - public: - group(const string& name) : name(name) - { - QSettings conf(ini_pathname(), QSettings::IniFormat); - auto q_name = QString::fromStdString(name); - conf.beginGroup(q_name); - for (auto& k_ : conf.childKeys()) - { - auto tmp = k_.toUtf8(); - string k(tmp); - kvs[k] = conf.value(k_); - } - conf.endGroup(); - } - static constexpr const char* org = "opentrack"; - - void save() - { - QSettings s(ini_pathname(), QSettings::IniFormat); - auto q_name = QString::fromStdString(name); - s.beginGroup(q_name); - for (auto& i : kvs) - { - auto k = QString::fromStdString(i.first); - s.setValue(k, i.second); - } - s.endGroup(); - } - - template<typename t> - t get(const string& k) - { - return qcruft_to_t<t>(kvs[k]); - } - - void put(const string& s, const QVariant& d) - { - kvs[s] = d; - } - - bool contains(const string& s) - { - return kvs.count(s) != 0; - } - }; - - class impl_bundle : public QObject { - Q_OBJECT - protected: - QMutex mtx; - const string group_name; - group saved; - group transient; - bool modified; - impl_bundle(const impl_bundle&) = delete; - impl_bundle& operator=(const impl_bundle&) = delete; - public: - impl_bundle(const string& group_name) : - mtx(QMutex::Recursive), - group_name(group_name), - saved(group_name), - transient(saved), - modified(false) - { - } - - string name() { return group_name; } - - void reload() { - QMutexLocker l(&mtx); - saved = group(group_name); - transient = saved; - modified = false; - } - - bool store_kv(const string& name, const QVariant& datum) - { - QMutexLocker l(&mtx); - - auto old = transient.get<QVariant>(name); - if (!transient.contains(name) || datum != old) - { - modified = true; - transient.put(name, datum); - return true; - } - return false; - } - bool contains(const string& name) - { - QMutexLocker l(&mtx); - return transient.contains(name); - } - template<typename t> - t get(const string& name) - { - QMutexLocker l(&mtx); - return transient.get<t>(name); - } - void save() - { - QMutexLocker l(&mtx); - modified = false; - saved = transient; - transient.save(); - } - - bool modifiedp() { - QMutexLocker l(&mtx); - return modified; - } - }; - - class opt_bundle; - - namespace - { - template<typename k, typename v, typename cnt = int> - struct opt_singleton - { - public: - using pbundle = std::shared_ptr<v>; - using tt = std::tuple<cnt, pbundle>; - private: - QMutex implsgl_mtx; - map<k, tt> implsgl_data; - public: - opt_singleton() : implsgl_mtx(QMutex::Recursive) {} - - static opt_singleton<k, v>& datum() - { - static opt_singleton<k, v> ret; - return ret; - } - - pbundle bundle(const k& key) - { - QMutexLocker l(&implsgl_mtx); - - if (implsgl_data.count(key) != 0) - return std::get<1>(implsgl_data[key]); - - auto shr = std::make_shared<v>(key); - implsgl_data[key] = tt(cnt(1), shr); - return shr; - } - - void bundle_decf(const k& key) - { - QMutexLocker l(&implsgl_mtx); - - if (--std::get<0>(implsgl_data[key]) == 0) - implsgl_data.erase(key); - } - - ~opt_singleton() { implsgl_data.clear(); } - }; - - using pbundle = std::shared_ptr<opt_bundle>; - using t_fact = opt_singleton<string, opt_bundle>; - } - - static inline t_fact::pbundle bundle(const string name) { return t_fact::datum().bundle(name); } - - class opt_bundle : public impl_bundle - { - public: - opt_bundle() : impl_bundle("i-have-no-name") {} - opt_bundle(const string& group_name) : impl_bundle(group_name) - { - qDebug() << "bundle +" << QString::fromStdString(group_name); - } - - ~opt_bundle() - { - qDebug() << "bundle -" << QString::fromStdString(group_name); - t_fact::datum().bundle_decf(group_name); - } - }; - - class base_value : public QObject { - Q_OBJECT -#define DEFINE_SLOT(t) void setValue(t datum) { store(datum); } -#define DEFINE_SIGNAL(t) void valueChanged(const t&) - public: - base_value(pbundle b, const string& name) : b(b), self_name(name) {} - protected: - pbundle b; - string self_name; - - template<typename t> - void store(const t& datum) - { - if (b->store_kv(self_name, datum)) - emit valueChanged(datum); - } - public slots: - DEFINE_SLOT(double) - DEFINE_SLOT(int) - DEFINE_SLOT(QString) - DEFINE_SLOT(bool) - signals: - DEFINE_SIGNAL(double); - DEFINE_SIGNAL(int); - DEFINE_SIGNAL(bool); - DEFINE_SIGNAL(QString); - }; - - static inline string string_from_qstring(const QString& datum) - { - auto tmp = datum.toUtf8(); - return string(tmp.constData()); - } - - template<typename t> - class value : public base_value { - public: - t operator=(const t datum) - { - store(datum); - return datum; - } - static constexpr const Qt::ConnectionType DIRECT_CONNTYPE = Qt::DirectConnection; - static constexpr const Qt::ConnectionType SAFE_CONNTYPE = Qt::UniqueConnection; - value(pbundle b, const string& name, t def) : base_value(b, name) - { - if (!b->contains(name) || b->get<QVariant>(name).type() == QVariant::Invalid) - *this = def; - } - value(pbundle b, const QString& name, t def) : value(b, string_from_qstring(name), def) {} - value(pbundle b, const char* name, t def) : value(b, string(name), def) {} - - operator t() - { - return b->get<t>(self_name); - } - }; - - template<typename t, typename q> - inline void tie_setting(value<t>&, q*); - - template<> - inline void tie_setting(value<int>& v, QComboBox* cb) - { - cb->setCurrentIndex(v); - v = cb->currentIndex(); - base_value::connect(cb, SIGNAL(currentIndexChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(int)), cb, SLOT(setCurrentIndex(int)), v.SAFE_CONNTYPE); - } - - template<> - inline void tie_setting(value<QString>& v, QComboBox* cb) - { - cb->setCurrentText(v); - v = cb->currentText(); - base_value::connect(cb, SIGNAL(currentTextChanged(QString)), &v, SLOT(setValue(QString)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(QString)), cb, SLOT(setCurrentText(QString)), v.SAFE_CONNTYPE); - } - - template<> - inline void tie_setting(value<bool>& v, QCheckBox* cb) - { - cb->setChecked(v); - base_value::connect(cb, SIGNAL(toggled(bool)), &v, SLOT(setValue(bool)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(bool)), cb, SLOT(setChecked(bool)), v.SAFE_CONNTYPE); - } - - template<> - inline void tie_setting(value<double>& v, QDoubleSpinBox* dsb) - { - dsb->setValue(v); - base_value::connect(dsb, SIGNAL(valueChanged(double)), &v, SLOT(setValue(double)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(double)), dsb, SLOT(setValue(double)), v.SAFE_CONNTYPE); - } - - template<> - inline void tie_setting(value<int>& v, QSpinBox* sb) - { - sb->setValue(v); - base_value::connect(sb, SIGNAL(valueChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(int)), sb, SLOT(setValue(int)), v.SAFE_CONNTYPE); - } - - template<> - inline void tie_setting(value<int>& v, QSlider* sl) - { - sl->setValue(v); - v = sl->value(); - base_value::connect(sl, SIGNAL(valueChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(int)), sl, SLOT(setValue(int)), v.SAFE_CONNTYPE); - } - - template<> - inline void tie_setting(value<QString>& v, QLineEdit* le) - { - le->setText(v); - base_value::connect(le, SIGNAL(textChanged(QString)), &v, SLOT(setValue(QString)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(QString)),le, SLOT(setText(QString)), v.SAFE_CONNTYPE); - } - - template<> - inline void tie_setting(value<QString>& v, QLabel* lb) - { - lb->setText(v); - base_value::connect(&v, SIGNAL(valueChanged(QString)), lb, SLOT(setText(QString)), v.SAFE_CONNTYPE); - } -} diff --git a/facetracknoir/plugin-api.hpp b/facetracknoir/plugin-api.hpp deleted file mode 100644 index f352a6a9..00000000 --- a/facetracknoir/plugin-api.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "facetracknoir/export.hpp" - -enum Axis { - TX = 0, TY, TZ, Yaw, Pitch, Roll -}; - -#ifndef OPENTRACK_CROSS_ONLY -# include "facetracknoir/plugin-qt-api.hpp" -#endif
\ No newline at end of file diff --git a/facetracknoir/plugin-qt-api.hpp b/facetracknoir/plugin-qt-api.hpp deleted file mode 100644 index a2aa0d19..00000000 --- a/facetracknoir/plugin-qt-api.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include <QString> -#include <QFrame> -#include <QIcon> - -struct Metadata -{ -public: - virtual QString name() = 0; - virtual QIcon icon() = 0; - virtual ~Metadata() {}; -}; - -// XXX TODO get rid of QString/QFrame to fix ABI woes -// will lead plugins from different C++ runtimes working -sh 20141004 - -// XXX TODO make public QWidget the mess -sh 20141004 - -struct IFilter -{ -public: - virtual ~IFilter() {}; - virtual void filter(const double *target_camera_position, double *new_camera_position) = 0; -}; - -struct IFilterDialog : public QWidget -{ - virtual ~IFilterDialog() {} - virtual void registerFilter(IFilter* tracker) = 0; - virtual void unregisterFilter() = 0; -}; - -struct IProtocol -{ -public: - virtual ~IProtocol() {}; - virtual bool correct() = 0; - virtual void pose( const double* headpose ) = 0; - virtual QString game_name() = 0; -}; - -struct IProtocolDialog : public QWidget -{ - virtual ~IProtocolDialog() {} - virtual void register_protocol(IProtocol *protocol) = 0; - virtual void unregister_protocol() = 0; -}; - -struct ITracker -{ -public: - virtual ~ITracker() {}; - virtual void start_tracker( QFrame* frame ) = 0; - virtual void data(double *data) = 0; -}; - -struct ITrackerDialog : public QWidget -{ - virtual ~ITrackerDialog() {} - virtual void register_tracker(ITracker *tracker) = 0; - virtual void unregister_tracker() = 0; -}; diff --git a/facetracknoir/plugin-support.cpp b/facetracknoir/plugin-support.cpp deleted file mode 100644 index b202fc74..00000000 --- a/facetracknoir/plugin-support.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include <cstdio> -#include <cinttypes> -#include "plugin-support.h" -#include <QCoreApplication> -#include <QFile> - -#ifndef _WIN32 -# include <dlfcn.h> -#endif - -SelectedLibraries::~SelectedLibraries() -{ -} - -template<typename t> -static ptr<t> make_instance(ptr<DynamicLibrary> lib) -{ - ptr<t> ret = nullptr; - if (lib && lib->Constructor) - ret = ptr<t>(reinterpret_cast<t*>(reinterpret_cast<CTOR_FUNPTR>(lib->Constructor)())); - qDebug() << "lib" << (lib ? lib->filename : "<null>") << "ptr" << (intptr_t)ret.get(); - return ret; -} - -SelectedLibraries::SelectedLibraries(QFrame* frame, dylib t, dylib p, dylib f) : - pTracker(nullptr), - pFilter(nullptr), - pProtocol(nullptr), - correct(false) -{ - pTracker = make_instance<ITracker>(t); - pProtocol = make_instance<IProtocol>(p); - pFilter = make_instance<IFilter>(f); - - if (!pTracker|| !pProtocol) - { - qDebug() << "load failure tracker" << (intptr_t)pTracker.get() << "protocol" << (intptr_t)pProtocol.get(); - return; - } - - if (pProtocol) - if(!pProtocol->correct()) - { - qDebug() << "protocol load failure"; - return; - } - - pTracker->start_tracker(frame); - - correct = true; -} - -DynamicLibrary::DynamicLibrary(const QString& filename) : - Dialog(nullptr), - Constructor(nullptr), - Metadata(nullptr) -{ - this->filename = filename; -#if defined(_WIN32) - QString fullPath = QCoreApplication::applicationDirPath() + "/" + this->filename; - handle = new QLibrary(fullPath); - - struct _foo { - static bool die(QLibrary*& l, bool failp) - { - if (failp) - { - qDebug() << "failed" << l->errorString(); - delete l; - l = nullptr; - } - return failp; - } - }; - - if (_foo::die(handle, !handle->load())) - return; - - Dialog = (CTOR_FUNPTR) handle->resolve("GetDialog"); - if (_foo::die(handle, !Dialog)) - return; - - Constructor = (CTOR_FUNPTR) handle->resolve("GetConstructor"); - if (_foo::die(handle, !Constructor)) - return; - - Metadata = (METADATA_FUNPTR) handle->resolve("GetMetadata"); - if (_foo::die(handle, !Metadata)) - return; -#else - QByteArray latin1 = QFile::encodeName(filename); - handle = dlopen(latin1.constData(), RTLD_NOW | -# ifdef __linux - RTLD_DEEPBIND -# elif defined(__APPLE__) - RTLD_LOCAL|RTLD_FIRST|RTLD_NOW -# else - 0 -# endif - ); - - struct _foo { - static bool err(void*& handle) - { - const char* err = dlerror(); - if (err) - { - fprintf(stderr, "Error, ignoring: %s\n", err); - fflush(stderr); - dlclose(handle); - handle = nullptr; - return true; - } - return false; - } - }; - - if (handle) - { - if (_foo::err(handle)) - return; - Dialog = (CTOR_FUNPTR) dlsym(handle, "GetDialog"); - if (_foo::err(handle)) - return; - Constructor = (CTOR_FUNPTR) dlsym(handle, "GetConstructor"); - if (_foo::err(handle)) - return; - Metadata = (METADATA_FUNPTR) dlsym(handle, "GetMetadata"); - if (_foo::err(handle)) - return; - } else { - (void) _foo::err(handle); - } -#endif -} - -DynamicLibrary::~DynamicLibrary() -{ -#if defined(_WIN32) - handle->unload(); -#else - if (handle) - (void) dlclose(handle); -#endif -} diff --git a/facetracknoir/plugin-support.h b/facetracknoir/plugin-support.h deleted file mode 100644 index 83856922..00000000 --- a/facetracknoir/plugin-support.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "facetracknoir/plugin-api.hpp" - -#include <QWidget> -#include <QDebug> -#include <QString> -#include <QLibrary> -#include <QFrame> - -#include <memory> -template<typename t> using ptr = std::shared_ptr<t>; - -extern "C" typedef void* (*CTOR_FUNPTR)(void); -extern "C" typedef Metadata* (*METADATA_FUNPTR)(void); - -class DynamicLibrary { -public: - DynamicLibrary(const QString& filename); - ~DynamicLibrary(); - CTOR_FUNPTR Dialog; - CTOR_FUNPTR Constructor; - METADATA_FUNPTR Metadata; - QString filename; -private: -#if defined(_WIN32) - QLibrary* handle; -#else - void* handle; -#endif -}; - -struct SelectedLibraries { - using dylib = ptr<DynamicLibrary>; - - ptr<ITracker> pTracker; - ptr<IFilter> pFilter; - ptr<IProtocol> pProtocol; - SelectedLibraries(QFrame* frame, dylib t, dylib p, dylib f); - SelectedLibraries() : pTracker(nullptr), pFilter(nullptr), pProtocol(nullptr), correct(false) {} - ~SelectedLibraries(); - bool correct; -};
\ No newline at end of file diff --git a/facetracknoir/pose.hpp b/facetracknoir/pose.hpp deleted file mode 100644 index 41e984f5..00000000 --- a/facetracknoir/pose.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include <utility> -#include <algorithm> -#include "./quat.hpp" -#include "./plugin-api.hpp" - -class Pose { -private: - static constexpr double pi = 3.141592653; - static constexpr double d2r = pi/180.0; - static constexpr double r2d = 180./pi; - - double axes[6]; -public: - Pose() : axes {0,0,0, 0,0,0 } {} - - inline operator double*() { return axes; } - inline operator const double*() const { return axes; } - - inline double& operator()(int i) { return axes[i]; } - inline double operator()(int i) const { return axes[i]; } - - Quat quat() const - { - return Quat(axes[Yaw]*d2r, axes[Pitch]*d2r, axes[Roll]*d2r); - } - - static Pose fromQuat(const Quat& q) - { - Pose ret; - q.to_euler_degrees(ret(Yaw), ret(Pitch), ret(Roll)); - return ret; - } - - Pose operator&(const Pose& B) const - { - const Quat q = quat() * B.quat().inv(); - Pose ret = fromQuat(q); - for (int i = TX; i < TX + 3; i++) - ret(i) = axes[i] - B.axes[i]; - return ret; - } -}; diff --git a/facetracknoir/qcopyable-mutex.hpp b/facetracknoir/qcopyable-mutex.hpp deleted file mode 100644 index f7f36f93..00000000 --- a/facetracknoir/qcopyable-mutex.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include <QMutex> - -class MyMutex { -private: - QMutex inner; - -public: - QMutex* operator->() { return &inner; } - QMutex* operator->() const { return &const_cast<MyMutex*>(this)->inner; } - - MyMutex operator=(const MyMutex& datum) - { - auto mode = - datum->isRecursive() - ? QMutex::Recursive - : QMutex::NonRecursive; - - return MyMutex(mode); - } - - MyMutex(const MyMutex& datum) - { - *this = datum; - } - - MyMutex(QMutex::RecursionMode mode = QMutex::NonRecursive) : - inner(mode) - { - } - - QMutex* operator&() - { - return &inner; - } -}; diff --git a/facetracknoir/quat.hpp b/facetracknoir/quat.hpp deleted file mode 100644 index 6d777b28..00000000 --- a/facetracknoir/quat.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (c) 2012 Patrick Ruoff - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - */ - -#pragma once -#include <cmath> - -class Quat { -private: - static constexpr double pi = 3.141592653; - static constexpr double r2d = 180./pi; - double a,b,c,d; // quaternion coefficients -public: - Quat() : a(1.),b(0.),c(0.),d(0.) {} - Quat(double yaw, double pitch, double roll) { from_euler_rads(yaw, pitch, roll); } - Quat(double a, double b, double c, double d) : a(a),b(b),c(c),d(d) {} - - Quat inv(){ - return Quat(a,-b,-c, -d); - } - - // conversions - // see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - void from_euler_rads(double yaw, double pitch, double roll) - { - - const double sin_phi = sin(roll/2.); - const double cos_phi = cos(roll/2.); - const double sin_the = sin(pitch/2.); - const double cos_the = cos(pitch/2.); - const double sin_psi = sin(yaw/2.); - const double cos_psi = cos(yaw/2.); - - a = cos_phi*cos_the*cos_psi + sin_phi*sin_the*sin_psi; - b = sin_phi*cos_the*cos_psi - cos_phi*sin_the*sin_psi; - c = cos_phi*sin_the*cos_psi + sin_phi*cos_the*sin_psi; - d = cos_phi*cos_the*sin_psi - sin_phi*sin_the*cos_psi; - } - - void to_euler_rads(double& yaw, double& pitch, double& roll) const - { - roll = atan2(2.*(a*b + c*d), 1. - 2.*(b*b + c*c)); - pitch = asin(2.*(a*c - b*d)); - yaw = atan2(2.*(a*d + b*c), 1. - 2.*(c*c + d*d)); - } - - void to_euler_degrees(double& yaw, double& pitch, double& roll) const - { - to_euler_rads(yaw, pitch, roll); - yaw *= r2d; - pitch *= r2d; - roll *= r2d; - } - - const Quat operator*(const Quat& B) const - { - const Quat& A = *this; - return Quat(A.a*B.a - A.b*B.b - A.c*B.c - A.d*B.d, // quaternion multiplication - A.a*B.b + A.b*B.a + A.c*B.d - A.d*B.c, - A.a*B.c - A.b*B.d + A.c*B.a + A.d*B.b, - A.a*B.d + A.b*B.c - A.c*B.b + A.d*B.a); - } -}; diff --git a/facetracknoir/timer.hpp b/facetracknoir/timer.hpp deleted file mode 100644 index 628365c9..00000000 --- a/facetracknoir/timer.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include <ctime> -#if defined (_WIN32) -# include <windows.h> -static inline void opentrack_clock_gettime(int, struct timespec* ts) -{ - static LARGE_INTEGER freq; - - if (!freq.QuadPart) - (void) QueryPerformanceFrequency(&freq); - - LARGE_INTEGER d; - - (void) QueryPerformanceCounter(&d); - - d.QuadPart *= 1000000000L; - d.QuadPart /= freq.QuadPart; - - ts->tv_sec = d.QuadPart / 1000000000L; - ts->tv_nsec = d.QuadPart % 1000000000L; -} -# define clock_gettime opentrack_clock_gettime -#else -# if defined(__MACH__) -# define CLOCK_MONOTONIC 0 -# include <inttypes.h> -# include <mach/mach_time.h> -static inline void clock_gettime(int, struct timespec* ts) -{ - static mach_timebase_info_data_t sTimebaseInfo; - uint64_t state, nsec; - if ( sTimebaseInfo.denom == 0 ) { - (void) mach_timebase_info(&sTimebaseInfo); - } - state = mach_absolute_time(); - nsec = state * sTimebaseInfo.numer / sTimebaseInfo.denom; - ts->tv_sec = nsec / 1000000000L; - ts->tv_nsec = nsec % 1000000000L; -} -# endif -#endif -class Timer { -private: - struct timespec state; - long conv(const struct timespec& cur) - { - return (cur.tv_sec - state.tv_sec) * 1000000000L + (cur.tv_nsec - state.tv_nsec); - } -public: - Timer() { - start(); - } - long start() { - struct timespec cur; - (void) clock_gettime(CLOCK_MONOTONIC, &cur); - long ret = conv(cur); - state = cur; - return ret; - } - long elapsed() { - struct timespec cur; - (void) clock_gettime(CLOCK_MONOTONIC, &cur); - return conv(cur); - } - long elapsed_ms() { - return elapsed() / 1000000L; - } -}; diff --git a/facetracknoir/tracker.cpp b/facetracknoir/tracker.cpp deleted file mode 100644 index 41db7c19..00000000 --- a/facetracknoir/tracker.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* Copyright (c) 2012-2013 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. - */ - -/* - * this file appeared originally in facetracknoir, was rewritten completely - * following opentrack fork. - * - * originally written by Wim Vriend. - */ - -#include <opencv2/core/core.hpp> - -#include "./tracker.h" -#include <cmath> -#include <algorithm> - -#if defined(_WIN32) -# include <windows.h> -#endif - -Tracker::Tracker(main_settings& s, Mappings &m, SelectedLibraries &libs) : - s(s), - m(m), - centerp(false), - enabledp(true), - should_quit(false), - libs(libs) -{ -} - -Tracker::~Tracker() -{ - should_quit = true; - wait(); -} - -double Tracker::map(double pos, Mapping& axis) { - bool altp = (pos < 0) && axis.opts.altp; - axis.curve.setTrackingActive( !altp ); - axis.curveAlt.setTrackingActive( altp ); - auto& fc = altp ? axis.curveAlt : axis.curve; - double invert = axis.opts.invert ? -1 : 1; - return invert * (fc.getValue(pos) + axis.opts.zero); -} - -static cv::Matx33d euler_to_rmat(const double* input) -{ - static constexpr double pi = 3.141592653; - const auto H = input[0] * pi / -180; - const auto P = input[1] * pi / -180; - const auto B = input[2] * pi / 180; - - const auto cosH = cos(H); - const auto sinH = sin(H); - const auto cosP = cos(P); - const auto sinP = sin(P); - const auto cosB = cos(B); - const auto sinB = sin(B); - - double foo[] = { - cosH * cosB - sinH * sinP * sinB, - - sinB * cosP, - sinH * cosB + cosH * sinP * sinB, - cosH * sinB + sinH * sinP * cosB, - cosB * cosP, - sinB * sinH - cosH * sinP * cosB, - - sinH * cosP, - - sinP, - cosH * cosP, - }; - - return cv::Matx33d(foo); -} - -void Tracker::t_compensate(const double* input, double* output, bool rz) -{ - const cv::Matx33d rmat = euler_to_rmat(&input[Yaw]); - const cv::Vec3d tvec(input); - const cv::Vec3d ret = rmat * tvec; - - const int max = !rz ? 3 : 2; - - for (int i = 0; i < max; i++) - output[i] = ret(i); -} - -void Tracker::logic() -{ - libs.pTracker->data(newpose); - - Pose final_raw; - - if (enabledp) - { - for (int i = 0; i < 6; i++) - { - auto& axis = m(i); - int k = axis.opts.src; - if (k < 0 || k >= 6) - { - final_raw(i) = 0; - continue; - } - // not really raw, after axis remap -sh - final_raw(i) = newpose[k]; - } - unstopped_raw = final_raw; - } - - Pose filtered_pose; - - if (libs.pFilter) - libs.pFilter->filter(final_raw, filtered_pose); - else - filtered_pose = final_raw; - - if (centerp) - { - centerp = false; - raw_center = final_raw; - } - - Pose raw_centered = filtered_pose & raw_center; - - Pose mapped_pose_precomp; - - for (int i = 0; i < 6; i++) - mapped_pose_precomp(i) = map(raw_centered(i), m(i)); - - Pose mapped_pose; - - mapped_pose = mapped_pose_precomp; - if (s.tcomp_p) - t_compensate(mapped_pose_precomp, mapped_pose, s.tcomp_tz); - - libs.pProtocol->pose(mapped_pose); - - { - QMutexLocker foo(&mtx); - output_pose = mapped_pose; - raw_6dof = unstopped_raw; - } -} - -void Tracker::run() { - const int sleep_ms = 3; - -#if defined(_WIN32) - (void) timeBeginPeriod(1); -#endif - - while (!should_quit) - { - t.start(); - - logic(); - - double q = sleep_ms * 1000L; - q -= t.elapsed(); - q = std::max(0., q); - usleep((long)q); - } - -#if defined(_WIN32) - (void) timeEndPeriod(1); -#endif - - for (int i = 0; i < 6; i++) - { - m(i).curve.setTrackingActive(false); - m(i).curveAlt.setTrackingActive(false); - } -} - -void Tracker::get_raw_and_mapped_poses(double* mapped, double* raw) const { - QMutexLocker foo(&const_cast<Tracker&>(*this).mtx); - for (int i = 0; i < 6; i++) - { - raw[i] = raw_6dof(i); - mapped[i] = output_pose(i); - } -} - diff --git a/facetracknoir/tracker.h b/facetracknoir/tracker.h deleted file mode 100644 index 75f54084..00000000 --- a/facetracknoir/tracker.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include <atomic> -#include <vector> - -#include "./timer.hpp" -#include "./plugin-support.h" -#include "./mappings.hpp" -#include "./pose.hpp" - -#include "../qfunctionconfigurator/functionconfig.h" -#include "./main-settings.hpp" -#include "./options.h" - -#include <QMutex> -#include <QThread> - -class Tracker : private QThread { - Q_OBJECT -private: - QMutex mtx; - main_settings& s; - // XXX can be const-cast when functionconfig const-correct -sh 20141004 - Mappings& m; - - Timer t; - Pose output_pose, raw_6dof, raw_center, unstopped_raw; - double newpose[6]; - std::atomic<bool> centerp; - std::atomic<bool> enabledp; - std::atomic<bool> should_quit; - SelectedLibraries const& libs; - - double map(double pos, Mapping& axis); - void logic(); - - static void t_compensate(const double* input, double* output, bool rz); -protected: - void run() override; -public: - Tracker(main_settings& s, Mappings& m, SelectedLibraries& libs); - ~Tracker(); - - void get_raw_and_mapped_poses(double* mapped, double* raw) const; - void start() { QThread::start(); } - void toggle_enabled() { enabledp.store(!enabledp.load()); } - void center() { centerp.store(!centerp.load()); } -}; |