// 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;
            }
        }
예제 #3
0
        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);
        }
예제 #6
0
        // 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);
            }
        }
예제 #10
0
        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);
        }
예제 #13
0
        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);
            }
        }
예제 #15
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);
            }
        }
예제 #18
0
 public void SetFingerState(BKI_Finger f, BKI_FingerState v)
 {
     fingerStates[(int)f] = v;
 }
예제 #19
0
 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);
 }