// Returns the rotational value read directly from the rotations before being applied to the mesh. public float GetFingerValueRaw(BKI_Hand hand, BKI_Finger finger) { BKI_HandValues handVals = null; switch (hand) { case BKI_Hand.right: handVals = rightHandValues; break; case BKI_Hand.left: handVals = leftHandValues; break; } switch (finger) { case BKI_Finger.thumb: return(handVals.GetFingerValueRaw(finger)); case BKI_Finger.index: return(handVals.GetFingerValueRaw(finger)); case BKI_Finger.middle: return(handVals.GetFingerValueRaw(finger)); case BKI_Finger.ring: return(handVals.GetFingerValueRaw(finger)); case BKI_Finger.pinky: return(handVals.GetFingerValueRaw(finger)); default: return(0); } }
public void RegisterPickupable(Collider c, BKI_Hand hand, BKI_Finger finger, BKI_FreezeTypes freezeType) { if (c.gameObject == null) { return; } switch (hand) { case BKI_Hand.right: if (freezeType == BKI_FreezeTypes.toProximal && registeredPickupableRight[(int)finger] != null) { return; } if (c.GetComponent <IBetterPickupable>() != null && registeredPickupableRight[(int)finger] == null) { registeredPickupableRight[(int)finger] = c.GetComponent <IBetterPickupable>().GetPickupable(); } break; case BKI_Hand.left: if (freezeType == BKI_FreezeTypes.toProximal && registeredPickupableLeft[(int)finger] != null) { return; } if (c.GetComponent <IBetterPickupable>() != null && registeredPickupableLeft[(int)finger] == null) { registeredPickupableLeft[(int)finger] = c.GetComponent <IBetterPickupable>().GetPickupable(); } break; } }
public void FreezeFingerInArray(BKI_Finger finger, BKI_FreezeTypes freezeType, Collider identifier) { // If the object that calls the freeze is already in the registry, return. We don't want duplicates to enter the array. if (boneJointFrozenValuesRegisteredCols.Contains(identifier)) { return; } else { boneJointFrozenValuesRegisteredCols.Add(identifier); } switch (freezeType) { case BKI_FreezeTypes.toProximal: FreezeToProximal(finger); break; case BKI_FreezeTypes.toTip: FreezeToTip(finger); break; default: return; } }
// Returns true or false depending on whether the read value exceeds the demanded deadzone. // Acts as a mirror of Unity.Input.GetButton() for the BetterKnuckleGestures library. public bool IsFingerDown(BKI_Hand hand, BKI_Finger finger) { BKI_HandValues handVals = null; switch (hand) { case BKI_Hand.right: handVals = rightHandValues; break; case BKI_Hand.left: handVals = leftHandValues; break; } switch (finger) { case BKI_Finger.thumb: return(handVals.GetFingerValue(finger) >= DEFAULT_PRESSED_DEADZONE); case BKI_Finger.index: return(handVals.GetFingerValue(finger) >= DEFAULT_PRESSED_DEADZONE); case BKI_Finger.middle: return(handVals.GetFingerValue(finger) >= DEFAULT_PRESSED_DEADZONE); case BKI_Finger.ring: return(handVals.GetFingerValue(finger) >= DEFAULT_PRESSED_DEADZONE); case BKI_Finger.pinky: return(handVals.GetFingerValue(finger) >= DEFAULT_PRESSED_DEADZONE); default: return(false); } }
private void FreezeFinger(BKI_Hand hand, BKI_Finger finger, BKI_FreezeTypes freezeType, Collider c) { switch (hand) { case BKI_Hand.right: if (BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.right, finger) <= 0.05f) { break; } fingerFrozenRightHand[(int)finger] = true; fingerFrozenValueRightHand[(int)finger] = Mathf.Clamp(BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.right, finger) - 0.1f, 0.1f, 1f); rightHandSkeleton.FreezeFingerInArray(finger, freezeType, c); break; case BKI_Hand.left: if (BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.left, finger) <= 0.05f) { break; } fingerFrozenLeftHand[(int)finger] = true; fingerFrozenValueLeftHand[(int)finger] = Mathf.Clamp(BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.left, finger) - 0.1f, 0.1f, 1f); leftHandSkeleton.FreezeFingerInArray(finger, freezeType, c); break; } RegisterPickupable(c, hand, finger, freezeType); }
// Flags the declared finger as no longer frozen. public void UnfreezeFinger(BKI_Finger finger, BKI_FreezeTypes type) { switch (type) { case BKI_FreezeTypes.toProximal: switch (finger) { case BKI_Finger.thumb: isThumbProxFrozen = false; break; case BKI_Finger.index: isIndexProxFrozen = false; break; case BKI_Finger.middle: isMiddleProxFrozen = false; break; case BKI_Finger.ring: isRingProxFrozen = false; break; case BKI_Finger.pinky: isPinkyProxFrozen = false; break; } break; case BKI_FreezeTypes.toTip: switch (finger) { case BKI_Finger.thumb: isThumbTipFrozen = false; break; case BKI_Finger.index: isIndexTipFrozen = false; break; case BKI_Finger.middle: isMiddleTipFrozen = false; break; case BKI_Finger.ring: isRingTipFrozen = false; break; case BKI_Finger.pinky: isPinkyTipFrozen = false; break; } break; } }
private void RefreezeFinger(BKI_Hand hand, BKI_Finger finger, BKI_FreezeTypes freezeType, Collider c) { if (IsValueOverFrozenValue(hand, finger)) { UnfreezeFinger(hand, finger, freezeType, c); } else { FreezeFinger(hand, finger, freezeType, c); } }
public BKI_PickupableObject GetRegisteredPickupable(BKI_Hand hand, BKI_Finger finger) { if (hand == BKI_Hand.right) { return((IsHandGripping(BKI_Hand.right)) ? registeredPickupableRight[(int)finger] : null); } else { return((IsHandGripping(BKI_Hand.left)) ? registeredPickupableLeft[(int)finger] : null); } }
public bool IsValueOverFrozenValue(BKI_Hand h, BKI_Finger f) { switch (h) { case BKI_Hand.right: return(fingerFrozenValueRightHand[(int)f] > BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.right, f) || BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.right, f) < 0.1f); case BKI_Hand.left: return(fingerFrozenValueLeftHand[(int)f] > BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.left, f) || BKI_FingerCurler.BKI_Curler_Instance.GetFingerValueRaw(BKI_Hand.left, f) < 0.1f); default: return(false); } }
private void UnfreezeToProximal(BKI_Finger finger) { int startNum; int exitNum; switch (finger) { case BKI_Finger.thumb: startNum = thumbRange[0]; exitNum = startNum + 1; break; case BKI_Finger.index: startNum = indexRange[0]; exitNum = startNum + 2; break; case BKI_Finger.middle: startNum = middleRange[0]; exitNum = startNum + 2; break; case BKI_Finger.ring: startNum = ringRange[0]; exitNum = startNum + 2; break; case BKI_Finger.pinky: startNum = pinkyRange[0]; exitNum = startNum + 2; break; default: return; } UnfreezeFinger(finger, BKI_FreezeTypes.toProximal); for (int i = startNum; i < exitNum; i++) { boneJointFrozenValues[i]--; if (boneJointFrozenValues[i] < 0) { boneJointFrozenValues[i] = 0; } } }
public void UnregisterPickupable(Collider c, BKI_Hand hand, BKI_Finger finger, BKI_FreezeTypes freezeType) { if (c.GetComponent <IBetterPickupable>() == null) { return; } switch (hand) { case BKI_Hand.right: registeredPickupableRight[(int)finger] = null; break; case BKI_Hand.left: registeredPickupableLeft[(int)finger] = null; break; } }
private void UnfreezeFinger(BKI_Hand hand, BKI_Finger finger, BKI_FreezeTypes freezeType, Collider c) { switch (hand) { case BKI_Hand.right: fingerFrozenRightHand[(int)finger] = false; fingerFrozenValueRightHand[(int)finger] = 0; rightHandSkeleton.UnfreezeFingerInArray(finger, freezeType, c); break; case BKI_Hand.left: fingerFrozenLeftHand[(int)finger] = false; fingerFrozenValueLeftHand[(int)finger] = 0; leftHandSkeleton.UnfreezeFingerInArray(finger, freezeType, c); break; } UnregisterPickupable(c, hand, finger, freezeType); }
private void FreezeToTip(BKI_Finger finger) { int startNum; int exitNum; switch (finger) { case BKI_Finger.thumb: startNum = thumbRange[0]; exitNum = startNum + thumbRange.Count; break; case BKI_Finger.index: startNum = indexRange[0]; exitNum = startNum + indexRange.Count; break; case BKI_Finger.middle: startNum = middleRange[0]; exitNum = startNum + middleRange.Count; break; case BKI_Finger.ring: startNum = ringRange[0]; exitNum = startNum + ringRange.Count; break; case BKI_Finger.pinky: startNum = pinkyRange[0]; exitNum = startNum + pinkyRange.Count; break; default: return; } FreezeFinger(finger, BKI_FreezeTypes.toTip); for (int i = startNum; i < exitNum; i++) { boneJointFrozenValues[i]++; } }
// Returns the float value of the specified finger. public float GetFingerValueRaw(BKI_Finger finger) { switch (finger) { case BKI_Finger.thumb: return(rawThumbZ); case BKI_Finger.index: return(rawIndexZ); case BKI_Finger.middle: return(rawMiddleZ); case BKI_Finger.ring: return(rawRingZ); case BKI_Finger.pinky: return(rawPinkyZ); default: return(0); } }
// Simple callback that returns whether or not the finger is marked as frozen. public bool IsFingerFrozen(BKI_Finger finger) { switch (finger) { case BKI_Finger.thumb: return(isThumbTipFrozen); case BKI_Finger.index: return(isIndexTipFrozen); case BKI_Finger.middle: return(isMiddleTipFrozen); case BKI_Finger.ring: return(isRingTipFrozen); case BKI_Finger.pinky: return(isPinkyTipFrozen); default: return(false); } }
// Returns the float value of the specified finger. public float GetFingerValue(BKI_Finger finger) { switch (finger) { case BKI_Finger.thumb: return(meshThumbZ); case BKI_Finger.index: return(meshIndexZ); case BKI_Finger.middle: return(meshMiddleZ); case BKI_Finger.ring: return(meshRingZ); case BKI_Finger.pinky: return(meshPinkyZ); default: return(0); } }
// Instantiating and assigning the colliders of all 10 fingers. private void SetupFingerTriggers() { if (prefab == null) { Debug.LogError("Collider prefab is invalid. Quitting initialisation."); return; } // Left hand tip collider setup code. tipTriggersLeftHand = new List <BKI_FingerCollider>(); for (int i = 0; i < 5; i++) { BKI_FingerCollider bcf = Instantiate(prefab.gameObject).GetComponent <BKI_FingerCollider>(); Transform parentObj = null; BKI_Finger finger = (BKI_Finger)i; switch (finger) { case BKI_Finger.thumb: parentObj = leftHandSkeleton.thumbTip; break; case BKI_Finger.index: parentObj = leftHandSkeleton.indexTip; break; case BKI_Finger.middle: parentObj = leftHandSkeleton.middleTip; break; case BKI_Finger.ring: parentObj = leftHandSkeleton.ringTip; break; case BKI_Finger.pinky: parentObj = leftHandSkeleton.pinkyTip; break; default: Debug.LogError("Parent transform is invalid. Quitting initialisation."); return; } System.Action <Collider> onEnterCallback = (c) => FreezeFinger(BKI_Hand.left, finger, BKI_FreezeTypes.toTip, c); System.Action <Collider> onStayCallback = (c) => RefreezeFinger(BKI_Hand.left, finger, BKI_FreezeTypes.toTip, c); System.Action <Collider> onExitCallback = (c) => UnfreezeFinger(BKI_Hand.left, finger, BKI_FreezeTypes.toTip, c); System.Action <Collider> registerCall = (c) => RegisterPickupable(c, BKI_Hand.left, finger, BKI_FreezeTypes.toTip); System.Action <Collider> unregisterCall = (c) => UnregisterPickupable(c, BKI_Hand.left, finger, BKI_FreezeTypes.toTip); bcf.Initialise(this, parentObj, leftHandSkeleton, onEnterCallback, onStayCallback, onExitCallback, -0.005f, registerCall, unregisterCall); tipTriggersLeftHand.Add(bcf); } // Right hand tip collider setup code. tipTriggersRightHand = new List <BKI_FingerCollider>(); for (int i = 0; i < 5; i++) { BKI_FingerCollider bcf = Instantiate(prefab.gameObject).GetComponent <BKI_FingerCollider>(); Transform parentObj = null; BKI_Finger finger = (BKI_Finger)i; switch (finger) { case BKI_Finger.thumb: parentObj = rightHandSkeleton.thumbTip; break; case BKI_Finger.index: parentObj = rightHandSkeleton.indexTip; break; case BKI_Finger.middle: parentObj = rightHandSkeleton.middleTip; break; case BKI_Finger.ring: parentObj = rightHandSkeleton.ringTip; break; case BKI_Finger.pinky: parentObj = rightHandSkeleton.pinkyTip; break; default: Debug.LogError("Parent transform is invalid. Quitting initialisation."); return; } System.Action <Collider> onEnterCallback = (c) => FreezeFinger(BKI_Hand.right, finger, BKI_FreezeTypes.toTip, c); System.Action <Collider> onStayCallback = (c) => RefreezeFinger(BKI_Hand.right, finger, BKI_FreezeTypes.toTip, c); System.Action <Collider> onExitCallback = (c) => UnfreezeFinger(BKI_Hand.right, finger, BKI_FreezeTypes.toTip, c); System.Action <Collider> registerCall = (c) => RegisterPickupable(c, BKI_Hand.right, finger, BKI_FreezeTypes.toTip); System.Action <Collider> unregisterCall = (c) => UnregisterPickupable(c, BKI_Hand.right, finger, BKI_FreezeTypes.toTip); bcf.Initialise(this, parentObj, rightHandSkeleton, onEnterCallback, onStayCallback, onExitCallback, -0.005f, registerCall, unregisterCall); tipTriggersRightHand.Add(bcf); } // Left hand proximal trigger setup code. proxTriggersLeftHand = new List <BKI_FingerCollider>(); for (int i = 0; i < 5; i++) { BKI_FingerCollider bcf = Instantiate(prefab.gameObject).GetComponent <BKI_FingerCollider>(); Transform parentObj = null; BKI_Finger finger = (BKI_Finger)i; switch (finger) { case BKI_Finger.thumb: parentObj = leftHandSkeleton.thumbMiddle; break; case BKI_Finger.index: parentObj = leftHandSkeleton.indexMiddle; break; case BKI_Finger.middle: parentObj = leftHandSkeleton.middleMiddle; break; case BKI_Finger.ring: parentObj = leftHandSkeleton.ringMiddle; break; case BKI_Finger.pinky: parentObj = leftHandSkeleton.pinkyMiddle; break; default: Debug.LogError("Parent transform is invalid. Quitting initialisation."); return; } System.Action <Collider> onEnterCallback = (c) => FreezeFinger(BKI_Hand.left, finger, BKI_FreezeTypes.toProximal, c); System.Action <Collider> onStayCallback = (c) => RefreezeFinger(BKI_Hand.left, finger, BKI_FreezeTypes.toProximal, c); System.Action <Collider> onExitCallback = (c) => UnfreezeFinger(BKI_Hand.left, finger, BKI_FreezeTypes.toProximal, c); System.Action <Collider> registerCall = (c) => RegisterPickupable(c, BKI_Hand.left, finger, BKI_FreezeTypes.toProximal); System.Action <Collider> unregisterCall = (c) => UnregisterPickupable(c, BKI_Hand.left, finger, BKI_FreezeTypes.toProximal); bcf.Initialise(this, parentObj, leftHandSkeleton, onEnterCallback, onStayCallback, onExitCallback, -0.015f, registerCall, unregisterCall); proxTriggersLeftHand.Add(bcf); } // Right hand proximal trigger setup code. proxTriggersRightHand = new List <BKI_FingerCollider>(); for (int i = 0; i < 5; i++) { BKI_FingerCollider bcf = Instantiate(prefab.gameObject).GetComponent <BKI_FingerCollider>(); Transform parentObj = null; BKI_Finger finger = (BKI_Finger)i; switch (finger) { case BKI_Finger.thumb: parentObj = rightHandSkeleton.thumbMiddle; break; case BKI_Finger.index: parentObj = rightHandSkeleton.indexMiddle; break; case BKI_Finger.middle: parentObj = rightHandSkeleton.middleMiddle; break; case BKI_Finger.ring: parentObj = rightHandSkeleton.ringMiddle; break; case BKI_Finger.pinky: parentObj = rightHandSkeleton.pinkyMiddle; break; default: Debug.LogError("Parent transform is invalid. Quitting initialisation."); return; } System.Action <Collider> onEnterCallback = (c) => FreezeFinger(BKI_Hand.right, finger, BKI_FreezeTypes.toProximal, c); System.Action <Collider> onStayCallback = (c) => RefreezeFinger(BKI_Hand.right, finger, BKI_FreezeTypes.toProximal, c); System.Action <Collider> onExitCallback = (c) => UnfreezeFinger(BKI_Hand.right, finger, BKI_FreezeTypes.toProximal, c); System.Action <Collider> registerCall = (c) => RegisterPickupable(c, BKI_Hand.right, finger, BKI_FreezeTypes.toProximal); System.Action <Collider> unregisterCall = (c) => UnregisterPickupable(c, BKI_Hand.right, finger, BKI_FreezeTypes.toProximal); bcf.Initialise(this, parentObj, rightHandSkeleton, onEnterCallback, onStayCallback, onExitCallback, -0.015f, registerCall, unregisterCall); proxTriggersRightHand.Add(bcf); } }
public void SetFingerState(BKI_Finger f, BKI_FingerState v) { fingerStates[(int)f] = v; }
public BKI_FingerState GetFingerState(BKI_Finger f) { return(fingerStates[(int)f]); }
// Returns a value between 0 and 1 based on the raw rotation values before they get assigned to the hand mesh. public float GetFingerValueMapped(BKI_Finger finger) { return(ClampedMap(proximalRotations[(int)finger], magicNumbers[(int)finger].x, magicNumbers[(int)finger].y, 0, 1)); }
public bool IsValueInAllowedRange(BKI_Finger finger, float value) { return(value >= ranges[(int)finger].x && value <= ranges[(int)finger].y); }