public InteractableCollisionInfo(ColliderZone collider, InteractableCollisionDepth collisionDepth,
                                  InteractableTool collidingTool)
 {
     InteractableCollider = collider;
     CollisionDepth       = collisionDepth;
     CollidingTool        = collidingTool;
 }
 public ColliderZoneArgs(ColliderZone collider, float frameTime,
                         InteractableTool collidingTool, InteractionType interactionType)
 {
     Collider      = collider;
     FrameTime     = frameTime;
     CollidingTool = collidingTool;
     InteractionT  = interactionType;
 }
 /// <summary>
 /// Used to tell the tool to "focus" on a specific object, if
 /// focusing is indeed possible given the tool type.
 /// </summary>
 /// <param name="focusedInteractable">Interactable to focus.</param>
 /// <param name="colliderZone">Collider zone of interactable.</param>
 public abstract void FocusOnInteractable(Interactable focusedInteractable,
                                          ColliderZone colliderZone);
Exemplo n.º 4
0
 public override void FocusOnInteractable(Interactable focusedInteractable,
                                          ColliderZone colliderZone)
 {
     _rayToolView.SetFocusedInteractable(focusedInteractable);
     _focusedInteractable = focusedInteractable;
 }
Exemplo n.º 5
0
 public void FocusOnInteractable(Interactable focusedInteractable,
                                 ColliderZone colliderZone)
 {
     // no need for focus
 }
        public override void UpdateCollisionDepth(InteractableTool interactableTool,
                                                  InteractableCollisionDepth oldCollisionDepth,
                                                  InteractableCollisionDepth newCollisionDepth)
        {
            bool isFarFieldTool = interactableTool.IsFarFieldTool;

            // if this is a near field tool and another tool already controls it, bail.
            // (assuming we are not allowing multiple near field tools)
            bool testForSingleToolInteraction = !isFarFieldTool &&
                                                !_allowMultipleNearFieldInteraction;

            if (testForSingleToolInteraction && _toolToState.Keys.Count > 0 &&
                !_toolToState.ContainsKey(interactableTool))
            {
                return;
            }

            var oldState = CurrentButtonState;

            // ignore contact test if you are using the far field tool
            var  currButtonDirection = transform.TransformDirection(_localButtonDirection);
            bool validContact        = IsValidContact(interactableTool, currButtonDirection) ||
                                       interactableTool.IsFarFieldTool;
            // in case tool enters contact zone first, we are in proximity as well
            bool toolIsInProximity = newCollisionDepth >= InteractableCollisionDepth.Proximity;
            bool toolInContactZone = newCollisionDepth == InteractableCollisionDepth.Contact;
            bool toolInActionZone  = newCollisionDepth == InteractableCollisionDepth.Action;

            bool switchingStates = oldCollisionDepth != newCollisionDepth;

            if (switchingStates)
            {
                FireInteractionEventsOnDepth(oldCollisionDepth, interactableTool,
                                             InteractionType.Exit);
                FireInteractionEventsOnDepth(newCollisionDepth, interactableTool,
                                             InteractionType.Enter);
            }
            else
            {
                FireInteractionEventsOnDepth(newCollisionDepth, interactableTool,
                                             InteractionType.Stay);
            }

            var upcomingState = oldState;

            if (interactableTool.IsFarFieldTool)
            {
                upcomingState = toolInContactZone ? InteractableState.ContactState :
                                toolInActionZone ? InteractableState.ActionState : InteractableState.Default;
            }
            else
            {
                // plane describing positive side of button
                var buttonZonePlane = new Plane(-currButtonDirection, _buttonPlaneCenter.position);
                // skip plane test if the boolean flag tells us not to test it
                bool onPositiveSideOfButton = !_makeSureToolIsOnPositiveSide ||
                                              buttonZonePlane.GetSide(interactableTool.InteractionPosition);
                upcomingState = GetUpcomingStateNearField(oldState, newCollisionDepth,
                                                          toolInActionZone, toolInContactZone, toolIsInProximity,
                                                          validContact, onPositiveSideOfButton);
            }

            if (upcomingState != InteractableState.Default)
            {
                _toolToState[interactableTool] = upcomingState;
            }
            else
            {
                _toolToState.Remove(interactableTool);
            }

            // far field tools depend on max state set
            // (or if proper flag is set for near field tools)
            bool setMaxStateForAllTools = isFarFieldTool ||
                                          _allowMultipleNearFieldInteraction;

            if (setMaxStateForAllTools)
            {
                foreach (var toolState in _toolToState.Values)
                {
                    if (upcomingState < toolState)
                    {
                        upcomingState = toolState;
                    }
                }
            }

            if (oldState != upcomingState)
            {
                CurrentButtonState = upcomingState;

                var interactionType = !switchingStates ? InteractionType.Stay :
                                      newCollisionDepth == InteractableCollisionDepth.None ? InteractionType.Exit :
                                      InteractionType.Enter;
                ColliderZone currentCollider = null;
                switch (CurrentButtonState)
                {
                case InteractableState.ProximityState:
                    currentCollider = ProximityCollider;
                    break;

                case InteractableState.ContactState:
                    currentCollider = ContactCollider;
                    break;

                case InteractableState.ActionState:
                    currentCollider = ActionCollider;
                    break;

                default:
                    currentCollider = null;
                    break;
                }
                InteractableStateChanged?.Invoke(new InteractableStateArgs(this, interactableTool,
                                                                           CurrentButtonState, oldState, new ColliderZoneArgs(currentCollider, Time.frameCount,
                                                                                                                              interactableTool, interactionType)));
            }
        }
 public override void FocusOnInteractable(OculusSampleFramework.Interactable focusedInteractable, ColliderZone colliderZone)
 {
 }