forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			932 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			932 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using UnityEngine.InputSystem;
 | 
						|
using UnityEngine.Serialization;
 | 
						|
using UnityEngine.UI;
 | 
						|
using UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation;
 | 
						|
 | 
						|
#if UNITY_EDITOR
 | 
						|
using UnityEditor;
 | 
						|
#endif
 | 
						|
 | 
						|
namespace UnityEngine.XR.Interaction.Toolkit.Samples.DeviceSimulator
 | 
						|
{
 | 
						|
    class XRDeviceSimulatorUI : MonoBehaviour
 | 
						|
    {
 | 
						|
        XRDeviceSimulator m_Simulator;
 | 
						|
 | 
						|
        const string k_MouseDeviceType = "Mouse";
 | 
						|
        const string k_TranslateLookText = "Move";
 | 
						|
        const string k_RotateLookText = "Look";
 | 
						|
 | 
						|
#if UNITY_EDITOR
 | 
						|
        const string k_MenuOpenStateKey = "XRI." + nameof(XRDeviceSimulatorUI) + ".MenuOpenState";
 | 
						|
#endif
 | 
						|
        [SerializeField]
 | 
						|
        [HideInInspector]
 | 
						|
        bool m_IsMenuOpen = true;
 | 
						|
 | 
						|
        bool isMenuOpen
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if UNITY_EDITOR
 | 
						|
                m_IsMenuOpen = EditorPrefs.GetBool(k_MenuOpenStateKey, m_IsMenuOpen);
 | 
						|
#endif
 | 
						|
                return m_IsMenuOpen;
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                m_IsMenuOpen = value;
 | 
						|
#if UNITY_EDITOR
 | 
						|
                EditorPrefs.SetBool(k_MenuOpenStateKey, m_IsMenuOpen);
 | 
						|
#endif
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Header("Open/Close Panels")]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        GameObject m_XRDeviceSimulatorMainPanel;
 | 
						|
        [SerializeField]
 | 
						|
        GameObject m_XRDeviceSimulatorCollapsedPanel;
 | 
						|
 | 
						|
        [Header("Sprites")]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Sprite m_HmdSpriteDark;
 | 
						|
        [SerializeField]
 | 
						|
        Sprite m_HmdSpriteLight;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Sprite m_KeyboardSprite;
 | 
						|
        internal Sprite keyboardSprite => m_KeyboardSprite;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Sprite m_MouseSprite;
 | 
						|
        internal Sprite mouseSprite => m_MouseSprite;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Sprite m_RMouseSpriteDark;
 | 
						|
        internal Sprite rMouseSpriteDark => m_RMouseSpriteDark;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Sprite m_RMouseSpriteLight;
 | 
						|
        internal Sprite rMouseSpriteLight => m_RMouseSpriteLight;
 | 
						|
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Sprite m_RMouseSprite;
 | 
						|
        internal Sprite rMouseSprite
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_RMouseSprite == null)
 | 
						|
                    m_RMouseSprite = m_RMouseSpriteDark;
 | 
						|
#endif
 | 
						|
                return m_RMouseSprite;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Header("General")]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_CycleDevicesText;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_CurrentSelectedDeviceText;
 | 
						|
 | 
						|
        [Header("Headset Device")]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_HeadsetImage;
 | 
						|
 | 
						|
        [Space]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_HeadsetMoveButton;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_HeadsetMoveButtonIcon;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_HeadsetMoveButtonText;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_HeadsetMoveValueIcon;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_HeadsetMoveValueText;
 | 
						|
 | 
						|
        [Space]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_HeadsetLookButton;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_HeadsetLookButtonText;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_HeadsetLookValueIcon;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_HeadsetLookValueText;
 | 
						|
 | 
						|
        [Space]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        [FormerlySerializedAs("m_ShowCursorButton")]
 | 
						|
        Image m_CursorLockButton;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        [FormerlySerializedAs("m_ShowCursorValueText")]
 | 
						|
        Text m_CursorLockValueText;
 | 
						|
 | 
						|
        [Space]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_MouseModeButtonText;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_MouseModeValueText;
 | 
						|
 | 
						|
        [Space]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_HeadsetSelectedButton;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_HeadsetSelectedValueText;
 | 
						|
 | 
						|
        [Header("Controllers")]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Image m_ControllerSelectedButton;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_ControllersSelectedValueText;
 | 
						|
 | 
						|
        [Header("Left Controller")]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        XRDeviceSimulatorControllerUI m_LeftController;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_LeftControllerButtonText;
 | 
						|
 | 
						|
        [Header("Right Controller")]
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        XRDeviceSimulatorControllerUI m_RightController;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        Text m_RightControllerButtonText;
 | 
						|
 | 
						|
        static readonly Color k_EnabledColorDark = new Color(0xC4 / 255f, 0xC4 / 255f, 0xC4 / 255f);
 | 
						|
        static readonly Color k_EnabledColorLight = new Color(0x55/255f, 0x55/255f, 0x55/255f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_EnabledColor = Color.clear;
 | 
						|
        internal Color enabledColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_EnabledColor == Color.clear)
 | 
						|
                    m_EnabledColor = k_EnabledColorDark;
 | 
						|
#endif
 | 
						|
                return m_EnabledColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static readonly Color k_DisabledColorDark = new Color(0xC4 / 255f, 0xC4 / 255f, 0xC4 / 255f, 0.5f);
 | 
						|
        static readonly Color k_DisabledColorLight = new Color(0x55/255f, 0x55/255f, 0x55/255f, 0.5f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_DisabledColor = Color.clear;
 | 
						|
        internal Color disabledColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_DisabledColor == Color.clear)
 | 
						|
                    m_DisabledColor = k_DisabledColorDark;
 | 
						|
#endif
 | 
						|
                return m_DisabledColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static readonly Color k_ButtonColorDark = new Color(0x55 / 255f, 0x55 / 255f, 0x55 / 255f);
 | 
						|
        static readonly Color k_ButtonColorLight = new Color(0xE4/255f, 0xE4/255f, 0xE4/255f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_ButtonColor = Color.clear;
 | 
						|
        internal Color buttonColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_ButtonColor == Color.clear)
 | 
						|
                    m_ButtonColor = k_ButtonColorDark;
 | 
						|
#endif
 | 
						|
                return m_ButtonColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static readonly Color k_DisabledButtonColorDark = new Color(0x55 / 255f, 0x55 / 255f, 0x55 / 255f, 0.5f);
 | 
						|
        static readonly Color k_DisabledButtonColorLight = new Color(0xE4 / 255f, 0xE4 / 255f, 0xE4 / 255f, 0.5f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_DisabledButtonColor = Color.clear;
 | 
						|
        internal Color disabledButtonColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_DisabledButtonColor == Color.clear)
 | 
						|
                    m_DisabledButtonColor = k_DisabledButtonColorDark;
 | 
						|
#endif
 | 
						|
                return m_DisabledButtonColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static readonly Color k_SelectedColorDark = new Color(0x4F / 255f, 0x65 / 255f, 0x7F / 255f);
 | 
						|
        static readonly Color k_SelectedColorLight = new Color(0x96/255f, 0xC3/255f, 0xFB/255f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_SelectedColor = Color.clear;
 | 
						|
        internal Color selectedColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_SelectedColor == Color.clear)
 | 
						|
                    m_SelectedColor = k_SelectedColorDark;
 | 
						|
#endif
 | 
						|
                return m_SelectedColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static readonly Color k_BackgroundColorDark = Color.black;
 | 
						|
        static readonly Color k_BackgroundColorLight = new Color(0xB6/255f, 0xB6/255f, 0xB6/255f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_BackgroundColor = Color.clear;
 | 
						|
        internal Color backgroundColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_BackgroundColor == Color.clear)
 | 
						|
                    m_BackgroundColor = k_BackgroundColorDark;
 | 
						|
#endif
 | 
						|
                return m_BackgroundColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static readonly Color k_DeviceColorDark = new Color(0x6E / 255f, 0x6E / 255f, 0x6E / 255f);
 | 
						|
        static readonly Color k_DeviceColorLight = new Color(0xE4 / 255f, 0xE4 / 255f, 0xE4 / 255f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_DeviceColor = Color.clear;
 | 
						|
        internal Color deviceColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_DeviceColor == Color.clear)
 | 
						|
                    m_DeviceColor = k_DeviceColorDark;
 | 
						|
#endif
 | 
						|
                return m_DeviceColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static readonly Color k_DisabledDeviceColorDark = new Color(0x58 / 255f, 0x58 / 255f, 0x58 / 255f);
 | 
						|
        static readonly Color k_DisabledDeviceColorLight = new Color(0xA2 / 255f, 0xA2 / 255f, 0xA2 / 255f, 0.5f);
 | 
						|
        [HideInInspector]
 | 
						|
        [SerializeField]
 | 
						|
        Color m_DisabledDeviceColor = Color.clear;
 | 
						|
        internal Color disabledDeviceColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
#if !UNITY_EDITOR
 | 
						|
                if (m_DisabledDeviceColor == Color.clear)
 | 
						|
                    m_DisabledDeviceColor = k_DisabledDeviceColorDark;
 | 
						|
#endif
 | 
						|
                return m_DisabledDeviceColor;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        // Handles 2 axis activation for 1 UI Button
 | 
						|
        bool m_XAxisActivated;
 | 
						|
        bool m_ZAxisActivated;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// See <see cref="MonoBehaviour"/>.
 | 
						|
        /// </summary>
 | 
						|
        protected void Start()
 | 
						|
        {
 | 
						|
            var simulator = GetComponentInParent<XRDeviceSimulator>();
 | 
						|
            if (simulator != null)
 | 
						|
                Initialize(simulator);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// See <see cref="MonoBehaviour"/>.
 | 
						|
        /// </summary>
 | 
						|
        protected void OnDestroy()
 | 
						|
        {
 | 
						|
            if (m_Simulator != null)
 | 
						|
            {
 | 
						|
                Unsubscribe(m_Simulator.manipulateLeftAction, OnManipulateLeftAction);
 | 
						|
                Unsubscribe(m_Simulator.manipulateRightAction, OnManipulateRightAction);
 | 
						|
                Unsubscribe(m_Simulator.toggleManipulateLeftAction, OnToggleManipulateLeftAction);
 | 
						|
                Unsubscribe(m_Simulator.toggleManipulateRightAction, OnToggleManipulateRightAction);
 | 
						|
                Unsubscribe(m_Simulator.toggleManipulateBodyAction, OnToggleManipulateBodyAction);
 | 
						|
                Unsubscribe(m_Simulator.manipulateHeadAction, OnManipulateHeadAction);
 | 
						|
                Unsubscribe(m_Simulator.cycleDevicesAction, OnCycleDevicesAction);
 | 
						|
                Unsubscribe(m_Simulator.stopManipulationAction, OnStopManipulationAction);
 | 
						|
                Unsubscribe(m_Simulator.toggleMouseTransformationModeAction, OnToggleMouseTransformationModeAction);
 | 
						|
                Unsubscribe(m_Simulator.negateModeAction, OnNegateModeAction);
 | 
						|
                Unsubscribe(m_Simulator.toggleCursorLockAction, OnToggleCursorLockAction);
 | 
						|
                Unsubscribe(m_Simulator.keyboardXTranslateAction, OnKeyboardXTranslateAction);
 | 
						|
                Unsubscribe(m_Simulator.keyboardYTranslateAction, OnKeyboardYTranslateAction);
 | 
						|
                Unsubscribe(m_Simulator.keyboardZTranslateAction, OnKeyboardZTranslateAction);
 | 
						|
                Unsubscribe(m_Simulator.restingHandAxis2DAction, OnRestingHandAxis2DAction);
 | 
						|
                Unsubscribe(m_Simulator.gripAction, OnGripAction);
 | 
						|
                Unsubscribe(m_Simulator.triggerAction, OnTriggerAction);
 | 
						|
                Unsubscribe(m_Simulator.menuAction, OnMenuAction);
 | 
						|
                Unsubscribe(m_Simulator.primaryButtonAction, OnPrimaryButtonAction);
 | 
						|
                Unsubscribe(m_Simulator.secondaryButtonAction, OnSecondaryButtonAction);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void Initialize(XRDeviceSimulator simulator)
 | 
						|
        {
 | 
						|
            m_Simulator = simulator;
 | 
						|
            InitColorTheme();
 | 
						|
            Initialize();
 | 
						|
            // Start with the headset enabled
 | 
						|
            OnSetMouseMode();
 | 
						|
            OnActivateHeadsetDevice();
 | 
						|
        }
 | 
						|
 | 
						|
        void InitColorTheme()
 | 
						|
        {
 | 
						|
#if UNITY_EDITOR
 | 
						|
            var isEditorPro = EditorGUIUtility.isProSkin;
 | 
						|
            m_EnabledColor = isEditorPro ? k_EnabledColorDark : k_EnabledColorLight;
 | 
						|
            m_DisabledColor = isEditorPro ? k_DisabledColorDark : k_DisabledColorLight;
 | 
						|
            m_ButtonColor = isEditorPro ? k_ButtonColorDark : k_ButtonColorLight;
 | 
						|
            m_DisabledButtonColor = isEditorPro ? k_DisabledButtonColorDark : k_DisabledButtonColorLight;
 | 
						|
            m_SelectedColor = isEditorPro ? k_SelectedColorDark : k_SelectedColorLight;
 | 
						|
            m_BackgroundColor = isEditorPro ? k_BackgroundColorDark : k_BackgroundColorLight;
 | 
						|
            m_DeviceColor = isEditorPro ? k_DeviceColorDark : k_DeviceColorLight;
 | 
						|
            m_DisabledDeviceColor = isEditorPro ? k_DisabledDeviceColorDark : k_DisabledDeviceColorLight;
 | 
						|
            m_HeadsetImage.sprite = isEditorPro ? m_HmdSpriteDark : m_HmdSpriteLight;
 | 
						|
            m_RMouseSprite = isEditorPro ? m_RMouseSpriteDark : m_RMouseSpriteLight;
 | 
						|
#endif
 | 
						|
        }
 | 
						|
 | 
						|
        void Initialize()
 | 
						|
        {
 | 
						|
            var bckgrdAlpha = m_XRDeviceSimulatorMainPanel.GetComponent<Image>().color.a;
 | 
						|
 | 
						|
            foreach (var image in GetComponentsInChildren<Image>(true))
 | 
						|
                image.color = image.sprite == null ? buttonColor : enabledColor;
 | 
						|
 | 
						|
            foreach (var text in GetComponentsInChildren<Text>(true))
 | 
						|
                text.color = enabledColor;
 | 
						|
 | 
						|
            m_HeadsetImage.color = Color.white;
 | 
						|
 | 
						|
            var bckgrdColor = backgroundColor;
 | 
						|
            bckgrdColor.a = bckgrdAlpha;
 | 
						|
            m_XRDeviceSimulatorMainPanel.GetComponent<Image>().color = bckgrdColor;
 | 
						|
            m_XRDeviceSimulatorCollapsedPanel.GetComponent<Image>().color = bckgrdColor;
 | 
						|
 | 
						|
            m_CycleDevicesText.text = m_Simulator.cycleDevicesAction.action.controls[0].displayName;
 | 
						|
 | 
						|
            // Headset
 | 
						|
            var toggleManipulateBodyActionControl = m_Simulator.toggleManipulateBodyAction.action.controls[0];
 | 
						|
            m_HeadsetSelectedValueText.text = $"{toggleManipulateBodyActionControl.displayName}";
 | 
						|
 | 
						|
            var ctrlsBinding1 = m_Simulator.axis2DAction.action.controls;
 | 
						|
            var ctrlsBinding2 = m_Simulator.keyboardYTranslateAction.action.controls;
 | 
						|
            m_HeadsetMoveValueText.text = $"{ctrlsBinding1[0].displayName},{ctrlsBinding1[1].displayName},{ctrlsBinding1[2].displayName},{ctrlsBinding1[3].displayName} + " +
 | 
						|
                $"{ctrlsBinding2[0].displayName},{ctrlsBinding2[1].displayName}";
 | 
						|
 | 
						|
            m_CursorLockValueText.text = m_Simulator.toggleCursorLockAction.action.controls[0].displayName;
 | 
						|
            m_CursorLockButton.color = Cursor.lockState == CursorLockMode.Locked ? selectedColor : buttonColor;
 | 
						|
 | 
						|
            m_HeadsetLookButtonText.text = m_Simulator.mouseTransformationMode == XRDeviceSimulator.TransformationMode.Translate ? k_TranslateLookText : k_RotateLookText;
 | 
						|
            m_MouseModeValueText.text = m_Simulator.toggleMouseTransformationModeAction.action.controls[0].displayName;
 | 
						|
 | 
						|
            var manipulateHeadActionControl = m_Simulator.manipulateHeadAction.action.controls[0];
 | 
						|
            m_HeadsetLookValueIcon.sprite = GetInputIcon(manipulateHeadActionControl);
 | 
						|
            if (manipulateHeadActionControl.name.Equals("leftButton") ||  manipulateHeadActionControl.name.Equals("rightButton"))
 | 
						|
            {
 | 
						|
                m_HeadsetLookValueIcon.color = Color.white;
 | 
						|
 | 
						|
                // If the binding is using the left button, mirror the MouseR image
 | 
						|
                if (manipulateHeadActionControl.name.Equals("leftButton"))
 | 
						|
                    m_HeadsetLookValueIcon.transform.localScale = new Vector3(-1f, 1f, 1f);
 | 
						|
            }
 | 
						|
            m_HeadsetLookValueText.text = manipulateHeadActionControl.device.name == k_MouseDeviceType ? k_MouseDeviceType : manipulateHeadActionControl.displayName;
 | 
						|
 | 
						|
            m_LeftController.Initialize(m_Simulator);
 | 
						|
            m_LeftControllerButtonText.text = $"{m_Simulator.toggleManipulateLeftAction.action.controls[0].displayName} / {m_Simulator.manipulateLeftAction.action.controls[0].displayName} [Hold]";
 | 
						|
            m_RightController.Initialize(m_Simulator);
 | 
						|
            m_RightControllerButtonText.text = $"{m_Simulator.toggleManipulateRightAction.action.controls[0].displayName} / {m_Simulator.manipulateRightAction.action.controls[0].displayName} [Hold]";
 | 
						|
 | 
						|
            m_ControllersSelectedValueText.text =
 | 
						|
                $"{m_Simulator.toggleManipulateLeftAction.action.controls[0].displayName}, {m_Simulator.toggleManipulateRightAction.action.controls[0].displayName} [Toggle]";
 | 
						|
 | 
						|
            m_HeadsetMoveButtonIcon.color = enabledColor;
 | 
						|
 | 
						|
            // Update OnDestroy with corresponding Unsubscribe call when adding here
 | 
						|
            Subscribe(m_Simulator.manipulateLeftAction, OnManipulateLeftAction);
 | 
						|
            Subscribe(m_Simulator.manipulateRightAction, OnManipulateRightAction);
 | 
						|
            Subscribe(m_Simulator.toggleManipulateLeftAction, OnToggleManipulateLeftAction);
 | 
						|
            Subscribe(m_Simulator.toggleManipulateRightAction, OnToggleManipulateRightAction);
 | 
						|
            Subscribe(m_Simulator.toggleManipulateBodyAction, OnToggleManipulateBodyAction);
 | 
						|
            Subscribe(m_Simulator.manipulateHeadAction, OnManipulateHeadAction);
 | 
						|
            Subscribe(m_Simulator.cycleDevicesAction, OnCycleDevicesAction);
 | 
						|
            Subscribe(m_Simulator.stopManipulationAction, OnStopManipulationAction);
 | 
						|
            Subscribe(m_Simulator.toggleMouseTransformationModeAction, OnToggleMouseTransformationModeAction);
 | 
						|
            Subscribe(m_Simulator.negateModeAction, OnNegateModeAction);
 | 
						|
            Subscribe(m_Simulator.toggleCursorLockAction, OnToggleCursorLockAction);
 | 
						|
            Subscribe(m_Simulator.keyboardXTranslateAction, OnKeyboardXTranslateAction);
 | 
						|
            Subscribe(m_Simulator.keyboardYTranslateAction, OnKeyboardYTranslateAction);
 | 
						|
            Subscribe(m_Simulator.keyboardZTranslateAction, OnKeyboardZTranslateAction);
 | 
						|
            Subscribe(m_Simulator.restingHandAxis2DAction, OnRestingHandAxis2DAction);
 | 
						|
            Subscribe(m_Simulator.gripAction, OnGripAction);
 | 
						|
            Subscribe(m_Simulator.triggerAction, OnTriggerAction);
 | 
						|
            Subscribe(m_Simulator.menuAction, OnMenuAction);
 | 
						|
            Subscribe(m_Simulator.primaryButtonAction, OnPrimaryButtonAction);
 | 
						|
            Subscribe(m_Simulator.secondaryButtonAction, OnSecondaryButtonAction);
 | 
						|
 | 
						|
            m_XRDeviceSimulatorMainPanel.SetActive(isMenuOpen);
 | 
						|
            m_XRDeviceSimulatorCollapsedPanel.SetActive(!isMenuOpen);
 | 
						|
        }
 | 
						|
 | 
						|
        internal Sprite GetInputIcon(InputControl control)
 | 
						|
        {
 | 
						|
            if (control == null)
 | 
						|
                return null;
 | 
						|
 | 
						|
            var icon = keyboardSprite;
 | 
						|
            if (control.device.name == k_MouseDeviceType)
 | 
						|
            {
 | 
						|
                switch (control.name)
 | 
						|
                {
 | 
						|
                    case "leftButton":
 | 
						|
                    case "rightButton":
 | 
						|
                        icon = rMouseSprite;
 | 
						|
                        break;
 | 
						|
                    default:
 | 
						|
                        icon = mouseSprite;
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return icon;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Hides the simulator UI panel when called while displaying the simulator button.
 | 
						|
        /// </summary>
 | 
						|
        public void OnClickCloseSimulatorUIPanel()
 | 
						|
        {
 | 
						|
            isMenuOpen = false;
 | 
						|
            m_XRDeviceSimulatorMainPanel.SetActive(false);
 | 
						|
            m_XRDeviceSimulatorCollapsedPanel.SetActive(true);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Displays the simulator UI panel when called while hiding the simulator button.
 | 
						|
        /// </summary>
 | 
						|
        public void OnClickOpenSimulatorUIPanel()
 | 
						|
        {
 | 
						|
            isMenuOpen = true;
 | 
						|
            m_XRDeviceSimulatorMainPanel.SetActive(true);
 | 
						|
            m_XRDeviceSimulatorCollapsedPanel.SetActive(false);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sets the Left Controller device as active to receive input.
 | 
						|
        /// </summary>
 | 
						|
        void OnActivateLeftController()
 | 
						|
        {
 | 
						|
            m_CurrentSelectedDeviceText.text = "Left Controller";
 | 
						|
            OnActivateController(m_LeftController);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sets the Right Controller device as active to receive input.
 | 
						|
        /// </summary>
 | 
						|
        void OnActivateRightController()
 | 
						|
        {
 | 
						|
            m_CurrentSelectedDeviceText.text = "Right Controller";
 | 
						|
            OnActivateController(m_RightController);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnActivateController(XRDeviceSimulatorControllerUI controller)
 | 
						|
        {
 | 
						|
            PushCurrentButtonState(controller);
 | 
						|
            controller.SetAsActiveController(true, m_Simulator);
 | 
						|
            var other = controller == m_LeftController ? m_RightController : m_LeftController;
 | 
						|
            other.SetAsActiveController(false, m_Simulator, true);
 | 
						|
 | 
						|
            m_HeadsetImage.gameObject.SetActive(false);
 | 
						|
 | 
						|
            HeadDeviceSetActive(false);
 | 
						|
            m_ControllerSelectedButton.color = selectedColor;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sets both Left & Right Controller devices as active to receive input.
 | 
						|
        /// </summary>
 | 
						|
        void OnActivateBothControllers()
 | 
						|
        {
 | 
						|
            m_CurrentSelectedDeviceText.text = "Left & Right Controllers";
 | 
						|
            PushCurrentButtonState(m_LeftController);
 | 
						|
            PushCurrentButtonState(m_RightController);
 | 
						|
            m_LeftController.SetAsActiveController(true, m_Simulator);
 | 
						|
            m_RightController.SetAsActiveController(true, m_Simulator);
 | 
						|
 | 
						|
            m_HeadsetImage.gameObject.SetActive(false);
 | 
						|
 | 
						|
            HeadDeviceSetActive(false);
 | 
						|
            m_ControllerSelectedButton.color = selectedColor;
 | 
						|
        }
 | 
						|
 | 
						|
        void PushCurrentButtonState(XRDeviceSimulatorControllerUI controller)
 | 
						|
        {
 | 
						|
            controller.OnGrip(m_Simulator.gripAction.action.inProgress);
 | 
						|
            controller.OnTrigger(m_Simulator.triggerAction.action.inProgress);
 | 
						|
            controller.OnMenu(m_Simulator.menuAction.action.inProgress);
 | 
						|
            controller.OnPrimaryButton(m_Simulator.primaryButtonAction.action.inProgress);
 | 
						|
            controller.OnSecondaryButton(m_Simulator.secondaryButtonAction.action.inProgress);
 | 
						|
            controller.OnXAxisTranslatePerformed(m_Simulator.keyboardXTranslateAction.action.inProgress);
 | 
						|
            controller.OnZAxisTranslatePerformed(m_Simulator.keyboardZTranslateAction.action.inProgress);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sets the headset device as active to receive input.
 | 
						|
        /// </summary>
 | 
						|
        void OnActivateHeadsetDevice(bool activated = true)
 | 
						|
        {
 | 
						|
            m_LeftController.SetAsActiveController(false, m_Simulator);
 | 
						|
            m_RightController.SetAsActiveController(false, m_Simulator);
 | 
						|
 | 
						|
            m_CurrentSelectedDeviceText.text = activated ? "Head Mounted Display (HMD)" : "None";
 | 
						|
            m_HeadsetImage.gameObject.SetActive(activated);
 | 
						|
 | 
						|
            HeadDeviceSetActive(activated);
 | 
						|
            m_ControllerSelectedButton.color = buttonColor;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Updates all the UI associated the the Headset.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="active">Whether the headset is the active device or not.</param>
 | 
						|
        void HeadDeviceSetActive(bool active)
 | 
						|
        {
 | 
						|
            m_HeadsetSelectedButton.color = active ? selectedColor : buttonColor;
 | 
						|
 | 
						|
            var currentColor = active ? enabledColor : disabledColor;
 | 
						|
            m_HeadsetMoveButtonIcon.color = currentColor;
 | 
						|
            m_HeadsetMoveButtonText.color = currentColor;
 | 
						|
            m_HeadsetMoveValueIcon.color = currentColor;
 | 
						|
            m_HeadsetMoveValueText.color = currentColor;
 | 
						|
 | 
						|
            m_HeadsetMoveButton.color = active ? buttonColor : disabledButtonColor;
 | 
						|
        }
 | 
						|
 | 
						|
        static void Subscribe(InputActionReference reference, Action<InputAction.CallbackContext> performedOrCanceled)
 | 
						|
        {
 | 
						|
            var action = reference != null ? reference.action : null;
 | 
						|
            if (action != null && performedOrCanceled != null)
 | 
						|
            {
 | 
						|
                action.performed += performedOrCanceled;
 | 
						|
                action.canceled += performedOrCanceled;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static void Unsubscribe(InputActionReference reference, Action<InputAction.CallbackContext> performedOrCanceled)
 | 
						|
        {
 | 
						|
            var action = reference != null ? reference.action : null;
 | 
						|
            if (action != null && performedOrCanceled != null)
 | 
						|
            {
 | 
						|
                action.performed -= performedOrCanceled;
 | 
						|
                action.canceled -= performedOrCanceled;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnManipulateLeftAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingLeftController && m_Simulator.manipulatingRightController)
 | 
						|
                    OnActivateBothControllers();
 | 
						|
                else if (m_Simulator.manipulatingLeftController)
 | 
						|
                    OnActivateLeftController();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingRightController)
 | 
						|
                    OnActivateRightController();
 | 
						|
                else
 | 
						|
                    OnActivateHeadsetDevice(m_Simulator.manipulatingFPS);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnManipulateRightAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingLeftController && m_Simulator.manipulatingRightController)
 | 
						|
                    OnActivateBothControllers();
 | 
						|
                else if (m_Simulator.manipulatingRightController)
 | 
						|
                    OnActivateRightController();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingLeftController)
 | 
						|
                    OnActivateLeftController();
 | 
						|
                else
 | 
						|
                    OnActivateHeadsetDevice(m_Simulator.manipulatingFPS);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnToggleManipulateLeftAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingLeftController)
 | 
						|
                    OnActivateLeftController();
 | 
						|
                else
 | 
						|
                    OnActivateHeadsetDevice();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnToggleManipulateRightAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingRightController)
 | 
						|
                    OnActivateRightController();
 | 
						|
                else
 | 
						|
                    OnActivateHeadsetDevice();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnToggleManipulateBodyAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
            {
 | 
						|
                OnActivateHeadsetDevice();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnManipulateHeadAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            var isInProgress = context.phase.IsInProgress();
 | 
						|
            var noControllers = !m_Simulator.manipulatingLeftController && !m_Simulator.manipulatingRightController;
 | 
						|
            if (isInProgress)
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingFPS || noControllers)
 | 
						|
                    OnActivateHeadsetDevice();
 | 
						|
            }
 | 
						|
            else if (noControllers)
 | 
						|
            {
 | 
						|
                OnActivateHeadsetDevice(m_Simulator.manipulatingFPS);
 | 
						|
            }
 | 
						|
 | 
						|
            m_HeadsetImage.gameObject.SetActive(isInProgress || noControllers);
 | 
						|
            m_HeadsetLookButton.color = isInProgress ? selectedColor : buttonColor;
 | 
						|
        }
 | 
						|
 | 
						|
        void OnCycleDevicesAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
            {
 | 
						|
                if (m_Simulator.manipulatingFPS)
 | 
						|
                    OnActivateHeadsetDevice();
 | 
						|
                if (m_Simulator.manipulatingLeftController)
 | 
						|
                    OnActivateLeftController();
 | 
						|
                if (m_Simulator.manipulatingRightController)
 | 
						|
                    OnActivateRightController();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnStopManipulationAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
                OnActivateHeadsetDevice(m_Simulator.manipulatingFPS);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnToggleMouseTransformationModeAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
                OnSetMouseMode();
 | 
						|
        }
 | 
						|
 | 
						|
        void OnNegateModeAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnSetMouseMode();
 | 
						|
        }
 | 
						|
 | 
						|
        void OnToggleCursorLockAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
                OnCursorLockChanged();
 | 
						|
        }
 | 
						|
 | 
						|
        void OnKeyboardXTranslateAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnXAxisTranslatePerformed(context.phase.IsInProgress(), false);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnKeyboardYTranslateAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnYAxisTranslatePerformed(context.phase.IsInProgress());
 | 
						|
        }
 | 
						|
 | 
						|
        void OnKeyboardZTranslateAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnZAxisTranslatePerformed(context.phase.IsInProgress(), false);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnRestingHandAxis2DAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            var restingHandAxis2DInput = Vector2.ClampMagnitude(context.ReadValue<Vector2>(), 1f);
 | 
						|
            if (context.phase.IsInProgress())
 | 
						|
            {
 | 
						|
                if (restingHandAxis2DInput.x != 0f)
 | 
						|
                    OnXAxisTranslatePerformed(true, true);
 | 
						|
                if (restingHandAxis2DInput.y != 0f)
 | 
						|
                    OnZAxisTranslatePerformed(true, true);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (restingHandAxis2DInput.x == 0f)
 | 
						|
                    OnXAxisTranslatePerformed(false, true);
 | 
						|
                if (restingHandAxis2DInput.y == 0f)
 | 
						|
                    OnZAxisTranslatePerformed(false, true);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnGripAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnGripPerformed(context.phase.IsInProgress());
 | 
						|
        }
 | 
						|
 | 
						|
        void OnTriggerAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnTriggerPerformed(context.phase.IsInProgress());
 | 
						|
        }
 | 
						|
 | 
						|
        void OnMenuAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnMenuPerformed(context.phase.IsInProgress());
 | 
						|
        }
 | 
						|
 | 
						|
        void OnPrimaryButtonAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnPrimaryButtonPerformed(context.phase.IsInProgress());
 | 
						|
        }
 | 
						|
 | 
						|
        void OnSecondaryButtonAction(InputAction.CallbackContext context)
 | 
						|
        {
 | 
						|
            OnSecondaryButtonPerformed(context.phase.IsInProgress());
 | 
						|
        }
 | 
						|
 | 
						|
        void OnSetMouseMode()
 | 
						|
        {
 | 
						|
            // Translate/Rotate
 | 
						|
            m_MouseModeButtonText.text = m_Simulator.negateMode
 | 
						|
                ? XRDeviceSimulator.Negate(m_Simulator.mouseTransformationMode).ToString()
 | 
						|
                : m_Simulator.mouseTransformationMode.ToString();
 | 
						|
            // Move/Look
 | 
						|
            m_HeadsetLookButtonText.text =
 | 
						|
                m_Simulator.mouseTransformationMode == XRDeviceSimulator.TransformationMode.Translate
 | 
						|
                    ? k_TranslateLookText
 | 
						|
                    : k_RotateLookText;
 | 
						|
        }
 | 
						|
 | 
						|
        void OnCursorLockChanged()
 | 
						|
        {
 | 
						|
            m_CursorLockButton.color = Cursor.lockState == CursorLockMode.Locked ? selectedColor : buttonColor;
 | 
						|
        }
 | 
						|
 | 
						|
        // x-axis [A-D]
 | 
						|
        void OnXAxisTranslatePerformed(bool activated, bool restingHand)
 | 
						|
        {
 | 
						|
            var active = activated;
 | 
						|
            if (!restingHand)
 | 
						|
            {
 | 
						|
                m_XAxisActivated = activated;
 | 
						|
                active |= m_ZAxisActivated;
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingLeftController)
 | 
						|
            {
 | 
						|
                var lController = restingHand ? m_RightController : m_LeftController;
 | 
						|
                lController.OnXAxisTranslatePerformed(active);
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingRightController)
 | 
						|
            {
 | 
						|
                var rController = restingHand ? m_LeftController : m_RightController;
 | 
						|
                rController.OnXAxisTranslatePerformed(active);
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingFPS)
 | 
						|
                m_HeadsetMoveButton.color = active ? selectedColor : buttonColor;
 | 
						|
        }
 | 
						|
 | 
						|
        // y-axis [Q-E]
 | 
						|
        void OnYAxisTranslatePerformed(bool activated)
 | 
						|
        {
 | 
						|
            if (m_Simulator.manipulatingFPS)
 | 
						|
                m_HeadsetMoveButton.color = activated ? selectedColor : buttonColor;
 | 
						|
        }
 | 
						|
 | 
						|
        // z-axis [W-S]
 | 
						|
        void OnZAxisTranslatePerformed(bool activated, bool restingHand)
 | 
						|
        {
 | 
						|
            var active = activated;
 | 
						|
            if (!restingHand)
 | 
						|
            {
 | 
						|
                m_ZAxisActivated = activated;
 | 
						|
                active |= m_XAxisActivated;
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingLeftController)
 | 
						|
            {
 | 
						|
                var lController = restingHand ? m_RightController : m_LeftController;
 | 
						|
                lController.OnZAxisTranslatePerformed(active);
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingRightController)
 | 
						|
            {
 | 
						|
                var rController = restingHand ? m_LeftController : m_RightController;
 | 
						|
                rController.OnZAxisTranslatePerformed(active);
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingFPS)
 | 
						|
                m_HeadsetMoveButton.color = active ? selectedColor : buttonColor;
 | 
						|
        }
 | 
						|
 | 
						|
        void OnMenuPerformed(bool activated)
 | 
						|
        {
 | 
						|
            if (m_Simulator.manipulatingLeftController)
 | 
						|
                m_LeftController.OnMenu(activated);
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingRightController)
 | 
						|
                m_RightController.OnMenu(activated);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnGripPerformed(bool activated)
 | 
						|
        {
 | 
						|
            if (m_Simulator.manipulatingLeftController)
 | 
						|
                m_LeftController.OnGrip(activated);
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingRightController)
 | 
						|
                m_RightController.OnGrip(activated);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnTriggerPerformed(bool activated)
 | 
						|
        {
 | 
						|
            if (m_Simulator.manipulatingLeftController)
 | 
						|
                m_LeftController.OnTrigger(activated);
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingRightController)
 | 
						|
                m_RightController.OnTrigger(activated);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnPrimaryButtonPerformed(bool activated)
 | 
						|
        {
 | 
						|
            if (m_Simulator.manipulatingLeftController)
 | 
						|
                m_LeftController.OnPrimaryButton(activated);
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingRightController)
 | 
						|
                m_RightController.OnPrimaryButton(activated);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnSecondaryButtonPerformed(bool activated)
 | 
						|
        {
 | 
						|
            if (m_Simulator.manipulatingLeftController)
 | 
						|
                m_LeftController.OnSecondaryButton(activated);
 | 
						|
 | 
						|
            if (m_Simulator.manipulatingRightController)
 | 
						|
                m_RightController.OnSecondaryButton(activated);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |