diff options
| -rw-r--r-- | facetracknoir/facetracknoir.cpp | 4 | ||||
| -rw-r--r-- | facetracknoir/facetracknoir.h | 2 | ||||
| -rw-r--r-- | facetracknoir/tracker.h | 46 | ||||
| -rw-r--r-- | qfunctionconfigurator/functionconfig.cpp | 143 | ||||
| -rw-r--r-- | qfunctionconfigurator/functionconfig.h | 79 | ||||
| -rw-r--r-- | qfunctionconfigurator/qfunctionconfigurator.cpp | 13 | ||||
| -rw-r--r-- | qfunctionconfigurator/qfunctionconfigurator.h | 23 | 
7 files changed, 154 insertions, 156 deletions
| diff --git a/facetracknoir/facetracknoir.cpp b/facetracknoir/facetracknoir.cpp index 8df368cd..da8fae61 100644 --- a/facetracknoir/facetracknoir.cpp +++ b/facetracknoir/facetracknoir.cpp @@ -366,8 +366,8 @@ void FaceTrackNoIR::startTracker( ) {          for (int i = 0; i < 6; i++)          { -            axis(i).curve.loadSettings(iniFile); -            axis(i).curveAlt.loadSettings(iniFile); +            axis(i).curve.loadSettings(iniFile, axis(i).name1); +            axis(i).curveAlt.loadSettings(iniFile, axis(i).name2);          }      } diff --git a/facetracknoir/facetracknoir.h b/facetracknoir/facetracknoir.h index 1da2d6b8..dc37ad37 100644 --- a/facetracknoir/facetracknoir.h +++ b/facetracknoir/facetracknoir.h @@ -86,7 +86,7 @@ public:          return dlopen_filters.value(ui.iconcomboFilter->currentIndex(), (DynamicLibrary*) NULL);      }      THeadPoseDOF& axis(int idx) { -        return *pose.axes[idx]; +        return pose.axes[idx];      }  #if defined(_WIN32) diff --git a/facetracknoir/tracker.h b/facetracknoir/tracker.h index 152551d4..d06ac9d2 100644 --- a/facetracknoir/tracker.h +++ b/facetracknoir/tracker.h @@ -21,12 +21,7 @@  #include "facetracknoir/timer.hpp"  using namespace options; -class FaceTrackNoIR;				// pre-define parent-class to avoid circular includes -  class THeadPoseDOF { -private: -    THeadPoseDOF(const THeadPoseDOF &) = delete; -    THeadPoseDOF& operator=(const THeadPoseDOF&) = delete;  public:      THeadPoseDOF(QString primary,                   QString secondary, @@ -36,22 +31,27 @@ public:                   int maxOutput2,                   axis_opts* opts) :          headPos(0), -        curve(primary, maxInput1, maxOutput1), -        curveAlt(secondary, maxInput2, maxOutput2), -        opts(*opts) +        curve(maxInput1, maxOutput1), +        curveAlt(maxInput2, maxOutput2), +        opts(*opts), +        name1(primary), +        name2(secondary)      {          QSettings settings("opentrack");          QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();          QSettings iniFile( currentFile, QSettings::IniFormat ); -        curve.loadSettings(iniFile); -        curveAlt.loadSettings(iniFile); +        curve.loadSettings(iniFile, primary); +        curveAlt.loadSettings(iniFile, secondary);      }      volatile double headPos;      FunctionConfig curve;  	FunctionConfig curveAlt;      axis_opts& opts; +    QString name1, name2;  }; +class FaceTrackNoIR; +  class Tracker : protected QThread {  	Q_OBJECT @@ -80,23 +80,17 @@ public:  class HeadPoseData {  public: -    THeadPoseDOF* axes[6]; -    HeadPoseData(std::vector<axis_opts*> opts) -    { -        axes[TX] = new THeadPoseDOF("tx","tx_alt", 100, 100, 100, 100, opts[TX]); -        axes[TY] = new THeadPoseDOF("ty","ty_alt", 100, 100, 100, 100, opts[TY]); -        axes[TZ] = new THeadPoseDOF("tz","tz_alt", 100, 100, 100, 100, opts[TZ]); -        axes[Yaw] = new THeadPoseDOF("rx", "rx_alt", 180, 180, 180, 180, opts[Yaw]); -        axes[Pitch] = new THeadPoseDOF("ry", "ry_alt", 90, 90, 90, 90, opts[Pitch]); -        axes[Roll] = new THeadPoseDOF("rz", "rz_alt", 180, 180, 180, 180, opts[Roll]); -    } -    ~HeadPoseData() -    { -        for (int i = 0; i < 6; i++) -        { -            delete axes[i]; +    THeadPoseDOF axes[6]; +    HeadPoseData(std::vector<axis_opts*> opts) : +        axes { +            THeadPoseDOF("tx","tx_alt", 100, 100, 100, 100, opts[TX]), +            THeadPoseDOF("ty","ty_alt", 100, 100, 100, 100, opts[TY]), +            THeadPoseDOF("tz","tz_alt", 100, 100, 100, 100, opts[TZ]), +            THeadPoseDOF("rx", "rx_alt", 180, 180, 180, 180, opts[Yaw]), +            THeadPoseDOF("ry", "ry_alt", 90, 90, 90, 90, opts[Pitch]), +            THeadPoseDOF("rz", "rz_alt", 180, 180, 180, 180, opts[Roll])          } -    } +    {}  };  #endif diff --git a/qfunctionconfigurator/functionconfig.cpp b/qfunctionconfigurator/functionconfig.cpp index 85d058fb..640db1ef 100644 --- a/qfunctionconfigurator/functionconfig.cpp +++ b/qfunctionconfigurator/functionconfig.cpp @@ -17,36 +17,17 @@  #include <math.h>  #include <QPixmap> -FunctionConfig::FunctionConfig(QString title, int intMaxInput, int intMaxOutput) : -    _mutex(QMutex::Recursive) -{ -	_title = title; -    _points = QList<QPointF>(); -	_data = 0; -	_size = 0; -	lastValueTracked = QPointF(0,0); -	_tracking_active = false; -	_max_Input = intMaxInput; -	_max_Output = intMaxOutput; -    QSettings settings("opentrack"); -    QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString(); -    QSettings iniFile( currentFile, QSettings::IniFormat ); -    loadSettings(iniFile); -	reload(); -} -  void FunctionConfig::setTrackingActive(bool blnActive)  { -    _tracking_active = blnActive; +    activep = blnActive;  }  FunctionConfig::FunctionConfig() :      _mutex(QMutex::Recursive), -    _data(0), -    _size(0), -    _tracking_active(false), -    _max_Input(0), -    _max_Output(0) +    data(0), +    activep(false), +    max_x(0), +    max_y(0)  {  } @@ -54,31 +35,30 @@ float FunctionConfig::getValue(float x) {      QMutexLocker foo(&_mutex);      int x2 = (int) (std::min<float>(std::max<float>(x, -360), 360) * MEMOIZE_PRECISION);      float ret = getValueInternal(x2); -	lastValueTracked.setX(x); -	lastValueTracked.setY(ret); +	last_input_value.setX(x); +	last_input_value.setY(ret);  	return ret;  }  bool FunctionConfig::getLastPoint(QPointF& point ) {      QMutexLocker foo(&_mutex); -	point = lastValueTracked; -	return _tracking_active; +	point = last_input_value; +	return activep;  }  float FunctionConfig::getValueInternal(int x) {      float sign = x < 0 ? -1 : 1;  	x = x < 0 ? -x : x;      float ret; -	if (!_data) -		ret = 0; -	else if (_size == 0) +    int sz = data.size(); +	if (sz == 0)  		ret = 0;  	else if (x < 0)  		ret = 0; -	else if (x < _size && x >= 0) -		ret = _data[x]; +	else if (x < sz && x >= 0) +		ret = data[x];  	else -		ret = _data[_size - 1]; +		ret = data[sz - 1];  	return ret * sign;  } @@ -96,35 +76,32 @@ static bool sortFn(const QPointF& one, const QPointF& two) {  }  void FunctionConfig::reload() { -	_size = 0; +	if (input.size()) +		qStableSort(input.begin(), input.end(), sortFn); -	if (_points.size()) -		qStableSort(_points.begin(), _points.end(), sortFn); +	if (input.size()) { +        data = std::vector<float>(MEMOIZE_PRECISION * input[input.size() - 1].x()); +         +        const int sz = data.size(); -	if (_data) -        delete[] _data; -	_data = NULL; -	if (_points.size()) { -        _data = new float[_size = MEMOIZE_PRECISION * _points[_points.size() - 1].x()]; +        for (int i = 0; i < sz; i++) +                data[i] = -1; -        for (int i = 0; i < _size; i++) -                _data[i] = -1e6; - -		for (int k = 0; k < _points[0].x() * MEMOIZE_PRECISION; k++) { -            if (k < _size) -                _data[k] = _points[0].y() * k / (_points[0].x() * MEMOIZE_PRECISION); +		for (int k = 0; k < input[0].x() * MEMOIZE_PRECISION; k++) { +            if (k < sz) +                data[k] = input[0].y() * k / (input[0].x() * MEMOIZE_PRECISION);          } -       for (int i = 0; i < _points.size(); i++) { -            QPointF p0 = ensureInBounds(_points, i - 1); -            QPointF p1 = ensureInBounds(_points, i); -            QPointF p2 = ensureInBounds(_points, i + 1); -            QPointF p3 = ensureInBounds(_points, i + 2); +       for (int i = 0; i < sz; i++) { +            QPointF p0 = ensureInBounds(input, i - 1); +            QPointF p1 = ensureInBounds(input, i); +            QPointF p2 = ensureInBounds(input, i + 1); +            QPointF p3 = ensureInBounds(input, i + 2); -            int end = p2.x() * MEMOIZE_PRECISION; +            int end = std::min<int>(sz, p2.x() * MEMOIZE_PRECISION);              int start = p1.x() * MEMOIZE_PRECISION; -            for (int j = start; j < end && j < _size; j++) { +            for (int j = start; j < end; j++) {                  double t = (j - start) / (double) (end - start);                  double t2 = t*t;                  double t3 = t*t*t; @@ -140,47 +117,41 @@ void FunctionConfig::reload() {                                   (2. * p0.y() - 5. * p1.y() + 4. * p2.y() - p3.y()) * t2 +                                   (-p0.y() + 3. * p1.y() - 3. * p2.y() + p3.y()) * t3); -                if (x >= 0 && x < _size) -                    _data[x] = y; +                if (x >= 0 && x < sz) +                    data[x] = y;              }  		}         float last = 0; - -       for (int i = 0; i < _size; i++) +       for (int i = 0; i < sz; i++)         { -           if (_data[i] == -1e6) -               _data[i] = last; -           last = _data[i]; +           if (data[i] <= 0) +               data[i] = last; +           last = data[i];         }  	}  } -FunctionConfig::~FunctionConfig() { -	if (_data) -        delete[] _data; -} -  void FunctionConfig::removePoint(int i) {      QMutexLocker foo(&_mutex); -    if (i >= 0 && i < _points.size()) +    if (i >= 0 && i < input.size())      { -        _points.removeAt(i); +        input.removeAt(i);          reload();      }  }  void FunctionConfig::addPoint(QPointF pt) {      QMutexLocker foo(&_mutex); -	_points.append(pt); +	input.append(pt);  	reload();  }  void FunctionConfig::movePoint(int idx, QPointF pt) {      QMutexLocker foo(&_mutex); -    if (idx >= 0 && idx < _points.size()) +    if (idx >= 0 && idx < input.size())      { -        _points[idx] = pt; +        input[idx] = pt;          reload();      }  } @@ -188,45 +159,45 @@ void FunctionConfig::movePoint(int idx, QPointF pt) {  QList<QPointF> FunctionConfig::getPoints() {  	QList<QPointF> ret;      QMutexLocker foo(&_mutex); -    for (int i = 0; i < _points.size(); i++) { -		ret.append(_points[i]); +    for (int i = 0; i < input.size(); i++) { +		ret.append(input[i]);  	}  	return ret;  } -void FunctionConfig::loadSettings(QSettings& settings) { +void FunctionConfig::loadSettings(QSettings& settings, const QString& title) {      QMutexLocker foo(&_mutex);      QPointF newPoint;  	QList<QPointF> points; -	settings.beginGroup(QString("Curves-%1").arg(_title)); +	settings.beginGroup(QString("Curves-%1").arg(title));      int max = settings.value("point-count", 0).toInt();  	for (int i = 0; i < max; i++) {  		newPoint = QPointF(settings.value(QString("point-%1-x").arg(i), 0).toFloat(),  				   settings.value(QString("point-%1-y").arg(i), 0).toFloat()); -		if (newPoint.x() > _max_Input) { -			newPoint.setX(_max_Input); +		if (newPoint.x() > max_x) { +			newPoint.setX(max_x);  		} -		if (newPoint.y() > _max_Output) { -			newPoint.setY(_max_Output); +		if (newPoint.y() > max_y) { +			newPoint.setY(max_y);  		}  		points.append(newPoint);  	}      settings.endGroup(); -	_points = points; +	input = points;  	reload();  } -void FunctionConfig::saveSettings(QSettings& settings) { +void FunctionConfig::saveSettings(QSettings& settings, const QString& title) {      QMutexLocker foo(&_mutex); -	settings.beginGroup(QString("Curves-%1").arg(_title)); -	int max = _points.size(); +	settings.beginGroup(QString("Curves-%1").arg(title)); +	int max = input.size();  	settings.setValue("point-count", max);  	for (int i = 0; i < max; i++) { -		settings.setValue(QString("point-%1-x").arg(i), _points[i].x()); -		settings.setValue(QString("point-%1-y").arg(i), _points[i].y()); +		settings.setValue(QString("point-%1-x").arg(i), input[i].x()); +		settings.setValue(QString("point-%1-y").arg(i), input[i].y());      }      for (int i = max; true; i++) diff --git a/qfunctionconfigurator/functionconfig.h b/qfunctionconfigurator/functionconfig.h index 9b43f0bd..22bfc406 100644 --- a/qfunctionconfigurator/functionconfig.h +++ b/qfunctionconfigurator/functionconfig.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2012, Stanislaw Halik <sthalik@misaki.pl> +/* Copyright (c) 2011-2014, Stanislaw Halik <sthalik@misaki.pl>   * Permission to use, copy, modify, and/or distribute this   * software for any purpose with or without fee is hereby granted, @@ -14,36 +14,72 @@  #include <QSettings>  #include <QMutex>  #include "ftnoir_tracker_base/ftnoir_tracker_base.h" +#include <vector>  #define MEMOIZE_PRECISION 100 +class MyMutex { +private: +    QMutex inner; +     +public: +    QMutex* operator->() { return &inner; } +    QMutex* operator->() const { return &const_cast<MyMutex*>(this)->inner; } +     +    MyMutex operator=(const MyMutex& datum) +    { +        auto mode = +                datum->isRecursive() +                ? QMutex::Recursive +                : QMutex::NonRecursive; +         +        return MyMutex(mode); +    } +     +    MyMutex(const MyMutex& datum) +    { +        *this = datum; +    } +     +    MyMutex(QMutex::RecursionMode mode = QMutex::NonRecursive) : +        inner(mode) +    { +    } +     +    QMutex* operator&() +    { +        return &inner; +    } +}; +  class FTNOIR_TRACKER_BASE_EXPORT FunctionConfig {  private: -    QMutex _mutex; -	QList<QPointF> _points; -	void reload(); -    float* _data; -	int _size; -	QString _title; +    void reload();      float getValueInternal(int x); -	QPointF lastValueTracked; -    volatile bool _tracking_active; -	int _max_Input; -	int _max_Output; -    FunctionConfig(const FunctionConfig&) = delete; +     +    MyMutex _mutex; +	QList<QPointF> input; +    std::vector<float> data; +	QPointF last_input_value; +    volatile bool activep; +	int max_x; +	int max_y;  public: -    int maxInput() const { return _max_Input; } -    int maxOutput() const { return _max_Output; } +    int maxInput() const { return max_x; } +    int maxOutput() const { return max_y; }      FunctionConfig(); -    FunctionConfig(QString title, int intMaxInput, int intMaxOutput); -    ~FunctionConfig(); +    FunctionConfig(int maxx, int maxy) +    { +        setMaxInput(maxx); +        setMaxOutput(maxy); +    }      float getValue(float x);  	bool getLastPoint(QPointF& point);  	void removePoint(int i);      void removeAllPoints() {          QMutexLocker foo(&_mutex); -        _points.clear(); +        input.clear();          reload();      } @@ -51,15 +87,14 @@ public:  	void movePoint(int idx, QPointF pt);  	QList<QPointF> getPoints();  	void setMaxInput(int MaxInput) { -		_max_Input = MaxInput; +		max_x = MaxInput;  	}  	void setMaxOutput(int MaxOutput) { -		_max_Output = MaxOutput; +		max_y = MaxOutput;  	} -	void saveSettings(QSettings& settings); -	void loadSettings(QSettings& settings); +	void saveSettings(QSettings& settings, const QString& title); +	void loadSettings(QSettings& settings, const QString& title);  	void setTrackingActive(bool blnActive); -    QString getTitle() { return _title; }  }; diff --git a/qfunctionconfigurator/qfunctionconfigurator.cpp b/qfunctionconfigurator/qfunctionconfigurator.cpp index e94eded4..a197dadb 100644 --- a/qfunctionconfigurator/qfunctionconfigurator.cpp +++ b/qfunctionconfigurator/qfunctionconfigurator.cpp @@ -41,7 +41,7 @@ void QFunctionConfigurator::setConfig(FunctionConfig* config) {      QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();      QSettings iniFile( currentFile, QSettings::IniFormat ); -    config->loadSettings(iniFile); +    config->loadSettings(iniFile, name);      _config = config;      _draw_function = _draw_background = true;      update_range(); @@ -52,7 +52,7 @@ void QFunctionConfigurator::saveSettings(QString settingsFile) {      QSettings iniFile( settingsFile, QSettings::IniFormat );						// Application settings (in INI-file)      if (_config) { -        _config->saveSettings(iniFile); +        _config->saveSettings(iniFile, name);      }  } @@ -279,7 +279,6 @@ void QFunctionConfigurator::mousePressEvent(QMouseEvent *e)              }              if (!bTouchingPoint) {                  _config->addPoint(pixel_coord_to_point(e->pos())); -                emit CurveChanged( true );              }          }      } @@ -296,7 +295,6 @@ void QFunctionConfigurator::mousePressEvent(QMouseEvent *e)              if (found_pt != -1) {                  _config->removePoint(found_pt); -                emit CurveChanged( true );              }              movingPoint = -1;          } @@ -353,7 +351,6 @@ void QFunctionConfigurator::mouseReleaseEvent(QMouseEvent *e)      if (e->button() == Qt::LeftButton) {          timer.invalidate();          if (movingPoint >= 0 && movingPoint < points.size()) { -            emit CurveChanged( true );              if (_config) {                  _config->movePoint(movingPoint, pixel_coord_to_point(e->pos()));              } @@ -400,12 +397,6 @@ QPointF QFunctionConfigurator::point_to_pixel(QPointF point) const                     range.y() + range.height() - point.y() * c.y());  } -void QFunctionConfigurator::setColorBezier(QColor color) -{ -    colBezier = color; -    update(); -} -  void QFunctionConfigurator::resizeEvent(QResizeEvent *)  {      update_range(); diff --git a/qfunctionconfigurator/qfunctionconfigurator.h b/qfunctionconfigurator/qfunctionconfigurator.h index d3a8741f..e4af0062 100644 --- a/qfunctionconfigurator/qfunctionconfigurator.h +++ b/qfunctionconfigurator/qfunctionconfigurator.h @@ -16,40 +16,47 @@  class FTNOIR_TRACKER_BASE_EXPORT QFunctionConfigurator : public QWidget  {  	Q_OBJECT -    Q_PROPERTY(QColor colorBezier READ colorBezier WRITE setColorBezier) +    Q_PROPERTY(QString Name READ get_name WRITE set_name) +          QColor colorBezier() const      {          return colBezier;      } +    void setColorBezier(QColor color) +    { +        colBezier = color; +        update(); +    } +    QString get_name() const { +        return name; +    } +    void set_name(QString name) +    { +        this->name = name; +    }  public:  	QFunctionConfigurator(QWidget *parent = 0);  	FunctionConfig* config();      void setConfig(FunctionConfig* config);      void saveSettings(QString settingsFile); - -signals: -    void CurveChanged(bool); -  public slots: -    void setColorBezier(QColor);  protected slots:  	void paintEvent(QPaintEvent *e);  	void mousePressEvent(QMouseEvent *e);  	void mouseMoveEvent(QMouseEvent *e);  	void mouseReleaseEvent(QMouseEvent *e); -        protected:      void drawBackground();  	void drawFunction();  	void drawPoint(QPainter *painter, const QPointF &pt, QColor colBG );  	void drawLine(QPainter *painter, const QPointF &start, const QPointF &end, QPen pen);      bool point_within_pixel(QPointF pt, QPointF pixel) const; -  protected:  	virtual void resizeEvent(QResizeEvent *);  private: +    QString name;      void update_range() {          if (!_config)              return; | 
