From 14cda00ebc46ba02f68bbbd3ae111059d1ccac9c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 12 Dec 2014 20:52:41 -0800 Subject: [PATCH 01/10] First implementation of the DependencyManager --- libraries/shared/src/DependencyManager.cpp | 33 +++++++++++++ libraries/shared/src/DependencyManager.h | 55 ++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 libraries/shared/src/DependencyManager.cpp create mode 100644 libraries/shared/src/DependencyManager.h diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp new file mode 100644 index 0000000000..b4b3061317 --- /dev/null +++ b/libraries/shared/src/DependencyManager.cpp @@ -0,0 +1,33 @@ +// +// DependencyManager.cpp +// +// +// Created by Clément Brisset on 12/10/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "DependencyManager.h" + +DependencyManager& DependencyManager::getInstance() { + static DependencyManager instance; + return instance; +} + +DependencyManager::DependencyManager() { + // Guard against request of ourself + // We could set the value to this, but since it doesn't make sense to access + // the DependencyManager instance from the outside let's set it to NULL + _instanceHash.insert(typeid(DependencyManager).name(), NULL); +} + +DependencyManager::~DependencyManager() { + foreach (Dependency* instance, _instanceHash) { + if (instance) { + instance->deleteInstance(); + } + } + _instanceHash.clear(); +} \ No newline at end of file diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h new file mode 100644 index 0000000000..690058cab4 --- /dev/null +++ b/libraries/shared/src/DependencyManager.h @@ -0,0 +1,55 @@ +// +// DependencyManager.h +// +// +// Created by Clément Brisset on 12/10/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_DependencyManager_h +#define hifi_DependencyManager_h + +#include +#include + +#include + +class DependencyManager { +public: + template + static T* get(); + + class Dependency { + virtual void deleteInstance() = 0; + friend DependencyManager; + }; +private: + static DependencyManager& getInstance(); + DependencyManager(); + ~DependencyManager(); + + typedef QHash InstanceHash; + static InstanceHash& getInstanceHash() { return getInstance()._instanceHash; } + InstanceHash _instanceHash; +}; + +template +T* DependencyManager::get() { + const QString& typeId = typeid(T).name(); + + // Search the hash for global instance + Dependency* instance = getInstanceHash().value(typeId, NULL); + if (instance) { + return dynamic_cast(instance); + } + + // Found no instance in hash so we create one. + T* newInstance = new T(); + getInstanceHash().insert(typeId, dynamic_cast(newInstance)); + return newInstance; +} + +#endif // hifi_DependencyManager_h \ No newline at end of file From 50fd52377ff72e63c038a2b5aff908b855f7c026 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 12 Dec 2014 21:10:45 -0800 Subject: [PATCH 02/10] Couple improvements to the dependency manager --- libraries/shared/src/DependencyManager.cpp | 9 +-------- libraries/shared/src/DependencyManager.h | 14 +++++++++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp index b4b3061317..41cb405ac7 100644 --- a/libraries/shared/src/DependencyManager.cpp +++ b/libraries/shared/src/DependencyManager.cpp @@ -16,17 +16,10 @@ DependencyManager& DependencyManager::getInstance() { return instance; } -DependencyManager::DependencyManager() { - // Guard against request of ourself - // We could set the value to this, but since it doesn't make sense to access - // the DependencyManager instance from the outside let's set it to NULL - _instanceHash.insert(typeid(DependencyManager).name(), NULL); -} - DependencyManager::~DependencyManager() { foreach (Dependency* instance, _instanceHash) { if (instance) { - instance->deleteInstance(); + delete instance; } } _instanceHash.clear(); diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h index 690058cab4..2a81941b8a 100644 --- a/libraries/shared/src/DependencyManager.h +++ b/libraries/shared/src/DependencyManager.h @@ -19,16 +19,24 @@ class DependencyManager { public: + // Only accessible method. + // usage: T* instance = DependencyManager::get(); template static T* get(); + // Any class T in the DependencyManager needs to subclass Dependency + // They also need to have protected constructor(s) and virtual destructor + // As well as declare DependencyManager a friend class class Dependency { - virtual void deleteInstance() = 0; + protected: + Dependency() {} + virtual ~Dependency() {} // Ensure the proper destruction of the object friend DependencyManager; }; + private: static DependencyManager& getInstance(); - DependencyManager(); + DependencyManager() {} ~DependencyManager(); typedef QHash InstanceHash; @@ -52,4 +60,4 @@ T* DependencyManager::get() { return newInstance; } -#endif // hifi_DependencyManager_h \ No newline at end of file +#endif // hifi_DependencyManager_h From 9aea2843ac89fbeae4a0463bc8e7d4c3f23691c2 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 12 Dec 2014 21:20:26 -0800 Subject: [PATCH 03/10] Remove pointer check --- libraries/shared/src/DependencyManager.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp index 41cb405ac7..c858cb7059 100644 --- a/libraries/shared/src/DependencyManager.cpp +++ b/libraries/shared/src/DependencyManager.cpp @@ -18,9 +18,7 @@ DependencyManager& DependencyManager::getInstance() { DependencyManager::~DependencyManager() { foreach (Dependency* instance, _instanceHash) { - if (instance) { - delete instance; - } + delete instance; } _instanceHash.clear(); } \ No newline at end of file From ad2dee5eaab5afa8e684d7e3274697a005567e8e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 16:26:08 -0800 Subject: [PATCH 04/10] Switched devices to DependencyManager for Faceshift --- interface/src/devices/FaceTracker.h | 2 +- interface/src/devices/Faceshift.h | 3 +++ interface/src/devices/Visage.cpp | 9 +++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/interface/src/devices/FaceTracker.h b/interface/src/devices/FaceTracker.h index 459f38cafc..75954871e5 100644 --- a/interface/src/devices/FaceTracker.h +++ b/interface/src/devices/FaceTracker.h @@ -23,8 +23,8 @@ class FaceTracker : public QObject { Q_OBJECT public: - FaceTracker(); + virtual ~FaceTracker() {} const glm::vec3& getHeadTranslation() const { return _headTranslation; } const glm::quat& getHeadRotation() const { return _headRotation; } diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 3b4092c099..618a8fb975 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -19,6 +19,8 @@ #include #endif +#include + #include "FaceTracker.h" /// Handles interaction with the Faceshift software, which provides head position/orientation and facial features. @@ -27,6 +29,7 @@ class Faceshift : public FaceTracker { public: Faceshift(); + virtual ~Faceshift() {} void init(); diff --git a/interface/src/devices/Visage.cpp b/interface/src/devices/Visage.cpp index 9c7416c219..38dcdb4ce6 100644 --- a/interface/src/devices/Visage.cpp +++ b/interface/src/devices/Visage.cpp @@ -11,11 +11,12 @@ #include + +#include +#include #include #include -#include - #include "Application.h" #include "Visage.h" @@ -119,7 +120,7 @@ static const QMultiHash >& getActionUnitNameMap() const float TRANSLATION_SCALE = 20.0f; void Visage::init() { - connect(Application::getInstance()->getFaceshift(), SIGNAL(connectionStateChanged()), SLOT(updateEnabled())); + connect(DependencyManager::get(), SIGNAL(connectionStateChanged()), SLOT(updateEnabled())); updateEnabled(); } @@ -171,7 +172,7 @@ void Visage::reset() { void Visage::updateEnabled() { setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Visage) && !(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift) && - Application::getInstance()->getFaceshift()->isConnectedOrConnecting())); + DependencyManager::get()->isConnectedOrConnecting())); } void Visage::setEnabled(bool enabled) { From 1d9e53e227026dfe685e082be3e2262a81724585 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 16:28:28 -0800 Subject: [PATCH 05/10] Switched avatar to DependencyManager for Faceshift --- interface/src/avatar/Head.cpp | 17 +++++++++-------- interface/src/avatar/MyAvatar.cpp | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 660ebfcbb3..4b1e9e358c 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -10,6 +10,7 @@ #include +#include #include #include "Application.h" @@ -196,14 +197,14 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { _mouth2 = glm::mix(_audioJawOpen * MMMM_POWER, _mouth2, MMMM_PERIOD + randFloat() * MMMM_RANDOM_PERIOD); _mouth4 = glm::mix(_audioJawOpen, _mouth4, SMILE_PERIOD + randFloat() * SMILE_RANDOM_PERIOD); - Application::getInstance()->getFaceshift()->updateFakeCoefficients(_leftEyeBlink, - _rightEyeBlink, - _browAudioLift, - _audioJawOpen, - _mouth2, - _mouth3, - _mouth4, - _blendshapeCoefficients); + DependencyManager::get()->updateFakeCoefficients(_leftEyeBlink, + _rightEyeBlink, + _browAudioLift, + _audioJawOpen, + _mouth2, + _mouth3, + _mouth4, + _blendshapeCoefficients); } else { _saccade = glm::vec3(); } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 32053ea076..17cda19980 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -421,8 +422,7 @@ void MyAvatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bo } void MyAvatar::renderHeadMouse(int screenWidth, int screenHeight) const { - - Faceshift* faceshift = Application::getInstance()->getFaceshift(); + Faceshift* faceshift = DependencyManager::get(); float pixelsPerDegree = screenHeight / Menu::getInstance()->getFieldOfView(); From 39a19a297ffd27fa92082ff389a6831c27e80cd5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 16:31:03 -0800 Subject: [PATCH 06/10] Switched menu to DependencyManager for Faceshift --- interface/src/Menu.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 5e35f08e95..ec9b93e072 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -31,9 +31,10 @@ #include #include -#include +#include #include #include +#include #include "Application.h" #include "AccountManager.h" @@ -432,7 +433,7 @@ Menu::Menu() : MenuOption::Faceshift, 0, true, - appInstance->getFaceshift(), + DependencyManager::get(), SLOT(setTCPEnabled(bool))); #endif #ifdef HAVE_VISAGE From 1db3592d4c593a595fe1a5905f94fb2c6c0b0271 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 19:56:42 -0800 Subject: [PATCH 07/10] Switched meFaceshifto DependencyManager for Faceshift --- interface/src/Application.cpp | 17 ++++++++++------- interface/src/Application.h | 4 +--- interface/src/devices/Faceshift.h | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7a0e61240a..8a13ef650d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -1690,8 +1691,10 @@ int Application::getMouseDragStartedY() const { } FaceTracker* Application::getActiveFaceTracker() { + Faceshift* faceshift = DependencyManager::get(); + return (_dde.isActive() ? static_cast(&_dde) : - (_faceshift.isActive() ? static_cast(&_faceshift) : + (faceshift->isActive() ? static_cast(faceshift) : (_visage.isActive() ? static_cast(&_visage) : NULL))); } @@ -1976,7 +1979,7 @@ void Application::init() { #endif // initialize our face trackers after loading the menu settings - _faceshift.init(); + DependencyManager::get()->init(); _visage.init(); Leapmotion::init(); @@ -2101,13 +2104,13 @@ void Application::updateMouseRay() { void Application::updateFaceshift() { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::updateFaceshift()"); - + Faceshift* faceshift = DependencyManager::get(); // Update faceshift - _faceshift.update(); + faceshift->update(); // Copy angular velocity if measured by faceshift, to the head - if (_faceshift.isActive()) { - _myAvatar->getHead()->setAngularVelocity(_faceshift.getHeadAngularVelocity()); + if (faceshift->isActive()) { + _myAvatar->getHead()->setAngularVelocity(faceshift->getHeadAngularVelocity()); } } @@ -3549,7 +3552,7 @@ void Application::deleteVoxelAt(const VoxelDetail& voxel) { } void Application::resetSensors() { - _faceshift.reset(); + DependencyManager::get()->reset(); _visage.reset(); _dde.reset(); diff --git a/interface/src/Application.h b/interface/src/Application.h index f82b14b47e..61ae317713 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -220,8 +220,7 @@ public: int getMouseDragStartedY() const; int getTrueMouseDragStartedX() const { return _mouseDragStartedX; } int getTrueMouseDragStartedY() const { return _mouseDragStartedY; } - bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated;; } - Faceshift* getFaceshift() { return &_faceshift; } + bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } Visage* getVisage() { return &_visage; } DdeFaceTracker* getDDE() { return &_dde; } FaceTracker* getActiveFaceTracker(); @@ -532,7 +531,6 @@ private: AvatarManager _avatarManager; MyAvatar* _myAvatar; // TODO: move this and relevant code to AvatarManager (or MyAvatar as the case may be) - Faceshift _faceshift; Visage _visage; DdeFaceTracker _dde; diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 618a8fb975..83be51c7fa 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -24,7 +24,7 @@ #include "FaceTracker.h" /// Handles interaction with the Faceshift software, which provides head position/orientation and facial features. -class Faceshift : public FaceTracker { +class Faceshift : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: From e40961df12f4edeee6c69250bfa9e9e8da09f37d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 21:34:27 -0800 Subject: [PATCH 08/10] Checking that T is in fact derived from Dependency --- libraries/shared/src/DependencyManager.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h index 2a81941b8a..87c7c7b4a6 100644 --- a/libraries/shared/src/DependencyManager.h +++ b/libraries/shared/src/DependencyManager.h @@ -16,6 +16,7 @@ #include #include +#include class DependencyManager { public: @@ -56,7 +57,9 @@ T* DependencyManager::get() { // Found no instance in hash so we create one. T* newInstance = new T(); - getInstanceHash().insert(typeId, dynamic_cast(newInstance)); + instance = dynamic_cast(newInstance); + assert(instance != NULL); // If this triggers, check that T is derived from Dependency + getInstanceHash().insert(typeId, instance); return newInstance; } From 65094f21654e1ddd78232c20d9c0e8ff1e0985dd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 21:47:08 -0800 Subject: [PATCH 09/10] Update headers --- interface/src/Application.cpp | 1 + interface/src/Application.h | 1 - interface/src/Menu.cpp | 1 + interface/src/avatar/Head.cpp | 1 + interface/src/devices/Faceshift.cpp | 1 - interface/src/devices/Visage.cpp | 1 + 6 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8a13ef650d..3706206f1f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -77,6 +77,7 @@ #include "ModelUploader.h" #include "Util.h" +#include "devices/Faceshift.h" #include "devices/Leapmotion.h" #include "devices/MIDIManager.h" #include "devices/OculusManager.h" diff --git a/interface/src/Application.h b/interface/src/Application.h index 61ae317713..d1d15d22a9 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -54,7 +54,6 @@ #include "avatar/Avatar.h" #include "avatar/AvatarManager.h" #include "avatar/MyAvatar.h" -#include "devices/Faceshift.h" #include "devices/PrioVR.h" #include "devices/SixenseManager.h" #include "devices/Visage.h" diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ec9b93e072..c08df2b2c5 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -38,6 +38,7 @@ #include "Application.h" #include "AccountManager.h" +#include "devices/Faceshift.h" #include "Menu.h" #include "scripting/LocationScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 4b1e9e358c..a16cdd9270 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include "Application.h" diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index fb74f416a9..5c1bbfe709 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -14,7 +14,6 @@ #include #include -#include "Application.h" #include "Faceshift.h" #include "Menu.h" #include "Util.h" diff --git a/interface/src/devices/Visage.cpp b/interface/src/devices/Visage.cpp index 38dcdb4ce6..51b927df75 100644 --- a/interface/src/devices/Visage.cpp +++ b/interface/src/devices/Visage.cpp @@ -18,6 +18,7 @@ #include #include "Application.h" +#include "Faceshift.h" #include "Visage.h" // this has to go after our normal includes, because its definition of HANDLE conflicts with Qt's From 738f23f326a0e1d9ac353aeaef8c6c769d542166 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 22:30:13 -0800 Subject: [PATCH 10/10] Moved visage and dde over to DependencyManager --- interface/src/Application.cpp | 18 +++++++++++------- interface/src/Application.h | 8 +------- interface/src/Menu.cpp | 5 +++-- interface/src/avatar/Head.cpp | 11 +++++++---- interface/src/devices/DdeFaceTracker.h | 13 ++++++++----- interface/src/devices/Faceshift.h | 6 +++--- interface/src/devices/Visage.h | 11 ++++++----- 7 files changed, 39 insertions(+), 33 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3706206f1f..fbe55071e4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -77,11 +77,13 @@ #include "ModelUploader.h" #include "Util.h" +#include "devices/DdeFaceTracker.h" #include "devices/Faceshift.h" #include "devices/Leapmotion.h" #include "devices/MIDIManager.h" #include "devices/OculusManager.h" #include "devices/TV3DManager.h" +#include "devices/Visage.h" #include "renderer/ProgramObject.h" #include "gpu/Batch.h" @@ -1693,10 +1695,12 @@ int Application::getMouseDragStartedY() const { FaceTracker* Application::getActiveFaceTracker() { Faceshift* faceshift = DependencyManager::get(); + Visage* visage = DependencyManager::get(); + DdeFaceTracker* dde = DependencyManager::get(); - return (_dde.isActive() ? static_cast(&_dde) : + return (dde->isActive() ? static_cast(dde) : (faceshift->isActive() ? static_cast(faceshift) : - (_visage.isActive() ? static_cast(&_visage) : NULL))); + (visage->isActive() ? static_cast(visage) : NULL))); } struct SendVoxelsOperationArgs { @@ -1981,7 +1985,7 @@ void Application::init() { // initialize our face trackers after loading the menu settings DependencyManager::get()->init(); - _visage.init(); + DependencyManager::get()->init(); Leapmotion::init(); @@ -2120,7 +2124,7 @@ void Application::updateVisage() { PerformanceWarning warn(showWarnings, "Application::updateVisage()"); // Update Visage - _visage.update(); + DependencyManager::get()->update(); } void Application::updateDDE() { @@ -2128,7 +2132,7 @@ void Application::updateDDE() { PerformanceWarning warn(showWarnings, "Application::updateDDE()"); // Update Cara - _dde.update(); + DependencyManager::get()->update(); } void Application::updateMyAvatarLookAtPosition() { @@ -3554,8 +3558,8 @@ void Application::deleteVoxelAt(const VoxelDetail& voxel) { void Application::resetSensors() { DependencyManager::get()->reset(); - _visage.reset(); - _dde.reset(); + DependencyManager::get()->reset(); + DependencyManager::get()->reset(); OculusManager::reset(); diff --git a/interface/src/Application.h b/interface/src/Application.h index d1d15d22a9..833f1374ce 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -56,8 +56,6 @@ #include "avatar/MyAvatar.h" #include "devices/PrioVR.h" #include "devices/SixenseManager.h" -#include "devices/Visage.h" -#include "devices/DdeFaceTracker.h" #include "entities/EntityTreeRenderer.h" #include "renderer/AmbientOcclusionEffect.h" #include "renderer/DeferredLightingEffect.h" @@ -99,6 +97,7 @@ class QMouseEvent; class QSettings; class QWheelEvent; +class FaceTracker; class Node; class ProgramObject; @@ -220,8 +219,6 @@ public: int getTrueMouseDragStartedX() const { return _mouseDragStartedX; } int getTrueMouseDragStartedY() const { return _mouseDragStartedY; } bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } - Visage* getVisage() { return &_visage; } - DdeFaceTracker* getDDE() { return &_dde; } FaceTracker* getActiveFaceTracker(); PrioVR* getPrioVR() { return &_prioVR; } BandwidthMeter* getBandwidthMeter() { return &_bandwidthMeter; } @@ -530,9 +527,6 @@ private: AvatarManager _avatarManager; MyAvatar* _myAvatar; // TODO: move this and relevant code to AvatarManager (or MyAvatar as the case may be) - Visage _visage; - DdeFaceTracker _dde; - PrioVR _prioVR; Camera _myCamera; // My view onto the world diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c08df2b2c5..6c2c3966fc 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -39,6 +39,8 @@ #include "Application.h" #include "AccountManager.h" #include "devices/Faceshift.h" +#include "devices/OculusManager.h" +#include "devices/Visage.h" #include "Menu.h" #include "scripting/LocationScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" @@ -51,7 +53,6 @@ #include "ui/ModelsBrowser.h" #include "ui/LoginDialog.h" #include "ui/NodeBounds.h" -#include "devices/OculusManager.h" Menu* Menu::_instance = NULL; @@ -439,7 +440,7 @@ Menu::Menu() : #endif #ifdef HAVE_VISAGE addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::Visage, 0, false, - appInstance->getVisage(), SLOT(updateEnabled())); + DependencyManager::get(), SLOT(updateEnabled())); #endif addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSkeletonCollisionShapes); diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index a16cdd9270..42b3c968e1 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include "Application.h" @@ -77,11 +78,13 @@ 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(); - if ((_isFaceshiftConnected = faceTracker)) { + DdeFaceTracker* dde = DependencyManager::get(); + Faceshift* faceshift = DependencyManager::get(); + + if ((_isFaceshiftConnected = (faceshift == faceTracker))) { _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); - _isFaceshiftConnected = true; - } else if (Application::getInstance()->getDDE()->isActive()) { - faceTracker = Application::getInstance()->getDDE(); + } else if (dde->isActive()) { + faceTracker = dde; _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); } } diff --git a/interface/src/devices/DdeFaceTracker.h b/interface/src/devices/DdeFaceTracker.h index 68d9e7d487..d80aa043e4 100644 --- a/interface/src/devices/DdeFaceTracker.h +++ b/interface/src/devices/DdeFaceTracker.h @@ -14,16 +14,14 @@ #include +#include + #include "FaceTracker.h" -class DdeFaceTracker : public FaceTracker { +class DdeFaceTracker : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: - DdeFaceTracker(); - DdeFaceTracker(const QHostAddress& host, quint16 port); - ~DdeFaceTracker(); - //initialization void init(); void reset(); @@ -57,6 +55,11 @@ private slots: void socketStateChanged(QAbstractSocket::SocketState socketState); private: + DdeFaceTracker(); + DdeFaceTracker(const QHostAddress& host, quint16 port); + ~DdeFaceTracker(); + friend DependencyManager; + float getBlendshapeCoefficient(int index) const; void decodePacket(const QByteArray& buffer); diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 83be51c7fa..3cca8f2bb1 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -28,9 +28,6 @@ class Faceshift : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: - Faceshift(); - virtual ~Faceshift() {} - void init(); bool isConnectedOrConnecting() const; @@ -90,6 +87,9 @@ private slots: void readFromSocket(); private: + Faceshift(); + virtual ~Faceshift() {} + friend DependencyManager; float getBlendshapeCoefficient(int index) const; diff --git a/interface/src/devices/Visage.h b/interface/src/devices/Visage.h index 33e2f0a7e1..73edddc4d7 100644 --- a/interface/src/devices/Visage.h +++ b/interface/src/devices/Visage.h @@ -16,6 +16,8 @@ #include #include +#include + #include "FaceTracker.h" namespace VisageSDK { @@ -24,14 +26,10 @@ namespace VisageSDK { } /// Handles input from the Visage webcam feature tracking software. -class Visage : public FaceTracker { +class Visage : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: - - Visage(); - virtual ~Visage(); - void init(); bool isActive() const { return _active; } @@ -44,6 +42,9 @@ public slots: void updateEnabled(); private: + Visage(); + virtual ~Visage(); + friend DependencyManager; #ifdef HAVE_VISAGE VisageSDK::VisageTracker2* _tracker;