Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

435 lines
22 KiB

// SDK Input Override|Utilities|90170
namespace VRTK
{
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Linq;
[Serializable]
public class VRTK_SDKInputOverrideType
{
[Header("SDK settings")]
[Tooltip("An optional SDK Setup to use to determine when to modify the transform.")]
public VRTK_SDKSetup loadedSDKSetup;
[Tooltip("An optional SDK controller type to use to determine when to modify the transform.")]
public SDK_BaseController.ControllerType controllerType;
}
[Serializable]
public class VRTK_SDKButtonInputOverrideType : VRTK_SDKInputOverrideType
{
[Header("Button Override")]
[Tooltip("The button to override to.")]
public VRTK_ControllerEvents.ButtonAlias overrideButton = VRTK_ControllerEvents.ButtonAlias.Undefined;
}
[Serializable]
public class VRTK_SDKVector2AxisInputOverrideType : VRTK_SDKInputOverrideType
{
[Header("Vector2 Axis Override")]
[Tooltip("The Vector2 axis to override to.")]
public VRTK_ControllerEvents.Vector2AxisAlias overrideAxis = VRTK_ControllerEvents.Vector2AxisAlias.Undefined;
}
/// <summary>
/// Provides the ability to switch button mappings based on the current SDK or controller type
/// </summary>
/// <remarks>
/// **Script Usage:**
/// * Place the `VRTK_SDKInputOverride` script on any active scene GameObject.
/// * Customise the input button for each script type for each SDK controller type.
/// </remarks>
public class VRTK_SDKInputOverride : VRTK_SDKControllerReady
{
[Header("Interact Grab")]
[Tooltip("The Interact Grab script to override the controls on.")]
public VRTK_InteractGrab interactGrabScript;
[Tooltip("The list of overrides.")]
public List<VRTK_SDKButtonInputOverrideType> interactGrabOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("Interact Use")]
[Tooltip("The Interact Use script to override the controls on.")]
public VRTK_InteractUse interactUseScript;
[Tooltip("The list of overrides.")]
public List<VRTK_SDKButtonInputOverrideType> interactUseOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("Pointer")]
[Tooltip("The Pointer script to override the controls on.")]
public VRTK_Pointer pointerScript;
[Tooltip("The list of overrides for the activation button.")]
public List<VRTK_SDKButtonInputOverrideType> pointerActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Tooltip("The list of overrides for the selection button.")]
public List<VRTK_SDKButtonInputOverrideType> pointerSelectionOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("UI Pointer")]
[Tooltip("The UI Pointer script to override the controls on.")]
public VRTK_UIPointer uiPointerScript;
[Tooltip("The list of overrides for the activation button.")]
public List<VRTK_SDKButtonInputOverrideType> uiPointerActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Tooltip("The list of overrides for the selection button.")]
public List<VRTK_SDKButtonInputOverrideType> uiPointerSelectionOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("Pointer Direction Indicator")]
[Tooltip("The Pointer Direction Indicator script to override the controls on.")]
public VRTK_PointerDirectionIndicator pointerDirectionIndicatorScript;
[Tooltip("The list of overrides for the coordinate axis.")]
public List<VRTK_SDKVector2AxisInputOverrideType> directionIndicatorCoordinateOverrides = new List<VRTK_SDKVector2AxisInputOverrideType>();
[Header("Touchpad Control")]
[Tooltip("The Touchpad Control script to override the controls on.")]
public VRTK_TouchpadControl touchpadControlScript;
[Tooltip("The list of overrides for the Touchpad Control coordinate axis.")]
public List<VRTK_SDKVector2AxisInputOverrideType> touchpadControlCoordinateOverrides = new List<VRTK_SDKVector2AxisInputOverrideType>();
[Tooltip("The list of overrides for the activation button.")]
public List<VRTK_SDKButtonInputOverrideType> touchpadControlActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Tooltip("The list of overrides for the modifier button.")]
public List<VRTK_SDKButtonInputOverrideType> touchpadControlModifierOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("Button Control")]
[Tooltip("The ButtonControl script to override the controls on.")]
public VRTK_ButtonControl buttonControlScript;
[Tooltip("The list of overrides for the forward button.")]
public List<VRTK_SDKButtonInputOverrideType> buttonControlForwardOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Tooltip("The list of overrides for the backward button.")]
public List<VRTK_SDKButtonInputOverrideType> buttonControlBackwardOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Tooltip("The list of overrides for the left button.")]
public List<VRTK_SDKButtonInputOverrideType> buttonControlLeftOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Tooltip("The list of overrides for the right button.")]
public List<VRTK_SDKButtonInputOverrideType> buttonControlRightOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("Slingshot Jump")]
[Tooltip("The SlingshotJump script to override the controls on.")]
public VRTK_SlingshotJump slingshotJumpScript;
[Tooltip("The list of overrides for the activation button.")]
public List<VRTK_SDKButtonInputOverrideType> slingshotJumpActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Tooltip("The list of overrides for the cancel button.")]
public List<VRTK_SDKButtonInputOverrideType> slingshotJumpCancelOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("Move In Place")]
[Tooltip("The MoveInPlace script to override the controls on.")]
public VRTK_MoveInPlace moveInPlaceScript;
[Tooltip("The list of overrides for the engage button.")]
public List<VRTK_SDKButtonInputOverrideType> moveInPlaceEngageOverrides = new List<VRTK_SDKButtonInputOverrideType>();
[Header("Step Multiplier")]
[Tooltip("The Step Multiplier script to override the controls on.")]
public VRTK_StepMultiplier stepMultiplierScript;
[Tooltip("The list of overrides for the activation button.")]
public List<VRTK_SDKButtonInputOverrideType> stepMultiplierActivationOverrides = new List<VRTK_SDKButtonInputOverrideType>();
/// <summary>
/// The ForceManage method forces the inputs to be updated even without an SDK change event occuring.
/// </summary>
public virtual void ForceManage()
{
ManageInputs();
}
protected override void OnEnable()
{
base.OnEnable();
ManageInputs();
}
protected override void OnDisable()
{
if (!gameObject.activeSelf)
{
base.OnDisable();
}
}
protected override void ControllerReady(VRTK_ControllerReference controllerReference)
{
if (VRTK_SDKManager.GetLoadedSDKSetup() != null && gameObject.activeInHierarchy)
{
ManageInputs();
}
}
protected virtual VRTK_SDKButtonInputOverrideType GetSelectedModifier(List<VRTK_SDKButtonInputOverrideType> overrideTypes, VRTK_ControllerReference controllerReference)
{
VRTK_SDKButtonInputOverrideType selectedModifier = null;
//attempt to find by the overall SDK set up to start with
if (VRTK_SDKManager.GetLoadedSDKSetup() != null)
{
selectedModifier = overrideTypes.FirstOrDefault(item => item.loadedSDKSetup == VRTK_SDKManager.GetLoadedSDKSetup());
}
//If no sdk set up is found or it is null then try and find by the SDK controller
if (selectedModifier == null)
{
SDK_BaseController.ControllerType currentControllerType = VRTK_DeviceFinder.GetCurrentControllerType(controllerReference);
selectedModifier = overrideTypes.FirstOrDefault(item => item.controllerType == currentControllerType);
}
return selectedModifier;
}
protected virtual VRTK_SDKVector2AxisInputOverrideType GetSelectedModifier(List<VRTK_SDKVector2AxisInputOverrideType> overrideTypes, VRTK_ControllerReference controllerReference)
{
//attempt to find by the overall SDK set up to start with
VRTK_SDKVector2AxisInputOverrideType selectedModifier = overrideTypes.FirstOrDefault(item => item.loadedSDKSetup == VRTK_SDKManager.GetLoadedSDKSetup());
//If no sdk set up is found or it is null then try and find by the SDK controller
if (selectedModifier == null)
{
SDK_BaseController.ControllerType currentControllerType = VRTK_DeviceFinder.GetCurrentControllerType(controllerReference);
selectedModifier = overrideTypes.FirstOrDefault(item => item.controllerType == currentControllerType);
}
return selectedModifier;
}
protected virtual void ManageInputs()
{
ManageInteractGrab();
ManageInteractUse();
ManagePointer();
ManageUIPointer();
ManagePointerDirectionIndicator();
ManageTouchpadControl();
ManageButtonControl();
ManageSlingshotJump();
ManageMoveInPlace();
ManageStepMultiplier();
}
protected virtual VRTK_ControllerReference GetReferenceFromEvents(VRTK_ControllerEvents controllerEvents)
{
return VRTK_ControllerReference.GetControllerReference((controllerEvents != null ? controllerEvents.gameObject : null));
}
protected virtual VRTK_ControllerReference GetRightThenLeftReference()
{
VRTK_ControllerReference controllerReference = VRTK_ControllerReference.GetControllerReference(SDK_BaseController.ControllerHand.Right);
return (VRTK_ControllerReference.IsValid(controllerReference) ? controllerReference : VRTK_ControllerReference.GetControllerReference(SDK_BaseController.ControllerHand.Left));
}
protected virtual void ManageInteractGrab()
{
if (interactGrabScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(interactGrabScript.controllerEvents);
VRTK_SDKButtonInputOverrideType selectedModifier = GetSelectedModifier(interactGrabOverrides, controllerReference);
if (selectedModifier != null && selectedModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
interactGrabScript.enabled = false;
interactGrabScript.grabButton = selectedModifier.overrideButton;
interactGrabScript.enabled = true;
}
}
}
protected virtual void ManageInteractUse()
{
if (interactUseScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(interactUseScript.controllerEvents);
VRTK_SDKButtonInputOverrideType selectedModifier = GetSelectedModifier(interactUseOverrides, controllerReference);
if (selectedModifier != null && selectedModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
interactUseScript.enabled = false;
interactUseScript.useButton = selectedModifier.overrideButton;
interactUseScript.enabled = true;
}
}
}
protected virtual void ManagePointer()
{
if (pointerScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(pointerScript.controllerEvents);
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(pointerActivationOverrides, controllerReference);
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
pointerScript.enabled = false;
pointerScript.activationButton = selectedActivationModifier.overrideButton;
pointerScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedSelectionModifier = GetSelectedModifier(pointerSelectionOverrides, controllerReference);
if (selectedSelectionModifier != null && selectedSelectionModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
pointerScript.enabled = false;
pointerScript.selectionButton = selectedSelectionModifier.overrideButton;
pointerScript.enabled = true;
}
}
}
protected virtual void ManageUIPointer()
{
if (uiPointerScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(uiPointerScript.controllerEvents);
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(uiPointerActivationOverrides, controllerReference);
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
uiPointerScript.enabled = false;
uiPointerScript.activationButton = selectedActivationModifier.overrideButton;
uiPointerScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedSelectionModifier = GetSelectedModifier(uiPointerSelectionOverrides, controllerReference);
if (selectedSelectionModifier != null && selectedSelectionModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
uiPointerScript.enabled = false;
uiPointerScript.selectionButton = selectedSelectionModifier.overrideButton;
uiPointerScript.enabled = true;
}
}
}
protected virtual void ManagePointerDirectionIndicator()
{
if (pointerDirectionIndicatorScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(pointerDirectionIndicatorScript.GetControllerEvents());
VRTK_SDKVector2AxisInputOverrideType selectedCoorinateModifier = GetSelectedModifier(directionIndicatorCoordinateOverrides, controllerReference);
if (selectedCoorinateModifier != null && selectedCoorinateModifier.overrideAxis != VRTK_ControllerEvents.Vector2AxisAlias.Undefined)
{
pointerDirectionIndicatorScript.enabled = false;
pointerDirectionIndicatorScript.coordinateAxis = selectedCoorinateModifier.overrideAxis;
pointerDirectionIndicatorScript.enabled = true;
}
}
}
protected virtual void ManageTouchpadControl()
{
if (touchpadControlScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(touchpadControlScript.controller);
VRTK_SDKVector2AxisInputOverrideType selectedCoorinateModifier = GetSelectedModifier(touchpadControlCoordinateOverrides, controllerReference);
if (selectedCoorinateModifier != null && selectedCoorinateModifier.overrideAxis != VRTK_ControllerEvents.Vector2AxisAlias.Undefined)
{
touchpadControlScript.enabled = false;
touchpadControlScript.coordinateAxis = selectedCoorinateModifier.overrideAxis;
touchpadControlScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(touchpadControlActivationOverrides, controllerReference);
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
touchpadControlScript.enabled = false;
touchpadControlScript.primaryActivationButton = selectedActivationModifier.overrideButton;
touchpadControlScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedActionModifier = GetSelectedModifier(touchpadControlModifierOverrides, controllerReference);
if (selectedActionModifier != null && selectedActionModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
touchpadControlScript.enabled = false;
touchpadControlScript.actionModifierButton = selectedActionModifier.overrideButton;
touchpadControlScript.enabled = true;
}
}
}
protected virtual void ManageButtonControl()
{
if (buttonControlScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(buttonControlScript.controller);
VRTK_SDKButtonInputOverrideType selectedForwardModifier = GetSelectedModifier(buttonControlForwardOverrides, controllerReference);
if (selectedForwardModifier != null && selectedForwardModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
buttonControlScript.enabled = false;
buttonControlScript.forwardButton = selectedForwardModifier.overrideButton;
buttonControlScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedBackwardModifier = GetSelectedModifier(buttonControlBackwardOverrides, controllerReference);
if (selectedBackwardModifier != null && selectedBackwardModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
buttonControlScript.enabled = false;
buttonControlScript.backwardButton = selectedBackwardModifier.overrideButton;
buttonControlScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedLeftModifier = GetSelectedModifier(buttonControlLeftOverrides, controllerReference);
if (selectedLeftModifier != null && selectedLeftModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
buttonControlScript.enabled = false;
buttonControlScript.leftButton = selectedLeftModifier.overrideButton;
buttonControlScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedRightModifier = GetSelectedModifier(buttonControlRightOverrides, controllerReference);
if (selectedRightModifier != null && selectedRightModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
buttonControlScript.enabled = false;
buttonControlScript.rightButton = selectedRightModifier.overrideButton;
buttonControlScript.enabled = true;
}
}
}
protected virtual void ManageSlingshotJump()
{
if (slingshotJumpScript != null)
{
VRTK_ControllerReference controllerReference = GetRightThenLeftReference();
VRTK_SDKButtonInputOverrideType selectedActivationModifier = GetSelectedModifier(slingshotJumpActivationOverrides, controllerReference);
if (selectedActivationModifier != null && selectedActivationModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
slingshotJumpScript.enabled = false;
slingshotJumpScript.SetActivationButton(selectedActivationModifier.overrideButton);
slingshotJumpScript.enabled = true;
}
VRTK_SDKButtonInputOverrideType selectedCancelModifier = GetSelectedModifier(slingshotJumpCancelOverrides, controllerReference);
if (selectedCancelModifier != null && selectedCancelModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
slingshotJumpScript.enabled = false;
slingshotJumpScript.SetCancelButton(selectedCancelModifier.overrideButton);
slingshotJumpScript.enabled = true;
}
}
}
protected virtual void ManageMoveInPlace()
{
if (moveInPlaceScript != null)
{
VRTK_ControllerReference controllerReference = GetRightThenLeftReference();
VRTK_SDKButtonInputOverrideType selectedEngageModifier = GetSelectedModifier(moveInPlaceEngageOverrides, controllerReference);
if (selectedEngageModifier != null && selectedEngageModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
moveInPlaceScript.enabled = false;
moveInPlaceScript.engageButton = selectedEngageModifier.overrideButton;
moveInPlaceScript.enabled = true;
}
}
}
protected virtual void ManageStepMultiplier()
{
if (stepMultiplierScript != null)
{
VRTK_ControllerReference controllerReference = GetReferenceFromEvents(stepMultiplierScript.controllerEvents);
VRTK_SDKButtonInputOverrideType selectedModifier = GetSelectedModifier(stepMultiplierActivationOverrides, controllerReference);
if (selectedModifier != null && selectedModifier.overrideButton != VRTK_ControllerEvents.ButtonAlias.Undefined)
{
stepMultiplierScript.enabled = false;
stepMultiplierScript.activationButton = selectedModifier.overrideButton;
stepMultiplierScript.enabled = true;
}
}
}
}
}