UP-Viagg-io/Viagg-io/Assets/Packages/XR Device Simulator/Scripts/XRDeviceSimulatorUI.cs

1166 lines
43 KiB
C#
Raw Normal View History

2024-06-05 16:23:48 +02:00
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;
}
}
[SerializeField]
Sprite m_RoundedRectangle;
[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]
Image m_ControllerSelectedIcon;
[SerializeField]
Text m_ControllerSelectedText;
[SerializeField]
Text m_ControllersSelectedValueText;
[SerializeField]
CanvasGroup m_ControllersCanvasGroup;
[Header("Left Controller")]
[SerializeField]
XRDeviceSimulatorControllerUI m_LeftController;
[SerializeField]
Text m_LeftControllerButtonText;
[Header("Right Controller")]
[SerializeField]
XRDeviceSimulatorControllerUI m_RightController;
[SerializeField]
Text m_RightControllerButtonText;
[Header("Hands")]
[SerializeField]
Image m_HandsSelectedButton;
[SerializeField]
Image m_HandsSelectedIcon;
[SerializeField]
Text m_HandsSelectedText;
[SerializeField]
Image m_HandsSelectedValueIcon;
[SerializeField]
Text m_HandsSelectedValueText;
[SerializeField]
CanvasGroup m_HandsCanvasGroup;
[Header("Left Hand")]
[SerializeField]
XRDeviceSimulatorHandsUI m_LeftHand;
[SerializeField]
Text m_LeftHandButtonText;
[Header("Right Hand")]
[SerializeField]
XRDeviceSimulatorHandsUI m_RightHand;
[SerializeField]
Text m_RightHandButtonText;
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.handControllerModeAction, OnHandControllerModeAction);
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);
#if XR_HANDS_1_1_OR_NEWER
foreach (var simulatedExpression in m_Simulator.simulatedHandExpressions)
{
simulatedExpression.performed -= OnHandExpressionAction;
}
#endif
}
}
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 || image.sprite == m_RoundedRectangle ? 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_RightController.Initialize(m_Simulator);
var toggleSlashHoldLeftText = $"{m_Simulator.toggleManipulateLeftAction.action.controls[0].displayName} / {m_Simulator.manipulateLeftAction.action.controls[0].displayName} [Hold]";
var toggleSlashHoldRightText = $"{m_Simulator.toggleManipulateRightAction.action.controls[0].displayName} / {m_Simulator.manipulateRightAction.action.controls[0].displayName} [Hold]";
m_LeftControllerButtonText.text = toggleSlashHoldLeftText;
m_RightControllerButtonText.text = toggleSlashHoldRightText;
m_LeftHand.Initialize(m_Simulator);
m_RightHand.Initialize(m_Simulator);
m_LeftHandButtonText.text = toggleSlashHoldLeftText;
m_RightHandButtonText.text = toggleSlashHoldRightText;
UpdateDeviceInputMethod();
HandsSetActive(false);
#if XR_HANDS_1_1_OR_NEWER
m_HandsSelectedValueIcon.color = enabledColor;
m_HandsSelectedValueText.color = enabledColor;
#else
m_HandsSelectedValueIcon.color = disabledColor;
m_HandsSelectedValueText.color = disabledColor;
#endif
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.handControllerModeAction, OnHandControllerModeAction);
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);
#if XR_HANDS_1_1_OR_NEWER
foreach (var simulatedExpression in m_Simulator.simulatedHandExpressions)
{
simulatedExpression.performed += OnHandExpressionAction;
}
#endif
m_XRDeviceSimulatorMainPanel.SetActive(isMenuOpen);
m_XRDeviceSimulatorCollapsedPanel.SetActive(!isMenuOpen);
}
void UpdateDeviceInputMethod()
{
var toggleManipulateText = $"{m_Simulator.toggleManipulateLeftAction.action.controls[0].displayName}, {m_Simulator.toggleManipulateRightAction.action.controls[0].displayName} [Toggle]";
#if XR_HANDS_1_1_OR_NEWER
var modeChangeText = m_Simulator.handControllerModeAction != null ? $"{m_Simulator.handControllerModeAction.action.controls[0].displayName}" : string.Empty;
#else
var modeChangeText = string.Empty;
#endif
m_ControllersSelectedValueText.text = m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Controller ? toggleManipulateText : modeChangeText;
m_HandsSelectedValueText.text = m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Hand ? toggleManipulateText : modeChangeText;
var modeColor = m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Controller ? enabledColor : disabledColor;
m_ControllerSelectedIcon.color = modeColor;
m_ControllerSelectedText.color = modeColor;
modeColor = m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Hand ? enabledColor : disabledColor;
m_HandsSelectedIcon.color = modeColor;
m_HandsSelectedText.color = modeColor;
}
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);
}
void OnActivateLeftDevice()
{
if (m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Controller)
OnActivateLeftController();
else if (m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Hand)
OnActivateLeftHand();
}
void OnActivateRightDevice()
{
if (m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Controller)
OnActivateRightController();
else if (m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Hand)
OnActivateRightHand();
}
void OnActivateBothDevices()
{
if (m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Controller)
OnActivateBothControllers();
else if (m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Hand)
OnActivateBothHands();
}
/// <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)
{
ControllersSetActive(true);
PushCurrentButtonState(controller);
controller.SetAsActiveController(true, m_Simulator);
var other = controller == m_LeftController ? m_RightController : m_LeftController;
other.SetAsActiveController(false, m_Simulator, true);
HeadDeviceSetActive(false);
HandsSetActive(false);
}
/// <summary>
/// Sets both Left & Right Controller devices as active to receive input.
/// </summary>
void OnActivateBothControllers()
{
ControllersSetActive(true);
m_CurrentSelectedDeviceText.text = "Left & Right Controllers";
PushCurrentButtonState(m_LeftController);
PushCurrentButtonState(m_RightController);
m_LeftController.SetAsActiveController(true, m_Simulator);
m_RightController.SetAsActiveController(true, m_Simulator);
HeadDeviceSetActive(false);
HandsSetActive(false);
}
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 Left Hand device as active to receive input.
/// </summary>
void OnActivateLeftHand()
{
m_CurrentSelectedDeviceText.text = "Left Hand";
OnActivateHand(m_LeftHand);
}
/// <summary>
/// Sets the Right Hand device as active to receive input.
/// </summary>
void OnActivateRightHand()
{
m_CurrentSelectedDeviceText.text = "Right Hand";
OnActivateHand(m_RightHand);
}
void OnActivateHand(XRDeviceSimulatorHandsUI hand)
{
HandsSetActive(true);
hand.SetActive(true, m_Simulator);
XRDeviceSimulatorHandsUI otherHand = hand == m_LeftHand ? m_RightHand : m_LeftHand;
otherHand.SetActive(false, m_Simulator);
HeadDeviceSetActive(false);
ControllersSetActive(false);
}
/// <summary>
/// Sets both Left & Right Hand devices as active to receive input.
/// </summary>
void OnActivateBothHands()
{
HandsSetActive(true);
m_CurrentSelectedDeviceText.text = "Left & Right Hands";
m_LeftHand.SetActive(true, m_Simulator);
m_RightHand.SetActive(true, m_Simulator);
HeadDeviceSetActive(false);
ControllersSetActive(false);
}
/// <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_LeftHand.SetActive(false, m_Simulator);
m_RightHand.SetActive(false, m_Simulator);
m_CurrentSelectedDeviceText.text = activated ? "Head Mounted Display (HMD)" : "None";
m_HeadsetImage.gameObject.SetActive(activated);
HeadDeviceSetActive(activated);
if (m_Simulator.manipulatingFPS)
{
ControllersSetActive(false, m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Controller);
HandsSetActive(false, m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Hand);
}
else
{
HandsSetActive(false, Mathf.Approximately(m_HandsCanvasGroup.alpha, 1f));
ControllersSetActive(false, Mathf.Approximately(m_ControllersCanvasGroup.alpha, 1f));
}
}
/// <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_HeadsetImage.gameObject.SetActive(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;
}
void HandsSetActive(bool isActive, bool showCanvasGroup = false)
{
m_HandsCanvasGroup.alpha = isActive || showCanvasGroup ? 1f : 0f;
#if XR_HANDS_1_1_OR_NEWER
m_HandsSelectedButton.color = isActive ? selectedColor : buttonColor;
#else
m_HandsSelectedButton.color = disabledButtonColor;
#endif
}
void ControllersSetActive(bool isActive, bool showCanvasGroup = false)
{
m_ControllersCanvasGroup.alpha = isActive || showCanvasGroup ? 1f : 0f;
m_ControllerSelectedButton.color = isActive ? selectedColor : buttonColor;
}
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.manipulatingLeftDevice && m_Simulator.manipulatingRightDevice)
OnActivateBothDevices();
else if (m_Simulator.manipulatingLeftDevice)
OnActivateLeftDevice();
}
else
{
if (m_Simulator.manipulatingRightDevice)
OnActivateRightDevice();
else
OnActivateHeadsetDevice(m_Simulator.manipulatingFPS);
}
}
void OnManipulateRightAction(InputAction.CallbackContext context)
{
if (context.phase.IsInProgress())
{
if (m_Simulator.manipulatingLeftDevice && m_Simulator.manipulatingRightDevice)
OnActivateBothDevices();
else if (m_Simulator.manipulatingRightDevice)
OnActivateRightDevice();
}
else
{
if (m_Simulator.manipulatingLeftDevice)
OnActivateLeftDevice();
else
OnActivateHeadsetDevice(m_Simulator.manipulatingFPS);
}
}
void OnToggleManipulateLeftAction(InputAction.CallbackContext context)
{
if (context.phase.IsInProgress())
{
if (m_Simulator.manipulatingLeftDevice)
OnActivateLeftDevice();
else
OnActivateHeadsetDevice();
}
}
void OnToggleManipulateRightAction(InputAction.CallbackContext context)
{
if (context.phase.IsInProgress())
{
if (m_Simulator.manipulatingRightDevice)
OnActivateRightDevice();
else
OnActivateHeadsetDevice();
}
}
void OnToggleManipulateBodyAction(InputAction.CallbackContext context)
{
if (context.phase.IsInProgress())
{
OnActivateHeadsetDevice();
}
}
void OnManipulateHeadAction(InputAction.CallbackContext context)
{
var isInProgress = context.phase.IsInProgress();
var noDevices = !m_Simulator.manipulatingLeftDevice && !m_Simulator.manipulatingRightDevice;
if (isInProgress)
{
if (m_Simulator.manipulatingFPS || noDevices)
OnActivateHeadsetDevice();
}
else if (noDevices)
{
OnActivateHeadsetDevice(m_Simulator.manipulatingFPS);
}
m_HeadsetLookButton.color = isInProgress ? selectedColor : buttonColor;
}
void OnHandControllerModeAction(InputAction.CallbackContext context)
{
#if XR_HANDS_1_1_OR_NEWER
if (context.phase.IsInProgress())
{
if (m_Simulator.manipulatingLeftDevice && m_Simulator.manipulatingRightDevice)
OnActivateBothDevices();
else if (m_Simulator.manipulatingLeftDevice)
OnActivateLeftDevice();
else if (m_Simulator.manipulatingRightDevice)
OnActivateRightDevice();
else if (m_Simulator.manipulatingFPS)
OnActivateHeadsetDevice();
else
{
ControllersSetActive(false, m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Controller);
HandsSetActive(false, m_Simulator.deviceMode == XRDeviceSimulator.DeviceMode.Hand);
}
}
UpdateDeviceInputMethod();
#endif
}
void OnCycleDevicesAction(InputAction.CallbackContext context)
{
if (context.phase.IsInProgress())
{
if (m_Simulator.manipulatingFPS)
OnActivateHeadsetDevice();
if (m_Simulator.manipulatingLeftDevice)
OnActivateLeftDevice();
if (m_Simulator.manipulatingRightDevice)
OnActivateRightDevice();
}
}
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 OnHandExpressionAction(XRDeviceSimulator.SimulatedHandExpression simulatedExpression, InputAction.CallbackContext context)
{
if (context.phase.IsInProgress())
{
if (m_Simulator.manipulatingLeftHand)
m_LeftHand.ToggleExpression(simulatedExpression, m_Simulator);
if (m_Simulator.manipulatingRightHand)
m_RightHand.ToggleExpression(simulatedExpression, m_Simulator);
}
}
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);
}
}
}