From 3195bebe6b59b6f9dc657584570260c28d7937ec Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 13 Sep 2013 14:54:32 +0200 Subject: Allow for editing filter settings while the software is running --- facetracknoir/facetracknoir.cpp | 19 ++++++++----- ftnoir_filter_accela/ftnoir_filter_accela.cpp | 17 +++++++++-- ftnoir_filter_accela/ftnoir_filter_accela.h | 13 +++++---- .../ftnoir_filter_accela_dialog.cpp | 27 ++++++++++++++---- ftnoir_filter_base/ftnoir_filter_base.h | 4 ++- ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp | 12 ++++++++ ftnoir_filter_ewma2/ftnoir_filter_ewma2.h | 14 ++++++--- ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp | 33 +++++++++++++--------- 8 files changed, 101 insertions(+), 38 deletions(-) diff --git a/facetracknoir/facetracknoir.cpp b/facetracknoir/facetracknoir.cpp index da2ce21f..d765ee96 100644 --- a/facetracknoir/facetracknoir.cpp +++ b/facetracknoir/facetracknoir.cpp @@ -610,7 +610,7 @@ void FaceTrackNoIR::startTracker( ) { ui.btnLoad->setEnabled ( false ); ui.btnSave->setEnabled ( false ); ui.btnSaveAs->setEnabled ( false ); - ui.btnShowFilterControls->setEnabled ( false ); + ui.btnShowFilterControls->setEnabled ( true ); // // Create the Tracker and setup @@ -687,14 +687,17 @@ void FaceTrackNoIR::startTracker( ) { tracker->setInvertAxis(TY, ui.chkInvertY->isChecked() ); tracker->setInvertAxis(TZ, ui.chkInvertZ->isChecked() ); - tracker->start(); - // // Register the Tracker instance with the Tracker Dialog (if open) // if (pTrackerDialog && Libraries->pTracker) { pTrackerDialog->registerTracker( Libraries->pTracker ); } + + if (pFilterDialog && Libraries->pFilter) + pFilterDialog->registerFilter(Libraries->pFilter); + + tracker->start(); ui.headPoseWidget->show(); @@ -776,7 +779,7 @@ void FaceTrackNoIR::stopTracker( ) { pProtocolDialog->unRegisterProtocol(); } if (pFilterDialog) - pFilterDialog->Initialize(this, NULL); + pFilterDialog->unregisterFilter(); // // Delete the tracker (after stopping things and all). @@ -911,9 +914,9 @@ void FaceTrackNoIR::showTrackerSettings() { if (lib) { pTrackerDialog = (ITrackerDialog*) lib->Dialog(); if (pTrackerDialog) { - pTrackerDialog->Initialize(this); if (Libraries && Libraries->pTracker) pTrackerDialog->registerTracker(Libraries->pTracker); + pTrackerDialog->Initialize(this); } } } @@ -930,9 +933,9 @@ void FaceTrackNoIR::showSecondTrackerSettings() { if (lib) { pSecondTrackerDialog = (ITrackerDialog*) lib->Dialog(); if (pSecondTrackerDialog) { - pSecondTrackerDialog->Initialize(this); if (Libraries && Libraries->pSecondTracker) pSecondTrackerDialog->registerTracker(Libraries->pSecondTracker); + pSecondTrackerDialog->Initialize(this); } } } @@ -966,7 +969,9 @@ void FaceTrackNoIR::showFilterControls() { if (lib && lib->Dialog) { pFilterDialog = (IFilterDialog*) lib->Dialog(); if (pFilterDialog) { - pFilterDialog->Initialize(this, Libraries ? Libraries->pFilter : NULL); + pFilterDialog->Initialize(this); + if (Libraries && Libraries->pFilter) + pFilterDialog->registerFilter(Libraries->pFilter); } } } diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.cpp b/ftnoir_filter_accela/ftnoir_filter_accela.cpp index f2306204..c2cda351 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela.cpp @@ -5,11 +5,13 @@ * copyright notice and this permission notice appear in all copies. */ #include "ftnoir_filter_accela/ftnoir_filter_accela.h" -#include "math.h" +#include #include -#include +#include #include "facetracknoir/global-settings.h" +using namespace std; + FTNoIR_Filter::FTNoIR_Filter() { first_run = true; @@ -34,6 +36,15 @@ void FTNoIR_Filter::loadSettings() { iniFile.endGroup (); } +void FTNoIR_Filter::receiveSettings(double rot, double trans, double zoom_fac) +{ + QMutexLocker foo(&mutex); + + rotation_alpha = rot; + translation_alpha = trans; + zoom_factor = zoom_fac; +} + static double parabola(const double a, const double x) { const double a1 = 1./a; @@ -56,6 +67,8 @@ void FTNoIR_Filter::FilterHeadPoseData(double *current_camera_position, first_run = false; return; } + + QMutexLocker foo(&mutex); for (int i=0;i<6;i++) { diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.h b/ftnoir_filter_accela/ftnoir_filter_accela.h index a0b7f3ef..0c13c0e8 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela.h +++ b/ftnoir_filter_accela/ftnoir_filter_accela.h @@ -32,6 +32,7 @@ #include "ftnoir_filter_base/ftnoir_filter_base.h" #include "ui_ftnoir_accela_filtercontrols.h" #include "facetracknoir/global-settings.h" +#include #define ACCELA_SMOOTHING_ROTATION 6.0 #define ACCELA_SMOOTHING_TRANSLATION 3.0 @@ -48,9 +49,10 @@ public: void Initialize() { first_run = true; } - + void receiveSettings(double rot, double trans, double zoom_fac); private: - void loadSettings(); // Load the settings from the INI-file + QMutex mutex; + void loadSettings(); bool first_run; double rotation_alpha, translation_alpha, zoom_factor; }; @@ -64,17 +66,18 @@ class FTNOIR_FILTER_BASE_EXPORT FilterControls: public QWidget, public IFilterDi { Q_OBJECT public: - explicit FilterControls(); virtual ~FilterControls(); void showEvent ( QShowEvent * event ); - void Initialize(QWidget *parent, IFilter *ptr); - + void Initialize(QWidget *parent); + void registerFilter(IFilter* filter); + void unregisterFilter(); private: Ui::AccelaUICFilterControls ui; void loadSettings(); void save(); bool settingsDirty; + FTNoIR_Filter* accela_filter; private slots: void doOK(); void doCancel(); diff --git a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp b/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp index f0641ea6..97653f94 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp @@ -39,7 +39,7 @@ // Constructor for server-settings-dialog // FilterControls::FilterControls() : - QWidget() + QWidget(), accela_filter(NULL) { ui.setupUi( this ); @@ -66,9 +66,9 @@ FilterControls::~FilterControls() { // // Initialize tracker-client-dialog // -void FilterControls::Initialize(QWidget *parent, IFilter* ptr) { +void FilterControls::Initialize(QWidget *parent) { loadSettings(); - + QPoint offsetpos(100, 100); if (parent) { this->move(parent->pos() + offsetpos); @@ -76,6 +76,16 @@ void FilterControls::Initialize(QWidget *parent, IFilter* ptr) { show(); } +void FilterControls::registerFilter(IFilter* filter) +{ + accela_filter = (FTNoIR_Filter*) filter; +} + +void FilterControls::unregisterFilter() +{ + accela_filter = NULL; +} + // // OK clicked on server-dialog // @@ -154,14 +164,19 @@ void FilterControls::save() { QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) qDebug() << "FTNoIR_Filter::save() says: iniFile = " << currentFile; + + double rot, trans, zoom; iniFile.beginGroup ( "Accela" ); - iniFile.setValue("zoom-slowness", ui.slideZoom->value()); - iniFile.setValue("rotation-alpha", ui.rotation_alpha->value()); - iniFile.setValue("translation-alpha", ui.translation_alpha->value()); + iniFile.setValue("zoom-slowness", zoom = ui.slideZoom->value()); + iniFile.setValue("rotation-alpha", rot = ui.rotation_alpha->value()); + iniFile.setValue("translation-alpha", trans = ui.translation_alpha->value()); iniFile.endGroup (); settingsDirty = false; + + if (accela_filter) + accela_filter->receiveSettings(rot, trans, zoom); } //////////////////////////////////////////////////////////////////////////////// diff --git a/ftnoir_filter_base/ftnoir_filter_base.h b/ftnoir_filter_base/ftnoir_filter_base.h index aef76370..9ff286b1 100644 --- a/ftnoir_filter_base/ftnoir_filter_base.h +++ b/ftnoir_filter_base/ftnoir_filter_base.h @@ -33,7 +33,9 @@ struct IFilter struct IFilterDialog { virtual ~IFilterDialog() {} - virtual void Initialize(QWidget *parent, IFilter* ptr) = 0; + virtual void Initialize(QWidget *parent) = 0; + virtual void registerFilter(IFilter* tracker) = 0; + virtual void unregisterFilter() = 0; }; #endif // FTNOIR_FILTER_BASE_H diff --git a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp index b5250593..43cfd102 100644 --- a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp +++ b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.cpp @@ -28,6 +28,7 @@ #include #include "facetracknoir/global-settings.h" #include +#include //#define LOG_OUTPUT ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -47,6 +48,15 @@ FTNoIR_Filter::~FTNoIR_Filter() { } +void FTNoIR_Filter::receiveSettings(double smin, double smax, double sexpt) +{ + QMutexLocker foo(&mutex); + + kMinSmoothing = smin; + kMaxSmoothing = smax; + kSmoothingScaleCurve = sexpt; +} + // // Load the current Settings from the currently 'active' INI-file. // @@ -88,6 +98,8 @@ void FTNoIR_Filter::FilterHeadPoseData(double *current_camera_position, first_run=false; return; } + + QMutexLocker foo(&mutex); for (int i=0;i<6;i++) { // Calculate the delta. diff --git a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h index a5f3ef24..18fec8d4 100644 --- a/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h +++ b/ftnoir_filter_ewma2/ftnoir_filter_ewma2.h @@ -30,6 +30,7 @@ #include "facetracknoir/global-settings.h" #include "ui_ftnoir_ewma_filtercontrols.h" #include +#include ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -47,6 +48,7 @@ public: double *target_camera_position, double *new_camera_position, double *last_post_filter); + void receiveSettings(double smin, double smax, double sexpt); private: void loadSettings(); // Load the settings from the INI-file @@ -59,6 +61,8 @@ private: double kMinSmoothing; double kMaxSmoothing; double kSmoothingScaleCurve; + + QMutex mutex; }; //******************************************************************************************************* @@ -73,7 +77,9 @@ public: explicit FilterControls(); virtual ~FilterControls(); void showEvent ( QShowEvent * event ); - void Initialize(QWidget *parent, IFilter* ptr); + void Initialize(QWidget *parent); + void registerFilter(IFilter* flt); + void unregisterFilter(); private: Ui::UICFilterControls ui; @@ -83,13 +89,13 @@ private: /** helper **/ bool settingsDirty; - IFilter* pFilter; // If the filter was active when the dialog was opened, this will hold a pointer to the Filter instance + FTNoIR_Filter* pFilter; private slots: void doOK(); void doCancel(); - void settingChanged() { settingsDirty = true; }; - void settingChanged( int ) { settingsDirty = true; }; + void settingChanged() { settingsDirty = true; } + void settingChanged( int ) { settingsDirty = true; } }; //******************************************************************************************************* diff --git a/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp b/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp index eb259572..ebcba5f1 100644 --- a/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp +++ b/ftnoir_filter_ewma2/ftnoir_filter_ewma2_dialog.cpp @@ -35,7 +35,7 @@ // Constructor for server-settings-dialog // FilterControls::FilterControls() : -QWidget() + QWidget(), pFilter(NULL) { ui.setupUi( this ); @@ -69,15 +69,7 @@ FilterControls::~FilterControls() { // // Initialize tracker-client-dialog // -void FilterControls::Initialize(QWidget *parent, IFilter* ptr) { - - // - // The dialog can be opened, while the Tracker is running. - // In that case, ptr will point to the active Filter-instance. - // This can be used to update settings, while Tracking and may also be handy to display logging-data and such... - // - pFilter = ptr; - +void FilterControls::Initialize(QWidget *parent) { // // // @@ -88,6 +80,16 @@ void FilterControls::Initialize(QWidget *parent, IFilter* ptr) { show(); } +void FilterControls::registerFilter(IFilter* flt) +{ + pFilter = (FTNoIR_Filter*) flt; +} + +void FilterControls::unregisterFilter() +{ + pFilter = NULL; +} + // // OK clicked on server-dialog // @@ -166,14 +168,19 @@ void FilterControls::save() { QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + + double smooth_min, smooth_max, smooth_expt; iniFile.beginGroup ( "Tracking" ); - iniFile.setValue ( "minSmooth", ui.minSmooth->value() ); - iniFile.setValue ( "powCurve", ui.powCurve->value() ); - iniFile.setValue ( "maxSmooth", ui.maxSmooth->value() ); + iniFile.setValue ( "minSmooth", smooth_min = ui.minSmooth->value() ); + iniFile.setValue ( "powCurve", smooth_expt = ui.powCurve->value() ); + iniFile.setValue ( "maxSmooth", smooth_max = ui.maxSmooth->value() ); iniFile.endGroup (); settingsDirty = false; + + if (pFilter) + pFilter->receiveSettings(smooth_min, smooth_max, smooth_expt); } //////////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3