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);
public override void FocusOnInteractable(Interactable focusedInteractable, ColliderZone colliderZone) { _rayToolView.SetFocusedInteractable(focusedInteractable); _focusedInteractable = focusedInteractable; }
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) { }