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); }
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); }
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); }
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); }