summaryrefslogtreecommitdiffhomepage
path: root/facetracknoir/facetracknoir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'facetracknoir/facetracknoir.cpp')
-rw-r--r--facetracknoir/facetracknoir.cpp190
1 files changed, 13 insertions, 177 deletions
diff --git a/facetracknoir/facetracknoir.cpp b/facetracknoir/facetracknoir.cpp
index c8e2fae5..8028d0ca 100644
--- a/facetracknoir/facetracknoir.cpp
+++ b/facetracknoir/facetracknoir.cpp
@@ -87,9 +87,6 @@ static void fill_combobox(const QString& filter, QList<DynamicLibrary*>& list, Q
}
}
-//
-// Setup the Main Dialog
-//
FaceTrackNoIR::FaceTrackNoIR(QWidget *parent, Qt::WindowFlags flags) :
__opentrack_version__(OPENTRACK_VERSION),
QMainWindow(parent, flags),
@@ -110,22 +107,13 @@ FaceTrackNoIR::FaceTrackNoIR(QWidget *parent, Qt::WindowFlags flags) :
ui.setupUi(this);
setFixedSize(size());
- //
- // Initialize Widget handles, to prevent memory-access errors.
- //
_keyboard_shortcuts = 0;
_curve_config = 0;
tracker = 0;
- // this is needed for Wine plugin subprocess
QDir::setCurrent(QCoreApplication::applicationDirPath());
- // if we simply place a global variable with THeadPoseData,
- // it gets initialized and pulls in QSettings before
- // main() starts. program can and will crash.
-
- // menu objects will be connected with the functions in FaceTrackNoIR class
connect(ui.btnLoad, SIGNAL(clicked()), this, SLOT(open()));
connect(ui.btnSave, SIGNAL(clicked()), this, SLOT(save()));
connect(ui.btnSaveAs, SIGNAL(clicked()), this, SLOT(saveAs()));
@@ -137,7 +125,6 @@ FaceTrackNoIR::FaceTrackNoIR(QWidget *parent, Qt::WindowFlags flags) :
connect(ui.btnShowServerControls, SIGNAL(clicked()), this, SLOT(showServerControls()));
connect(ui.btnShowFilterControls, SIGNAL(clicked()), this, SLOT(showFilterControls()));
- // Connect checkboxes
connect(ui.chkInvertYaw, SIGNAL(stateChanged(int)), this, SLOT(setInvertYaw(int)));
connect(ui.chkInvertRoll, SIGNAL(stateChanged(int)), this, SLOT(setInvertRoll(int)));
connect(ui.chkInvertPitch, SIGNAL(stateChanged(int)), this, SLOT(setInvertPitch(int)));
@@ -145,11 +132,9 @@ FaceTrackNoIR::FaceTrackNoIR(QWidget *parent, Qt::WindowFlags flags) :
connect(ui.chkInvertY, SIGNAL(stateChanged(int)), this, SLOT(setInvertY(int)));
connect(ui.chkInvertZ, SIGNAL(stateChanged(int)), this, SLOT(setInvertZ(int)));
- // button methods connect with methods in this class
connect(ui.btnStartTracker, SIGNAL(clicked()), this, SLOT(startTracker()));
connect(ui.btnStopTracker, SIGNAL(clicked()), this, SLOT(stopTracker()));
- //read the camera-name, using DirectShow
GetCameraNameDX();
ui.cbxSecondTrackerSource->addItem(QIcon(), "None");
@@ -161,15 +146,10 @@ FaceTrackNoIR::FaceTrackNoIR(QWidget *parent, Qt::WindowFlags flags) :
fill_combobox("opentrack-filter-*.", dlopen_filters, ui.iconcomboFilter, NULL);
connect(ui.iconcomboProfile, SIGNAL(currentIndexChanged(int)), this, SLOT(profileSelected(int)));
-
- //Setup the timer for showing the headpose.
connect(&timUpdateHeadPose, SIGNAL(timeout()), this, SLOT(showHeadPose()));
- //Load the tracker-settings, from the INI-file
loadSettings();
- //Q_INIT_RESOURCE(PoseWidget);
-
#ifndef _WIN32
connect(&keyCenter, SIGNAL(activated()), this, SLOT(shortcutRecentered()));
connect(&keyToggle, SIGNAL(activated()), this, SLOT(shortcutToggled()));
@@ -179,27 +159,18 @@ FaceTrackNoIR::FaceTrackNoIR(QWidget *parent, Qt::WindowFlags flags) :
kbd_quit.setEnabled(true);
}
-/** destructor stops the engine and quits the faceapi **/
FaceTrackNoIR::~FaceTrackNoIR() {
- //
- // Stop the tracker, by simulating a button-push
- //
stopTracker();
save();
if (Libraries)
delete Libraries;
}
-//
-// Get a pointer to the video-widget, to use in the DLL
-//
QFrame* FaceTrackNoIR::get_video_widget() {
return ui.video_frame;
}
-/** read the name of the first video-capturing device at start up **/
-/** FaceAPI can only use this first one... **/
void FaceTrackNoIR::GetCameraNameDX() {
#if defined(_WIN32)
ui.cameraName->setText("No video-capturing device was found in your system: check if it's connected!");
@@ -223,32 +194,23 @@ void FaceTrackNoIR::GetCameraNameDX() {
if (hr == S_OK) {
qDebug() << "GetWDM says: CreateClassEnumerator succeeded!";
- // Enumerate the monikers.
IMoniker *pMoniker = NULL;
ULONG cFetched;
if (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) {
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
if (SUCCEEDED(hr)) {
- // To retrieve the filter's friendly name, do the following:
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
- // Display the name in your UI somehow.
QString str((QChar*)varName.bstrVal, wcslen(varName.bstrVal));
qDebug() << "GetWDM says: Moniker found:" << str;
ui.cameraName->setText(str);
}
VariantClear(&varName);
- ////// To create an instance of the filter, do the following:
- ////IBaseFilter *pFilter;
- ////hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
- //// (void**)&pFilter);
- // Now add the filter to the graph.
- //Remember to release pFilter later.
pPropBag->Release();
}
pMoniker->Release();
@@ -268,10 +230,6 @@ void FaceTrackNoIR::GetCameraNameDX() {
#endif
}
-//
-// Open an INI-file with the QFileDialog
-// If succesfull, the settings in it will be read
-//
void FaceTrackNoIR::open() {
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::ExistingFile);
@@ -283,26 +241,20 @@ void FaceTrackNoIR::open() {
tr("Settings file (*.ini);;All Files (*)"),
NULL);
- //
- // If a file was selected, save it's name and read it's contents.
- //
if (! fileName.isEmpty() ) {
{
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
+ QSettings settings("opentrack");
settings.setValue ("SettingsFile", QFileInfo(fileName).absoluteFilePath());
}
loadSettings();
}
}
-//
-// Save the current Settings to the currently 'active' INI-file.
-//
void FaceTrackNoIR::save() {
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
+ QSettings settings("opentrack");
QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();
- QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+ QSettings iniFile( currentFile, QSettings::IniFormat );
iniFile.beginGroup ( "Tracking" );
iniFile.setValue ( "invertYaw", ui.chkInvertYaw->isChecked() );
@@ -331,9 +283,6 @@ void FaceTrackNoIR::save() {
}
iniFile.endGroup ();
- //
- // Save the name of the filter in the INI-file.
- //
iniFile.beginGroup ( "Filter" );
{
DynamicLibrary* filter = dlopen_filters.value( ui.iconcomboFilter->currentIndex(), (DynamicLibrary*) NULL);
@@ -352,89 +301,54 @@ void FaceTrackNoIR::save() {
#endif
}
-//
-// Get the new name of the INI-file and save the settings to it.
-//
-// The user may choose to overwrite an existing file. This will be deleted, before copying the current file to it.
-//
void FaceTrackNoIR::saveAs()
{
- //
- // Get the current filename of the INI-file.
- //
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
+ QSettings settings("opentrack");
QString oldFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();
- //
- // Get the new filename of the INI-file.
- //
QString fileName = QFileDialog::getSaveFileName(this, tr("Save file"),
oldFile,
// QCoreApplication::applicationDirPath() + "/settings",
tr("Settings file (*.ini);;All Files (*)"));
if (!fileName.isEmpty()) {
- //
- // Remove the file, if it already exists.
- //
QFileInfo newFileInfo ( fileName );
if ((newFileInfo.exists()) && (oldFile != fileName)) {
QFile newFileFile ( fileName );
newFileFile.remove();
}
- //
- // Copy the current INI-file to the new name.
- //
QFileInfo oldFileInfo ( oldFile );
if (oldFileInfo.exists()) {
QFile oldFileFile ( oldFile );
oldFileFile.copy( fileName );
}
- //
- // Write the new name to the Registry and save the other INI-values.
- //
settings.setValue ("SettingsFile", fileName);
save();
- //
- // Reload the settings, to get the GUI right again...
- //
loadSettings();
}
}
-//
-// Load the current Settings from the currently 'active' INI-file.
-//
void FaceTrackNoIR::loadSettings() {
looping = true;
qDebug() << "loadSettings says: Starting ";
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
+ QSettings settings("opentrack");
QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();
qDebug() << "Config file now" << currentFile;
- QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+ QSettings iniFile( currentFile, QSettings::IniFormat );
- //
- // Put the filename in the window-title.
- //
QFileInfo pathInfo ( currentFile );
setWindowTitle(QString( OPENTRACK_VERSION " :: ") + pathInfo.fileName());
- //
- // Get a List of all the INI-files in the (currently active) Settings-folder.
- //
QDir settingsDir( pathInfo.dir() );
QStringList filters;
filters << "*.ini";
iniFileList.clear();
iniFileList = settingsDir.entryList( filters, QDir::Files, QDir::Name );
- //
- // Add strings to the Listbox.
- //
ui.iconcomboProfile->clear();
for ( int i = 0; i < iniFileList.size(); i++) {
ui.iconcomboProfile->addItem(QIcon(":/images/settings16.png"), iniFileList.at(i));
@@ -455,16 +369,10 @@ void FaceTrackNoIR::loadSettings() {
ui.chkInvertZ->setChecked (iniFile.value ( "invertZ", 0 ).toBool());
iniFile.endGroup ();
- // Read the currently selected Protocol from the INI-file.
- // If the setting "DLL" isn't found (pre-1.7 version of INI), then the setting 'Selection' is evaluated.
- //
iniFile.beginGroup ( "GameProtocol" );
QString selectedProtocolName = iniFile.value ( "DLL", "" ).toString();
iniFile.endGroup ();
- //
- // Find the Index of the DLL and set the selection.
- //
for ( int i = 0; i < dlopen_protocols.size(); i++) {
if (dlopen_protocols.at(i)->filename.compare( selectedProtocolName, Qt::CaseInsensitive ) == 0) {
ui.iconcomboProtocol->setCurrentIndex( i );
@@ -472,10 +380,6 @@ void FaceTrackNoIR::loadSettings() {
}
}
- //
- // Read the currently selected Tracker from the INI-file.
- // If the setting "DLL" isn't found (pre-1.7 version), then the setting 'Selection' is evaluated.
- //
iniFile.beginGroup ( "TrackerSource" );
QString selectedTrackerName = iniFile.value ( "DLL", "" ).toString();
qDebug() << "loadSettings says: selectedTrackerName = " << selectedTrackerName;
@@ -493,17 +397,11 @@ void FaceTrackNoIR::loadSettings() {
}
}
- //
- // Read the currently selected Filter from the INI-file.
- //
iniFile.beginGroup ( "Filter" );
QString selectedFilterName = iniFile.value ( "DLL", "" ).toString();
qDebug() << "createIconGroupBox says: selectedFilterName = " << selectedFilterName;
iniFile.endGroup ();
- //
- // Find the Index of the DLL and set the selection.
- //
for ( int i = 0; i < dlopen_filters.size(); i++) {
DynamicLibrary* foo = dlopen_filters.at(i);
if (foo && foo->filename.compare( selectedFilterName, Qt::CaseInsensitive ) == 0) {
@@ -522,23 +420,15 @@ void FaceTrackNoIR::loadSettings() {
looping = false;
}
-/** start tracking the face **/
void FaceTrackNoIR::startTracker( ) {
bindKeyboardShortcuts();
- //
- // Disable buttons
- //
ui.iconcomboProfile->setEnabled ( false );
ui.btnLoad->setEnabled ( false );
ui.btnSave->setEnabled ( false );
ui.btnSaveAs->setEnabled ( false );
ui.btnShowFilterControls->setEnabled ( true );
- //
- // Create the Tracker and setup
- //
-
if (Libraries)
delete Libraries;
Libraries = new SelectedLibraries(this);
@@ -560,9 +450,9 @@ void FaceTrackNoIR::startTracker( ) {
delete tracker;
}
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
+ QSettings settings("opentrack");
QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();
- QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+ QSettings iniFile( currentFile, QSettings::IniFormat );
for (int i = 0; i < 6; i++)
{
@@ -599,10 +489,6 @@ void FaceTrackNoIR::startTracker( ) {
tracker = new Tracker ( this );
- //
- // Setup the Tracker and send the settings.
- // This is necessary, because the events are only triggered 'on change'
- //
tracker->setInvertAxis(Yaw, ui.chkInvertYaw->isChecked() );
tracker->setInvertAxis(Pitch, ui.chkInvertPitch->isChecked() );
tracker->setInvertAxis(Roll, ui.chkInvertRoll->isChecked() );
@@ -610,9 +496,6 @@ void FaceTrackNoIR::startTracker( ) {
tracker->setInvertAxis(TY, ui.chkInvertY->isChecked() );
tracker->setInvertAxis(TZ, ui.chkInvertZ->isChecked() );
- //
- // Register the Tracker instance with the Tracker Dialog (if open)
- //
if (pTrackerDialog && Libraries->pTracker) {
pTrackerDialog->registerTracker( Libraries->pTracker );
}
@@ -624,29 +507,20 @@ void FaceTrackNoIR::startTracker( ) {
ui.video_frame->show();
- //
ui.btnStartTracker->setEnabled ( false );
ui.btnStopTracker->setEnabled ( true );
- // Enable/disable Protocol-server Settings
ui.iconcomboTrackerSource->setEnabled ( false );
ui.cbxSecondTrackerSource->setEnabled ( false );
ui.iconcomboProtocol->setEnabled ( false );
ui.btnShowServerControls->setEnabled ( false );
ui.iconcomboFilter->setEnabled ( false );
- //
- // Update the camera-name, FaceAPI can only use the 1st one found!
- //
GetCameraNameDX();
- //
- // Start the timer to update the head-pose (digits and 'man in black')
- //
timUpdateHeadPose.start(50);
}
-/** stop tracking the face **/
void FaceTrackNoIR::stopTracker( ) {
ui.game_name->setText("Not connected");
#if defined(_WIN32)
@@ -658,14 +532,9 @@ void FaceTrackNoIR::stopTracker( ) {
keybindingWorker = NULL;
}
#endif
- //
- // Stop displaying the head-pose.
- //
timUpdateHeadPose.stop();
ui.pose_display->rotateBy(0, 0, 0);
- // UnRegister the Tracker instance with the Tracker Dialog (if open)
- //
if (pTrackerDialog) {
pTrackerDialog->unRegisterTracker();
}
@@ -675,9 +544,6 @@ void FaceTrackNoIR::stopTracker( ) {
if (pFilterDialog)
pFilterDialog->unregisterFilter();
- //
- // Delete the tracker (after stopping things and all).
- //
if ( tracker ) {
qDebug() << "Done with tracking";
tracker->should_quit = true;
@@ -694,17 +560,14 @@ void FaceTrackNoIR::stopTracker( ) {
}
ui.btnStartTracker->setEnabled ( true );
ui.btnStopTracker->setEnabled ( false );
-// ui.btnShowEngineControls->setEnabled ( false );
ui.iconcomboProtocol->setEnabled ( true );
ui.iconcomboTrackerSource->setEnabled ( true );
ui.cbxSecondTrackerSource->setEnabled ( true );
ui.iconcomboFilter->setEnabled ( true );
- // Enable/disable Protocol-server Settings
ui.btnShowServerControls->setEnabled ( true );
ui.video_frame->hide();
- //
ui.iconcomboProfile->setEnabled ( true );
ui.btnLoad->setEnabled ( true );
ui.btnSave->setEnabled ( true );
@@ -712,13 +575,11 @@ void FaceTrackNoIR::stopTracker( ) {
ui.btnShowFilterControls->setEnabled ( true );
}
-/** set the invert from the checkbox **/
void FaceTrackNoIR::setInvertAxis(Axis axis, int invert ) {
if (tracker)
tracker->setInvertAxis (axis, (invert != 0)?true:false );
}
-/** Show the headpose in the widget (triggered by timer) **/
void FaceTrackNoIR::showHeadPose() {
double newdata[6];
@@ -732,9 +593,6 @@ void FaceTrackNoIR::showHeadPose() {
ui.lcdNumRotY->display(newdata[Pitch]);
ui.lcdNumRotZ->display(newdata[Roll]);
- //
- // Get the output-pose and also display it.
- //
tracker->getOutputHeadPose(newdata);
ui.pose_display->rotateBy(newdata[Yaw], newdata[Roll], newdata[Pitch]);
@@ -778,7 +636,6 @@ void FaceTrackNoIR::showTrackerSettings() {
}
}
-// Show the Settings dialog for the secondary Tracker
void FaceTrackNoIR::showSecondTrackerSettings() {
if (pSecondTrackerDialog) {
delete pSecondTrackerDialog;
@@ -799,7 +656,6 @@ void FaceTrackNoIR::showSecondTrackerSettings() {
}
}
-/** toggles Server Controls Dialog **/
void FaceTrackNoIR::showServerControls() {
if (pProtocolDialog) {
delete pProtocolDialog;
@@ -818,7 +674,6 @@ void FaceTrackNoIR::showServerControls() {
}
}
-/** toggles Filter Controls Dialog **/
void FaceTrackNoIR::showFilterControls() {
if (pFilterDialog) {
delete pFilterDialog;
@@ -838,60 +693,41 @@ void FaceTrackNoIR::showFilterControls() {
}
}
}
-/** toggles Keyboard Shortcut Dialog **/
void FaceTrackNoIR::showKeyboardShortcuts() {
- // Create if new
if (!_keyboard_shortcuts)
{
_keyboard_shortcuts = new KeyboardShortcutDialog( this, this );
}
- // Show if already created
- if (_keyboard_shortcuts) {
- _keyboard_shortcuts->show();
- _keyboard_shortcuts->raise();
- }
+ _keyboard_shortcuts->show();
+ _keyboard_shortcuts->raise();
}
-
-/** toggles Curve Configuration Dialog **/
void FaceTrackNoIR::showCurveConfiguration() {
- // Create if new
if (!_curve_config)
{
_curve_config = new CurveConfigurationDialog( this, this );
}
- // Show if already created
if (_curve_config) {
_curve_config->show();
_curve_config->raise();
}
}
-/** exit application **/
void FaceTrackNoIR::exit() {
QCoreApplication::exit(0);
}
-//
-// Handle changes of the Profile selection
-//
void FaceTrackNoIR::profileSelected(int index)
{
if (looping)
return;
- //
- // Read the current INI-file setting, to get the folder in which it's located...
- //
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
+ QSettings settings("opentrack");
QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();
QFileInfo pathInfo ( currentFile );
- //
- // Save the name of the INI-file in the Registry.
- //
settings.setValue ("SettingsFile", pathInfo.absolutePath() + "/" + iniFileList.value(index, ""));
loadSettings();
}
@@ -937,10 +773,10 @@ static void bind_keyboard_shortcut(Key& key, const QString label, QSettings& ini
void FaceTrackNoIR::bindKeyboardShortcuts()
{
- QSettings settings("opentrack"); // Registry settings (in HK_USER)
+ QSettings settings("opentrack");
QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();
- QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+ QSettings iniFile( currentFile, QSettings::IniFormat );
iniFile.beginGroup ( "KB_Shortcuts" );
#if !defined(_WIN32)