From c446e72226ba71519b46b815b1a6e884218a6907 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 18 Feb 2015 12:39:51 -0800 Subject: [PATCH 1/7] Add Face Tracking menu item to select the face tracker to use Includes new DDE Face Regression option. --- interface/src/Application.cpp | 10 ++++++++++ interface/src/Application.h | 2 ++ interface/src/Menu.cpp | 34 ++++++++++++++++++++++++-------- interface/src/Menu.h | 10 ++++++---- interface/src/devices/Visage.cpp | 3 ++- 5 files changed, 46 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ce33b04777..4f771ccbf0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1601,6 +1601,16 @@ FaceTracker* Application::getActiveFaceTracker() { (visage->isActive() ? static_cast(visage.data()) : NULL))); } +void Application::setActiveFaceTracker() { +#ifdef HAVE_FACESHIFT + DependencyManager::get()->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); +#endif + DependencyManager::get()->setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::DDEFaceRegression)); +#ifdef HAVE_VISAGE + DependencyManager::get()->updateEnabled(); +#endif +} + bool Application::exportEntities(const QString& filename, float x, float y, float z, float scale) { QVector entities; _entities.getTree()->findEntities(AACube(glm::vec3(x / (float)TREE_SCALE, diff --git a/interface/src/Application.h b/interface/src/Application.h index da29920ef9..2db120aa27 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -366,6 +366,8 @@ public slots: void notifyPacketVersionMismatch(); + void setActiveFaceTracker(); + private slots: void clearDomainOctreeDetails(); void timer(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 46b6141ba9..1478a6d3d6 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -27,6 +27,7 @@ #include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" #include "avatar/AvatarManager.h" +#include "devices/DDEFaceTracker.h" #include "devices/Faceshift.h" #include "devices/RealSense.h" #include "devices/SixenseManager.h" @@ -357,18 +358,35 @@ Menu::Menu() { dialogsManager.data(), SLOT(lodTools())); QMenu* avatarDebugMenu = developerMenu->addMenu("Avatar"); + + QMenu* faceTrackingMenu = avatarDebugMenu->addMenu("Face Tracking"); + { + QActionGroup* faceTrackerGroup = new QActionGroup(avatarDebugMenu); + + QAction* noFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::NoFaceTracking, + 0, true, + qApp, SLOT(setActiveFaceTracker())); + faceTrackerGroup->addAction(noFaceTracker); + #ifdef HAVE_FACESHIFT - addCheckableActionToQMenuAndActionHash(avatarDebugMenu, - MenuOption::Faceshift, - 0, - true, - DependencyManager::get().data(), - SLOT(setTCPEnabled(bool))); + QAction* faceshiftFaceTracker = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::Faceshift, + 0, true, + qApp, SLOT(setActiveFaceTracker())); + faceTrackerGroup->addAction(faceshiftFaceTracker); #endif + + QAction* ddeFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::DDEFaceRegression, + 0, false, + qApp, SLOT(setActiveFaceTracker())); + faceTrackerGroup->addAction(ddeFaceTracker); + #ifdef HAVE_VISAGE - addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::Visage, 0, false, - DependencyManager::get().data(), SLOT(updateEnabled())); + QAction* visageFaceTracker = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::Visage, + 0, false, + qApp, SLOT(setActiveFaceTracker())); + faceTrackerGroup->addAction(visageFaceTracker); #endif + } addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSkeletonCollisionShapes); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderHeadCollisionShapes); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 19e51ad044..6dbc841a42 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -133,13 +133,12 @@ namespace MenuOption { const QString CollideWithEnvironment = "Collide With World Boundaries"; const QString Collisions = "Collisions"; const QString Console = "Console..."; + const QString ControlWithSpeech = "Control With Speech"; const QString CopyAddress = "Copy Address to Clipboard"; const QString CopyPath = "Copy Path to Clipboard"; - const QString ControlWithSpeech = "Control With Speech"; - const QString DeleteBookmark = "Delete Bookmark..."; - const QString DontRenderEntitiesAsScene = "Don't Render Entities as Scene"; - const QString DontDoPrecisionPicking = "Don't Do Precision Picking"; + const QString DDEFaceRegression = "DDE Face Regression"; const QString DecreaseAvatarSize = "Decrease Avatar Size"; + const QString DeleteBookmark = "Delete Bookmark..."; const QString DisableActivityLogger = "Disable Activity Logger"; const QString DisableAutoAdjustLOD = "Disable Automatically Adjusting LOD"; const QString DisableLightEntities = "Disable Light Entities"; @@ -152,7 +151,9 @@ namespace MenuOption { const QString DisplayModelElementChildProxies = "Display Model Element Children"; const QString DisplayModelElementProxy = "Display Model Element Bounds"; const QString DisplayTimingDetails = "Display Timing Details"; + const QString DontDoPrecisionPicking = "Don't Do Precision Picking"; const QString DontFadeOnOctreeServerChanges = "Don't Fade In/Out on Octree Server Changes"; + const QString DontRenderEntitiesAsScene = "Don't Render Entities as Scene"; const QString EchoLocalAudio = "Echo Local Audio"; const QString EchoServerAudio = "Echo Server Audio"; const QString EditEntitiesHelp = "Edit Entities Help..."; @@ -192,6 +193,7 @@ namespace MenuOption { const QString MuteEnvironment = "Mute Environment"; const QString NetworkSimulator = "Network Simulator..."; const QString NewVoxelCullingMode = "New Voxel Culling Mode"; + const QString NoFaceTracking = "None"; const QString ObeyEnvironmentalGravity = "Obey Environmental Gravity"; const QString OctreeStats = "Voxel and Entity Statistics"; const QString OffAxisProjection = "Off-Axis Projection"; diff --git a/interface/src/devices/Visage.cpp b/interface/src/devices/Visage.cpp index bdb33cc092..39bda83e61 100644 --- a/interface/src/devices/Visage.cpp +++ b/interface/src/devices/Visage.cpp @@ -174,7 +174,8 @@ void Visage::reset() { void Visage::updateEnabled() { setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Visage) && !(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift) && - DependencyManager::get()->isConnectedOrConnecting())); + DependencyManager::get()->isConnectedOrConnecting()) && + !Menu::getInstance()->isOptionChecked(MenuOption::DDEFaceRegression)); } void Visage::setEnabled(bool enabled) { From a66af77b23d843caf84799da3acc14da7c39161d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 18 Feb 2015 12:40:59 -0800 Subject: [PATCH 2/7] Update DDE face tracker to work with menu item --- interface/src/Application.cpp | 1 + interface/src/devices/DdeFaceTracker.cpp | 84 ++++++++++-------------- interface/src/devices/DdeFaceTracker.h | 11 ++-- 3 files changed, 41 insertions(+), 55 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4f771ccbf0..ac73920399 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1728,6 +1728,7 @@ void Application::init() { // initialize our face trackers after loading the menu settings DependencyManager::get()->init(); + DependencyManager::get()->init(); DependencyManager::get()->init(); Leapmotion::init(); diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index d8766ca0ab..c4797c4018 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -44,58 +44,40 @@ struct Packet{ }; DdeFaceTracker::DdeFaceTracker() : -_lastReceiveTimestamp(0), -_reset(false), -_leftBlinkIndex(0), // see http://support.faceshift.com/support/articles/35129-export-of-blendshapes -_rightBlinkIndex(1), -_leftEyeOpenIndex(8), -_rightEyeOpenIndex(9), -_browDownLeftIndex(14), -_browDownRightIndex(15), -_browUpCenterIndex(16), -_browUpLeftIndex(17), -_browUpRightIndex(18), -_mouthSmileLeftIndex(28), -_mouthSmileRightIndex(29), -_jawOpenIndex(21) + DdeFaceTracker(QHostAddress::Any, DDE_FEATURE_POINT_SERVER_PORT) +{ + +} + +DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 port) : + _lastReceiveTimestamp(0), + _reset(false), + _leftBlinkIndex(0), // see http://support.faceshift.com/support/articles/35129-export-of-blendshapes + _rightBlinkIndex(1), + _leftEyeOpenIndex(8), + _rightEyeOpenIndex(9), + _browDownLeftIndex(14), + _browDownRightIndex(15), + _browUpCenterIndex(16), + _browUpLeftIndex(17), + _browUpRightIndex(18), + _mouthSmileLeftIndex(28), + _mouthSmileRightIndex(29), + _jawOpenIndex(21), + _host(host), + _port(port) { _blendshapeCoefficients.resize(NUM_EXPRESSION); connect(&_udpSocket, SIGNAL(readyRead()), SLOT(readPendingDatagrams())); connect(&_udpSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketErrorOccurred(QAbstractSocket::SocketError))); connect(&_udpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SLOT(socketStateChanged(QAbstractSocket::SocketState))); - - bindTo(DDE_FEATURE_POINT_SERVER_PORT); -} - -DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 port) : -_lastReceiveTimestamp(0), -_reset(false), -_leftBlinkIndex(0), // see http://support.faceshift.com/support/articles/35129-export-of-blendshapes -_rightBlinkIndex(1), -_leftEyeOpenIndex(8), -_rightEyeOpenIndex(9), -_browDownLeftIndex(14), -_browDownRightIndex(15), -_browUpCenterIndex(16), -_browUpLeftIndex(17), -_browUpRightIndex(18), -_mouthSmileLeftIndex(28), -_mouthSmileRightIndex(29), -_jawOpenIndex(21) -{ - _blendshapeCoefficients.resize(NUM_EXPRESSION); - - connect(&_udpSocket, SIGNAL(readyRead()), SLOT(readPendingDatagrams())); - connect(&_udpSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketErrorOccurred(QAbstractSocket::SocketError))); - connect(&_udpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SIGNAL(socketStateChanged(QAbstractSocket::SocketState))); - - bindTo(host, port); } DdeFaceTracker::~DdeFaceTracker() { - if(_udpSocket.isOpen()) + if (_udpSocket.isOpen()) { _udpSocket.close(); + } } void DdeFaceTracker::init() { @@ -110,15 +92,15 @@ void DdeFaceTracker::update() { } -void DdeFaceTracker::bindTo(quint16 port) { - bindTo(QHostAddress::Any, port); -} - -void DdeFaceTracker::bindTo(const QHostAddress& host, quint16 port) { - if(_udpSocket.isOpen()) { +void DdeFaceTracker::setEnabled(bool enabled) { + if (enabled) { + if (_udpSocket.isOpen()) { + _udpSocket.close(); + } + _udpSocket.bind(_host, _port); + } else { _udpSocket.close(); } - _udpSocket.bind(host, port); } bool DdeFaceTracker::isActive() const { @@ -135,7 +117,7 @@ void DdeFaceTracker::socketStateChanged(QAbstractSocket::SocketState socketState QString state; switch(socketState) { case QAbstractSocket::BoundState: - state = "Bounded"; + state = "Bound"; break; case QAbstractSocket::ClosingState: state = "Closing"; @@ -156,7 +138,7 @@ void DdeFaceTracker::socketStateChanged(QAbstractSocket::SocketState socketState state = "Unconnected"; break; } - qDebug() << "[Info] DDE Face Tracker Socket: " << socketState; + qDebug() << "[Info] DDE Face Tracker Socket: " << state; } void DdeFaceTracker::readPendingDatagrams() { diff --git a/interface/src/devices/DdeFaceTracker.h b/interface/src/devices/DdeFaceTracker.h index 71a743cce0..bd5d066732 100644 --- a/interface/src/devices/DdeFaceTracker.h +++ b/interface/src/devices/DdeFaceTracker.h @@ -28,9 +28,6 @@ public: void reset(); void update(); - //sockets - void bindTo(quint16 port); - void bindTo(const QHostAddress& host, quint16 port); bool isActive() const; float getLeftBlink() const { return getBlendshapeCoefficient(_leftBlinkIndex); } @@ -47,7 +44,10 @@ public: float getMouthSize() const { return getBlendshapeCoefficient(_jawOpenIndex); } float getMouthSmileLeft() const { return getBlendshapeCoefficient(_mouthSmileLeftIndex); } float getMouthSmileRight() const { return getBlendshapeCoefficient(_mouthSmileRightIndex); } - + +public slots: + void setEnabled(bool enabled); + private slots: //sockets @@ -59,6 +59,9 @@ private: DdeFaceTracker(); DdeFaceTracker(const QHostAddress& host, quint16 port); ~DdeFaceTracker(); + + QHostAddress _host; + quint16 _port; float getBlendshapeCoefficient(int index) const; void decodePacket(const QByteArray& buffer); From d704af21acff0739d4b5537e127c5c31e3e897b9 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 18 Feb 2015 12:41:54 -0800 Subject: [PATCH 3/7] Generalize "faceshift" data handling to "facetracker" DDE face tracking data is now broadcast to other avatars. --- assignment-client/src/Agent.cpp | 2 +- interface/src/avatar/Head.cpp | 13 ++++--------- libraries/avatars/src/AvatarData.cpp | 14 +++++++------- libraries/avatars/src/AvatarData.h | 4 ++-- libraries/avatars/src/HeadData.cpp | 2 +- libraries/avatars/src/HeadData.h | 2 +- libraries/avatars/src/Player.cpp | 10 +++++----- 7 files changed, 21 insertions(+), 26 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 4755d9137a..323d5695ed 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -193,7 +193,7 @@ void Agent::run() { // setup an Avatar for the script to use ScriptableAvatar scriptedAvatar(&_scriptEngine); - scriptedAvatar.setForceFaceshiftConnected(true); + scriptedAvatar.setForceFaceTrackerConnected(true); // call model URL setters with empty URLs so our avatar, if user, will have the default models scriptedAvatar.setFaceModelURL(QUrl()); diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index afc1346ad8..52f1b3ee86 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -80,15 +80,10 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { // Only use face trackers when not playing back a recording. if (!myAvatar->isPlaying()) { FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); - auto dde = DependencyManager::get(); - auto faceshift = DependencyManager::get(); - - if ((_isFaceshiftConnected = (faceshift == faceTracker))) { + _isFaceTrackerConnected = faceTracker != NULL; + if (_isFaceTrackerConnected) { _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); - } else if (dde->isActive()) { - faceTracker = dde.data(); - _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); - } + } } // Twist the upper body to follow the rotation of the head, but only do this with my avatar, // since everyone else will see the full joint rotations for other people. @@ -109,7 +104,7 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { _longTermAverageLoudness = glm::mix(_longTermAverageLoudness, _averageLoudness, glm::min(deltaTime / AUDIO_LONG_TERM_AVERAGING_SECS, 1.0f)); } - if (!(_isFaceshiftConnected || billboard)) { + if (!(_isFaceTrackerConnected || billboard)) { // Update eye saccades const float AVERAGE_MICROSACCADE_INTERVAL = 0.50f; const float AVERAGE_SACCADE_INTERVAL = 4.0f; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 4c71c5e9ed..a3d330f84b 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -44,7 +44,7 @@ AvatarData::AvatarData() : _handState(0), _keyState(NO_KEY_DOWN), _isChatCirclingEnabled(false), - _forceFaceshiftConnected(false), + _forceFaceTrackerConnected(false), _hasNewJointRotations(true), _headData(NULL), _handData(NULL), @@ -136,8 +136,8 @@ QByteArray AvatarData::toByteArray() { if (!_headData) { _headData = new HeadData(this); } - if (_forceFaceshiftConnected) { - _headData->_isFaceshiftConnected = true; + if (_forceFaceTrackerConnected) { + _headData->_isFaceTrackerConnected = true; } QByteArray avatarDataByteArray; @@ -191,7 +191,7 @@ QByteArray AvatarData::toByteArray() { setAtBit(bitItems, HAND_STATE_FINGER_POINTING_BIT); } // faceshift state - if (_headData->_isFaceshiftConnected) { + if (_headData->_isFaceTrackerConnected) { setAtBit(bitItems, IS_FACESHIFT_CONNECTED); } if (_isChatCirclingEnabled) { @@ -208,7 +208,7 @@ QByteArray AvatarData::toByteArray() { } // If it is connected, pack up the data - if (_headData->_isFaceshiftConnected) { + if (_headData->_isFaceTrackerConnected) { memcpy(destinationBuffer, &_headData->_leftEyeBlink, sizeof(float)); destinationBuffer += sizeof(float); @@ -417,7 +417,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { _handState = getSemiNibbleAt(bitItems, HAND_STATE_START_BIT) + (oneAtBit(bitItems, HAND_STATE_FINGER_POINTING_BIT) ? IS_FINGER_POINTING_FLAG : 0); - _headData->_isFaceshiftConnected = oneAtBit(bitItems, IS_FACESHIFT_CONNECTED); + _headData->_isFaceTrackerConnected = oneAtBit(bitItems, IS_FACESHIFT_CONNECTED); _isChatCirclingEnabled = oneAtBit(bitItems, IS_CHAT_CIRCLING_ENABLED); bool hasReferential = oneAtBit(bitItems, HAS_REFERENTIAL); @@ -436,7 +436,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { } - if (_headData->_isFaceshiftConnected) { + if (_headData->_isFaceTrackerConnected) { float leftEyeBlink, rightEyeBlink, averageLoudness, browAudioLift; minPossibleSize += sizeof(leftEyeBlink) + sizeof(rightEyeBlink) + sizeof(averageLoudness) + sizeof(browAudioLift); minPossibleSize++; // one byte for blendDataSize diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8848a261df..a8a330485c 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -241,7 +241,7 @@ public: Q_INVOKABLE void setBlendshape(QString name, float val) { _headData->setBlendshape(name, val); } - void setForceFaceshiftConnected(bool connected) { _forceFaceshiftConnected = connected; } + void setForceFaceTrackerConnected(bool connected) { _forceFaceTrackerConnected = connected; } // key state void setKeyState(KeyState s) { _keyState = s; } @@ -357,7 +357,7 @@ protected: KeyState _keyState; bool _isChatCirclingEnabled; - bool _forceFaceshiftConnected; + bool _forceFaceTrackerConnected; bool _hasNewJointRotations; // set in AvatarData, cleared in Avatar HeadData* _headData; diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 8dec8368c9..7789385547 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -31,7 +31,7 @@ HeadData::HeadData(AvatarData* owningAvatar) : _torsoTwist(0.0f), _lookAtPosition(0.0f, 0.0f, 0.0f), _audioLoudness(0.0f), - _isFaceshiftConnected(false), + _isFaceTrackerConnected(false), _leftEyeBlink(0.0f), _rightEyeBlink(0.0f), _averageLoudness(0.0f), diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index cef5d5fbca..b180541914 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -92,7 +92,7 @@ protected: glm::vec3 _lookAtPosition; float _audioLoudness; - bool _isFaceshiftConnected; + bool _isFaceTrackerConnected; float _leftEyeBlink; float _rightEyeBlink; float _averageLoudness; diff --git a/libraries/avatars/src/Player.cpp b/libraries/avatars/src/Player.cpp index 2fabc39bac..2b92acb189 100644 --- a/libraries/avatars/src/Player.cpp +++ b/libraries/avatars/src/Player.cpp @@ -110,7 +110,7 @@ void Player::startPlaying() { } // Fake faceshift connection - _avatar->setForceFaceshiftConnected(true); + _avatar->setForceFaceTrackerConnected(true); qDebug() << "Recorder::startPlaying()"; setupAudioThread(); @@ -136,8 +136,8 @@ void Player::stopPlaying() { cleanupAudioThread(); _avatar->clearJointsData(); - // Turn off fake faceshift connection - _avatar->setForceFaceshiftConnected(false); + // Turn off fake face tracker connection + _avatar->setForceFaceTrackerConnected(false); if (_useAttachments) { _avatar->setAttachmentData(_currentContext.attachments); @@ -255,8 +255,8 @@ void Player::play() { HeadData* head = const_cast(_avatar->getHeadData()); if (head) { - // Make sure fake faceshift connection doesn't get turned off - _avatar->setForceFaceshiftConnected(true); + // Make sure fake face tracker connection doesn't get turned off + _avatar->setForceFaceTrackerConnected(true); QVector blendCoef(currentFrame.getBlendshapeCoefficients().size()); for (int i = 0; i < currentFrame.getBlendshapeCoefficients().size(); ++i) { From 889851f6ea914ec146aaa7dc91d5777084c5cb36 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 18 Feb 2015 13:51:50 -0800 Subject: [PATCH 4/7] Fix typo --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ac73920399..01a2d9608b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1603,7 +1603,7 @@ FaceTracker* Application::getActiveFaceTracker() { void Application::setActiveFaceTracker() { #ifdef HAVE_FACESHIFT - DependencyManager::get()->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); + DependencyManager::get()->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); #endif DependencyManager::get()->setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::DDEFaceRegression)); #ifdef HAVE_VISAGE From 24d03deb210201521ae7215198c4d3a0b4827451 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 18 Feb 2015 15:02:44 -0800 Subject: [PATCH 5/7] Fix typo --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1478a6d3d6..bd609a6840 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -27,7 +27,7 @@ #include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" #include "avatar/AvatarManager.h" -#include "devices/DDEFaceTracker.h" +#include "devices/DdeFaceTracker.h" #include "devices/Faceshift.h" #include "devices/RealSense.h" #include "devices/SixenseManager.h" From 8d9685ee394f37e5d7d8a67ef04a3e9789a7a00c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 21 Feb 2015 11:01:07 -0800 Subject: [PATCH 6/7] Fix Face Tracking menu operation --- interface/src/Menu.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index bd609a6840..c45fc6ed33 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -369,8 +369,8 @@ Menu::Menu() { faceTrackerGroup->addAction(noFaceTracker); #ifdef HAVE_FACESHIFT - QAction* faceshiftFaceTracker = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::Faceshift, - 0, true, + QAction* faceshiftFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::Faceshift, + 0, false, qApp, SLOT(setActiveFaceTracker())); faceTrackerGroup->addAction(faceshiftFaceTracker); #endif @@ -381,7 +381,7 @@ Menu::Menu() { faceTrackerGroup->addAction(ddeFaceTracker); #ifdef HAVE_VISAGE - QAction* visageFaceTracker = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::Visage, + QAction* visageFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::Visage, 0, false, qApp, SLOT(setActiveFaceTracker())); faceTrackerGroup->addAction(visageFaceTracker); From f169ab1238a7547636a6c9508afb40c42da03beb Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 21 Feb 2015 11:26:48 -0800 Subject: [PATCH 7/7] Tidy and document DDE face tracker UDP socket opening and closing --- interface/src/devices/DdeFaceTracker.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index c4797c4018..87a180bd1e 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -93,13 +93,10 @@ void DdeFaceTracker::update() { } void DdeFaceTracker::setEnabled(bool enabled) { + // isOpen() does not work as one might expect on QUdpSocket; don't test isOpen() before closing socket. + _udpSocket.close(); if (enabled) { - if (_udpSocket.isOpen()) { - _udpSocket.close(); - } _udpSocket.bind(_host, _port); - } else { - _udpSocket.close(); } }