From 9f6bc080c9b832d8a66637189d38db743585498c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 8 May 2015 17:45:21 -0700 Subject: [PATCH 1/5] Default face tracking to Use Camera for first-time users First time start up with face tracking enabled. --- interface/src/Menu.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 61213e7334..eff32b4eb0 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -368,8 +368,12 @@ Menu::Menu() { { QActionGroup* faceTrackerGroup = new QActionGroup(avatarDebugMenu); + bool defaultNoFaceTracking = true; +#ifdef HAVE_DDE + defaultNoFaceTracking = false; +#endif QAction* noFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::NoFaceTracking, - 0, true, + 0, defaultNoFaceTracking, qApp, SLOT(setActiveFaceTracker())); faceTrackerGroup->addAction(noFaceTracker); @@ -381,7 +385,7 @@ Menu::Menu() { #endif #ifdef HAVE_DDE QAction* ddeFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseCamera, - 0, false, + 0, true, qApp, SLOT(setActiveFaceTracker())); faceTrackerGroup->addAction(ddeFaceTracker); #endif @@ -389,17 +393,17 @@ Menu::Menu() { #ifdef HAVE_DDE faceTrackingMenu->addSeparator(); QAction* useAudioForMouth = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseAudioForMouth, 0, true); - useAudioForMouth->setVisible(false); + useAudioForMouth->setVisible(true); // DDE face tracking is on by default QAction* ddeFiltering = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::VelocityFilter, 0, true); - ddeFiltering->setVisible(false); + ddeFiltering->setVisible(true); // DDE face tracking is on by default QAction* ddeCalibrate = addActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::CalibrateCamera, 0, DependencyManager::get().data(), SLOT(calibrate())); - ddeCalibrate->setVisible(false); + ddeCalibrate->setVisible(true); // DDE face tracking is on by default #endif #if defined(HAVE_FACESHIFT) || defined(HAVE_DDE) faceTrackingMenu->addSeparator(); addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking, - Qt::CTRL | Qt::SHIFT | Qt::Key_F, false, + Qt::CTRL | Qt::SHIFT | Qt::Key_F, true, // DDE face tracking is on by default qApp, SLOT(toggleFaceTrackerMute())); #endif From b3b735032dc7f77a209e29be8fa35a1adf28bb4b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 8 May 2015 18:16:59 -0700 Subject: [PATCH 2/5] Automatically calibrate if Use Camera is enabled Do at start up or when Use Camera is first enabled per program run. --- interface/src/devices/DdeFaceTracker.cpp | 16 +++++++++++----- interface/src/devices/DdeFaceTracker.h | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index 6ed253c1ec..269e8ac11f 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -187,7 +187,8 @@ DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 serverPort, qui _calibrationCount(0), _calibrationBillboard(NULL), _calibrationBillboardID(0), - _calibrationMessage(QString()) + _calibrationMessage(QString()), + _isCalibrated(false) { _coefficients.resize(NUM_FACESHIFT_BLENDSHAPES); _blendshapeCoefficients.resize(NUM_FACESHIFT_BLENDSHAPES); @@ -344,6 +345,10 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) { _lastReceiveTimestamp = usecTimestampNow(); if (buffer.size() > MIN_PACKET_SIZE) { + if (!_isCalibrated) { + calibrate(); + } + bool isFiltering = Menu::getInstance()->isOptionChecked(MenuOption::VelocityFilter); Packet packet; @@ -544,13 +549,13 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) { } } -static const int CALIBRATION_BILLBOARD_WIDTH = 240; -static const int CALIBRATION_BILLBOARD_HEIGHT = 180; -static const int CALIBRATION_BILLBOARD_TOP_MARGIN = 60; +static const int CALIBRATION_BILLBOARD_WIDTH = 300; +static const int CALIBRATION_BILLBOARD_HEIGHT = 120; +static const int CALIBRATION_BILLBOARD_TOP_MARGIN = 30; static const int CALIBRATION_BILLBOARD_LEFT_MARGIN = 30; static const int CALIBRATION_BILLBOARD_FONT_SIZE = 16; static const float CALIBRATION_BILLBOARD_ALPHA = 0.5f; -static QString CALIBRATION_INSTRUCTION_MESSAGE = "Hold still to calibrate"; +static QString CALIBRATION_INSTRUCTION_MESSAGE = "Hold still to calibrate camera"; void DdeFaceTracker::calibrate() { if (!_isCalibrating) { @@ -609,6 +614,7 @@ void DdeFaceTracker::finishCalibration() { qApp->getOverlays().deleteOverlay(_calibrationBillboardID); _calibrationBillboard = NULL; _isCalibrating = false; + _isCalibrated = true; for (int i = 0; i < NUM_FACESHIFT_BLENDSHAPES; i++) { _coefficientAverages[i] = _calibrationValues[i] / (float)CALIBRATION_SAMPLES; diff --git a/interface/src/devices/DdeFaceTracker.h b/interface/src/devices/DdeFaceTracker.h index 7019802603..2ec362a9c6 100644 --- a/interface/src/devices/DdeFaceTracker.h +++ b/interface/src/devices/DdeFaceTracker.h @@ -131,6 +131,7 @@ private: TextOverlay* _calibrationBillboard; int _calibrationBillboardID; QString _calibrationMessage; + bool _isCalibrated; void addCalibrationDatum(); void cancelCalibration(); void finishCalibration(); From e26147fc947eb8c1be1f2430a8af676ee3d2a814 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 8 May 2015 18:17:59 -0700 Subject: [PATCH 3/5] Do a reset at the end of calibration --- interface/src/devices/DdeFaceTracker.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index 269e8ac11f..585012aad8 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -620,5 +620,7 @@ void DdeFaceTracker::finishCalibration() { _coefficientAverages[i] = _calibrationValues[i] / (float)CALIBRATION_SAMPLES; } + reset(); + qCDebug(interfaceapp) << "DDE Face Tracker: Calibration finished"; } From 15b8dc4144099111cdd7c91f3643598aea95fe8d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 8 May 2015 18:18:15 -0700 Subject: [PATCH 4/5] Don't start calibration if the camera is muted --- interface/src/devices/DdeFaceTracker.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index 585012aad8..b5a2d93125 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -558,6 +558,10 @@ static const float CALIBRATION_BILLBOARD_ALPHA = 0.5f; static QString CALIBRATION_INSTRUCTION_MESSAGE = "Hold still to calibrate camera"; void DdeFaceTracker::calibrate() { + if (!Menu::getInstance()->isOptionChecked(MenuOption::UseCamera) || _isMuted) { + return; + } + if (!_isCalibrating) { qCDebug(interfaceapp) << "DDE Face Tracker: Calibration started"; From 5092e385b10b0ab16d9cabe4eb64fde8bb8166ca Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 8 May 2015 18:39:22 -0700 Subject: [PATCH 5/5] Disable "calibrate" menu item if webcam isn't enabled --- interface/src/Application.cpp | 1 + interface/src/devices/DdeFaceTracker.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cc62490b64..bae191804b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -948,6 +948,7 @@ void Application::faceTrackerMuteToggled() { bool isMuted = getSelectedFaceTracker()->isMuted(); muteAction->setChecked(isMuted); getSelectedFaceTracker()->setEnabled(!isMuted); + Menu::getInstance()->getActionForOption(MenuOption::CalibrateCamera)->setEnabled(!isMuted); } void Application::aboutApp() { diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index b5a2d93125..2ff4509e89 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -219,6 +219,7 @@ DdeFaceTracker::~DdeFaceTracker() { void DdeFaceTracker::init() { FaceTracker::init(); setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::UseCamera) && !_isMuted); + Menu::getInstance()->getActionForOption(MenuOption::CalibrateCamera)->setEnabled(!_isMuted); } void DdeFaceTracker::setEnabled(bool enabled) {