From dd87370ff2818ee3c3d67ba104405b85ee44daba Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 19 Oct 2014 16:08:46 +0200 Subject: decruft more --- CMakeLists.txt | 32 +- facetracknoir/curve-config.cpp | 2 +- facetracknoir/curve-config.h | 2 +- facetracknoir/export.hpp | 7 - facetracknoir/facetracknoir.cpp | 146 +++----- facetracknoir/facetracknoir.h | 86 ++--- facetracknoir/main-settings.hpp | 59 ---- facetracknoir/mappings.hpp | 88 ----- facetracknoir/options.h | 392 --------------------- facetracknoir/plugin-api.hpp | 11 - facetracknoir/plugin-qt-api.hpp | 63 ---- facetracknoir/plugin-support.cpp | 145 -------- facetracknoir/plugin-support.h | 43 --- facetracknoir/pose.hpp | 44 --- facetracknoir/qcopyable-mutex.hpp | 37 -- facetracknoir/quat.hpp | 66 ---- facetracknoir/timer.hpp | 68 ---- facetracknoir/tracker.cpp | 187 ---------- facetracknoir/tracker.h | 48 --- ftnoir_filter_accela/ftnoir_filter_accela.cpp | 2 +- ftnoir_filter_accela/ftnoir_filter_accela.h | 4 +- .../ftnoir_filter_accela_dialog.cpp | 2 +- ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp | 2 +- ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp | 2 +- ftnoir_filter_ewma2/ftnoir_filter_ewma2.h | 4 +- ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp | 2 +- ftnoir_filter_ewma2/ftnoir_filter_ewma_dll.cpp | 2 +- ftnoir_filter_kalman/ftnoir_filter_kalman.h | 4 +- ftnoir_filter_kalman/kalman.cpp | 2 +- ftnoir_posewidget/glwidget.h | 2 +- ftnoir_protocol_fg/ftnoir_protocol_fg.cpp | 2 +- ftnoir_protocol_fg/ftnoir_protocol_fg.h | 4 +- ftnoir_protocol_fg/ftnoir_protocol_fg_dialog.cpp | 2 +- ftnoir_protocol_fg/ftnoir_protocol_fg_dll.cpp | 2 +- ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.cpp | 2 +- ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.h | 4 +- .../ftnoir_protocol_fsuipc_dialog.cpp | 2 +- .../ftnoir_protocol_fsuipc_dll.cpp | 2 +- ftnoir_protocol_ft/ftnoir_protocol_ft.h | 4 +- ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp | 2 +- ftnoir_protocol_ftn/ftnoir_protocol_ftn.cpp | 2 +- ftnoir_protocol_ftn/ftnoir_protocol_ftn.h | 4 +- ftnoir_protocol_ftn/ftnoir_protocol_ftn_dialog.cpp | 2 +- ftnoir_protocol_ftn/ftnoir_protocol_ftn_dll.cpp | 2 +- .../ftnoir_protocol_libevdev.cpp | 2 +- .../ftnoir_protocol_libevdev.h | 2 +- .../ftnoir_protocol_libevdev_dialog.cpp | 2 +- .../ftnoir_protocol_libevdev_dll.cpp | 2 +- ftnoir_protocol_mouse/ftnoir_protocol_mouse.cpp | 2 +- ftnoir_protocol_mouse/ftnoir_protocol_mouse.h | 4 +- .../ftnoir_protocol_mouse_dialog.cpp | 2 +- .../ftnoir_protocol_mouse_dll.cpp | 2 +- ftnoir_protocol_sc/ftnoir_protocol_sc.cpp | 2 +- ftnoir_protocol_sc/ftnoir_protocol_sc.h | 4 +- ftnoir_protocol_sc/ftnoir_protocol_sc_dialog.cpp | 2 +- ftnoir_protocol_sc/ftnoir_protocol_sc_dll.cpp | 2 +- ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.cpp | 2 +- ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.h | 2 +- .../ftnoir_protocol_vjoy_dialog.cpp | 2 +- ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dll.cpp | 2 +- ftnoir_protocol_wine/ftnoir_protocol_wine.h | 2 +- .../ftnoir_protocol_wine_dialog.cpp | 2 +- ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp | 2 +- ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp | 2 +- ftnoir_tracker_aruco/ftnoir_tracker_aruco.h | 4 +- ftnoir_tracker_aruco/ftnoir_tracker_aruco_dll.h | 2 +- .../ftnoir_tracker_freepie-udp.cpp | 2 +- .../ftnoir_tracker_freepie-udp.h | 4 +- .../ftnoir_tracker_freepie-udp_dialog.cpp | 2 +- .../ftnoir_tracker_freepie-udp_dll.cpp | 2 +- ftnoir_tracker_ht/ftnoir_tracker_ht.cpp | 2 +- ftnoir_tracker_ht/ftnoir_tracker_ht.h | 4 +- ftnoir_tracker_ht/ftnoir_tracker_ht_dll.h | 2 +- ftnoir_tracker_hydra/ftnoir_tracker_hydra.cpp | 2 +- ftnoir_tracker_hydra/ftnoir_tracker_hydra.h | 4 +- .../ftnoir_tracker_hydra_dialog.cpp | 2 +- ftnoir_tracker_hydra/ftnoir_tracker_hydra_dll.cpp | 2 +- .../ftnoir_tracker_joystick.cpp | 2 +- ftnoir_tracker_joystick/ftnoir_tracker_joystick.h | 4 +- .../ftnoir_tracker_joystick_dialog.cpp | 2 +- .../ftnoir_tracker_joystick_dll.cpp | 2 +- .../ftnoir_tracker_libevdev.cpp | 2 +- ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h | 4 +- .../ftnoir_tracker_libevdev_dialog.cpp | 2 +- .../ftnoir_tracker_libevdev_dll.cpp | 2 +- ftnoir_tracker_pt/ftnoir_tracker_pt.h | 4 +- ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h | 2 +- ftnoir_tracker_pt/ftnoir_tracker_pt_dll.cpp | 2 +- ftnoir_tracker_pt/ftnoir_tracker_pt_dll.h | 2 +- ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h | 2 +- ftnoir_tracker_rift/ftnoir_tracker_rift.cpp | 2 +- ftnoir_tracker_rift/ftnoir_tracker_rift.h | 4 +- ftnoir_tracker_rift/ftnoir_tracker_rift_dialog.cpp | 2 +- ftnoir_tracker_rift/ftnoir_tracker_rift_dll.cpp | 2 +- ftnoir_tracker_udp/ftnoir_tracker_udp.cpp | 2 +- ftnoir_tracker_udp/ftnoir_tracker_udp.h | 4 +- ftnoir_tracker_udp/ftnoir_tracker_udp_dialog.cpp | 2 +- ftnoir_tracker_udp/ftnoir_tracker_udp_dll.cpp | 2 +- opentrack/export.hpp | 7 + opentrack/main-settings.hpp | 59 ++++ opentrack/mappings.hpp | 88 +++++ opentrack/options.hpp | 392 +++++++++++++++++++++ opentrack/plugin-api.hpp | 11 + opentrack/plugin-qt-api.hpp | 63 ++++ opentrack/plugin-support.cpp | 215 +++++++++++ opentrack/plugin-support.h | 51 +++ opentrack/pose.hpp | 44 +++ opentrack/qcopyable-mutex.hpp | 37 ++ opentrack/quat.hpp | 66 ++++ opentrack/timer.hpp | 68 ++++ opentrack/tracker.cpp | 187 ++++++++++ opentrack/tracker.h | 47 +++ qfunctionconfigurator/functionconfig.h | 4 +- qfunctionconfigurator/qfunctionconfigurator.h | 2 +- 114 files changed, 1549 insertions(+), 1512 deletions(-) delete mode 100644 facetracknoir/export.hpp delete mode 100644 facetracknoir/main-settings.hpp delete mode 100644 facetracknoir/mappings.hpp delete mode 100644 facetracknoir/options.h delete mode 100644 facetracknoir/plugin-api.hpp delete mode 100644 facetracknoir/plugin-qt-api.hpp delete mode 100644 facetracknoir/plugin-support.cpp delete mode 100644 facetracknoir/plugin-support.h delete mode 100644 facetracknoir/pose.hpp delete mode 100644 facetracknoir/qcopyable-mutex.hpp delete mode 100644 facetracknoir/quat.hpp delete mode 100644 facetracknoir/timer.hpp delete mode 100644 facetracknoir/tracker.cpp delete mode 100644 facetracknoir/tracker.h create mode 100644 opentrack/export.hpp create mode 100644 opentrack/main-settings.hpp create mode 100644 opentrack/mappings.hpp create mode 100644 opentrack/options.hpp create mode 100644 opentrack/plugin-api.hpp create mode 100644 opentrack/plugin-qt-api.hpp create mode 100644 opentrack/plugin-support.cpp create mode 100644 opentrack/plugin-support.h create mode 100644 opentrack/pose.hpp create mode 100644 opentrack/qcopyable-mutex.hpp create mode 100644 opentrack/quat.hpp create mode 100644 opentrack/timer.hpp create mode 100644 opentrack/tracker.cpp create mode 100644 opentrack/tracker.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9406680e..0b350598 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,6 +164,7 @@ macro(opentrack_library n dir) endmacro() opentrack_module(opentrack-bin facetracknoir) +opentrack_module(opentrack-api opentrack) opentrack_module(opentrack-pose-widget ftnoir_posewidget) opentrack_module(opentrack-spline-widget qfunctionconfigurator) @@ -184,7 +185,7 @@ file(GLOB opentrack-freetrack-c "freetrackclient/*.c") if(SDK_XPLANE) # probably librt already included - add_library(opentrack-xplane-plugin SHARED ${opentrack-xplane-plugin-c}) + add_library(opentrack-xplane-plugin STATIC ${opentrack-xplane-plugin-c}) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC AND NOT APPLE) SET_TARGET_PROPERTIES(opentrack-xplane-plugin PROPERTIES LINK_FLAGS @@ -209,7 +210,7 @@ if(QT_USE_FILE) INCLUDE(${QT_USE_FILE}) endif() -add_library(opentrack-compat SHARED ${opentrack-compat-c}) +add_library(opentrack-compat STATIC ${opentrack-compat-c}) if(NOT WIN32 AND NOT APPLE) target_link_libraries(opentrack-compat rt) endif() @@ -222,12 +223,12 @@ endif() set(MY_QT_LIBS ${Qt5Widgets_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Network_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5Core_LIBRARIES} ${my-qt-deps}) -add_library(opentrack-csv SHARED ${opentrack-csv-c}) +add_library(opentrack-csv STATIC ${opentrack-csv-c}) target_link_libraries(opentrack-csv ${MY_QT_LIBS}) -add_library(opentrack-pose-widget SHARED ${opentrack-pose-widget-c} ${opentrack-pose-widget-rcc}) +add_library(opentrack-pose-widget STATIC ${opentrack-pose-widget-c} ${opentrack-pose-widget-rcc}) target_link_libraries(opentrack-pose-widget ${MY_QT_LIBS}) -add_library(opentrack-spline-widget SHARED ${opentrack-spline-widget-c}) +add_library(opentrack-spline-widget STATIC ${opentrack-spline-widget-c}) target_link_libraries(opentrack-spline-widget ${MY_QT_LIBS}) add_library(opentrack-version STATIC ${opentrack-version-c}) @@ -395,7 +396,7 @@ else() set(opentrack-win32-executable "") endif() if(UNIX OR APPLE) - add_library(opentrack-qxt-mini SHARED ${qxt-mini-c}) + add_library(opentrack-qxt-mini STATIC ${qxt-mini-c}) SET_TARGET_PROPERTIES(opentrack-qxt-mini PROPERTIES COMPILE_FLAGS "-DBUILD_QXT_CORE=42 -DBUILD_QXT_WIDGETS=42 -DBUILD_QXT_GUI=42") target_link_libraries(opentrack-qxt-mini ${MY_QT_LIBS}) if(NOT APPLE) @@ -403,7 +404,9 @@ if(UNIX OR APPLE) endif() endif() +add_library(opentrack-api STATIC ${opentrack-api-c}) add_executable(opentrack ${opentrack-win32-executable} ${opentrack-bin-c} ${opentrack-bin-uih} ${opentrack-bin-rcc}) +target_link_libraries(opentrack opentrack-api) if(APPLE) SET_TARGET_PROPERTIES(opentrack-qxt-mini PROPERTIES LINK_FLAGS "-framework Carbon -framework CoreFoundation") @@ -412,13 +415,9 @@ endif() if(UNIX OR APPLE) target_link_libraries(opentrack opentrack-qxt-mini) endif() -target_link_libraries(opentrack ${OpenCV_LIBS}) +target_link_libraries(opentrack-api ${OpenCV_LIBS}) include_directories(${OpenCV_INCLUDE_DIRS}) -if(UNIX OR APPLE) - install(TARGETS opentrack-qxt-mini RUNTIME DESTINATION . LIBRARY DESTINATION . ) -endif() - link_with_dinput8(opentrack) if(CMAKE_SYSTEM STREQUAL LINUX) @@ -427,9 +426,9 @@ endif() target_link_libraries(opentrack opentrack-version opentrack-pose-widget opentrack-spline-widget ${MY_QT_LIBS} ${QXT_QXTCORE_LIB_RELEASE} ${QXT_QXTWIDGETS_LIB_RELEASE}) if(NOT WIN32) - target_link_libraries(opentrack dl) + target_link_libraries(opentrack-api dl) else() - target_link_libraries(opentrack winmm) + target_link_libraries(opentrack-api winmm) endif() # make install @@ -455,13 +454,6 @@ if(NOT WIN32 AND SDK_WINE_PREFIX AND NOT SDK_WINE_NO_WRAPPER) DESTINATION .) endif() -install(TARGETS - opentrack-compat - opentrack-csv - opentrack-pose-widget - opentrack-spline-widget - RUNTIME DESTINATION . LIBRARY DESTINATION . ) - install(TARGETS opentrack DESTINATION .) if(SDK_VJOY) 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 -#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 -#if defined(__APPLE__) -# define SONAME "dylib" -#elif defined(_WIN32) -# define SONAME "dll" -#else -# define SONAME "so" -#endif - -#include - -#ifdef _MSC_VER -# error "No support for MSVC anymore" -#else -# define LIB_PREFIX "lib" -#endif - -static bool get_metadata(ptr 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>& 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(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{&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> list, QList>& 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(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 lib = dlopen_trackers.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); + ptr lib = tracker_modules.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); if (lib) { pTrackerDialog = ptr(reinterpret_cast(lib->Dialog())); @@ -367,7 +348,7 @@ void FaceTrackNoIR::showTrackerSettings() } void FaceTrackNoIR::showServerControls() { - ptr lib = dlopen_protocols.value(ui.iconcomboProtocol->currentIndex(), nullptr); + ptr lib = protocol_modules.value(ui.iconcomboProtocol->currentIndex(), nullptr); if (lib) { pProtocolDialog = ptr(reinterpret_cast(lib->Dialog())); @@ -377,7 +358,7 @@ void FaceTrackNoIR::showServerControls() { } void FaceTrackNoIR::showFilterControls() { - ptr lib = dlopen_filters.value(ui.iconcomboFilter->currentIndex(), nullptr); + ptr lib = filter_modules.value(ui.iconcomboFilter->currentIndex(), nullptr); if (lib) { pFilterDialog = ptr(reinterpret_cast(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(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; - void bindKeyboardShortcuts(); - - // XXX this shit stinks -sh 20141004 - // TODO move to separate class representing running tracker state - ptr current_tracker() { - return dlopen_trackers.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); - } - ptr current_protocol() { - return dlopen_protocols.value(ui.iconcomboProtocol->currentIndex(), nullptr); - } - ptr 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 shortcuts_widget; ptr mapping_widget; + + QShortcut kbd_quit; + QPixmap no_feed_pixmap; + + QList> filter_modules; + QList> tracker_modules; + QList> protocol_modules; + + QList> module_list; + + // XXX this shit stinks -sh 20141004 + // TODO move to separate class representing running tracker state + ptr current_tracker() + { + return tracker_modules.value(ui.iconcomboTrackerSource->currentIndex(), nullptr); + } + ptr current_protocol() + { + return protocol_modules.value(ui.iconcomboProtocol->currentIndex(), nullptr); + } + ptr current_filter() + { + return filter_modules.value(ui.iconcomboFilter->currentIndex(), nullptr); + } void createIconGroupBox(); void loadSettings(); void updateButtonState(bool running, bool inertialp); - QList> dlopen_filters; - QList> dlopen_trackers; - QList> dlopen_protocols; - - QShortcut kbd_quit; - QPixmap no_feed_pixmap; + void fill_combobox(dylib::Type t, QList> list, QList > &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 -#include "facetracknoir/options.h" -using namespace options; - -struct key_opts { - value key_index; - value 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 zero; - value invert, altp; - value 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 tracker_dll, tracker2_dll, filter_dll, protocol_dll; - axis_opts a_x, a_y, a_z, a_yaw, a_pitch, a_roll; - value 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 -#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 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 -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -namespace options { - template - using map = std::map; - using std::string; - - template - // 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(const QVariant& t) - { - return t.toInt(); - } - - template<> - inline QString qcruft_to_t(const QVariant& t) - { - return t.toString(); - } - - template<> - inline bool qcruft_to_t(const QVariant& t) - { - return t.toBool(); - } - - template<> - inline double qcruft_to_t(const QVariant& t) - { - return t.toDouble(); - } - - template<> - inline QVariant qcruft_to_t(const QVariant& t) - { - return t; - } - - // snapshot of qsettings group at given time - class group { - private: - map 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 - t get(const string& k) - { - return qcruft_to_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(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 - t get(const string& name) - { - QMutexLocker l(&mtx); - return transient.get(name); - } - void save() - { - QMutexLocker l(&mtx); - modified = false; - saved = transient; - transient.save(); - } - - bool modifiedp() { - QMutexLocker l(&mtx); - return modified; - } - }; - - class opt_bundle; - - namespace - { - template - struct opt_singleton - { - public: - using pbundle = std::shared_ptr; - using tt = std::tuple; - private: - QMutex implsgl_mtx; - map implsgl_data; - public: - opt_singleton() : implsgl_mtx(QMutex::Recursive) {} - - static opt_singleton& datum() - { - static opt_singleton 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(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; - using t_fact = opt_singleton; - } - - 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 - 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 - 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(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(self_name); - } - }; - - template - inline void tie_setting(value&, q*); - - template<> - inline void tie_setting(value& 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& 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& 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& 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& 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& 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& 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& 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 -#include -#include - -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 -#include -#include "plugin-support.h" -#include -#include - -#ifndef _WIN32 -# include -#endif - -SelectedLibraries::~SelectedLibraries() -{ -} - -template -static ptr make_instance(ptr lib) -{ - ptr ret = nullptr; - if (lib && lib->Constructor) - ret = ptr(reinterpret_cast(reinterpret_cast(lib->Constructor)())); - qDebug() << "lib" << (lib ? lib->filename : "") << "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(t); - pProtocol = make_instance(p); - pFilter = make_instance(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 -#include -#include -#include -#include - -#include -template using ptr = std::shared_ptr; - -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; - - ptr pTracker; - ptr pFilter; - ptr 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 -#include -#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 - -class MyMutex { -private: - QMutex inner; - -public: - QMutex* operator->() { return &inner; } - QMutex* operator->() const { return &const_cast(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 - -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 -#if defined (_WIN32) -# include -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 -# include -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 - * - * 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 - -#include "./tracker.h" -#include -#include - -#if defined(_WIN32) -# include -#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(*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 -#include - -#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 -#include - -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 centerp; - std::atomic enabledp; - std::atomic 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()); } -}; diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.cpp b/ftnoir_filter_accela/ftnoir_filter_accela.cpp index f6ffd68c..37bd8891 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela.cpp @@ -9,7 +9,7 @@ #include #include #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" using namespace std; FTNoIR_Filter::FTNoIR_Filter() : first_run(true) diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.h b/ftnoir_filter_accela/ftnoir_filter_accela.h index c1b325fa..ec78dd4f 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela.h +++ b/ftnoir_filter_accela/ftnoir_filter_accela.h @@ -1,6 +1,6 @@ #pragma once #include "ui_ftnoir_accela_filtercontrols.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include #define ACCELA_SMOOTHING_ROTATION 60.0 @@ -8,7 +8,7 @@ #define ACCELA_SECOND_ORDER_ALPHA 100.0 #define ACCELA_THIRD_ORDER_ALPHA 180.0 -#include +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp b/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp index 1520ad6e..69348a7f 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp @@ -3,7 +3,7 @@ #include #include #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" FilterControls::FilterControls() : accela_filter(nullptr) diff --git a/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp b/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp index 65bee314..ff29227e 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp @@ -1,5 +1,5 @@ #include "ftnoir_filter_accela.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp index 5214b37b..b25fc50b 100644 --- a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp +++ b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp @@ -8,7 +8,7 @@ #include #include #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include #include diff --git a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h index f2baaa22..ff8c40a9 100644 --- a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h +++ b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h @@ -1,10 +1,10 @@ #pragma once -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include "ui_ftnoir_ewma_filtercontrols.h" #include #include -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp b/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp index bdc6e1bf..462cca3f 100644 --- a/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp +++ b/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp @@ -1,7 +1,7 @@ #include "ftnoir_filter_ewma2.h" #include #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include "ui_ftnoir_ewma_filtercontrols.h" FilterControls::FilterControls() : pFilter(NULL) diff --git a/ftnoir_filter_ewma2/ftnoir_filter_ewma_dll.cpp b/ftnoir_filter_ewma2/ftnoir_filter_ewma_dll.cpp index 5ec6138a..999dcd6f 100644 --- a/ftnoir_filter_ewma2/ftnoir_filter_ewma_dll.cpp +++ b/ftnoir_filter_ewma2/ftnoir_filter_ewma_dll.cpp @@ -1,5 +1,5 @@ #include "ftnoir_filter_ewma2.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_filter_kalman/ftnoir_filter_kalman.h b/ftnoir_filter_kalman/ftnoir_filter_kalman.h index 7dcd0f7d..bb1c2b98 100755 --- a/ftnoir_filter_kalman/ftnoir_filter_kalman.h +++ b/ftnoir_filter_kalman/ftnoir_filter_kalman.h @@ -9,14 +9,14 @@ #define INCLUDED_FTN_FILTER_H #include "ui_ftnoir_kalman_filtercontrols.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include #include #include #include #include #include -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" using namespace options; class OPENTRACK_EXPORT FTNoIR_Filter : public IFilter diff --git a/ftnoir_filter_kalman/kalman.cpp b/ftnoir_filter_kalman/kalman.cpp index 9a902643..ab352faa 100644 --- a/ftnoir_filter_kalman/kalman.cpp +++ b/ftnoir_filter_kalman/kalman.cpp @@ -5,7 +5,7 @@ * copyright notice and this permission notice appear in all copies. */ #include "ftnoir_filter_kalman.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include #include diff --git a/ftnoir_posewidget/glwidget.h b/ftnoir_posewidget/glwidget.h index 91536336..243e3773 100644 --- a/ftnoir_posewidget/glwidget.h +++ b/ftnoir_posewidget/glwidget.h @@ -9,7 +9,7 @@ #include #include -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" struct Point { Point(int x, int y) : diff --git a/ftnoir_protocol_fg/ftnoir_protocol_fg.cpp b/ftnoir_protocol_fg/ftnoir_protocol_fg.cpp index 8b5baaa8..b3243f62 100644 --- a/ftnoir_protocol_fg/ftnoir_protocol_fg.cpp +++ b/ftnoir_protocol_fg/ftnoir_protocol_fg.cpp @@ -26,7 +26,7 @@ * It is based on the (Linux) example made by Melchior FRANZ. * ********************************************************************************/ #include "ftnoir_protocol_fg.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" // For Todd and Arda Kutlu diff --git a/ftnoir_protocol_fg/ftnoir_protocol_fg.h b/ftnoir_protocol_fg/ftnoir_protocol_fg.h index 44b79c06..d35b9fbd 100644 --- a/ftnoir_protocol_fg/ftnoir_protocol_fg.h +++ b/ftnoir_protocol_fg/ftnoir_protocol_fg.h @@ -31,8 +31,8 @@ #include #include #include -#include "facetracknoir/plugin-api.hpp" -#include "facetracknoir/options.h" +#include "opentrack/plugin-api.hpp" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_protocol_fg/ftnoir_protocol_fg_dialog.cpp b/ftnoir_protocol_fg/ftnoir_protocol_fg_dialog.cpp index 0074a64a..041e9961 100644 --- a/ftnoir_protocol_fg/ftnoir_protocol_fg_dialog.cpp +++ b/ftnoir_protocol_fg/ftnoir_protocol_fg_dialog.cpp @@ -28,7 +28,7 @@ #include "ftnoir_protocol_fg.h" #include #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" //******************************************************************************************************* // FaceTrackNoIR Client Settings-dialog. diff --git a/ftnoir_protocol_fg/ftnoir_protocol_fg_dll.cpp b/ftnoir_protocol_fg/ftnoir_protocol_fg_dll.cpp index f830f8f7..aaaa1d63 100644 --- a/ftnoir_protocol_fg/ftnoir_protocol_fg_dll.cpp +++ b/ftnoir_protocol_fg/ftnoir_protocol_fg_dll.cpp @@ -24,7 +24,7 @@ ********************************************************************************/ #include "ftnoir_protocol_fg.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.cpp b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.cpp index 16f116f6..20a39fbc 100644 --- a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.cpp +++ b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.cpp @@ -25,7 +25,7 @@ * to games, using the FSUIPC.dll. * ********************************************************************************/ #include "ftnoir_protocol_fsuipc.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" FTNoIR_Protocol::FTNoIR_Protocol() { diff --git a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.h b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.h index 06428df3..006c93de 100644 --- a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.h +++ b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc.h @@ -31,7 +31,7 @@ #include #include #include "FSUIPC_User.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include "ui_ftnoir_fsuipccontrols.h" #include #include @@ -40,7 +40,7 @@ #include #include #include -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" using namespace options; #define FSUIPC_FILENAME "C:\\Program Files\\Microsoft Games\\Flight Simulator 9\\Modules\\FSUIPC.dll" diff --git a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dialog.cpp b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dialog.cpp index f73d65bd..d38eae71 100644 --- a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dialog.cpp +++ b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dialog.cpp @@ -23,7 +23,7 @@ * * ********************************************************************************/ #include "ftnoir_protocol_fsuipc.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" FSUIPCControls::FSUIPCControls() { diff --git a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dll.cpp b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dll.cpp index dbea2c46..19ecf351 100644 --- a/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dll.cpp +++ b/ftnoir_protocol_fsuipc/ftnoir_protocol_fsuipc_dll.cpp @@ -23,7 +23,7 @@ * * ********************************************************************************/ #include "ftnoir_protocol_fsuipc.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata(void) { diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft.h b/ftnoir_protocol_ft/ftnoir_protocol_ft.h index 51079f20..06992de5 100644 --- a/ftnoir_protocol_ft/ftnoir_protocol_ft.h +++ b/ftnoir_protocol_ft/ftnoir_protocol_ft.h @@ -26,7 +26,7 @@ ********************************************************************************/ #pragma once #include "ui_ftnoir_ftcontrols.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include #include #include @@ -37,7 +37,7 @@ #include #include #include "compat/compat.h" -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" #include "fttypes.h" using namespace options; diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp b/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp index d7a13fa5..13506022 100644 --- a/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp +++ b/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp @@ -1,4 +1,4 @@ -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include "ftnoir_protocol_ft/ftnoir_protocol_ft.h" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() diff --git a/ftnoir_protocol_ftn/ftnoir_protocol_ftn.cpp b/ftnoir_protocol_ftn/ftnoir_protocol_ftn.cpp index c8759bc1..f5911b2a 100644 --- a/ftnoir_protocol_ftn/ftnoir_protocol_ftn.cpp +++ b/ftnoir_protocol_ftn/ftnoir_protocol_ftn.cpp @@ -27,7 +27,7 @@ ********************************************************************************/ #include "ftnoir_protocol_ftn.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" FTNoIR_Protocol::FTNoIR_Protocol() { diff --git a/ftnoir_protocol_ftn/ftnoir_protocol_ftn.h b/ftnoir_protocol_ftn/ftnoir_protocol_ftn.h index 587f0034..c9b7ace6 100644 --- a/ftnoir_protocol_ftn/ftnoir_protocol_ftn.h +++ b/ftnoir_protocol_ftn/ftnoir_protocol_ftn.h @@ -32,8 +32,8 @@ #include #include #include -#include "facetracknoir/plugin-api.hpp" -#include "facetracknoir/options.h" +#include "opentrack/plugin-api.hpp" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dialog.cpp b/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dialog.cpp index 4637223d..8104a9de 100644 --- a/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dialog.cpp +++ b/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dialog.cpp @@ -23,7 +23,7 @@ * * ********************************************************************************/ #include "ftnoir_protocol_ftn.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" FTNControls::FTNControls() { diff --git a/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dll.cpp b/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dll.cpp index 0d24ccf8..d1fa3e33 100644 --- a/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dll.cpp +++ b/ftnoir_protocol_ftn/ftnoir_protocol_ftn_dll.cpp @@ -23,7 +23,7 @@ * * ********************************************************************************/ #include "ftnoir_protocol_ftn.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp index 8b7db62a..f0479e0d 100644 --- a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp +++ b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp @@ -1,5 +1,5 @@ #include "ftnoir_protocol_libevdev.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include #include diff --git a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h index af6b3142..9ea9664e 100644 --- a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h +++ b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h @@ -8,7 +8,7 @@ #include "ui_ftnoir_libevdev_controls.h" #include -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" extern "C" { # include diff --git a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dialog.cpp b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dialog.cpp index 15e8097c..68a4610a 100644 --- a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dialog.cpp +++ b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_protocol_libevdev.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" LibevdevControls::LibevdevControls() { diff --git a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dll.cpp b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dll.cpp index 75898715..9a16ea52 100644 --- a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dll.cpp +++ b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev_dll.cpp @@ -1,6 +1,6 @@ #include "ftnoir_protocol_libevdev.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_protocol_mouse/ftnoir_protocol_mouse.cpp b/ftnoir_protocol_mouse/ftnoir_protocol_mouse.cpp index ca3ba805..ac543812 100644 --- a/ftnoir_protocol_mouse/ftnoir_protocol_mouse.cpp +++ b/ftnoir_protocol_mouse/ftnoir_protocol_mouse.cpp @@ -27,7 +27,7 @@ * but no face-tracking. * ********************************************************************************/ #include "ftnoir_protocol_mouse.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" void FTNoIR_Protocol::pose(const double *headpose ) { double fMouse_X = 0; diff --git a/ftnoir_protocol_mouse/ftnoir_protocol_mouse.h b/ftnoir_protocol_mouse/ftnoir_protocol_mouse.h index 55a37e12..3d04fa15 100644 --- a/ftnoir_protocol_mouse/ftnoir_protocol_mouse.h +++ b/ftnoir_protocol_mouse/ftnoir_protocol_mouse.h @@ -39,8 +39,8 @@ #include #include #include -#include "facetracknoir/plugin-api.hpp" -#include "facetracknoir/options.h" +#include "opentrack/plugin-api.hpp" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dialog.cpp b/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dialog.cpp index efac958c..3303e54c 100644 --- a/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dialog.cpp +++ b/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dialog.cpp @@ -23,7 +23,7 @@ * * ********************************************************************************/ #include "ftnoir_protocol_mouse.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" MOUSEControls::MOUSEControls() : _proto(nullptr) { diff --git a/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dll.cpp b/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dll.cpp index 39bdf6e5..7bc2b85c 100644 --- a/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dll.cpp +++ b/ftnoir_protocol_mouse/ftnoir_protocol_mouse_dll.cpp @@ -23,7 +23,7 @@ * * ********************************************************************************/ #include "ftnoir_protocol_mouse.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_protocol_sc/ftnoir_protocol_sc.cpp b/ftnoir_protocol_sc/ftnoir_protocol_sc.cpp index b56585df..36764edc 100644 --- a/ftnoir_protocol_sc/ftnoir_protocol_sc.cpp +++ b/ftnoir_protocol_sc/ftnoir_protocol_sc.cpp @@ -27,7 +27,7 @@ * must be treated as such... * ********************************************************************************/ #include "ftnoir_protocol_sc.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" importSimConnect_CameraSetRelative6DOF FTNoIR_Protocol::simconnect_set6DOF; HANDLE FTNoIR_Protocol::hSimConnect = 0; // Handle to SimConnect diff --git a/ftnoir_protocol_sc/ftnoir_protocol_sc.h b/ftnoir_protocol_sc/ftnoir_protocol_sc.h index 784c915c..39544aab 100644 --- a/ftnoir_protocol_sc/ftnoir_protocol_sc.h +++ b/ftnoir_protocol_sc/ftnoir_protocol_sc.h @@ -29,7 +29,7 @@ #pragma once #undef _WIN32_WINNT #define _WIN32_WINNT 0x0502 -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" // // Prevent the SimConnect manifest from being merged in the application-manifest // This is necessary to run FaceTrackNoIR on a PC without FSX @@ -45,7 +45,7 @@ #include #include #include -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" using namespace options; typedef HRESULT (WINAPI *importSimConnect_Open)(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex); diff --git a/ftnoir_protocol_sc/ftnoir_protocol_sc_dialog.cpp b/ftnoir_protocol_sc/ftnoir_protocol_sc_dialog.cpp index 090a6174..30f7d460 100644 --- a/ftnoir_protocol_sc/ftnoir_protocol_sc_dialog.cpp +++ b/ftnoir_protocol_sc/ftnoir_protocol_sc_dialog.cpp @@ -24,7 +24,7 @@ ********************************************************************************/ #include "ftnoir_protocol_sc.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" SCControls::SCControls() { diff --git a/ftnoir_protocol_sc/ftnoir_protocol_sc_dll.cpp b/ftnoir_protocol_sc/ftnoir_protocol_sc_dll.cpp index 9bdbef09..937ffe0c 100644 --- a/ftnoir_protocol_sc/ftnoir_protocol_sc_dll.cpp +++ b/ftnoir_protocol_sc/ftnoir_protocol_sc_dll.cpp @@ -24,7 +24,7 @@ ********************************************************************************/ #include "ftnoir_protocol_sc.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.cpp b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.cpp index c29eb11e..b636ffd4 100644 --- a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.cpp +++ b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.cpp @@ -1,5 +1,5 @@ #include "ftnoir_protocol_vjoy.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" FTNoIR_Protocol::FTNoIR_Protocol() { diff --git a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.h b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.h index e9a6e704..73496fba 100644 --- a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.h +++ b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy.h @@ -28,7 +28,7 @@ #pragma once #include "ui_ftnoir_vjoy_controls.h" #include -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #define FT_PROGRAMID "FT_ProgramID" diff --git a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dialog.cpp b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dialog.cpp index 34ee29e9..8da3ccfd 100644 --- a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dialog.cpp +++ b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_protocol_vjoy.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" VJoyControls::VJoyControls() { diff --git a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dll.cpp b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dll.cpp index cdfdc361..fc30921d 100644 --- a/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dll.cpp +++ b/ftnoir_protocol_vjoy/ftnoir_protocol_vjoy_dll.cpp @@ -1,6 +1,6 @@ #include "ftnoir_protocol_vjoy.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_protocol_wine/ftnoir_protocol_wine.h b/ftnoir_protocol_wine/ftnoir_protocol_wine.h index 685c3010..528c4dd3 100644 --- a/ftnoir_protocol_wine/ftnoir_protocol_wine.h +++ b/ftnoir_protocol_wine/ftnoir_protocol_wine.h @@ -8,7 +8,7 @@ #include #include #include -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include "compat/compat.h" #include "ftnoir_protocol_wine/wine-shm.h" diff --git a/ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp b/ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp index 4e3d72ac..81fc9560 100644 --- a/ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp +++ b/ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp @@ -1,6 +1,6 @@ #include "ftnoir_protocol_wine.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" FTControls::FTControls() { diff --git a/ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp b/ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp index df26e49f..92faaa94 100644 --- a/ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp +++ b/ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp @@ -1,5 +1,5 @@ #include "ftnoir_protocol_wine.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp index 066b782a..bd7e3ff4 100644 --- a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp +++ b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.cpp @@ -12,7 +12,7 @@ #include #include "./include/markerdetector.h" #include "ftnoir_tracker_aruco.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include #include diff --git a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h index 67392d40..ad139145 100644 --- a/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h +++ b/ftnoir_tracker_aruco/ftnoir_tracker_aruco.h @@ -15,9 +15,9 @@ #include #include #include -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" #include "ftnoir_tracker_aruco/trans_calib.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include #include diff --git a/ftnoir_tracker_aruco/ftnoir_tracker_aruco_dll.h b/ftnoir_tracker_aruco/ftnoir_tracker_aruco_dll.h index 66e57100..ffcd3eca 100644 --- a/ftnoir_tracker_aruco/ftnoir_tracker_aruco_dll.h +++ b/ftnoir_tracker_aruco/ftnoir_tracker_aruco_dll.h @@ -5,7 +5,7 @@ * copyright notice and this permission notice appear in all copies. */ -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" //----------------------------------------------------------------------------- class TrackerDll : public Metadata diff --git a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.cpp b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.cpp index 0870e67d..eff1103b 100644 --- a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.cpp +++ b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_freepie-udp.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include #include diff --git a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.h b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.h index 92d42319..0cec952f 100644 --- a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.h +++ b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp.h @@ -9,8 +9,8 @@ #include #include #include "ui_freepie-udp-controls.h" -#include "facetracknoir/plugin-api.hpp" -#include "facetracknoir/options.h" +#include "opentrack/plugin-api.hpp" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dialog.cpp b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dialog.cpp index 6d6a951e..ec95da90 100644 --- a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dialog.cpp +++ b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_freepie-udp.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" TrackerDialog::TrackerDialog() { diff --git a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dll.cpp b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dll.cpp index 3c7fce9a..5b08f040 100644 --- a/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dll.cpp +++ b/ftnoir_tracker_freepie-udp/ftnoir_tracker_freepie-udp_dll.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_freepie-udp.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_tracker_ht/ftnoir_tracker_ht.cpp b/ftnoir_tracker_ht/ftnoir_tracker_ht.cpp index 13b6aabb..537d3cf6 100644 --- a/ftnoir_tracker_ht/ftnoir_tracker_ht.cpp +++ b/ftnoir_tracker_ht/ftnoir_tracker_ht.cpp @@ -3,7 +3,7 @@ #include "ftnoir_tracker_ht.h" #include "ftnoir_tracker_ht_dll.h" #include "ui_ht-trackercontrols.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include #if defined(_WIN32) diff --git a/ftnoir_tracker_ht/ftnoir_tracker_ht.h b/ftnoir_tracker_ht/ftnoir_tracker_ht.h index 119ffa7d..6a19477e 100644 --- a/ftnoir_tracker_ht/ftnoir_tracker_ht.h +++ b/ftnoir_tracker_ht/ftnoir_tracker_ht.h @@ -14,8 +14,8 @@ #include "ht_video_widget.h" #include "compat/compat.h" #include -#include "facetracknoir/options.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/options.hpp" +#include "opentrack/plugin-api.hpp" using namespace options; struct settings { diff --git a/ftnoir_tracker_ht/ftnoir_tracker_ht_dll.h b/ftnoir_tracker_ht/ftnoir_tracker_ht_dll.h index d684f72f..853d3181 100644 --- a/ftnoir_tracker_ht/ftnoir_tracker_ht_dll.h +++ b/ftnoir_tracker_ht/ftnoir_tracker_ht_dll.h @@ -1,4 +1,4 @@ -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" class TrackerDll : public Metadata { diff --git a/ftnoir_tracker_hydra/ftnoir_tracker_hydra.cpp b/ftnoir_tracker_hydra/ftnoir_tracker_hydra.cpp index b7f088e9..34c27579 100644 --- a/ftnoir_tracker_hydra/ftnoir_tracker_hydra.cpp +++ b/ftnoir_tracker_hydra/ftnoir_tracker_hydra.cpp @@ -1,6 +1,6 @@ /* Copyright: "i couldn't care less what anyone does with the 5 lines of code i wrote" - mm0zct */ #include "ftnoir_tracker_hydra.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include #ifdef _WIN32 # define SIXENSE_STATIC_LIB diff --git a/ftnoir_tracker_hydra/ftnoir_tracker_hydra.h b/ftnoir_tracker_hydra/ftnoir_tracker_hydra.h index a498a1cb..87d572d7 100644 --- a/ftnoir_tracker_hydra/ftnoir_tracker_hydra.h +++ b/ftnoir_tracker_hydra/ftnoir_tracker_hydra.h @@ -1,6 +1,6 @@ #include "ui_ftnoir_hydra_clientcontrols.h" -#include "facetracknoir/plugin-api.hpp" -#include "facetracknoir/options.h" +#include "opentrack/plugin-api.hpp" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dialog.cpp b/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dialog.cpp index 3d3be4ab..83b48a8e 100644 --- a/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dialog.cpp +++ b/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_hydra.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" TrackerControls::TrackerControls() { diff --git a/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dll.cpp b/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dll.cpp index 871312d1..1faa1578 100644 --- a/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dll.cpp +++ b/ftnoir_tracker_hydra/ftnoir_tracker_hydra_dll.cpp @@ -1,7 +1,7 @@ /* Copyright: "i couldn't care less what anyone does with the 5 lines of code i wrote" - mm0zct */ #include "ftnoir_tracker_hydra.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp index 97f36b67..352448a3 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_joystick.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include FTNoIR_Tracker::FTNoIR_Tracker() : diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h index 03bcc383..6d42f3e1 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h @@ -15,7 +15,7 @@ #include #include #include -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #ifndef DIRECTINPUT_VERSION # define DIRECTINPUT_VERSION 0x800 #endif @@ -26,7 +26,7 @@ #include #include -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp index 84e02fb0..bb95dd92 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_joystick.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) { diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dll.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dll.cpp index c2328a90..0dca6c9b 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dll.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dll.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_joystick.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp index 8be6a589..6557eada 100644 --- a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp +++ b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_libevdev.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include diff --git a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h index 4251435c..0ae1c8b3 100644 --- a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h +++ b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h @@ -1,8 +1,8 @@ #pragma once #include #include "libevdev/libevdev.h" -#include "facetracknoir/plugin-api.hpp" -#include "facetracknoir/options.h" +#include "opentrack/plugin-api.hpp" +#include "opentrack/options.hpp" #include "./ui_ftnoir_libevdev.h" #include #include diff --git a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dialog.cpp b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dialog.cpp index e0126283..02f48639 100644 --- a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dialog.cpp +++ b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_libevdev.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include diff --git a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp index e6216d7f..26c858b9 100644 --- a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp +++ b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_libevdev.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt.h b/ftnoir_tracker_pt/ftnoir_tracker_pt.h index 4295b6f9..921d61cf 100644 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt.h +++ b/ftnoir_tracker_pt/ftnoir_tracker_pt.h @@ -9,14 +9,14 @@ #define FTNOIR_TRACKER_PT_H #ifdef OPENTRACK_API -# include "facetracknoir/plugin-api.hpp" +# include "opentrack/plugin-api.hpp" #endif #include "ftnoir_tracker_pt_settings.h" #include "camera.h" #include "point_extractor.h" #include "point_tracker.h" #include "pt_video_widget.h" -#include "facetracknoir/timer.hpp" +#include "opentrack/timer.hpp" #include #include diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h b/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h index 8b6309da..7f634c04 100644 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h +++ b/ftnoir_tracker_pt/ftnoir_tracker_pt_dialog.h @@ -9,7 +9,7 @@ #define FTNOIR_TRACKER_PT_DIALOG_H #ifdef OPENTRACK_API -# include "facetracknoir/plugin-api.hpp" +# include "opentrack/plugin-api.hpp" #else #include "..\ftnoir_tracker_base\ftnoir_tracker_base.h" #endif diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.cpp b/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.cpp index 9b73ee37..1aaa1bf9 100644 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.cpp +++ b/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.cpp @@ -9,7 +9,7 @@ #include #ifdef OPENTRACK_API -# include "facetracknoir/plugin-support.h" +# include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() #else # pragma comment(linker, "/export:GetTrackerDll=_GetTrackerDll@0") diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.h b/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.h index d9b9adf6..9579d46c 100644 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.h +++ b/ftnoir_tracker_pt/ftnoir_tracker_pt_dll.h @@ -6,7 +6,7 @@ */ #if defined(OPENTRACK_API) -# include "facetracknoir/plugin-api.hpp" +# include "opentrack/plugin-api.hpp" #else # include "../ftnoir_tracker_base/ftnoir_tracker_base.h" #endif diff --git a/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h b/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h index e8cac679..9365eb9a 100644 --- a/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h +++ b/ftnoir_tracker_pt/ftnoir_tracker_pt_settings.h @@ -11,7 +11,7 @@ #include #include "point_tracker.h" -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" using namespace options; struct settings diff --git a/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp b/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp index 9f44c78e..724c7d3d 100644 --- a/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp +++ b/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp @@ -1,6 +1,6 @@ /* Copyright: "i couldn't care less what anyone does with the 5 lines of code i wrote" - mm0zct */ #include "ftnoir_tracker_rift.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" #include "OVR_CAPI.h" #include "Kernel/OVR_Math.h" #include diff --git a/ftnoir_tracker_rift/ftnoir_tracker_rift.h b/ftnoir_tracker_rift/ftnoir_tracker_rift.h index db14a536..179125f8 100644 --- a/ftnoir_tracker_rift/ftnoir_tracker_rift.h +++ b/ftnoir_tracker_rift/ftnoir_tracker_rift.h @@ -3,10 +3,10 @@ #include #include #include -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" #include "OVR.h" #include -#include "facetracknoir/options.h" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_tracker_rift/ftnoir_tracker_rift_dialog.cpp b/ftnoir_tracker_rift/ftnoir_tracker_rift_dialog.cpp index 2c0a1506..2439890b 100644 --- a/ftnoir_tracker_rift/ftnoir_tracker_rift_dialog.cpp +++ b/ftnoir_tracker_rift/ftnoir_tracker_rift_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_rift.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" TrackerControls::TrackerControls() { diff --git a/ftnoir_tracker_rift/ftnoir_tracker_rift_dll.cpp b/ftnoir_tracker_rift/ftnoir_tracker_rift_dll.cpp index fd50f75f..2809ef29 100644 --- a/ftnoir_tracker_rift/ftnoir_tracker_rift_dll.cpp +++ b/ftnoir_tracker_rift/ftnoir_tracker_rift_dll.cpp @@ -1,7 +1,7 @@ /* Copyright: "i couldn't care less what anyone does with the 5 lines of code i wrote" - mm0zct */ #include "ftnoir_tracker_rift.h" #include -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/ftnoir_tracker_udp/ftnoir_tracker_udp.cpp b/ftnoir_tracker_udp/ftnoir_tracker_udp.cpp index cbea79a4..507543be 100644 --- a/ftnoir_tracker_udp/ftnoir_tracker_udp.cpp +++ b/ftnoir_tracker_udp/ftnoir_tracker_udp.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_udp.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" FTNoIR_Tracker::FTNoIR_Tracker() : last_recv_pose { 0,0,0, 0,0,0 }, should_quit(false) {} diff --git a/ftnoir_tracker_udp/ftnoir_tracker_udp.h b/ftnoir_tracker_udp/ftnoir_tracker_udp.h index 1ec63866..96f07177 100644 --- a/ftnoir_tracker_udp/ftnoir_tracker_udp.h +++ b/ftnoir_tracker_udp/ftnoir_tracker_udp.h @@ -3,8 +3,8 @@ #include #include #include -#include "facetracknoir/plugin-api.hpp" -#include "facetracknoir/options.h" +#include "opentrack/plugin-api.hpp" +#include "opentrack/options.hpp" using namespace options; struct settings { diff --git a/ftnoir_tracker_udp/ftnoir_tracker_udp_dialog.cpp b/ftnoir_tracker_udp/ftnoir_tracker_udp_dialog.cpp index 0b4dd74e..eb5abcd8 100644 --- a/ftnoir_tracker_udp/ftnoir_tracker_udp_dialog.cpp +++ b/ftnoir_tracker_udp/ftnoir_tracker_udp_dialog.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_udp.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" TrackerControls::TrackerControls() { diff --git a/ftnoir_tracker_udp/ftnoir_tracker_udp_dll.cpp b/ftnoir_tracker_udp/ftnoir_tracker_udp_dll.cpp index d6cb5db3..e2b10455 100644 --- a/ftnoir_tracker_udp/ftnoir_tracker_udp_dll.cpp +++ b/ftnoir_tracker_udp/ftnoir_tracker_udp_dll.cpp @@ -1,5 +1,5 @@ #include "ftnoir_tracker_udp.h" -#include "facetracknoir/plugin-support.h" +#include "opentrack/plugin-api.hpp" extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { diff --git a/opentrack/export.hpp b/opentrack/export.hpp new file mode 100644 index 00000000..8c8bdc69 --- /dev/null +++ b/opentrack/export.hpp @@ -0,0 +1,7 @@ +#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/opentrack/main-settings.hpp b/opentrack/main-settings.hpp new file mode 100644 index 00000000..6f78ac82 --- /dev/null +++ b/opentrack/main-settings.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include +#include "opentrack/options.hpp" +using namespace options; + +struct key_opts { + value key_index; + value 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 zero; + value invert, altp; + value 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 tracker_dll, tracker2_dll, filter_dll, protocol_dll; + axis_opts a_x, a_y, a_z, a_yaw, a_pitch, a_roll; + value 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/opentrack/mappings.hpp b/opentrack/mappings.hpp new file mode 100644 index 00000000..86126db9 --- /dev/null +++ b/opentrack/mappings.hpp @@ -0,0 +1,88 @@ +#pragma once + +#include +#include "options.hpp" +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 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/opentrack/options.hpp b/opentrack/options.hpp new file mode 100644 index 00000000..6c15d729 --- /dev/null +++ b/opentrack/options.hpp @@ -0,0 +1,392 @@ +/* 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 +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +namespace options { + template + using map = std::map; + using std::string; + + template + // 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(const QVariant& t) + { + return t.toInt(); + } + + template<> + inline QString qcruft_to_t(const QVariant& t) + { + return t.toString(); + } + + template<> + inline bool qcruft_to_t(const QVariant& t) + { + return t.toBool(); + } + + template<> + inline double qcruft_to_t(const QVariant& t) + { + return t.toDouble(); + } + + template<> + inline QVariant qcruft_to_t(const QVariant& t) + { + return t; + } + + // snapshot of qsettings group at given time + class group { + private: + map 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 + t get(const string& k) + { + return qcruft_to_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 { + 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(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 + t get(const string& name) + { + QMutexLocker l(&mtx); + return transient.get(name); + } + void save() + { + QMutexLocker l(&mtx); + modified = false; + saved = transient; + transient.save(); + } + + bool modifiedp() { + QMutexLocker l(&mtx); + return modified; + } + }; + + class opt_bundle; + + namespace + { + template + struct opt_singleton + { + public: + using pbundle = std::shared_ptr; + using tt = std::tuple; + private: + QMutex implsgl_mtx; + map implsgl_data; + public: + opt_singleton() : implsgl_mtx(QMutex::Recursive) {} + + static opt_singleton& datum() + { + static auto ret = std::make_shared>(); + 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(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; + using t_fact = opt_singleton; + } + + 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(t) + public: + base_value(pbundle b, const string& name) : b(b), self_name(name) {} + signals: + DEFINE_SIGNAL(double); + DEFINE_SIGNAL(int); + DEFINE_SIGNAL(bool); + DEFINE_SIGNAL(QString); + protected: + pbundle b; + string self_name; + + template + void store(const t& datum) + { + if (b->store_kv(self_name, datum)) + emit valueChanged(static_cast(datum)); + } + public slots: + DEFINE_SLOT(double) + DEFINE_SLOT(int) + DEFINE_SLOT(QString) + DEFINE_SLOT(bool) + }; + + static inline string string_from_qstring(const QString& datum) + { + auto tmp = datum.toUtf8(); + return string(tmp.constData()); + } + + template + 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(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(self_name); + } + }; + + template + inline void tie_setting(value&, q*); + + template<> + inline void tie_setting(value& 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& 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& 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& 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& 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& 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& 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& v, QLabel* lb) + { + lb->setText(v); + base_value::connect(&v, SIGNAL(valueChanged(QString)), lb, SLOT(setText(QString)), v.SAFE_CONNTYPE); + } +} diff --git a/opentrack/plugin-api.hpp b/opentrack/plugin-api.hpp new file mode 100644 index 00000000..a8996d63 --- /dev/null +++ b/opentrack/plugin-api.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "export.hpp" + +enum Axis { + TX = 0, TY, TZ, Yaw, Pitch, Roll +}; + +#ifndef OPENTRACK_CROSS_ONLY +# include "plugin-qt-api.hpp" +#endif \ No newline at end of file diff --git a/opentrack/plugin-qt-api.hpp b/opentrack/plugin-qt-api.hpp new file mode 100644 index 00000000..a2aa0d19 --- /dev/null +++ b/opentrack/plugin-qt-api.hpp @@ -0,0 +1,63 @@ +#pragma once + +#include +#include +#include + +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/opentrack/plugin-support.cpp b/opentrack/plugin-support.cpp new file mode 100644 index 00000000..694f3e19 --- /dev/null +++ b/opentrack/plugin-support.cpp @@ -0,0 +1,215 @@ +#include +#include +#include "plugin-support.h" +#include +#include +#include + +#ifndef _WIN32 +# include +#endif + +SelectedLibraries::~SelectedLibraries() +{ +} + +template +static ptr make_instance(ptr lib) +{ + ptr ret = nullptr; + if (lib && lib->Constructor) + ret = ptr(reinterpret_cast(reinterpret_cast(lib->Constructor)())); + qDebug() << "lib" << (lib ? lib->filename : "") << "ptr" << (intptr_t)ret.get(); + return ret; +} + +SelectedLibraries::SelectedLibraries(QFrame* frame, dylibtr t, dylibtr p, dylibtr f) : + pTracker(nullptr), + pFilter(nullptr), + pProtocol(nullptr), + correct(false) +{ + pTracker = make_instance(t); + pProtocol = make_instance(p); + pFilter = make_instance(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; +} + +#if defined(__APPLE__) +# define SONAME "dylib" +#elif defined(_WIN32) +# define SONAME "dll" +#else +# define SONAME "so" +#endif + +#include + +#ifdef _MSC_VER +# error "No support for MSVC anymore" +#else +# define LIB_PREFIX "lib" +#endif + +static bool get_metadata(ptr lib, QString& name, QIcon& icon) +{ + Metadata* meta; + if (!lib->Meta || ((meta = lib->Meta()), !meta)) + return false; + name = meta->name(); + icon = meta->icon(); + delete meta; + return true; +} + +QList> dylib::enum_libraries() +{ +#define BASE "opentrack-" +#define SUFF "-*.*" + const char* filters_n[] = { BASE "filter" SUFF, + BASE "tracker" SUFF, + BASE "proto" SUFF }; + const Type filters_t[] = { Filter, Tracker, Protocol }; + + QDir settingsDir( QCoreApplication::applicationDirPath() ); + + QList> ret; + + for (int i = 0; i < 3; i++) + { + QString filter = filters_n[i]; + auto t = filters_t[i]; + 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(str, t); + qDebug() << "Loading" << str; + std::cout.flush(); + if (!get_metadata(lib, longName, icon)) + continue; + ret.push_back(lib); + } + } + + return ret; +} + +dylib::dylib(const QString& filename, Type t) : + type(t), + Dialog(nullptr), + Constructor(nullptr), + Meta(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; + + Meta = (METADATA_FUNPTR) handle->resolve("GetMetadata"); + if (_foo::die(handle, !Meta)) + 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; + Meta = (METADATA_FUNPTR) dlsym(handle, "GetMetadata"); + if (_foo::err(handle)) + return; + } else { + (void) _foo::err(handle); + } +#endif + + auto m = ptr(Meta()); + + icon = m->icon(); + name = m->name(); +} + +dylib::~dylib() +{ +#if defined(_WIN32) + handle->unload(); +#else + if (handle) + (void) dlclose(handle); +#endif +} diff --git a/opentrack/plugin-support.h b/opentrack/plugin-support.h new file mode 100644 index 00000000..238aeb53 --- /dev/null +++ b/opentrack/plugin-support.h @@ -0,0 +1,51 @@ +#pragma once + +#include "plugin-api.hpp" + +#include +#include +#include +#include +#include +#include + +#include +template using ptr = std::shared_ptr; + +extern "C" typedef void* (*CTOR_FUNPTR)(void); +extern "C" typedef Metadata* (*METADATA_FUNPTR)(void); + +struct dylib { + enum Type { Filter, Tracker, Protocol }; + + dylib(const QString& filename, Type t); + ~dylib(); + static QList> enum_libraries(); + + Type type; + QString filename; + + QIcon icon; + QString name; + + CTOR_FUNPTR Dialog; + CTOR_FUNPTR Constructor; + METADATA_FUNPTR Meta; +private: +#if defined(_WIN32) + QLibrary* handle; +#else + void* handle; +#endif +}; + +struct SelectedLibraries { + using dylibtr = ptr; + ptr pTracker; + ptr pFilter; + ptr pProtocol; + SelectedLibraries(QFrame* frame, dylibtr t, dylibtr p, dylibtr f); + SelectedLibraries() : pTracker(nullptr), pFilter(nullptr), pProtocol(nullptr), correct(false) {} + ~SelectedLibraries(); + bool correct; +}; \ No newline at end of file diff --git a/opentrack/pose.hpp b/opentrack/pose.hpp new file mode 100644 index 00000000..41e984f5 --- /dev/null +++ b/opentrack/pose.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#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/opentrack/qcopyable-mutex.hpp b/opentrack/qcopyable-mutex.hpp new file mode 100644 index 00000000..f7f36f93 --- /dev/null +++ b/opentrack/qcopyable-mutex.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include + +class MyMutex { +private: + QMutex inner; + +public: + QMutex* operator->() { return &inner; } + QMutex* operator->() const { return &const_cast(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/opentrack/quat.hpp b/opentrack/quat.hpp new file mode 100644 index 00000000..6d777b28 --- /dev/null +++ b/opentrack/quat.hpp @@ -0,0 +1,66 @@ +/* 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 + +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/opentrack/timer.hpp b/opentrack/timer.hpp new file mode 100644 index 00000000..628365c9 --- /dev/null +++ b/opentrack/timer.hpp @@ -0,0 +1,68 @@ +#pragma once +#include +#if defined (_WIN32) +# include +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 +# include +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/opentrack/tracker.cpp b/opentrack/tracker.cpp new file mode 100644 index 00000000..41db7c19 --- /dev/null +++ b/opentrack/tracker.cpp @@ -0,0 +1,187 @@ +/* Copyright (c) 2012-2013 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. + */ + +/* + * this file appeared originally in facetracknoir, was rewritten completely + * following opentrack fork. + * + * originally written by Wim Vriend. + */ + +#include + +#include "./tracker.h" +#include +#include + +#if defined(_WIN32) +# include +#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(*this).mtx); + for (int i = 0; i < 6; i++) + { + raw[i] = raw_6dof(i); + mapped[i] = output_pose(i); + } +} + diff --git a/opentrack/tracker.h b/opentrack/tracker.h new file mode 100644 index 00000000..02d6bee2 --- /dev/null +++ b/opentrack/tracker.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +#include "./timer.hpp" +#include "./plugin-support.h" +#include "./mappings.hpp" +#include "./pose.hpp" + +#include "../qfunctionconfigurator/functionconfig.h" +#include "./main-settings.hpp" +#include "./options.hpp" + +#include +#include + +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 centerp; + std::atomic enabledp; + std::atomic should_quit; + SelectedLibraries const& libs; + + double map(double pos, Mapping& axis); + void logic(); + + static void t_compensate(const double* input, double* output, bool rz); + 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()); } +}; diff --git a/qfunctionconfigurator/functionconfig.h b/qfunctionconfigurator/functionconfig.h index e24f54cf..9edfd51c 100644 --- a/qfunctionconfigurator/functionconfig.h +++ b/qfunctionconfigurator/functionconfig.h @@ -14,8 +14,8 @@ #include #include #include -#include "../facetracknoir/plugin-api.hpp" -#include "../facetracknoir/qcopyable-mutex.hpp" +#include "../opentrack/plugin-api.hpp" +#include "../opentrack/qcopyable-mutex.hpp" class OPENTRACK_EXPORT Map { diff --git a/qfunctionconfigurator/qfunctionconfigurator.h b/qfunctionconfigurator/qfunctionconfigurator.h index 229d9977..974d9bb6 100644 --- a/qfunctionconfigurator/qfunctionconfigurator.h +++ b/qfunctionconfigurator/qfunctionconfigurator.h @@ -14,7 +14,7 @@ #include #include #include "qfunctionconfigurator/functionconfig.h" -#include "facetracknoir/plugin-api.hpp" +#include "opentrack/plugin-api.hpp" class OPENTRACK_EXPORT QFunctionConfigurator : public QWidget { -- cgit v1.2.3