From 387f0a3f10e462f87009fa4d81ceec4e6bd5290a Mon Sep 17 00:00:00 2001 From: dooglifeSF <41022919+dooglifeSF@users.noreply.github.com> Date: Fri, 4 Oct 2019 15:28:35 -0700 Subject: [PATCH 1/5] add isInput* and isNotInput vars for use in json, and edit json to use them --- .../resources/avatar/avatar-animation.json | 110 +++++++++--------- interface/src/avatar/MySkeletonModel.cpp | 4 + libraries/animation/src/Rig.cpp | 42 +++++++ libraries/animation/src/Rig.h | 2 + 4 files changed, 103 insertions(+), 55 deletions(-) diff --git a/interface/resources/avatar/avatar-animation.json b/interface/resources/avatar/avatar-animation.json index 2b8b3eb9b3..1c3a603eb5 100644 --- a/interface/resources/avatar/avatar-animation.json +++ b/interface/resources/avatar/avatar-animation.json @@ -5244,23 +5244,23 @@ "transitions": [ { "state": "idle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5313,19 +5313,19 @@ "transitions": [ { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5380,19 +5380,19 @@ }, { "state": "idle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5469,19 +5469,19 @@ }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "strafeRightHmd", @@ -5533,19 +5533,19 @@ "transitions": [ { "state": "idleSettle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5597,19 +5597,19 @@ "transitions": [ { "state": "idleSettle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5661,19 +5661,19 @@ "transitions": [ { "state": "idleSettle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5725,19 +5725,19 @@ "transitions": [ { "state": "idleSettle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "turnRight", @@ -5794,19 +5794,19 @@ }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnLeft", @@ -5859,19 +5859,19 @@ }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5919,15 +5919,15 @@ "transitions": [ { "state": "idleSettle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "strafeLeftHmd", @@ -5935,11 +5935,11 @@ }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -5983,15 +5983,15 @@ "transitions": [ { "state": "idleSettle", - "var": "isNotMoving" + "var": "isNotInput" }, { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "strafeRightHmd", @@ -5999,11 +5999,11 @@ }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", @@ -6128,19 +6128,19 @@ "transitions": [ { "state": "WALKFWD", - "var": "isMovingForward" + "var": "isInputForward" }, { "state": "WALKBWD", - "var": "isMovingBackward" + "var": "isInputBackward" }, { "state": "STRAFERIGHT", - "var": "isMovingRight" + "var": "isInputRight" }, { "state": "STRAFELEFT", - "var": "isMovingLeft" + "var": "isInputLeft" }, { "state": "turnRight", diff --git a/interface/src/avatar/MySkeletonModel.cpp b/interface/src/avatar/MySkeletonModel.cpp index 38065c8095..8d92767321 100755 --- a/interface/src/avatar/MySkeletonModel.cpp +++ b/interface/src/avatar/MySkeletonModel.cpp @@ -315,6 +315,10 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { const float TALKING_TIME_THRESHOLD = 0.75f; params.isTalking = head->getTimeWithoutTalking() <= TALKING_TIME_THRESHOLD; + //pass X and Z input key floats (-1 to 1) to rig + params.inputX = myAvatar->getDriveKey(MyAvatar::TRANSLATE_X); + params.inputZ = myAvatar->getDriveKey(MyAvatar::TRANSLATE_Z); + myAvatar->updateRigControllerParameters(params); _rig.updateFromControllerParameters(params, deltaTime); diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index d63c2d6a9b..88b42285cd 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -2160,6 +2160,48 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo } } + //TODO: how to handle multiple inputs? Is there a trick to prioritize fwd/bwd with order of operations? + if (params.inputX) { + if (params.inputX > 0.0f) { + // left + _animVars.set("isInputForward", false); + _animVars.set("isInputBackward", false); + _animVars.set("isInputRight", true); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", false); + } else { + // right + _animVars.set("isInputForward", false); + _animVars.set("isInputBackward", false); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", true); + _animVars.set("isNotInput", false); + } + } else if (params.inputZ) { + if (params.inputZ > 0.0f) { + // forward + _animVars.set("isInputForward", true); + _animVars.set("isInputBackward", false); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", false); + } else { + // backward + _animVars.set("isInputForward", false); + _animVars.set("isInputBackward", true); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", false); + } + } else if (params.inputX == 0.0f && params.inputZ == 0.0f) { + // no WASD input + _animVars.set("isInputForward", false); + _animVars.set("isInputBackward", false); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", true); + } + _headEnabled = params.primaryControllerFlags[PrimaryControllerType_Head] & (uint8_t)ControllerFlags::Enabled; bool leftHandEnabled = params.primaryControllerFlags[PrimaryControllerType_LeftHand] & (uint8_t)ControllerFlags::Enabled; bool rightHandEnabled = params.primaryControllerFlags[PrimaryControllerType_RightHand] & (uint8_t)ControllerFlags::Enabled; diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 98431e1dca..8f5eddac00 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -88,6 +88,8 @@ public: AnimPose secondaryControllerPoses[NumSecondaryControllerTypes]; // rig space uint8_t secondaryControllerFlags[NumSecondaryControllerTypes]; bool isTalking; + float inputX; + float inputZ; bool reactionEnabledFlags[NUM_AVATAR_BEGIN_END_REACTIONS]; bool reactionTriggers[NUM_AVATAR_TRIGGER_REACTIONS]; HFMJointShapeInfo hipsShapeInfo; From 2626f85f49d1ab7d598857077f7533d5c8f7396e Mon Sep 17 00:00:00 2001 From: dooglifeSF <41022919+dooglifeSF@users.noreply.github.com> Date: Tue, 8 Oct 2019 15:44:06 -0700 Subject: [PATCH 2/5] Handle multiple inputs, bias towards inputZ instead of inputX, and add a deadzone that matches xbox controller analog deadzone --- libraries/animation/src/Rig.cpp | 47 ++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 88b42285cd..7f83fb5218 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -2160,40 +2160,43 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo } } - //TODO: how to handle multiple inputs? Is there a trick to prioritize fwd/bwd with order of operations? - if (params.inputX) { - if (params.inputX > 0.0f) { - // left + //deadzone constant + #define INPUT_DEADZONE_THRESHOLD 0.05f + + if (abs(params.inputZ) > INPUT_DEADZONE_THRESHOLD && abs(params.inputZ) >= abs(params.inputX)) { + if (params.inputZ > INPUT_DEADZONE_THRESHOLD) { + // forward + _animVars.set("isInputForward", true); + _animVars.set("isInputBackward", false); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", false); + } + else { + // backward + _animVars.set("isInputForward", false); + _animVars.set("isInputBackward", true); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", false); + } + } else if (abs(params.inputX) > INPUT_DEADZONE_THRESHOLD && abs(params.inputX) > abs(params.inputZ)) { + if (params.inputX > INPUT_DEADZONE_THRESHOLD) { + // right _animVars.set("isInputForward", false); _animVars.set("isInputBackward", false); _animVars.set("isInputRight", true); _animVars.set("isInputLeft", false); _animVars.set("isNotInput", false); } else { - // right + // left _animVars.set("isInputForward", false); _animVars.set("isInputBackward", false); _animVars.set("isInputRight", false); _animVars.set("isInputLeft", true); _animVars.set("isNotInput", false); } - } else if (params.inputZ) { - if (params.inputZ > 0.0f) { - // forward - _animVars.set("isInputForward", true); - _animVars.set("isInputBackward", false); - _animVars.set("isInputRight", false); - _animVars.set("isInputLeft", false); - _animVars.set("isNotInput", false); - } else { - // backward - _animVars.set("isInputForward", false); - _animVars.set("isInputBackward", true); - _animVars.set("isInputRight", false); - _animVars.set("isInputLeft", false); - _animVars.set("isNotInput", false); - } - } else if (params.inputX == 0.0f && params.inputZ == 0.0f) { + } else if (params.inputX <= INPUT_DEADZONE_THRESHOLD && params.inputZ <= INPUT_DEADZONE_THRESHOLD) { // no WASD input _animVars.set("isInputForward", false); _animVars.set("isInputBackward", false); From cfa7df7d1a27275d47b50424692d87ae5acbe972 Mon Sep 17 00:00:00 2001 From: dooglifeSF <41022919+dooglifeSF@users.noreply.github.com> Date: Tue, 8 Oct 2019 16:14:21 -0700 Subject: [PATCH 3/5] Refactor the if-logic to remove complexity --- libraries/animation/src/Rig.cpp | 52 ++++++++++++++++----------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 7f83fb5218..8d78ff1418 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -2163,25 +2163,31 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo //deadzone constant #define INPUT_DEADZONE_THRESHOLD 0.05f - if (abs(params.inputZ) > INPUT_DEADZONE_THRESHOLD && abs(params.inputZ) >= abs(params.inputX)) { - if (params.inputZ > INPUT_DEADZONE_THRESHOLD) { - // forward - _animVars.set("isInputForward", true); - _animVars.set("isInputBackward", false); - _animVars.set("isInputRight", false); - _animVars.set("isInputLeft", false); - _animVars.set("isNotInput", false); - } - else { - // backward - _animVars.set("isInputForward", false); - _animVars.set("isInputBackward", true); - _animVars.set("isInputRight", false); - _animVars.set("isInputLeft", false); - _animVars.set("isNotInput", false); - } - } else if (abs(params.inputX) > INPUT_DEADZONE_THRESHOLD && abs(params.inputX) > abs(params.inputZ)) { - if (params.inputX > INPUT_DEADZONE_THRESHOLD) { + if (abs(params.inputX) <= INPUT_DEADZONE_THRESHOLD && abs(params.inputZ) <= INPUT_DEADZONE_THRESHOLD) { + // no WASD input + _animVars.set("isInputForward", false); + _animVars.set("isInputBackward", false); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", true); + } else if ( abs(params.inputZ) >= abs(params.inputX) ) { + if (params.inputZ > 0) { + // forward + _animVars.set("isInputForward", true); + _animVars.set("isInputBackward", false); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", false); + } else { + // backward + _animVars.set("isInputForward", false); + _animVars.set("isInputBackward", true); + _animVars.set("isInputRight", false); + _animVars.set("isInputLeft", false); + _animVars.set("isNotInput", false); + } + } else { + if (params.inputX > 0) { // right _animVars.set("isInputForward", false); _animVars.set("isInputBackward", false); @@ -2196,15 +2202,9 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo _animVars.set("isInputLeft", true); _animVars.set("isNotInput", false); } - } else if (params.inputX <= INPUT_DEADZONE_THRESHOLD && params.inputZ <= INPUT_DEADZONE_THRESHOLD) { - // no WASD input - _animVars.set("isInputForward", false); - _animVars.set("isInputBackward", false); - _animVars.set("isInputRight", false); - _animVars.set("isInputLeft", false); - _animVars.set("isNotInput", true); } + _headEnabled = params.primaryControllerFlags[PrimaryControllerType_Head] & (uint8_t)ControllerFlags::Enabled; bool leftHandEnabled = params.primaryControllerFlags[PrimaryControllerType_LeftHand] & (uint8_t)ControllerFlags::Enabled; bool rightHandEnabled = params.primaryControllerFlags[PrimaryControllerType_RightHand] & (uint8_t)ControllerFlags::Enabled; From 2a1258968aa3113206a3a27be7584bddcdf24453 Mon Sep 17 00:00:00 2001 From: dooglifeSF <41022919+dooglifeSF@users.noreply.github.com> Date: Wed, 9 Oct 2019 10:10:45 -0700 Subject: [PATCH 4/5] Change macro to const float, use floats in control flow. --- libraries/animation/src/Rig.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index d84b04c800..432f9387fa 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -2161,7 +2161,7 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo } //deadzone constant - #define INPUT_DEADZONE_THRESHOLD 0.05f + const float INPUT_DEADZONE_THRESHOLD = 0.05f; if (abs(params.inputX) <= INPUT_DEADZONE_THRESHOLD && abs(params.inputZ) <= INPUT_DEADZONE_THRESHOLD) { // no WASD input @@ -2171,7 +2171,7 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo _animVars.set("isInputLeft", false); _animVars.set("isNotInput", true); } else if ( abs(params.inputZ) >= abs(params.inputX) ) { - if (params.inputZ > 0) { + if (params.inputZ > 0.0f) { // forward _animVars.set("isInputForward", true); _animVars.set("isInputBackward", false); @@ -2187,7 +2187,7 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo _animVars.set("isNotInput", false); } } else { - if (params.inputX > 0) { + if (params.inputX > 0.0f) { // right _animVars.set("isInputForward", false); _animVars.set("isInputBackward", false); From 85b681e70e82a1b28986166f735d6c5238b58590 Mon Sep 17 00:00:00 2001 From: dooglifeSF <41022919+dooglifeSF@users.noreply.github.com> Date: Wed, 9 Oct 2019 11:07:14 -0700 Subject: [PATCH 5/5] switch abs() to fabsf() --- libraries/animation/src/Rig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 432f9387fa..0be05f843e 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -2163,14 +2163,14 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo //deadzone constant const float INPUT_DEADZONE_THRESHOLD = 0.05f; - if (abs(params.inputX) <= INPUT_DEADZONE_THRESHOLD && abs(params.inputZ) <= INPUT_DEADZONE_THRESHOLD) { + if (fabsf(params.inputX) <= INPUT_DEADZONE_THRESHOLD && fabsf(params.inputZ) <= INPUT_DEADZONE_THRESHOLD) { // no WASD input _animVars.set("isInputForward", false); _animVars.set("isInputBackward", false); _animVars.set("isInputRight", false); _animVars.set("isInputLeft", false); _animVars.set("isNotInput", true); - } else if ( abs(params.inputZ) >= abs(params.inputX) ) { + } else if (fabsf(params.inputZ) >= fabsf(params.inputX)) { if (params.inputZ > 0.0f) { // forward _animVars.set("isInputForward", true);