From 131af0cf16a4108007c1c05cb9c5aea8b8a20833 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 12:26:11 -0800 Subject: [PATCH 1/8] I believe this should fix the "Joint/model not in model list" errors. --- interface/src/renderer/FBXReader.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/interface/src/renderer/FBXReader.cpp b/interface/src/renderer/FBXReader.cpp index 63e3afc8cf..1058bd02d9 100644 --- a/interface/src/renderer/FBXReader.cpp +++ b/interface/src/renderer/FBXReader.cpp @@ -548,17 +548,18 @@ public: }; void appendModelIDs(const QString& parentID, const QMultiHash& childMap, - QHash& models, QVector& modelIDs) { - if (models.contains(parentID)) { + QHash& models, QSet& remainingModels, QVector& modelIDs) { + if (remainingModels.contains(parentID)) { modelIDs.append(parentID); + remainingModels.remove(parentID); } int parentIndex = modelIDs.size() - 1; foreach (const QString& childID, childMap.values(parentID)) { - if (models.contains(childID)) { + if (remainingModels.contains(childID)) { FBXModel& model = models[childID]; if (model.parentIndex == -1) { model.parentIndex = parentIndex; - appendModelIDs(childID, childMap, models, modelIDs); + appendModelIDs(childID, childMap, models, remainingModels, modelIDs); } } } @@ -1101,8 +1102,12 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) // get the list of models in depth-first traversal order QVector modelIDs; - if (!models.isEmpty()) { - QString top = models.constBegin().key(); + QSet remainingModels; + for (QHash::const_iterator model = models.constBegin(); model != models.constEnd(); model++) { + remainingModels.insert(model.key()); + } + while (!remainingModels.isEmpty()) { + QString top = *remainingModels.constBegin(); forever { foreach (const QString& name, parentMap.values(top)) { if (models.contains(name)) { @@ -1115,7 +1120,7 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) outerContinue: ; } - appendModelIDs(top, childMap, models, modelIDs); + appendModelIDs(top, childMap, models, remainingModels, modelIDs); } // convert the models to joints From 9fa170494c7274f074f2d38a8e4db78d0bb320de Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 14:04:46 -0800 Subject: [PATCH 2/8] I believe what we really want to decay is the mouse pitch. --- interface/src/avatar/MyAvatar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index e7dba4a4c7..490dd5febb 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -210,8 +210,8 @@ void MyAvatar::simulate(float deltaTime, Transmitter* transmitter) { // you start moving, but don't do this with an HMD like the Oculus. if (!OculusManager::isConnected()) { if (forwardAcceleration > ACCELERATION_PULL_THRESHOLD) { - _head.setPitch(_head.getPitch() * (1.f - forwardAcceleration * ACCELERATION_PITCH_DECAY * deltaTime)); - _head.setYaw(_head.getYaw() * (1.f - forwardAcceleration * ACCELERATION_YAW_DECAY * deltaTime)); + _head.setMousePitch(_head.getMousePitch() * qMax(0.0f, + (1.f - forwardAcceleration * ACCELERATION_PITCH_DECAY * deltaTime))); } } else if (fabsf(forwardAcceleration) > OCULUS_ACCELERATION_PULL_THRESHOLD && fabs(_head.getYaw()) > OCULUS_YAW_OFFSET_THRESHOLD) { From 4ae5203f38c67899aebf67e45080c95810c1b23b Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 14:10:33 -0800 Subject: [PATCH 3/8] Remove unused constant. --- interface/src/avatar/MyAvatar.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 490dd5febb..161ea5b9d8 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -200,7 +200,6 @@ void MyAvatar::simulate(float deltaTime, Transmitter* transmitter) { // Compute instantaneous acceleration float forwardAcceleration = glm::length(glm::dot(getBodyFrontDirection(), getVelocity() - oldVelocity)) / deltaTime; const float ACCELERATION_PITCH_DECAY = 0.4f; - const float ACCELERATION_YAW_DECAY = 0.4f; const float ACCELERATION_PULL_THRESHOLD = 0.2f; const float OCULUS_ACCELERATION_PULL_THRESHOLD = 1.0f; const int OCULUS_YAW_OFFSET_THRESHOLD = 10; From 38118fdab039591c7905afaa3acb3c4963c0b5fe Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 14:42:05 -0800 Subject: [PATCH 4/8] When we start setting the fake coefficients after we set the real ones, make sure all of the other coefficients are zero. --- interface/src/devices/Faceshift.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index f8600b6e50..347bb82bc4 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -95,6 +95,7 @@ void Faceshift::reset() { void Faceshift::updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, float jawOpen, std::vector& coefficients) const { coefficients.resize(max((int)coefficients.size(), _jawOpenIndex + 1)); + qFill(coefficients.begin(), coefficients.end(), 0.0f); coefficients[_leftBlinkIndex] = leftBlink; coefficients[_rightBlinkIndex] = rightBlink; coefficients[_browUpCenterIndex] = browUp; From 515b40ecc3e09788db6cf08b138a1adc7e87cb66 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 15:00:14 -0800 Subject: [PATCH 5/8] Attempt to disable Hydra hands after five seconds without movement. --- interface/src/devices/SixenseManager.cpp | 18 +++++++++++++++++- interface/src/devices/SixenseManager.h | 4 ++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index 9c757a1e45..2498eec5ac 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -13,7 +13,9 @@ #include "Application.h" #include "SixenseManager.h" -SixenseManager::SixenseManager() { +using namespace std; + +SixenseManager::SixenseManager() : _lastMovement(usecTimestampNow()) { #ifdef HAVE_SIXENSE sixenseInit(); #endif @@ -98,6 +100,12 @@ void SixenseManager::update(float deltaTime) { palm->setRawVelocity(rawVelocity); // meters/sec palm->setRawPosition(position); + // use the velocity to determine whether there's any movement + const float MOVEMENT_SPEED_THRESHOLD = 0.001f; + if (glm::length(rawVelocity) > MOVEMENT_SPEED_THRESHOLD) { + _lastMovement = usecTimestampNow(); + } + // initialize the "finger" based on the direction FingerData finger(palm, &hand); finger.setActive(true); @@ -118,6 +126,14 @@ void SixenseManager::update(float deltaTime) { palm->getFingers().push_back(finger); palm->getFingers().push_back(finger); } + + // if the controllers haven't been moved in a while, disable + const int MOVEMENT_DISABLE_DURATION = 5 * 1000 * 1000; + if (usecTimestampNow() - _lastMovement > MOVEMENT_DISABLE_DURATION) { + for (vector::iterator it = hand.getPalms().begin(); it != hand.getPalms().end(); it++) { + it->setActive(false); + } + } #endif } diff --git a/interface/src/devices/SixenseManager.h b/interface/src/devices/SixenseManager.h index 874f29fc34..863db7852f 100644 --- a/interface/src/devices/SixenseManager.h +++ b/interface/src/devices/SixenseManager.h @@ -22,6 +22,10 @@ public: public slots: void setFilter(bool filter); + +private: + + uint64_t _lastMovement; }; #endif /* defined(__interface__SixenseManager__) */ From a7e9434c961e68e4546ca5d8a343e246d1ad2794 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 15:50:14 -0800 Subject: [PATCH 6/8] Tweaked constants. --- interface/src/devices/SixenseManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index 2498eec5ac..352cae44ab 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -101,7 +101,7 @@ void SixenseManager::update(float deltaTime) { palm->setRawPosition(position); // use the velocity to determine whether there's any movement - const float MOVEMENT_SPEED_THRESHOLD = 0.001f; + const float MOVEMENT_SPEED_THRESHOLD = 0.05f; if (glm::length(rawVelocity) > MOVEMENT_SPEED_THRESHOLD) { _lastMovement = usecTimestampNow(); } @@ -128,7 +128,7 @@ void SixenseManager::update(float deltaTime) { } // if the controllers haven't been moved in a while, disable - const int MOVEMENT_DISABLE_DURATION = 5 * 1000 * 1000; + const int MOVEMENT_DISABLE_DURATION = 30 * 1000 * 1000; if (usecTimestampNow() - _lastMovement > MOVEMENT_DISABLE_DURATION) { for (vector::iterator it = hand.getPalms().begin(); it != hand.getPalms().end(); it++) { it->setActive(false); From 5283e519270e2899d57e44e21b94bd7537402251 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 15:51:12 -0800 Subject: [PATCH 7/8] Start out disabled. --- interface/src/devices/SixenseManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index 352cae44ab..9d6b011921 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -15,7 +15,7 @@ using namespace std; -SixenseManager::SixenseManager() : _lastMovement(usecTimestampNow()) { +SixenseManager::SixenseManager() : _lastMovement(0) { #ifdef HAVE_SIXENSE sixenseInit(); #endif From a7c14f1f17d2a3826c389aa19a0d838e67a5e9c3 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 Jan 2014 15:53:50 -0800 Subject: [PATCH 8/8] Only register movement if the hand isn't new. --- interface/src/devices/SixenseManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index 9d6b011921..9ebe4b35d1 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -100,9 +100,9 @@ void SixenseManager::update(float deltaTime) { palm->setRawVelocity(rawVelocity); // meters/sec palm->setRawPosition(position); - // use the velocity to determine whether there's any movement + // use the velocity to determine whether there's any movement (if the hand isn't new) const float MOVEMENT_SPEED_THRESHOLD = 0.05f; - if (glm::length(rawVelocity) > MOVEMENT_SPEED_THRESHOLD) { + if (glm::length(rawVelocity) > MOVEMENT_SPEED_THRESHOLD && foundHand) { _lastMovement = usecTimestampNow(); }