From ed27638358c354858aa51b7d1a99126ea6644fb6 Mon Sep 17 00:00:00 2001 From: Wim Vriend Date: Fri, 19 Oct 2012 14:17:32 +0000 Subject: Added second headtracker logic. The other headtrackers will have to be adapted. git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@190 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb --- FTNoIR_Tracker_SM/FTNoIR_SM_Controls.ui | 272 ++++++++++++++++++++- FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h | 36 ++- FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp | 99 +++++++- .../ftnoir_tracker_faceapi_dialog.cpp | 122 ++++++++- FaceTrackNoIR/tracker.cpp | 108 ++++++-- FaceTrackNoIR/tracker.h | 3 + 6 files changed, 607 insertions(+), 33 deletions(-) diff --git a/FTNoIR_Tracker_SM/FTNoIR_SM_Controls.ui b/FTNoIR_Tracker_SM/FTNoIR_SM_Controls.ui index 2f699672..170a4a46 100644 --- a/FTNoIR_Tracker_SM/FTNoIR_SM_Controls.ui +++ b/FTNoIR_Tracker_SM/FTNoIR_SM_Controls.ui @@ -6,8 +6,8 @@ 0 0 - 406 - 160 + 383 + 344 @@ -92,6 +92,274 @@ + + + + + + Roll: + + + + + + + Pitch: + + + + + + + Yaw: + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + + + Enable Axis: + + + + + + + X: + + + + + + + Y: + + + + + + + Z: + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + Invert Axis: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + + + + 20 + 16777215 + + + + Qt::LeftToRight + + + + + + + + diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h index 5f3eb9b9..e62009f5 100644 --- a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h +++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h @@ -55,6 +55,21 @@ private: SMMemMap *pMemData; HANDLE hSMMutex; QProcess *faceAPI; + + int numTracker; + bool bEnableRoll; + bool bEnablePitch; + bool bEnableYaw; + bool bEnableX; + bool bEnableY; + bool bEnableZ; + + double dInvertRoll; + double dInvertPitch; + double dInvertYaw; + double dInvertX; + double dInvertY; + double dInvertZ; }; // Widget that has controls for SMoIR protocol client-settings. @@ -68,8 +83,12 @@ public: void showEvent ( QShowEvent * event ); void Initialize(QWidget *parent, int numTracker); - void registerTracker(ITracker *tracker) {}; - void unRegisterTracker() {}; + void registerTracker(ITracker *tracker) { + theTracker = (FTNoIR_Tracker *) tracker; // Accept the pointer to the Tracker + }; + void unRegisterTracker() { + theTracker = NULL; // Reset the pointer + }; private: Ui::UICSMClientControls ui; @@ -92,6 +111,16 @@ private: smEngineHandle *engine_handle; QTimer *timUpdateSettings; // Timer to display current settings + FTNoIR_Tracker *theTracker; + int numTracker; // Primary (1) or secondary tracker (2) + + int numRoll; // Number of Tracker (1 or 2) which tracks this axis + int numPitch; + int numYaw; + int numX; + int numY; + int numZ; + private slots: void doOK(); void doCancel(); @@ -110,6 +139,9 @@ private slots: void doSetFilter(int value){ doCommand(FT_SM_SET_PAR_FILTER, value); } + void settingChanged(int dummy) { + settingsDirty = true; + }; signals: void stateChanged(int newState); diff --git a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp index b04c856b..23b973cb 100644 --- a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp +++ b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp @@ -36,13 +36,28 @@ FTNoIR_Tracker::~FTNoIR_Tracker() if ( pMemData != NULL ) { UnmapViewOfFile ( pMemData ); } + + numTracker = 1; + bEnableRoll = true; + bEnablePitch = true; + bEnableYaw = true; + bEnableX = true; + bEnableY = true; + bEnableZ = true; + + dInvertRoll = 1.0f; + dInvertPitch = 1.0f; + dInvertYaw = 1.0f; + dInvertX = 1.0f; + dInvertY = 1.0f; + dInvertZ = 1.0f; CloseHandle( hSMMutex ); CloseHandle( hSMMemMap ); hSMMemMap = 0; } -void FTNoIR_Tracker::Initialize( QFrame *videoframe, int numTracker ) +void FTNoIR_Tracker::Initialize( QFrame *videoframe, int num) { qDebug() << "FTNoIR_Tracker::Initialize says: Starting "; @@ -53,11 +68,17 @@ void FTNoIR_Tracker::Initialize( QFrame *videoframe, int numTracker ) QMessageBox::warning(0,"FaceTrackNoIR Error","Memory mapping not created!",QMessageBox::Ok,QMessageBox::NoButton); } + numTracker = num; loadSettings(); if ( pMemData != NULL ) { - pMemData->command = 0; // Reset any and all commands - pMemData->handle = videoframe->winId(); // Handle of Videoframe widget + pMemData->command = 0; // Reset any and all commands + if (videoframe != NULL) { + pMemData->handle = videoframe->winId(); // Handle of Videoframe widget + } + else { + pMemData->handle = NULL; // reset Handle of Videoframe widget + } } // @@ -70,7 +91,9 @@ void FTNoIR_Tracker::Initialize( QFrame *videoframe, int numTracker ) // Show the video widget qDebug() << "FTNoIR_Tracker::Initialize says: videoframe = " << videoframe; - videoframe->show(); + if (videoframe != NULL) { + videoframe->show(); + } return; } @@ -110,12 +133,24 @@ bool FTNoIR_Tracker::GiveHeadPoseData(THeadPoseData *data) // // Copy the measurements to FaceTrackNoIR. // - data->x = pMemData->data.new_pose.head_pos.x * 100.0f; // From meters to centimeters - data->y = pMemData->data.new_pose.head_pos.y * 100.0f; - data->z = pMemData->data.new_pose.head_pos.z * 100.0f; - data->yaw = pMemData->data.new_pose.head_rot.y_rads * 57.295781f; // From rads to degrees - data->pitch = pMemData->data.new_pose.head_rot.x_rads * 57.295781f; - data->roll = pMemData->data.new_pose.head_rot.z_rads * 57.295781f; + if (bEnableX) { + data->x = dInvertX * pMemData->data.new_pose.head_pos.x * 100.0f; // From meters to centimeters + } + if (bEnableY) { + data->y = dInvertY * pMemData->data.new_pose.head_pos.y * 100.0f; + } + if (bEnableZ) { + data->z = dInvertZ * pMemData->data.new_pose.head_pos.z * 100.0f; + } + if (bEnableYaw) { + data->yaw = dInvertYaw * pMemData->data.new_pose.head_rot.y_rads * 57.295781f; // From rads to degrees + } + if (bEnablePitch) { + data->pitch = dInvertPitch * pMemData->data.new_pose.head_rot.x_rads * 57.295781f; + } + if (bEnableRoll) { + data->roll = dInvertRoll * pMemData->data.new_pose.head_rot.z_rads * 57.295781f; + } // // Reset the handshake, to let faceAPI know we're still here! @@ -132,6 +167,12 @@ bool FTNoIR_Tracker::GiveHeadPoseData(THeadPoseData *data) // Load the current Settings from the currently 'active' INI-file. // void FTNoIR_Tracker::loadSettings() { +int numRoll; // Number of Tracker (1 or 2) which tracks this axis +int numPitch; +int numYaw; +int numX; +int numY; +int numZ; qDebug() << "FTNoIR_Tracker::loadSettings says: Starting "; QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) @@ -145,7 +186,45 @@ void FTNoIR_Tracker::loadSettings() { if (pMemData) { pMemData->initial_filter_level = iniFile.value ( "FilterLevel", 1 ).toInt(); } + dInvertRoll = (iniFile.value ( "InvertRoll", 0 ).toBool()) ? -1.0f : 1.0f; + dInvertPitch = (iniFile.value ( "InvertPitch", 0 ).toBool()) ? -1.0f : 1.0f; + dInvertYaw = (iniFile.value ( "InvertYaw", 0 ).toBool()) ? -1.0f : 1.0f; + dInvertX = (iniFile.value ( "InvertX", 0 ).toBool()) ? -1.0f : 1.0f; + dInvertY = (iniFile.value ( "InvertY", 0 ).toBool()) ? -1.0f : 1.0f; + dInvertZ = (iniFile.value ( "InvertZ", 0 ).toBool()) ? -1.0f : 1.0f; + + iniFile.endGroup (); + + iniFile.beginGroup ( "HeadTracker" ); + // + // Check if the Tracker is the Primary one. + // If the property is not found in the INI-file, set the value. + // + if (numTracker == 1) { + numRoll = iniFile.value ( "RollTracker", 1 ).toInt(); + numPitch = iniFile.value ( "PitchTracker", 1 ).toInt(); + numYaw = iniFile.value ( "YawTracker", 1 ).toInt(); + numX = iniFile.value ( "XTracker", 0 ).toInt(); + numY = iniFile.value ( "YTracker", 0 ).toInt(); + numZ = iniFile.value ( "ZTracker", 0 ).toInt(); + } + else { + numRoll = iniFile.value ( "RollTracker", 0 ).toInt(); + numPitch = iniFile.value ( "PitchTracker", 0 ).toInt(); + numYaw = iniFile.value ( "YawTracker", 0 ).toInt(); + numX = iniFile.value ( "XTracker", 0 ).toInt(); + numY = iniFile.value ( "YTracker", 0 ).toInt(); + numZ = iniFile.value ( "ZTracker", 0 ).toInt(); + } + bEnableRoll = (numRoll == numTracker); + bEnablePitch = (numPitch == numTracker); + bEnableYaw = (numYaw == numTracker); + bEnableX = (numX == numTracker); + bEnableY = (numY == numTracker); + bEnableZ = (numZ == numTracker); + iniFile.endGroup (); + } // diff --git a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi_dialog.cpp b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi_dialog.cpp index e04af2f7..f9d1047f 100644 --- a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi_dialog.cpp +++ b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi_dialog.cpp @@ -37,6 +37,8 @@ QWidget() { ui.setupUi( this ); + theTracker = NULL; + // Connect Qt signals to member-functions connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); @@ -56,15 +58,26 @@ QWidget() QMessageBox::warning(0,"FaceTrackNoIR Error","Memory mapping not created!",QMessageBox::Ok,QMessageBox::NoButton); } - // Load the settings from the current .INI-file - loadSettings(); - //Setup the timer for showing the headpose. timUpdateSettings = new QTimer(this); connect(timUpdateSettings, SIGNAL(timeout()), this, SLOT(doTimUpdate())); timUpdateSettings->start(100); connect(this, SIGNAL(stateChanged( int )), this, SLOT(showSettings( int ))); + connect(ui.chkInvertRoll, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkInvertPitch, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkInvertYaw, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkInvertX, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkInvertY, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkInvertZ, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + + connect(ui.chkEnableRoll, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkEnablePitch, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkEnableYaw, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkEnableX, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkEnableY, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + connect(ui.chkEnableZ, SIGNAL(stateChanged(int)), this, SLOT(settingChanged(int))); + } // @@ -77,12 +90,17 @@ TrackerControls::~TrackerControls() { // // Initialize tracker-client-dialog // -void TrackerControls::Initialize(QWidget *parent, int numTracker) { +void TrackerControls::Initialize(QWidget *parent, int num) { QPoint offsetpos(200, 200); if (parent) { this->move(parent->pos() + offsetpos); } + + // Load the settings from the current .INI-file + numTracker = num; + loadSettings(); + show(); } @@ -147,6 +165,42 @@ void TrackerControls::loadSettings() { iniFile.beginGroup ( "SMTracker" ); ui.cbxFilterSetting->setCurrentIndex(iniFile.value ( "FilterLevel", 1 ).toInt()); + ui.chkInvertRoll->setChecked(iniFile.value ( "InvertRoll", 0 ).toBool()); + ui.chkInvertPitch->setChecked(iniFile.value ( "InvertPitch", 0 ).toBool()); + ui.chkInvertYaw->setChecked(iniFile.value ( "InvertYaw", 0 ).toBool()); + ui.chkInvertX->setChecked(iniFile.value ( "InvertX", 0 ).toBool()); + ui.chkInvertY->setChecked(iniFile.value ( "InvertY", 0 ).toBool()); + ui.chkInvertZ->setChecked(iniFile.value ( "InvertZ", 0 ).toBool()); + + iniFile.endGroup (); + + iniFile.beginGroup ( "HeadTracker" ); + // + // Check if the Tracker is the Primary one. + // If the property is not found in the INI-file, set the value. + // + if (numTracker == 1) { + numRoll = iniFile.value ( "RollTracker", 1 ).toInt(); + numPitch = iniFile.value ( "PitchTracker", 1 ).toInt(); + numYaw = iniFile.value ( "YawTracker", 1 ).toInt(); + numX = iniFile.value ( "XTracker", 0 ).toInt(); + numY = iniFile.value ( "YTracker", 0 ).toInt(); + numZ = iniFile.value ( "ZTracker", 0 ).toInt(); + } + else { + numRoll = iniFile.value ( "RollTracker", 0 ).toInt(); + numPitch = iniFile.value ( "PitchTracker", 0 ).toInt(); + numYaw = iniFile.value ( "YawTracker", 0 ).toInt(); + numX = iniFile.value ( "XTracker", 0 ).toInt(); + numY = iniFile.value ( "YTracker", 0 ).toInt(); + numZ = iniFile.value ( "ZTracker", 0 ).toInt(); + } + ui.chkEnableRoll->setChecked(numRoll == numTracker); + ui.chkEnablePitch->setChecked(numPitch == numTracker); + ui.chkEnableYaw->setChecked(numYaw == numTracker); + ui.chkEnableX->setChecked(numX == numTracker); + ui.chkEnableY->setChecked(numY == numTracker); + ui.chkEnableZ->setChecked(numZ == numTracker); iniFile.endGroup (); settingsDirty = false; @@ -164,6 +218,66 @@ void TrackerControls::save() { iniFile.beginGroup ( "SMTracker" ); iniFile.setValue ( "FilterLevel", ui.cbxFilterSetting->currentIndex() ); + iniFile.setValue ( "InvertRoll", ui.chkInvertRoll->isChecked() ); + iniFile.setValue ( "InvertPitch", ui.chkInvertPitch->isChecked() ); + iniFile.setValue ( "InvertYaw", ui.chkInvertYaw->isChecked() ); + iniFile.setValue ( "InvertX", ui.chkInvertX->isChecked() ); + iniFile.setValue ( "InvertY", ui.chkInvertY->isChecked() ); + iniFile.setValue ( "InvertZ", ui.chkInvertZ->isChecked() ); + iniFile.endGroup (); + + iniFile.beginGroup ( "HeadTracker" ); + if ( ui.chkEnableRoll->isChecked() ) { + iniFile.setValue ( "RollTracker", numTracker ); + } + else { + if (numRoll == numTracker) { + iniFile.setValue ( "RollTracker", 0 ); + } + } + + if ( ui.chkEnablePitch->isChecked() ) { + iniFile.setValue ( "PitchTracker", numTracker ); + } + else { + if (numPitch == numTracker) { + iniFile.setValue ( "PitchTracker", 0 ); + } + } + + if ( ui.chkEnableYaw->isChecked() ) { + iniFile.setValue ( "YawTracker", numTracker ); + } + else { + if (numYaw == numTracker) { + iniFile.setValue ( "YawTracker", 0 ); + } + } + if ( ui.chkEnableX->isChecked() ) { + iniFile.setValue ( "XTracker", numTracker ); + } + else { + if (numX == numTracker) { + iniFile.setValue ( "XTracker", 0 ); + } + } + if ( ui.chkEnableY->isChecked() ) { + iniFile.setValue ( "YTracker", numTracker ); + } + else { + if (numY == numTracker) { + iniFile.setValue ( "YTracker", 0 ); + } + } + if ( ui.chkEnableZ->isChecked() ) { + iniFile.setValue ( "ZTracker", numTracker ); + } + else { + if (numZ == numTracker) { + iniFile.setValue ( "ZTracker", 0 ); + } + } + iniFile.endGroup (); settingsDirty = false; diff --git a/FaceTrackNoIR/tracker.cpp b/FaceTrackNoIR/tracker.cpp index 80080df7..4e9608fd 100644 --- a/FaceTrackNoIR/tracker.cpp +++ b/FaceTrackNoIR/tracker.cpp @@ -176,7 +176,29 @@ QFrame *video_frame; } } else { - QMessageBox::warning(0,"FaceTrackNoIR Error", "Facetracker DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton); + QMessageBox::warning(0,"FaceTrackNoIR Error", libName + " DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton); + } + } + // + // Load the Tracker-engine DLL, get the tracker-class from it and do stuff... + // + pSecondTracker = NULL; + libName = mainApp->getSecondTrackerName(); + if (!libName.isEmpty()) { + trackerLib = new QLibrary(libName); + getIT = (importGetTracker) trackerLib->resolve("GetTracker"); + + if (getIT) { + ITracker *ptrXyz(getIT()); // Get the Class + if (ptrXyz) + { + pSecondTracker = ptrXyz; + pSecondTracker->Initialize( NULL, 2 ); + qDebug() << "Tracker::setup Function Resolved!"; + } + } + else { + QMessageBox::warning(0,"FaceTrackNoIR Error", libName + " DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton); } } @@ -233,11 +255,12 @@ QFrame *video_frame; /** destructor empty **/ Tracker::~Tracker() { - // Stop the Tracker + // Stop the Tracker(s) if (pTracker) { - qDebug() << "Tracker::~Tracker Calling pTracker->StopTracker()..."; pTracker->StopTracker( true ); - qDebug() << "Tracker::~Tracker After Calling pTracker->StopTracker()..."; + } + if (pSecondTracker) { + pSecondTracker->StopTracker( true ); } // Trigger thread to stop @@ -255,6 +278,10 @@ Tracker::~Tracker() { delete pTracker; pTracker = NULL; } + if (pSecondTracker) { + delete pSecondTracker; + pSecondTracker = NULL; + } // Close handles ::CloseHandle(m_StopThread); @@ -277,7 +304,12 @@ void Tracker::setup() { bool DLL_Ok; // retrieve pointers to the User Interface and the main Application - pTracker->StartTracker( mainApp->winId() ); + if (pTracker) { + pTracker->StartTracker( mainApp->winId() ); + } + if (pSecondTracker) { + pSecondTracker->StartTracker( mainApp->winId() ); + } // // Check if the Protocol-server files were installed OK. @@ -331,8 +363,13 @@ T6DOF offset_camera(0,0,0,0,0,0); T6DOF gamezero_camera(0,0,0,0,0,0); T6DOF gameoutput_camera(0,0,0,0,0,0); +bool bInitialCenter = true; +bool bTracker1Confid = false; +bool bTracker2Confid = false; + Tracker::do_tracking = true; // Start initially - Tracker::do_center = true; // Center initially + Tracker::do_center = false; // Center initially + bInitialCenter = true; // // Test some Filter-stuff @@ -420,11 +457,21 @@ T6DOF gameoutput_camera(0,0,0,0,0,0); // if (Tracker::do_tracking) { Tracker::confid = false; - pTracker->StartTracker( mainApp->winId() ); + if (pTracker) { + pTracker->StartTracker( mainApp->winId() ); + } + if (pSecondTracker) { + pSecondTracker->StartTracker( mainApp->winId() ); + } } else { if (setEngineStop) { // Only stop engine when option is checked - pTracker->StopTracker( false ); + if (pTracker) { + pTracker->StopTracker( false ); + } + if (pSecondTracker) { + pSecondTracker->StopTracker( false ); + } } } qDebug() << "Tracker::run() says StartStop pressed, do_tracking =" << Tracker::do_tracking; @@ -491,11 +538,21 @@ T6DOF gameoutput_camera(0,0,0,0,0,0); // if (Tracker::do_tracking) { Tracker::confid = false; - pTracker->StartTracker( mainApp->winId() ); + if (pTracker) { + pTracker->StartTracker( mainApp->winId() ); + } + if (pSecondTracker) { + pSecondTracker->StartTracker( mainApp->winId() ); + } } else { if (setEngineStop) { // Only stop engine when option is checked - pTracker->StopTracker( false ); + if (pTracker) { + pTracker->StopTracker( false ); + } + if (pSecondTracker) { + pSecondTracker->StopTracker( false ); + } } } qDebug() << "Tracker::run() says StartStop pressed, do_tracking =" << Tracker::do_tracking; @@ -559,7 +616,20 @@ T6DOF gameoutput_camera(0,0,0,0,0,0); newpose.y = 0.0f; newpose.z = 0.0f; - Tracker::confid = pTracker->GiveHeadPoseData(&newpose); + if (pTracker) { + bTracker1Confid = pTracker->GiveHeadPoseData(&newpose); + } + else { + bTracker1Confid = true; + } + if (pSecondTracker) { + bTracker2Confid = pSecondTracker->GiveHeadPoseData(&newpose); + } + else { + bTracker2Confid = true; + } + + Tracker::confid = (bTracker1Confid && bTracker2Confid); if ( Tracker::confid ) { addHeadPose(newpose); } @@ -567,10 +637,15 @@ T6DOF gameoutput_camera(0,0,0,0,0,0); // // If Center is pressed, copy the current values to the offsets. // - if (Tracker::do_center) { + if ((Tracker::do_center) || ((bInitialCenter) && (Tracker::confid))) { MessageBeep (MB_ICONASTERISK); - pTracker->notifyCenter(); // Send 'center' to the tracker + if (pTracker) { + pTracker->notifyCenter(); // Send 'center' to the tracker + } + if (pSecondTracker) { + pSecondTracker->notifyCenter(); // Send 'center' to the tracker + } // // Only copy valid values @@ -583,6 +658,7 @@ T6DOF gameoutput_camera(0,0,0,0,0,0); offset_camera.pitch = getSmoothFromList( &Pitch.rawList ); offset_camera.yaw = getSmoothFromList( &Yaw.rawList ); offset_camera.roll = getSmoothFromList( &Roll.rawList ); + bInitialCenter = false; } Tracker::do_center = false; @@ -593,8 +669,10 @@ T6DOF gameoutput_camera(0,0,0,0,0,0); // Change requested by Stanislaw // if (Tracker::confid && Tracker::do_game_zero) { - if (!pTracker->notifyZeroed()) - gamezero_camera = gameoutput_camera; + if (pTracker) { + if (!pTracker->notifyZeroed()) + gamezero_camera = gameoutput_camera; + } // gamezero_camera = gameoutput_camera; Tracker::do_game_zero = false; diff --git a/FaceTrackNoIR/tracker.h b/FaceTrackNoIR/tracker.h index 03d517c6..6a51758b 100644 --- a/FaceTrackNoIR/tracker.h +++ b/FaceTrackNoIR/tracker.h @@ -261,6 +261,9 @@ public: if (pTracker) { pTracker->refreshVideo(); } + if (pSecondTracker) { + pSecondTracker->refreshVideo(); + } }; static float getSmoothFromList ( QList *rawList ); -- cgit v1.2.3