From 9a573dbf66f8baddf1aabe79960c8658cbb0ee9e Mon Sep 17 00:00:00 2001 From: Wim Vriend Date: Tue, 28 Sep 2010 20:37:14 +0000 Subject: UpdateSettings after change of INI-file. Added curve to tracker git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@21 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb --- FaceTrackNoIR/FaceTrackNoIR.cpp | 42 +++++++++++++++++++++---- FaceTrackNoIR/FaceTrackNoIR.h | 10 ++++-- FaceTrackNoIR/tracker.cpp | 69 +++++++++++++++++++++++++++++++++++++++++ FaceTrackNoIR/tracker.h | 3 ++ 4 files changed, 115 insertions(+), 9 deletions(-) (limited to 'FaceTrackNoIR') diff --git a/FaceTrackNoIR/FaceTrackNoIR.cpp b/FaceTrackNoIR/FaceTrackNoIR.cpp index 895e6aac..d3511c16 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.cpp +++ b/FaceTrackNoIR/FaceTrackNoIR.cpp @@ -176,6 +176,15 @@ void FaceTrackNoIR::getGameProgramName() { } } +// +// Get the ProgramName from a connected game and display it. +// +void FaceTrackNoIR::updateSettings() { + if ( tracker != NULL ) { + tracker->loadSettings(); + } +} + /** read the name of the first video-capturing device at start up **/ /** FaceAPI can only use this first one... **/ void FaceTrackNoIR::GetCameraNameDX() { @@ -705,7 +714,7 @@ void FaceTrackNoIR::showPreferences() { // Create if new if (!_preferences) { - _preferences = new PreferencesDialog( this, Qt::Dialog ); + _preferences = new PreferencesDialog( this, this, Qt::Dialog ); } // Show if already created @@ -721,7 +730,7 @@ void FaceTrackNoIR::showKeyboardShortcuts() { // Create if new if (!_keyboard_shortcuts) { - _keyboard_shortcuts = new KeyboardShortcutDialog( this, Qt::Dialog ); + _keyboard_shortcuts = new KeyboardShortcutDialog( this, this, Qt::Dialog ); } // Show if already created @@ -737,7 +746,7 @@ void FaceTrackNoIR::showCurveConfiguration() { // Create if new if (!_curve_config) { - _curve_config = new CurveConfigurationDialog( this, Qt::Dialog ); + _curve_config = new CurveConfigurationDialog( this, this, Qt::Dialog ); } // Show if already created @@ -884,7 +893,7 @@ void FaceTrackNoIR::trackingSourceSelected(int index) // // Constructor for FaceTrackNoIR=Preferences-dialog // -PreferencesDialog::PreferencesDialog( QWidget *parent, Qt::WindowFlags f ) : +PreferencesDialog::PreferencesDialog( FaceTrackNoIR *ftnoir, QWidget *parent, Qt::WindowFlags f ) : QWidget( parent , f) { ui.setupUi( this ); @@ -892,6 +901,8 @@ QWidget( parent , f) QPoint offsetpos(100, 100); this->move(parent->pos() + offsetpos); + mainApp = ftnoir; // Preserve a pointer to FTNoIR + // Connect Qt signals to member-functions connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); @@ -975,6 +986,11 @@ void PreferencesDialog::save() { QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) settings.setValue( "AutoMinimizeTime", ui.slideAutoMinimizeTime->value() ); + // + // Send a message to the main program, to update the Settings (for the tracker) + // + mainApp->updateSettings(); + settingsDirty = false; } @@ -983,7 +999,7 @@ void PreferencesDialog::save() { // // Constructor for Keyboard-shortcuts-dialog // -KeyboardShortcutDialog::KeyboardShortcutDialog( QWidget *parent, Qt::WindowFlags f ) : +KeyboardShortcutDialog::KeyboardShortcutDialog( FaceTrackNoIR *ftnoir, QWidget *parent, Qt::WindowFlags f ) : QWidget( parent , f) { ui.setupUi( this ); @@ -991,6 +1007,8 @@ QWidget( parent , f) QPoint offsetpos(100, 100); this->move(parent->pos() + offsetpos); + mainApp = ftnoir; // Preserve a pointer to FTNoIR + // Connect Qt signals to member-functions connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); @@ -1273,6 +1291,11 @@ void KeyboardShortcutDialog::save() { iniFile.endGroup (); settingsDirty = false; + + // + // Send a message to the main program, to update the Settings (for the tracker) + // + mainApp->updateSettings(); } //**************************************************************************************************// @@ -1280,7 +1303,7 @@ void KeyboardShortcutDialog::save() { // // Constructor for Curve-configuration-dialog // -CurveConfigurationDialog::CurveConfigurationDialog( QWidget *parent, Qt::WindowFlags f ) : +CurveConfigurationDialog::CurveConfigurationDialog( FaceTrackNoIR *ftnoir, QWidget *parent, Qt::WindowFlags f ) : QWidget( parent , f) { ui.setupUi( this ); @@ -1288,6 +1311,8 @@ QWidget( parent , f) QPoint offsetpos(100, 100); this->move(parent->pos() + offsetpos); + mainApp = ftnoir; // Preserve a pointer to FTNoIR + // Connect Qt signals to member-functions connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); @@ -1471,6 +1496,11 @@ void CurveConfigurationDialog::save() { iniFile.endGroup (); settingsDirty = false; + + // + // Send a message to the main program, to update the Settings (for the tracker) + // + mainApp->updateSettings(); } void getCurvePoints(QSettings *iniFile, QString prefix, QPointF *point1, QPointF *point2, QPointF *point3, QPointF *point4, int NeutralZone, int Sensitivity, int MaxInput, int MaxOutput) { diff --git a/FaceTrackNoIR/FaceTrackNoIR.h b/FaceTrackNoIR/FaceTrackNoIR.h index 410547e2..c14d4e16 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.h +++ b/FaceTrackNoIR/FaceTrackNoIR.h @@ -58,6 +58,7 @@ public: ~FaceTrackNoIR(); void getGameProgramName(); // Get the ProgramName from the game and display it. + void updateSettings(); // Update the settings (let Tracker read INI-file). private: Ui::FaceTrackNoIRClass ui; @@ -158,7 +159,7 @@ class PreferencesDialog: public QWidget, public Ui::UICPreferencesDialog Q_OBJECT public: - explicit PreferencesDialog( QWidget *parent=0, Qt::WindowFlags f=0 ); + explicit PreferencesDialog( FaceTrackNoIR *ftnoir, QWidget *parent=0, Qt::WindowFlags f=0 ); virtual ~PreferencesDialog(); void showEvent ( QShowEvent * event ); @@ -169,6 +170,7 @@ private: /** helper **/ bool settingsDirty; + FaceTrackNoIR *mainApp; private slots: void doOK(); @@ -182,7 +184,7 @@ class KeyboardShortcutDialog: public QWidget, public Ui::UICKeyboardShortcutDial Q_OBJECT public: - explicit KeyboardShortcutDialog( QWidget *parent=0, Qt::WindowFlags f=0 ); + explicit KeyboardShortcutDialog( FaceTrackNoIR *ftnoir, QWidget *parent=0, Qt::WindowFlags f=0 ); virtual ~KeyboardShortcutDialog(); void showEvent ( QShowEvent * event ); @@ -193,6 +195,7 @@ private: /** helper **/ bool settingsDirty; + FaceTrackNoIR *mainApp; QList stringList; // List of strings, that describe the keyboard-keys QList keyList; // List of keys, with the values of the keyboard-keys @@ -208,7 +211,7 @@ class CurveConfigurationDialog: public QWidget, public Ui::UICCurveConfiguration Q_OBJECT public: - explicit CurveConfigurationDialog( QWidget *parent=0, Qt::WindowFlags f=0 ); + explicit CurveConfigurationDialog( FaceTrackNoIR *ftnoir, QWidget *parent=0, Qt::WindowFlags f=0 ); virtual ~CurveConfigurationDialog(); void showEvent ( QShowEvent * event ); @@ -219,6 +222,7 @@ private: /** helper **/ bool settingsDirty; + FaceTrackNoIR *mainApp; private slots: void doOK(); diff --git a/FaceTrackNoIR/tracker.cpp b/FaceTrackNoIR/tracker.cpp index c7a2fadb..ce928d66 100644 --- a/FaceTrackNoIR/tracker.cpp +++ b/FaceTrackNoIR/tracker.cpp @@ -432,6 +432,12 @@ void Tracker::run() { Pitch.newPos = getSmoothFromList( &Pitch.rawList ) - Pitch.offset_headPos; } + QFile data("output.txt"); + if (data.open(QFile::WriteOnly | QFile::Append)) { + QTextStream out(&data); + out << "Input = " << getDegreesFromRads(Pitch.newPos) << " Output = " << getOutputFromCurve(&Pitch.curve, getDegreesFromRads(Pitch.newPos)) << '\n'; + } + // Yaw if (Tracker::useFilter) { Yaw.newPos = lowPassFilter ( getSmoothFromList( &Yaw.rawList ) - Yaw.offset_headPos, @@ -764,10 +770,21 @@ float clamped_value = 0.0f; return clamped_value; } +// +// Get the output from the curve. +// +float Tracker::getOutputFromCurve ( QPainterPath *curve, float input ) { + return curve->pointAtPercent(input/100.0f).x(); +} + // // Load the current Settings from the currently 'active' INI-file. // void Tracker::loadSettings() { +int NeutralZone; +int sensYaw, sensPitch, sensRoll; +int sensX, sensY, sensZ; +QPointF point1, point2, point3, point4; qDebug() << "Tracker::loadSettings says: Starting "; QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) @@ -777,6 +794,58 @@ void Tracker::loadSettings() { qDebug() << "loadSettings says: iniFile = " << currentFile; + // + // Read the Tracking settings, to fill the curves. + // + iniFile.beginGroup ( "Tracking" ); + NeutralZone = iniFile.value ( "NeutralZone", 5 ).toInt(); + sensYaw = iniFile.value ( "sensYaw", 100 ).toInt(); + sensPitch = iniFile.value ( "sensPitch", 100 ).toInt(); + sensRoll = iniFile.value ( "sensRoll", 100 ).toInt(); + sensX = iniFile.value ( "sensX", 100 ).toInt(); + sensY = iniFile.value ( "sensY", 100 ).toInt(); + sensZ = iniFile.value ( "sensZ", 100 ).toInt(); + iniFile.endGroup (); + + // + // Read the curve-settings from the file. Use the (deprecated) settings, if the curves are not there. + // + iniFile.beginGroup ( "Curves" ); + getCurvePoints( &iniFile, "Yaw_", &point1, &point2, &point3, &point4, NeutralZone, sensYaw, 50, 180 ); + Yaw.curve.moveTo( QPointF(0,0) ); + Yaw.curve.lineTo(point1); + Yaw.curve.cubicTo(point2, point3, point4); + + getCurvePoints( &iniFile, "Pitch_", &point1, &point2, &point3, &point4, NeutralZone, sensPitch, 50, 180 ); + Pitch.curve.moveTo( QPointF(0,0) ); + Pitch.curve.lineTo(point1); + Pitch.curve.cubicTo(point2, point3, point4); + + getCurvePoints( &iniFile, "Roll_", &point1, &point2, &point3, &point4, NeutralZone, sensRoll, 50, 180 ); + Roll.curve.moveTo( QPointF(0,0) ); + Roll.curve.lineTo(point1); + Roll.curve.cubicTo(point2, point3, point4); + + getCurvePoints( &iniFile, "X_", &point1, &point2, &point3, &point4, NeutralZone, sensX, 50, 180 ); + X.curve.moveTo( QPointF(0,0) ); + X.curve.lineTo(point1); + X.curve.cubicTo(point2, point3, point4); + + getCurvePoints( &iniFile, "Y_", &point1, &point2, &point3, &point4, NeutralZone, sensY, 50, 180 ); + Y.curve.moveTo( QPointF(0,0) ); + Y.curve.lineTo(point1); + Y.curve.cubicTo(point2, point3, point4); + + getCurvePoints( &iniFile, "Z_", &point1, &point2, &point3, &point4, NeutralZone, sensZ, 50, 180 ); + Z.curve.moveTo( QPointF(0,0) ); + Z.curve.lineTo(point1); + Z.curve.cubicTo(point2, point3, point4); + + iniFile.endGroup (); + + // + // Read the keyboard shortcuts. + // iniFile.beginGroup ( "KB_Shortcuts" ); // Center key diff --git a/FaceTrackNoIR/tracker.h b/FaceTrackNoIR/tracker.h index 0b0abe7f..51d83f41 100644 --- a/FaceTrackNoIR/tracker.h +++ b/FaceTrackNoIR/tracker.h @@ -31,6 +31,7 @@ #include #include #include +#include #define DIRECTINPUT_VERSION 0x0800 #include @@ -81,6 +82,7 @@ struct THeadPoseDOF { float newPos; // New Position (used locally) float prevPos; // Previous Position float prevRawPos; // Previous Raw Position + QPainterPath curve; // Bezier curve to translate input -> output }; // @@ -217,6 +219,7 @@ public: float getSmoothFromList ( QList *rawList ); float getDegreesFromRads ( float rads ) { return (rads * 57.295781f); } + float getOutputFromCurve ( QPainterPath *curve, float input ); // For now, use one slider for all void setSmoothing(int x) { -- cgit v1.2.3