diff --git a/interface/resources/avatar/animations/touch_thumb_closed_left.fbx b/interface/resources/avatar/animations/touch_thumb_closed_left.fbx new file mode 100644 index 0000000000..5a731144ba Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_closed_left.fbx differ diff --git a/interface/resources/avatar/animations/touch_thumb_closed_right.fbx b/interface/resources/avatar/animations/touch_thumb_closed_right.fbx new file mode 100644 index 0000000000..d947cdb1fd Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_closed_right.fbx differ diff --git a/interface/resources/avatar/animations/touch_thumb_open_left.fbx b/interface/resources/avatar/animations/touch_thumb_open_left.fbx new file mode 100644 index 0000000000..b50cbd8541 Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_open_left.fbx differ diff --git a/interface/resources/avatar/animations/touch_thumb_open_right.fbx b/interface/resources/avatar/animations/touch_thumb_open_right.fbx new file mode 100644 index 0000000000..ca861d0250 Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_open_right.fbx differ diff --git a/interface/resources/avatar/animations/touch_thumb_point_closed_left.fbx b/interface/resources/avatar/animations/touch_thumb_point_closed_left.fbx new file mode 100644 index 0000000000..bf8023b54a Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_point_closed_left.fbx differ diff --git a/interface/resources/avatar/animations/touch_thumb_point_closed_right.fbx b/interface/resources/avatar/animations/touch_thumb_point_closed_right.fbx new file mode 100644 index 0000000000..46c0cd48c4 Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_point_closed_right.fbx differ diff --git a/interface/resources/avatar/animations/touch_thumb_point_open_left.fbx b/interface/resources/avatar/animations/touch_thumb_point_open_left.fbx new file mode 100644 index 0000000000..23c36f2172 Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_point_open_left.fbx differ diff --git a/interface/resources/avatar/animations/touch_thumb_point_open_right.fbx b/interface/resources/avatar/animations/touch_thumb_point_open_right.fbx new file mode 100644 index 0000000000..5016832aab Binary files /dev/null and b/interface/resources/avatar/animations/touch_thumb_point_open_right.fbx differ diff --git a/interface/resources/avatar/avatar-animation.json b/interface/resources/avatar/avatar-animation.json index ddcb7ff20a..975f01855d 100644 --- a/interface/resources/avatar/avatar-animation.json +++ b/interface/resources/avatar/avatar-animation.json @@ -129,7 +129,9 @@ "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isRightIndexPoint", "state": "rightIndexPoint" } + { "var": "isRightIndexPoint", "state": "rightIndexPoint" }, + { "var": "isRightThumbRaise", "state": "rightThumbRaise" }, + { "var": "isRightIndexPointAndThumbRaise", "state": "rightIndexPointAndThumbRaise" } ] }, { @@ -137,7 +139,29 @@ "interpTarget": 15, "interpDuration": 3, "transitions": [ - { "var": "isRightHandGrasp", "state": "rightHandGrasp" } + { "var": "isRightHandGrasp", "state": "rightHandGrasp" }, + { "var": "isRightThumbRaise", "state": "rightThumbRaise" }, + { "var": "isRightIndexPointAndThumbRaise", "state": "rightIndexPointAndThumbRaise" } + ] + }, + { + "id": "rightThumbRaise", + "interpTarget": 15, + "interpDuration": 3, + "transitions": [ + { "var": "isRightHandGrasp", "state": "rightHandGrasp" }, + { "var": "isRightIndexPoint", "state": "rightIndexPoint" }, + { "var": "isRightIndexPointAndThumbRaise", "state": "rightIndexPointAndThumbRaise" } + ] + }, + { + "id": "rightIndexPointAndThumbRaise", + "interpTarget": 15, + "interpDuration": 3, + "transitions": [ + { "var": "isRightHandGrasp", "state": "rightHandGrasp" }, + { "var": "isRightIndexPoint", "state": "rightIndexPoint" }, + { "var": "isRightThumbRaise", "state": "rightThumbRaise" } ] } ] @@ -210,6 +234,74 @@ "children": [] } ] + }, + { + "id": "rightThumbRaise", + "type": "blendLinear", + "data": { + "alpha": 0.0, + "alphaVar": "rightHandGraspAlpha" + }, + "children": [ + { + "id": "rightThumbRaiseOpen", + "type": "clip", + "data": { + "url": "animations/touch_thumb_open_right.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "rightThumbRaiseClosed", + "type": "clip", + "data": { + "url": "animations/touch_thumb_closed_right.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + } + ] + }, + { + "id": "rightIndexPointAndThumbRaise", + "type": "blendLinear", + "data": { + "alpha": 0.0, + "alphaVar": "rightHandGraspAlpha" + }, + "children": [ + { + "id": "rightIndexPointAndThumbRaiseOpen", + "type": "clip", + "data": { + "url": "animations/touch_thumb_point_open_right.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "rightIndexPointAndThumbRaiseClosed", + "type": "clip", + "data": { + "url": "animations/touch_thumb_point_closed_right.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + } + ] } ] }, @@ -233,7 +325,9 @@ "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isLeftIndexPoint", "state": "leftIndexPoint" } + { "var": "isLeftIndexPoint", "state": "leftIndexPoint" }, + { "var": "isLeftThumbRaise", "state": "leftThumbRaise" }, + { "var": "isLeftIndexPointAndThumbRaise", "state": "leftIndexPointAndThumbRaise" } ] }, { @@ -241,7 +335,29 @@ "interpTarget": 15, "interpDuration": 3, "transitions": [ - { "var": "isLeftHandGrasp", "state": "leftHandGrasp" } + { "var": "isLeftHandGrasp", "state": "leftHandGrasp" }, + { "var": "isLeftThumbRaise", "state": "leftThumbRaise" }, + { "var": "isLeftIndexPointAndThumbRaise", "state": "leftIndexPointAndThumbRaise" } + ] + }, + { + "id": "leftThumbRaise", + "interpTarget": 15, + "interpDuration": 3, + "transitions": [ + { "var": "isLeftHandGrasp", "state": "leftHandGrasp" }, + { "var": "isLeftIndexPoint", "state": "leftIndexPoint" }, + { "var": "isLeftIndexPointAndThumbRaise", "state": "leftIndexPointAndThumbRaise" } + ] + }, + { + "id": "leftIndexPointAndThumbRaise", + "interpTarget": 15, + "interpDuration": 3, + "transitions": [ + { "var": "isLeftHandGrasp", "state": "leftHandGrasp" }, + { "var": "isLeftIndexPoint", "state": "leftIndexPoint" }, + { "var": "isLeftThumbRaise", "state": "leftThumbRaise" } ] } ] @@ -314,6 +430,74 @@ "children": [] } ] + }, + { + "id": "leftThumbRaise", + "type": "blendLinear", + "data": { + "alpha": 0.0, + "alphaVar": "leftHandGraspAlpha" + }, + "children": [ + { + "id": "leftThumbRaiseOpen", + "type": "clip", + "data": { + "url": "animations/touch_thumb_open_left.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "leftThumbRaiseClosed", + "type": "clip", + "data": { + "url": "animations/touch_thumb_closed_left.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + } + ] + }, + { + "id": "leftIndexPointAndThumbRaise", + "type": "blendLinear", + "data": { + "alpha": 0.0, + "alphaVar": "leftHandGraspAlpha" + }, + "children": [ + { + "id": "leftIndexPointAndThumbRaiseOpen", + "type": "clip", + "data": { + "url": "animations/touch_thumb_point_open_left.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "leftIndexPointAndThumbRaiseClosed", + "type": "clip", + "data": { + "url": "animations/touch_thumb_point_closed_left.fbx", + "startFrame": 15.0, + "endFrame": 15.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + } + ] } ] }, diff --git a/scripts/system/controllers/squeezeHands.js b/scripts/system/controllers/squeezeHands.js index 622dc9894b..75e6249dd6 100644 --- a/scripts/system/controllers/squeezeHands.js +++ b/scripts/system/controllers/squeezeHands.js @@ -25,9 +25,14 @@ var OVERLAY_RAMP_RATE = 8.0; var animStateHandlerID; -var isPointingIndex = false; +var isBothIndexesPointing = false; var HIFI_POINT_INDEX_MESSAGE_CHANNEL = "Hifi-Point-Index"; +var isLeftIndexPointing = false; +var isRightIndexPointing = false; +var isLeftThumbRaised = false; +var isRightThumbRaised = false; + function clamp(val, min, max) { return Math.min(Math.max(val, min), max); } @@ -47,8 +52,8 @@ function init() { [ "leftHandOverlayAlpha", "leftHandGraspAlpha", "rightHandOverlayAlpha", "rightHandGraspAlpha", - "isLeftHandGrasp", "isLeftIndexPoint", - "isRightHandGrasp", "isRightIndexPoint" + "isLeftHandGrasp", "isLeftIndexPoint", "isLeftThumbRaise", "isLeftIndexPointAndThumbRaise", + "isRightHandGrasp", "isRightIndexPoint", "isRightThumbRaise", "isRightIndexPointAndThumbRaise", ] ); Messages.subscribe(HIFI_POINT_INDEX_MESSAGE_CHANNEL); @@ -61,10 +66,14 @@ function animStateHandler(props) { leftHandGraspAlpha: lastLeftTrigger, rightHandOverlayAlpha: rightHandOverlayAlpha, rightHandGraspAlpha: lastRightTrigger, - isLeftHandGrasp: !isPointingIndex, - isLeftIndexPoint: isPointingIndex, - isRightHandGrasp: !isPointingIndex, - isRightIndexPoint: isPointingIndex + isLeftHandGrasp: !isBothIndexesPointing && !isLeftIndexPointing && !isLeftThumbRaised, + isLeftIndexPoint: (isBothIndexesPointing || isLeftIndexPointing) && !isLeftThumbRaised, + isLeftThumbRaise: !isBothIndexesPointing && !isLeftIndexPointing && isLeftThumbRaised, + isLeftIndexPointAndThumbRaise: (isBothIndexesPointing || isLeftIndexPointing) && isLeftThumbRaised, + isRightHandGrasp: !isBothIndexesPointing && !isRightIndexPointing && !isRightThumbRaised, + isRightIndexPoint: (isBothIndexesPointing || isRightIndexPointing) && !isRightThumbRaised, + isRightThumbRaise: !isBothIndexesPointing && !isRightIndexPointing && isRightThumbRaised, + isRightIndexPointAndThumbRaise: (isBothIndexesPointing || isRightIndexPointing) && isRightThumbRaised }; } @@ -92,6 +101,12 @@ function update(dt) { } else { rightHandOverlayAlpha = clamp(rightHandOverlayAlpha - OVERLAY_RAMP_RATE * dt, 0, 1); } + + // Pointing index fingers and raising thumbs + isLeftIndexPointing = leftHandPose.valid && Controller.getValue(Controller.Standard.LeftIndexPoint) === 1; + isRightIndexPointing = rightHandPose.valid && Controller.getValue(Controller.Standard.RightIndexPoint) === 1; + isLeftThumbRaised = leftHandPose.valid && Controller.getValue(Controller.Standard.LeftThumbUp) === 1; + isRightThumbRaised = rightHandPose.valid && Controller.getValue(Controller.Standard.RightThumbUp) === 1; } function handleMessages(channel, message, sender) { @@ -99,7 +114,7 @@ function handleMessages(channel, message, sender) { var data = JSON.parse(message); if (data.pointIndex !== undefined) { print("pointIndex: " + data.pointIndex); - isPointingIndex = data.pointIndex; + isBothIndexesPointing = data.pointIndex; } } }