diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2013-08-19 12:43:22 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2013-08-19 12:43:22 +0200 |
commit | 60ac7c17eb4786949a130099a4ef26af00c2ea4f (patch) | |
tree | ec1de61184aa62eb51db7c8bec6bbb1a6291abb3 | |
parent | 54883f543f45e94810ee48108474efad7f0ba2d6 (diff) |
Simplify Accela's UI and preset equations
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui | 675 | ||||
-rw-r--r-- | ftnoir_filter_accela/ftnoir_filter_accela.cpp | 111 | ||||
-rw-r--r-- | ftnoir_filter_accela/ftnoir_filter_accela.h | 31 | ||||
-rw-r--r-- | ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp | 91 | ||||
-rw-r--r-- | ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp | 18 |
6 files changed, 234 insertions, 694 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3731d7ec..10460e62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -320,7 +320,7 @@ endif() target_link_libraries(opentrack-spline-widget ${MY_QT_LIBS}) add_library(opentrack-filter-accela SHARED ${opentrack-filter-accela-c} ${opentrack-filter-accela-moc} ${opentrack-filter-accela-uih} ${opentrack-filter-accela-rcc}) - target_link_libraries(opentrack-filter-accela ${MY_QT_LIBS} opentrack-spline-widget) + target_link_libraries(opentrack-filter-accela ${MY_QT_LIBS}) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC) SET_TARGET_PROPERTIES(opentrack-filter-accela diff --git a/ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui b/ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui index 1478254e..d66dfa80 100644 --- a/ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui +++ b/ftnoir_filter_accela/ftnoir_accela_filtercontrols.ui @@ -9,8 +9,8 @@ <rect> <x>0</x> <y>0</y> - <width>868</width> - <height>729</height> + <width>570</width> + <height>71</height> </rect> </property> <property name="windowTitle"> @@ -29,495 +29,206 @@ <property name="styleSheet"> <string notr="true"/> </property> - <layout class="QVBoxLayout" name="_vertical_layout"> - <item> - <widget class="QTabWidget" name="tabWidget"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>850</width> - <height>650</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>300</width> - <height>650</height> - </size> - </property> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="tab_3"> - <attribute name="title"> - <string>Preset</string> - </attribute> - <widget class="QLabel" name="label_2"> - <property name="geometry"> - <rect> - <x>10</x> - <y>10</y> - <width>111</width> - <height>16</height> - </rect> - </property> - <property name="text"> - <string>Rotation smoothing</string> - </property> - </widget> - <widget class="QLabel" name="label_3"> - <property name="geometry"> - <rect> - <x>10</x> - <y>40</y> - <width>111</width> - <height>16</height> - </rect> - </property> - <property name="text"> - <string>Translation smoothing</string> - </property> - </widget> - <widget class="QDoubleSpinBox" name="rotationCircle"> - <property name="geometry"> - <rect> - <x>130</x> - <y>10</y> - <width>81</width> - <height>22</height> - </rect> - </property> - <property name="minimum"> - <double>0.100000000000000</double> - </property> - <property name="maximum"> - <double>10.000000000000000</double> - </property> - <property name="value"> - <double>3.000000000000000</double> - </property> - </widget> - <widget class="QDoubleSpinBox" name="translationCircle"> - <property name="geometry"> - <rect> - <x>130</x> - <y>40</y> - <width>81</width> - <height>22</height> - </rect> - </property> - <property name="minimum"> - <double>0.100000000000000</double> - </property> - <property name="maximum"> - <double>10.000000000000000</double> - </property> - <property name="value"> - <double>0.750000000000000</double> - </property> - </widget> - <widget class="QPushButton" name="resetCircle"> - <property name="geometry"> - <rect> - <x>140</x> - <y>70</y> - <width>75</width> - <height>23</height> - </rect> - </property> - <property name="text"> - <string>Set curves</string> - </property> - </widget> - <widget class="QPushButton" name="removeAllButton"> - <property name="geometry"> - <rect> - <x>60</x> - <y>70</y> - <width>75</width> - <height>23</height> - </rect> - </property> - <property name="text"> - <string>Remove all</string> - </property> - </widget> - </widget> - <widget class="QWidget" name="tab"> - <attribute name="title"> - <string>Rotation</string> - </attribute> - <widget class="QFunctionConfigurator" name="scalingConfig" native="true"> - <property name="geometry"> - <rect> - <x>20</x> - <y>10</y> - <width>819</width> - <height>571</height> - </rect> - </property> - <property name="maxInputEGU" stdset="0"> - <number>10</number> - </property> - <property name="maxOutputEGU" stdset="0"> - <number>10</number> - </property> - <property name="pixPerEGU_Input" stdset="0"> - <number>57</number> - </property> - <property name="pixPerEGU_Output" stdset="0"> - <number>57</number> - </property> - <property name="gridDistEGU_Input" stdset="0"> - <number>1</number> - </property> - <property name="gridDistEGU_Output" stdset="0"> - <number>1</number> - </property> - <property name="colorBezier" stdset="0"> - <color> - <red>255</red> - <green>170</green> - <blue>0</blue> - </color> - </property> - <property name="colorBackground" stdset="0"> - <color> - <red>192</red> - <green>192</green> - <blue>192</blue> - </color> - </property> - <property name="stringInputEGU" stdset="0"> - <string>Input</string> - </property> - <property name="stringOutputEGU" stdset="0"> - <string>Output</string> - </property> - <property name="stringCaption" stdset="0"> - <string>Translation</string> - </property> - </widget> - </widget> - <widget class="QWidget" name="tab_2"> - <attribute name="title"> - <string>Translation</string> - </attribute> - <widget class="QFunctionConfigurator" name="translationScalingConfig" native="true"> - <property name="geometry"> - <rect> - <x>20</x> - <y>10</y> - <width>819</width> - <height>581</height> - </rect> - </property> - <property name="maxInputEGU" stdset="0"> - <number>10</number> - </property> - <property name="maxOutputEGU" stdset="0"> - <number>10</number> - </property> - <property name="pixPerEGU_Input" stdset="0"> - <number>57</number> - </property> - <property name="pixPerEGU_Output" stdset="0"> - <number>57</number> - </property> - <property name="gridDistEGU_Input" stdset="0"> - <number>1</number> - </property> - <property name="gridDistEGU_Output" stdset="0"> - <number>1</number> - </property> - <property name="colorBezier" stdset="0"> - <color> - <red>85</red> - <green>255</green> - <blue>0</blue> - </color> - </property> - <property name="colorBackground" stdset="0"> - <color> - <red>192</red> - <green>192</green> - <blue>192</blue> - </color> - </property> - <property name="stringInputEGU" stdset="0"> - <string>Input</string> - </property> - <property name="stringOutputEGU" stdset="0"> - <string>Output</string> - </property> - </widget> - </widget> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QLabel" name="lblSensYaw_4"> - <property name="minimumSize"> - <size> - <width>25</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>150</width> - <height>16777215</height> - </size> - </property> - <property name="styleSheet"> - <string notr="true">color:#0; + <widget class="QLabel" name="lblSensYaw_5"> + <property name="geometry"> + <rect> + <x>243</x> + <y>10</y> + <width>76</width> + <height>22</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>25</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="styleSheet"> + <string notr="true">color:#0; background:none;</string> - </property> - <property name="text"> - <string>Reduction factor:</string> - </property> - </widget> - </item> - <item> - <widget class="QSlider" name="slideReduction"> - <property name="minimumSize"> - <size> - <width>50</width> - <height>15</height> - </size> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>1000</number> - </property> - <property name="pageStep"> - <number>5</number> - </property> - <property name="value"> - <number>100</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="tickPosition"> - <enum>QSlider::NoTicks</enum> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="spinReduction"> - <property name="minimumSize"> - <size> - <width>35</width> - <height>22</height> - </size> - </property> - <property name="styleSheet"> - <string notr="true">background:none;</string> - </property> - <property name="readOnly"> - <bool>false</bool> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>1000</number> - </property> - <property name="value"> - <number>100</number> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="lblSensYaw_5"> - <property name="minimumSize"> - <size> - <width>25</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>150</width> - <height>16777215</height> - </size> - </property> - <property name="styleSheet"> - <string notr="true">color:#0; -background:none;</string> - </property> - <property name="text"> - <string>Zoom slowness:</string> - </property> - </widget> - </item> - <item> - <widget class="QSlider" name="slideZoom"> - <property name="minimumSize"> - <size> - <width>50</width> - <height>15</height> - </size> - </property> - <property name="minimum"> - <number>0</number> - </property> - <property name="maximum"> - <number>200</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="value"> - <number>100</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="tickPosition"> - <enum>QSlider::NoTicks</enum> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="spinZoom"> - <property name="minimumSize"> - <size> - <width>35</width> - <height>22</height> - </size> - </property> - <property name="styleSheet"> - <string notr="true">background:none;</string> - </property> - <property name="readOnly"> - <bool>false</bool> - </property> - <property name="minimum"> - <number>0</number> - </property> - <property name="maximum"> - <number>200</number> - </property> - <property name="value"> - <number>100</number> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <spacer name="spacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="btnOK"> - <property name="text"> - <string>OK</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="btnCancel"> - <property name="text"> - <string>Cancel</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> + </property> + <property name="text"> + <string>Zoom slowness:</string> + </property> + </widget> + <widget class="QDoubleSpinBox" name="translation_alpha"> + <property name="geometry"> + <rect> + <x>130</x> + <y>40</y> + <width>81</width> + <height>22</height> + </rect> + </property> + <property name="minimum"> + <double>0.100000000000000</double> + </property> + <property name="maximum"> + <double>65535.000000000000000</double> + </property> + <property name="value"> + <double>1.000000000000000</double> + </property> + </widget> + <widget class="QDoubleSpinBox" name="rotation_alpha"> + <property name="geometry"> + <rect> + <x>130</x> + <y>10</y> + <width>81</width> + <height>22</height> + </rect> + </property> + <property name="minimum"> + <double>0.100000000000000</double> + </property> + <property name="maximum"> + <double>65535.000000000000000</double> + </property> + <property name="value"> + <double>1.000000000000000</double> + </property> + </widget> + <widget class="QLabel" name="label_2"> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>111</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>Rotation smoothing</string> + </property> + </widget> + <widget class="QSlider" name="slideZoom"> + <property name="geometry"> + <rect> + <x>325</x> + <y>13</y> + <width>189</width> + <height>15</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>50</width> + <height>15</height> + </size> + </property> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>200</number> + </property> + <property name="pageStep"> + <number>1</number> + </property> + <property name="value"> + <number>100</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickPosition"> + <enum>QSlider::NoTicks</enum> + </property> + </widget> + <widget class="QSpinBox" name="spinZoom"> + <property name="geometry"> + <rect> + <x>520</x> + <y>10</y> + <width>42</width> + <height>22</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>35</width> + <height>22</height> + </size> + </property> + <property name="styleSheet"> + <string notr="true">background:none;</string> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>200</number> + </property> + <property name="value"> + <number>100</number> + </property> + </widget> + <widget class="QLabel" name="label_3"> + <property name="geometry"> + <rect> + <x>10</x> + <y>40</y> + <width>111</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>Translation smoothing</string> + </property> + </widget> + <widget class="QPushButton" name="btnOK"> + <property name="geometry"> + <rect> + <x>409</x> + <y>40</y> + <width>75</width> + <height>23</height> + </rect> + </property> + <property name="text"> + <string>OK</string> + </property> + </widget> + <widget class="QPushButton" name="btnCancel"> + <property name="geometry"> + <rect> + <x>490</x> + <y>40</y> + <width>75</width> + <height>23</height> + </rect> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> </widget> - <customwidgets> - <customwidget> - <class>QFunctionConfigurator</class> - <extends>QWidget</extends> - <header>qfunctionconfigurator.h</header> - </customwidget> - </customwidgets> <resources/> <connections> <connection> - <sender>slideReduction</sender> - <signal>valueChanged(int)</signal> - <receiver>spinReduction</receiver> - <slot>setValue(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>219</x> - <y>620</y> - </hint> - <hint type="destinationlabel"> - <x>310</x> - <y>622</y> - </hint> - </hints> - </connection> - <connection> - <sender>spinReduction</sender> - <signal>valueChanged(int)</signal> - <receiver>slideReduction</receiver> - <slot>setValue(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>315</x> - <y>613</y> - </hint> - <hint type="destinationlabel"> - <x>170</x> - <y>621</y> - </hint> - </hints> - </connection> - <connection> <sender>slideZoom</sender> <signal>valueChanged(int)</signal> <receiver>spinZoom</receiver> <slot>setValue(int)</slot> <hints> <hint type="sourcelabel"> - <x>547</x> - <y>602</y> + <x>463</x> + <y>19</y> </hint> <hint type="destinationlabel"> - <x>667</x> - <y>602</y> + <x>537</x> + <y>20</y> </hint> </hints> </connection> @@ -528,12 +239,12 @@ background:none;</string> <slot>setValue(int)</slot> <hints> <hint type="sourcelabel"> - <x>663</x> - <y>602</y> + <x>533</x> + <y>20</y> </hint> <hint type="destinationlabel"> - <x>537</x> - <y>602</y> + <x>426</x> + <y>20</y> </hint> </hints> </connection> diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.cpp b/ftnoir_filter_accela/ftnoir_filter_accela.cpp index 0aea2f78..66744c2f 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela.cpp @@ -4,29 +4,16 @@ * purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*/
-/*
- Modifications (last one on top):
- 20120807 - WVR: FunctionConfig is now also used for the Filter. The extrapolation was adapted from Stanislaw.
- Additional changes: I have added two parameters to the constructor of FunctionConfig and
- renamed 3 member-functions (getFilterFullName is now called getFullName).
-*/
#include "ftnoir_filter_accela/ftnoir_filter_accela.h"
#include "math.h"
#include <QDebug>
#include <float.h>
#include "facetracknoir/global-settings.h"
-#if !defined(_WIN32) && !defined(__WIN32)
-# define _isnan isnan
-#endif
-
-FTNoIR_Filter::FTNoIR_Filter() :
- functionConfig("Accela-Scaling-Rotation", 10, 10),
- translationFunctionConfig("Accela-Scaling-Translation", 10, 10)
+FTNoIR_Filter::FTNoIR_Filter()
{
first_run = true;
- kMagicNumber = 1000;
- loadSettings(); // Load the Settings
+ loadSettings();
}
FTNoIR_Filter::~FTNoIR_Filter()
@@ -40,102 +27,50 @@ void FTNoIR_Filter::loadSettings() { QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();
QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
- functionConfig.loadSettings(iniFile);
- translationFunctionConfig.loadSettings(iniFile);
-
iniFile.beginGroup ( "Accela" );
- kMagicNumber = iniFile.value ( "Reduction", 1000 ).toFloat();
- kZoomSlowness = iniFile.value("zoom-slowness", 0).toFloat();
+ zoom_factor = iniFile.value("zoom-slowness", 0).toDouble();
+ rotation_alpha = iniFile.value("rotation-alpha", ACCELA_SMOOTHING_ROTATION).toDouble();
+ translation_alpha = iniFile.value("translation-alpha", ACCELA_SMOOTHING_TRANSLATION).toDouble();
iniFile.endGroup ();
}
+static double parabola(const double a, const double x)
+{
+ const double a1 = 1./a;
+ return a1 * a1 * x * x;
+}
+
void FTNoIR_Filter::FilterHeadPoseData(double *current_camera_position,
double *target_camera_position,
double *new_camera_position,
double *last_post_filter_values)
{
- double target[6];
- double prev_output[6];
- float output[6];
-
- for (int i = 0; i < 6; i++)
- {
- prev_output[i] = current_camera_position[i];
- target[i] = target_camera_position[i];
- }
-
if (first_run)
{
for (int i = 0; i < 6; i++)
{
- new_camera_position[i] = target[i];
- current_camera_position[i] = target[i];
+ new_camera_position[i] = target_camera_position[i];
+ current_camera_position[i] = target_camera_position[i];
}
- first_run=false;
+ first_run = false;
return;
}
for (int i=0;i<6;i++)
{
- if (_isnan(target[i]))
- return;
-
- if (_isnan(prev_output[i]))
- return;
-
- double e2 = target[i];
- double start = prev_output[i];
- double vec = e2 - start;
- int sign = vec < 0 ? -1 : 1;
- double x = fabs(vec);
- QList<QPointF> points = (i >= 3 ? functionConfig : translationFunctionConfig).getPoints();
- int extrapolatep = 0;
- double ratio;
- double maxx;
- double add;
- // linear extrapolation of a spline
- if (points.size() > 1) {
- QPointF last = points[points.size() - 1];
- QPointF penultimate = points[points.size() - 2];
- ratio = (last.y() - penultimate.y()) / (last.x() - penultimate.x());
- extrapolatep = 1;
- add = last.y();
- maxx = last.x();
- }
- double foo = extrapolatep && x > maxx ? add + ratio * (x - maxx) : (i >= 3 ? functionConfig : translationFunctionConfig).getValue(x);
- // the idea is that "empty" updates without new head pose data are still
- // useful for filtering, as skipping them would result in jerky output.
- // the magic "100" is the amount of calls to the filter by FTNOIR per sec.
- // WVR: Added kMagicNumber for Patrick
- double velocity = foo / kMagicNumber * (1 / std::max(1.0, 1 + kZoomSlowness * -last_post_filter_values[TZ] / 100));
- double sum = start + velocity * sign;
- bool done = (sign > 0 ? sum >= e2 : sum <= e2);
- if (done) {
- output[i] = e2;
- } else {
- output[i] = sum;
- }
-
- if (_isnan(output[i]))
- return;
+ const double vec = target_camera_position[i] - current_camera_position[i];
+ const int sign = vec < 0 ? -1 : 1;
+ const double x = fabs(vec);
+ const double a = i >= 3 ? rotation_alpha : translation_alpha;
+ const double reduction = 1. / std::max(1., 1. + zoom_factor * -last_post_filter_values[TZ] / 1000);
+ const double velocity = parabola(a, x) * reduction;
+ const double result = current_camera_position[i] + velocity * sign;
+ const bool done = sign > 0 ? result >= target_camera_position[i] : result <= target_camera_position[i];
+ new_camera_position[i] = current_camera_position[i] = done ? target_camera_position[i] : result;
}
-
- for (int i = 0; i < 6; i++)
- {
- new_camera_position[i] = output[i];
- current_camera_position[i] = output[i];
- }
}
-////////////////////////////////////////////////////////////////////////////////
-// Factory function that creates instances if the Filter object.
-
-// Export both decorated and undecorated names.
-// GetFilter - Undecorated name, which can be easily used with GetProcAddress
-// Win32 API function.
-// _GetFilter@0 - Common name decoration for __stdcall functions in C language.
-
extern "C" FTNOIR_FILTER_BASE_EXPORT IFilter* CALLING_CONVENTION GetConstructor()
{
return new FTNoIR_Filter;
diff --git a/ftnoir_filter_accela/ftnoir_filter_accela.h b/ftnoir_filter_accela/ftnoir_filter_accela.h index 6e98c797..a0b7f3ef 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela.h +++ b/ftnoir_filter_accela/ftnoir_filter_accela.h @@ -31,13 +31,10 @@ #include "ftnoir_filter_base/ftnoir_filter_base.h"
#include "ui_ftnoir_accela_filtercontrols.h"
-#include <qfunctionconfigurator/functionconfig.h>
#include "facetracknoir/global-settings.h"
-//
-// Macro to determine array-size
-//
-#define NUM_OF(x) (sizeof (x) / sizeof *(x))
+#define ACCELA_SMOOTHING_ROTATION 6.0
+#define ACCELA_SMOOTHING_TRANSLATION 3.0
//*******************************************************************************************************
// FaceTrackNoIR Filter class.
@@ -54,13 +51,8 @@ public: private:
void loadSettings(); // Load the settings from the INI-file
- double newHeadPose[6]; // Structure with new headpose
-
- bool first_run;
- double kMagicNumber, kZoomSlowness; // Stanislaws' magic number (should be 100 according to him...)
-
- FunctionConfig functionConfig;
- FunctionConfig translationFunctionConfig;
+ bool first_run;
+ double rotation_alpha, translation_alpha, zoom_factor;
};
//*******************************************************************************************************
@@ -82,21 +74,12 @@ private: Ui::AccelaUICFilterControls ui;
void loadSettings();
void save();
-
- /** helper **/
bool settingsDirty;
-
- IFilter* pFilter; // If the filter was active when the dialog was opened, this will hold a pointer to the Filter instance
- FunctionConfig functionConfig;
- FunctionConfig translationFunctionConfig;
-
private slots:
void doOK();
void doCancel();
void settingChanged(bool) { settingsDirty = true; }
void settingChanged(int) { settingsDirty = true; }
- void resetCircle();
- void removeAll();
};
//*******************************************************************************************************
@@ -108,9 +91,9 @@ public: FTNoIR_FilterDll();
~FTNoIR_FilterDll();
- void getFullName(QString *strToBeFilled) { *strToBeFilled = QString("Accela Filter Mk2"); }
- void getShortName(QString *strToBeFilled) { *strToBeFilled = QString("Accela Mk2"); }
- void getDescription(QString *strToBeFilled) { *strToBeFilled = QString("Accela filter Mk2"); }
+ void getFullName(QString *strToBeFilled) { *strToBeFilled = QString("Accela Filter Mk3"); }
+ void getShortName(QString *strToBeFilled) { *strToBeFilled = QString("Accela Mk3"); }
+ void getDescription(QString *strToBeFilled) { *strToBeFilled = QString("Accela filter Mk3"); }
void getIcon(QIcon *icon){ *icon = QIcon(":/images/filter-16.png"); }
};
diff --git a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp b/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp index 1de51b10..f0641ea6 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela_dialog.cpp @@ -39,9 +39,7 @@ // Constructor for server-settings-dialog
//
FilterControls::FilterControls() :
- QWidget(),
- functionConfig("Accela-Scaling-Rotation", 10, 10),
- translationFunctionConfig("Accela-Scaling-Translation", 10, 10)
+ QWidget()
{
ui.setupUi( this );
@@ -49,13 +47,11 @@ FilterControls::FilterControls() : loadSettings();
connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK()));
connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel()));
- connect(ui.scalingConfig, SIGNAL(CurveChanged(bool)), this, SLOT(settingChanged(bool)));
- connect(ui.translationScalingConfig, SIGNAL(CurveChanged(bool)), this, SLOT(settingChanged(bool)));
- connect(ui.resetCircle, SIGNAL(clicked()), this, SLOT(resetCircle()));
- connect(ui.removeAllButton, SIGNAL(clicked()), this, SLOT(removeAll()));
+ connect(ui.rotation_alpha, SIGNAL(valueChanged(double)), this, SLOT(settingChanged(int)));
+ connect(ui.translation_alpha, SIGNAL(valueChanged(double)), this, SLOT(settingChanged(int)));
- // Connect slider for reduction
- //connect(ui.slideReduction, SIGNAL(valueChanged(int)), this, SLOT(settingChanged(int)));
+ connect(ui.slideZoom, SIGNAL(valueChanged(int)), this, SLOT(settingChanged(int)));
+ connect(ui.spinZoom, SIGNAL(valueChanged(int)), this, SLOT(settingChanged(int)));
qDebug() << "FilterControls() says: started";
}
@@ -71,13 +67,6 @@ 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;
loadSettings();
QPoint offsetpos(100, 100);
@@ -145,74 +134,16 @@ void FilterControls::loadSettings() { //qDebug() << "FTNoIR_Filter::loadSettings2 says: size = " << NUM_OF(defScaleRotation);
- ui.translationScalingConfig->setConfig(&translationFunctionConfig, currentFile);
- ui.scalingConfig->setConfig(&functionConfig, currentFile);
-
iniFile.beginGroup ( "Accela" );
- ui.slideReduction->setValue (iniFile.value ( "Reduction", 1000 ).toInt());
ui.slideZoom->setValue(iniFile.value("zoom-slowness", 0).toInt());
- ui.rotationCircle->setValue(iniFile.value("preset-rotation", 3).toDouble());
- ui.translationCircle->setValue(iniFile.value("preset-translation", 0.75).toDouble());
+ ui.spinZoom->setValue(iniFile.value("zoom-slowness", 0).toInt());
+ ui.rotation_alpha->setValue(iniFile.value("rotation-alpha", ACCELA_SMOOTHING_ROTATION).toDouble());
+ ui.translation_alpha->setValue(iniFile.value("translation-alpha", ACCELA_SMOOTHING_TRANSLATION).toDouble());
iniFile.endGroup ();
settingsDirty = false;
}
-void FilterControls::removeAll() {
- translationFunctionConfig.removeAllPoints();
- functionConfig.removeAllPoints();
-}
-
-void FilterControls::resetCircle()
-{
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
- QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();
- QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
- iniFile.beginGroup ( "Accela" );
- iniFile.setValue("preset-rotation", ui.rotationCircle->value());
- iniFile.setValue("preset-translation", ui.translationCircle->value());
- iniFile.endGroup();
-
- // essentially unit circles elongated on the X axis
- double elongations[] = {
- ui.rotationCircle->value(), ui.translationCircle->value()
- };
-
- FunctionConfig* configs[] = {
- &functionConfig, &translationFunctionConfig
- };
-
- QFunctionConfigurator* widgets[] = {
- ui.scalingConfig, ui.translationScalingConfig
- };
-
- for (int i = 0; i < 2; i++)
- {
- FunctionConfig& cfg = *configs[i];
- double sz = elongations[i];
-
- cfg.removeAllPoints();
-
- for (double x = 0; x <= sz+1e-2; x += 1e-1)
- {
- double sq = sz*sz-x*x;
- double val;
- if (sq <= 1e-4)
- val = 0;
- else
- val = std::min<double>(sqrt(sq), sz);
-
- cfg.addPoint(QPointF(x, 10*(sz-val)/sz));
- }
-
- cfg.saveSettings(iniFile);
-
- widgets[i]->setConfig(&cfg, currentFile);
- }
-
- settingsDirty = false;
-}
-
//
// Save the current Settings to the currently 'active' INI-file.
//
@@ -225,13 +156,11 @@ void FilterControls::save() { qDebug() << "FTNoIR_Filter::save() says: iniFile = " << currentFile;
iniFile.beginGroup ( "Accela" );
- iniFile.setValue ( "Reduction", ui.slideReduction->value() );
iniFile.setValue("zoom-slowness", ui.slideZoom->value());
+ iniFile.setValue("rotation-alpha", ui.rotation_alpha->value());
+ iniFile.setValue("translation-alpha", ui.translation_alpha->value());
iniFile.endGroup ();
- functionConfig.saveSettings(iniFile);
- translationFunctionConfig.saveSettings(iniFile);
-
settingsDirty = false;
}
diff --git a/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp b/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp index 3ae273df..0235c067 100644 --- a/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp +++ b/ftnoir_filter_accela/ftnoir_filter_accela_dll.cpp @@ -22,16 +22,7 @@ * with this program; if not, see <http://www.gnu.org/licenses/>. *
* *
********************************************************************************/
-/*
- Modifications (last one on top):
- 20120830 - WVR: The Dialog class was used to get general info on the DLL. This
- had a big disadvantage: the complete dialog was loaded, just to get
- some data and then it was deleted again (without ever showing the dialog).
- The FilterDll class solves this.
- The functions to get the name(s) and icon were removed from the two other classes.
-*/
#include "ftnoir_filter_accela.h"
-#include <QDebug>
#include "facetracknoir/global-settings.h"
FTNoIR_FilterDll::FTNoIR_FilterDll() {
@@ -42,15 +33,6 @@ FTNoIR_FilterDll::~FTNoIR_FilterDll() }
-////////////////////////////////////////////////////////////////////////////////
-// Factory function that creates instances if the Filter object.
-
-// Export both decorated and undecorated names.
-// GetFilterDll - Undecorated name, which can be easily used with GetProcAddress
-// Win32 API function.
-// _GetFilterDll@0 - Common name decoration for __stdcall functions in C language.
-//#pragma comment(linker, "/export:GetFilterDll=_GetFilterDll@0")
-
extern "C" FTNOIR_FILTER_BASE_EXPORT Metadata* CALLING_CONVENTION GetMetadata()
{
return new FTNoIR_FilterDll;
|