Esempio n. 1
0
        public override bool CheckConditions()
        {
            var leftThumb = GestureSystem.GetLimb(InteractionLimb.LeftThumbTip);
            var leftIndex = GestureSystem.GetLimb(InteractionLimb.LeftIndexTip);

            var rightThumb = GestureSystem.GetLimb(InteractionLimb.RightThumbTip);
            var rightIndex = GestureSystem.GetLimb(InteractionLimb.RightIndexTip);

            if (leftThumb == null || leftIndex == null || rightThumb == null || rightIndex == null)
            {
                return(IsGestureActive);
            }

            if (IsGestureActive)
            {
                // if the gesture is already active, we only need to check if the user is still pinching their fingers together
                var isPinchingLeft  = GestureUtil.IsInProximity(DeactivationDistance, new[] { leftThumb, leftIndex });
                var isPinchingRight = GestureUtil.IsInProximity(DeactivationDistance, new[] { rightThumb, rightIndex });

                if (isPinchingLeft && isPinchingRight)
                {
                    // gesture still active
                    GesturePosLeft   = GestureUtil.GetCenterPosition(new[] { leftThumb, leftIndex });
                    GesturePosRight  = GestureUtil.GetCenterPosition(new[] { rightThumb, rightIndex });
                    GesturePosCenter = GestureUtil.GetCenterPosition(new[] { leftThumb, leftIndex, rightThumb, rightIndex });

                    RaiseGestureActiveEvent();
                }
                else
                {
                    // one of the hands stopped pinching - stop gesture
                    IsGestureActive = false;
                    RaiseGestureStopEvent();
                }
            }
            else
            {
                // gesture not active, so we'll check if the gesture is initiated
                var isPinchingLeft   = GestureUtil.CollidesWith(leftThumb, leftIndex);
                var isPinchingRight  = GestureUtil.CollidesWith(rightThumb, rightIndex);
                var areHandsTogether = GestureUtil.IsInProximity(ActivationDistance, new[] { leftThumb, leftIndex, rightThumb, rightIndex });


                if (isPinchingLeft && isPinchingRight && areHandsTogether)
                {
                    IsGestureActive = true;

                    GesturePosLeft   = GestureUtil.GetCenterPosition(new[] { leftThumb, leftIndex });
                    GesturePosRight  = GestureUtil.GetCenterPosition(new[] { rightThumb, rightIndex });
                    GesturePosCenter = GestureUtil.GetCenterPosition(new[] { leftThumb, leftIndex, rightThumb, rightIndex });

                    RaiseGestureStartEvent();
                }
            }


            return(IsGestureActive);
        }
Esempio n. 2
0
    public override bool CheckConditions()
    {
        var limbs = GestureSystem.GetLimbs(new[]
        {
            InteractionLimb.LeftThumbTip,
            InteractionLimb.LeftThumbBase,
            InteractionLimb.LeftIndexTip,
            InteractionLimb.LeftIndexBase,

            InteractionLimb.RightThumbTip,
            InteractionLimb.RightThumbBase,
            InteractionLimb.RightIndexTip,
            InteractionLimb.RightIndexBase
        });

        if (limbs.Values.Any((l) => l == null))
        {
            return(IsGestureActive);
        }

        var status = CheckStatus(limbs);

        if (status == GestureStatus.Starting)
        {
            IsGestureActive = true;
            RaiseGestureStartEvent();
        }
        else if (status == GestureStatus.Active)
        {
            RaiseGestureActiveEvent();
        }
        else if (status == GestureStatus.Stopping)
        {
            IsGestureActive = false;
            RaiseGestureStopEvent();
        }

        return(IsGestureActive);
    }
Esempio n. 3
0
    public override bool CheckConditions()
    {
        if (TriggerHand == Hand.Either)
        {
            var leftThumb = GestureSystem.GetLimb(InteractionLimb.LeftThumbTip);
            var leftIndex = GestureSystem.GetLimb(InteractionLimb.LeftIndexTip);

            var rightThumb = GestureSystem.GetLimb(InteractionLimb.RightThumbTip);
            var rightIndex = GestureSystem.GetLimb(InteractionLimb.RightIndexTip);

            if (leftThumb == null || leftIndex == null || rightThumb == null || rightIndex == null)
            {
                return(IsGestureActive);
            }

            var leftStatus  = CheckStatus(leftThumb, leftIndex);
            var rightStatus = CheckStatus(rightThumb, rightIndex);

            if (leftStatus == GestureStatus.Starting || rightStatus == GestureStatus.Starting)
            {
                if (leftStatus == GestureStatus.Starting)
                {
                    _activePosition = leftIndex.transform.position;
                }
                else
                {
                    _activePosition = rightIndex.transform.position;
                }

                IsGestureActive = true;
                RaiseGestureStartEvent();
            }
            else if (leftStatus == GestureStatus.Active || rightStatus == GestureStatus.Active)
            {
                if (leftStatus == GestureStatus.Active)
                {
                    _activePosition = leftIndex.transform.position;
                }
                else
                {
                    _activePosition = rightIndex.transform.position;
                }

                RaiseGestureActiveEvent();
            }
            else if (leftStatus == GestureStatus.Stopping && rightStatus == GestureStatus.Stopping)
            {
                IsGestureActive = false;
                RaiseGestureStopEvent();
            }
        }
        else if (TriggerHand == Hand.Both)
        {
            var leftThumb = GestureSystem.GetLimb(InteractionLimb.LeftThumbTip);
            var leftIndex = GestureSystem.GetLimb(InteractionLimb.LeftIndexTip);

            var rightThumb = GestureSystem.GetLimb(InteractionLimb.RightThumbTip);
            var rightIndex = GestureSystem.GetLimb(InteractionLimb.RightIndexTip);

            if (leftThumb == null || leftIndex == null || rightThumb == null || rightIndex == null)
            {
                return(IsGestureActive);
            }

            var leftStatus  = CheckStatus(leftThumb, leftIndex);
            var rightStatus = CheckStatus(rightThumb, rightIndex);

            if (leftStatus == GestureStatus.Starting && rightStatus == GestureStatus.Starting)
            {
                IsGestureActive = true;
                // TODO
                _activePosition = Vector3.zero;
                RaiseGestureStartEvent();
            }
            else if (leftStatus == GestureStatus.Active && rightStatus == GestureStatus.Active)
            {
                // TODO
                _activePosition = Vector3.zero;
                RaiseGestureActiveEvent();
            }
            else if (leftStatus == GestureStatus.Stopping || rightStatus == GestureStatus.Stopping)
            {
                IsGestureActive = false;
                RaiseGestureStopEvent();
            }
        }
        else
        {
            var indexType = (TriggerHand == Hand.Left) ? InteractionLimb.LeftIndexTip : InteractionLimb.RightIndexTip;
            var thumbType = (TriggerHand == Hand.Left) ? InteractionLimb.LeftThumbTip : InteractionLimb.RightThumbTip;

            var index = GestureSystem.GetLimb(indexType);
            var thumb = GestureSystem.GetLimb(thumbType);

            if (index == null || thumb == null)
            {
                return(IsGestureActive);
            }

            var status = CheckStatus(thumb, index);

            switch (status)
            {
            case GestureStatus.Starting:
                _activePosition = index.transform.position;
                IsGestureActive = true;
                RaiseGestureStartEvent();
                break;

            case GestureStatus.Active:
                _activePosition = index.transform.position;
                RaiseGestureActiveEvent();
                break;

            case GestureStatus.Stopping:
                IsGestureActive = false;
                RaiseGestureStopEvent();
                break;

            case GestureStatus.Inactive:
                // do nothing
                break;

            default:
                throw new InvalidOperationException("Unknown enum for GestureStatus");
            }
        }

        return(IsGestureActive);
    }
Esempio n. 4
0
        public override bool CheckConditions()
        {
            if (TriggerHand == Hand.Both)
            {
                var leftPalm  = GestureSystem.GetLimb(InteractionLimb.LeftPalm);
                var rightPalm = GestureSystem.GetLimb(InteractionLimb.RightPalm);

                if (leftPalm == null || rightPalm == null)
                {
                    return(IsGestureActive);
                }

                var leftStatus  = CheckStatus(leftPalm);
                var rightStatus = CheckStatus(rightPalm);

                if (leftStatus == GestureStatus.Starting && rightStatus == GestureStatus.Starting)
                {
                    IsGestureActive = true;
                    RaiseGestureStartEvent();
                }
                else if (leftStatus == GestureStatus.Active && rightStatus == GestureStatus.Active)
                {
                    RaiseGestureActiveEvent();
                }
                else if (leftStatus == GestureStatus.Stopping || rightStatus == GestureStatus.Stopping)
                {
                    IsGestureActive = false;
                    RaiseGestureStopEvent();
                }
            }
            else
            {
                var limbType = (TriggerHand == Hand.Left) ? InteractionLimb.LeftPalm : InteractionLimb.RightPalm;
                var palm     = GestureSystem.GetLimb(limbType);
                var status   = CheckStatus(palm);

                if (palm == null)
                {
                    return(IsGestureActive);
                }

                switch (status)
                {
                case GestureStatus.Starting:
                    IsGestureActive = true;
                    RaiseGestureStartEvent();
                    break;

                case GestureStatus.Active:
                    RaiseGestureActiveEvent();
                    break;

                case GestureStatus.Stopping:
                    IsGestureActive = false;
                    RaiseGestureStopEvent();
                    break;

                case GestureStatus.Inactive:
                    // do nothing
                    break;

                default:
                    throw new InvalidOperationException("Unknown enum for GestureStatus");
                }
            }

            return(IsGestureActive);
        }