|
|
- namespace VRTK
- {
- using UnityEngine;
-
- [RequireComponent(typeof(VRTK_RadialMenu))]
- public class VRTK_RadialMenuController : MonoBehaviour
- {
- [Tooltip("The controller to listen to the controller events on.")]
- public VRTK_ControllerEvents events;
-
- protected VRTK_RadialMenu menu;
- protected TouchAngleDeflection currentTad; //Keep track of angle and deflection for when we click
- protected bool touchpadTouched;
-
- protected virtual void Awake()
- {
- menu = GetComponent<VRTK_RadialMenu>();
-
- Initialize();
- }
-
- protected virtual void Initialize()
- {
- if (events == null)
- {
- events = GetComponentInParent<VRTK_ControllerEvents>();
- }
- }
-
- protected virtual void OnEnable()
- {
- if (events == null)
- {
- VRTK_Logger.Error(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_NOT_INJECTED, "RadialMenuController", "VRTK_ControllerEvents", "events", "the parent"));
- return;
- }
- else
- {
- events.TouchpadPressed += new ControllerInteractionEventHandler(DoTouchpadClicked);
- events.TouchpadReleased += new ControllerInteractionEventHandler(DoTouchpadUnclicked);
- events.TouchpadTouchStart += new ControllerInteractionEventHandler(DoTouchpadTouched);
- events.TouchpadTouchEnd += new ControllerInteractionEventHandler(DoTouchpadUntouched);
- events.TouchpadAxisChanged += new ControllerInteractionEventHandler(DoTouchpadAxisChanged);
-
- menu.FireHapticPulse += new HapticPulseEventHandler(AttemptHapticPulse);
- }
- }
-
- protected virtual void OnDisable()
- {
- events.TouchpadPressed -= new ControllerInteractionEventHandler(DoTouchpadClicked);
- events.TouchpadReleased -= new ControllerInteractionEventHandler(DoTouchpadUnclicked);
- events.TouchpadTouchStart -= new ControllerInteractionEventHandler(DoTouchpadTouched);
- events.TouchpadTouchEnd -= new ControllerInteractionEventHandler(DoTouchpadUntouched);
- events.TouchpadAxisChanged -= new ControllerInteractionEventHandler(DoTouchpadAxisChanged);
-
- menu.FireHapticPulse -= new HapticPulseEventHandler(AttemptHapticPulse);
- }
-
- protected virtual void DoClickButton(object sender = null) // The optional argument reduces the need for middleman functions in subclasses whose events likely pass object sender
- {
- menu.ClickButton(currentTad);
- }
-
- protected virtual void DoUnClickButton(object sender = null)
- {
- menu.UnClickButton(currentTad);
- }
-
- protected virtual void DoShowMenu(TouchAngleDeflection initialTad, object sender = null)
- {
- menu.ShowMenu();
- DoChangeAngle(initialTad); // Needed to register initial touch position before the touchpad axis actually changes
- }
-
- protected virtual void DoHideMenu(bool force, object sender = null)
- {
- menu.StopTouching();
- menu.HideMenu(force);
- }
-
- protected virtual void DoChangeAngle(TouchAngleDeflection givenTouchAngleDeflection, object sender = null)
- {
- currentTad = givenTouchAngleDeflection;
-
- menu.HoverButton(currentTad);
- }
-
- protected virtual void AttemptHapticPulse(float strength)
- {
- if (events)
- {
- VRTK_ControllerHaptics.TriggerHapticPulse(VRTK_ControllerReference.GetControllerReference(events.gameObject), strength);
- }
- }
-
- protected virtual void DoTouchpadClicked(object sender, ControllerInteractionEventArgs e)
- {
- DoClickButton();
- }
-
- protected virtual void DoTouchpadUnclicked(object sender, ControllerInteractionEventArgs e)
- {
- DoUnClickButton();
- }
-
- protected virtual void DoTouchpadTouched(object sender, ControllerInteractionEventArgs e)
- {
- touchpadTouched = true;
- DoShowMenu(CalculateAngle(e));
- }
-
- protected virtual void DoTouchpadUntouched(object sender, ControllerInteractionEventArgs e)
- {
- touchpadTouched = false;
- DoHideMenu(false);
- }
-
- //Touchpad finger moved position
- protected virtual void DoTouchpadAxisChanged(object sender, ControllerInteractionEventArgs e)
- {
- if (touchpadTouched)
- {
- DoChangeAngle(CalculateAngle(e));
- }
- }
-
- protected virtual TouchAngleDeflection CalculateAngle(ControllerInteractionEventArgs e)
- {
- TouchAngleDeflection touchAngleDeflection = new TouchAngleDeflection();
- touchAngleDeflection.angle = 360 - e.touchpadAngle;
- touchAngleDeflection.deflection = e.touchpadAxis.magnitude;
- return touchAngleDeflection;
- }
- }
- }
|