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.
 
 
 

261 lines
8.9 KiB

namespace VRTK
{
using UnityEngine;
using System.Collections;
public struct VRTKTrackedControllerEventArgs
{
public uint currentIndex;
public uint previousIndex;
}
public delegate void VRTKTrackedControllerEventHandler(object sender, VRTKTrackedControllerEventArgs e);
public class VRTK_TrackedController : MonoBehaviour
{
public uint index = uint.MaxValue;
public event VRTKTrackedControllerEventHandler ControllerEnabled;
public event VRTKTrackedControllerEventHandler ControllerDisabled;
public event VRTKTrackedControllerEventHandler ControllerIndexChanged;
public event VRTKTrackedControllerEventHandler ControllerModelAvailable;
protected GameObject aliasController;
protected SDK_BaseController.ControllerType controllerType = SDK_BaseController.ControllerType.Undefined;
protected bool controllerModelWaitSubscribed = false;
protected Coroutine emitControllerEnabledRoutine = null;
protected Coroutine emitControllerModelAvailableRoutine = null;
protected VRTK_ControllerReference controllerReference
{
get
{
return VRTK_ControllerReference.GetControllerReference(index);
}
}
public virtual void OnControllerEnabled(VRTKTrackedControllerEventArgs e)
{
if (ControllerEnabled != null)
{
ControllerEnabled(this, e);
}
}
public virtual void OnControllerDisabled(VRTKTrackedControllerEventArgs e)
{
if (ControllerDisabled != null)
{
ControllerDisabled(this, e);
}
}
public virtual void OnControllerIndexChanged(VRTKTrackedControllerEventArgs e)
{
if (ControllerIndexChanged != null)
{
ControllerIndexChanged(this, e);
}
}
public virtual void OnControllerModelAvailable(VRTKTrackedControllerEventArgs e)
{
if (ControllerModelAvailable != null)
{
ControllerModelAvailable(this, e);
}
}
public virtual SDK_BaseController.ControllerType GetControllerType()
{
return controllerType;
}
protected virtual VRTKTrackedControllerEventArgs SetEventPayload(uint previousIndex = uint.MaxValue)
{
VRTKTrackedControllerEventArgs e;
e.currentIndex = index;
e.previousIndex = previousIndex;
return e;
}
protected virtual void Awake()
{
VRTK_SDKManager.AttemptAddBehaviourToToggleOnLoadedSetupChange(this);
}
protected virtual void OnEnable()
{
aliasController = VRTK_DeviceFinder.GetScriptAliasController(gameObject);
if (aliasController == null)
{
aliasController = gameObject;
}
index = VRTK_DeviceFinder.GetControllerIndex(gameObject);
SetControllerType();
StartEmitControllerEnabledAtEndOfFrame();
ManageControllerModelListeners(true);
}
protected virtual void OnDisable()
{
CancelCoroutines();
index = uint.MaxValue;
ManageControllerModelListeners(false);
OnControllerDisabled(SetEventPayload());
}
protected virtual void OnDestroy()
{
VRTK_SDKManager.AttemptRemoveBehaviourToToggleOnLoadedSetupChange(this);
}
protected virtual void FixedUpdate()
{
VRTK_SDK_Bridge.ControllerProcessFixedUpdate(VRTK_ControllerReference.GetControllerReference(index));
}
protected virtual void Update()
{
uint checkIndex = VRTK_DeviceFinder.GetControllerIndex(gameObject);
if (checkIndex != index)
{
uint previousIndex = index;
index = checkIndex;
//If the controller model listeners have already been registered, then make sure to unsub and sub when index changes.
if (controllerModelWaitSubscribed)
{
ManageControllerModelListeners(false);
ManageControllerModelListeners(true);
}
OnControllerIndexChanged(SetEventPayload(previousIndex));
SetControllerType();
}
VRTK_SDK_Bridge.ControllerProcessUpdate(VRTK_ControllerReference.GetControllerReference(index));
if (aliasController != null && gameObject.activeInHierarchy && !aliasController.activeSelf)
{
aliasController.SetActive(true);
}
}
protected virtual void ManageLeftControllerListener(bool register, VRTKSDKBaseControllerEventHandler callbackMethod)
{
if (register)
{
VRTK_SDK_Bridge.GetControllerSDK().LeftControllerModelReady += callbackMethod;
}
else
{
VRTK_SDK_Bridge.GetControllerSDK().LeftControllerModelReady -= callbackMethod;
}
}
protected virtual void ManageRightControllerListener(bool register, VRTKSDKBaseControllerEventHandler callbackMethod)
{
if (register)
{
VRTK_SDK_Bridge.GetControllerSDK().RightControllerModelReady += callbackMethod;
}
else
{
VRTK_SDK_Bridge.GetControllerSDK().RightControllerModelReady -= callbackMethod;
}
}
protected virtual void RegisterHandControllerListener(bool register, SDK_BaseController.ControllerHand givenHand)
{
switch (givenHand)
{
case SDK_BaseController.ControllerHand.Left:
ManageLeftControllerListener(register, ControllerModelReady);
break;
case SDK_BaseController.ControllerHand.Right:
ManageRightControllerListener(register, ControllerModelReady);
break;
}
controllerModelWaitSubscribed = register;
}
protected virtual void ManageControllerModelListener(bool register, SDK_BaseController.ControllerHand givenHand)
{
if (VRTK_SDK_Bridge.WaitForControllerModel(givenHand))
{
RegisterHandControllerListener(register, givenHand);
}
else
{
if (register)
{
StartEmitControllerModelReadyAtEndOfFrame();
}
else if (controllerModelWaitSubscribed)
{
RegisterHandControllerListener(register, givenHand);
}
}
}
protected virtual void ManageControllerModelListeners(bool register)
{
ManageControllerModelListener(register, VRTK_DeviceFinder.GetControllerHand(gameObject));
}
protected virtual void SetControllerType()
{
controllerType = (controllerReference != null ? VRTK_DeviceFinder.GetCurrentControllerType(controllerReference) : SDK_BaseController.ControllerType.Undefined);
}
protected virtual void StartEmitControllerEnabledAtEndOfFrame()
{
if (gameObject.activeInHierarchy)
{
emitControllerEnabledRoutine = StartCoroutine(EmitControllerEnabledAtEndOfFrame());
}
}
protected virtual IEnumerator EmitControllerEnabledAtEndOfFrame()
{
yield return new WaitForEndOfFrame();
OnControllerEnabled(SetEventPayload());
}
protected virtual void ControllerModelReady(object sender, VRTKSDKBaseControllerEventArgs e)
{
SetControllerType();
if (e.controllerReference == null || controllerReference == e.controllerReference)
{
StartEmitControllerModelReadyAtEndOfFrame();
}
}
protected virtual void StartEmitControllerModelReadyAtEndOfFrame()
{
if (gameObject != null && gameObject.activeInHierarchy)
{
emitControllerModelAvailableRoutine = StartCoroutine(EmitControllerModelReadyAtEndOfFrame());
}
}
protected virtual IEnumerator EmitControllerModelReadyAtEndOfFrame()
{
yield return new WaitForEndOfFrame();
OnControllerModelAvailable(SetEventPayload());
}
protected virtual void CancelCoroutines()
{
if (emitControllerModelAvailableRoutine != null)
{
StopCoroutine(emitControllerModelAvailableRoutine);
}
if (emitControllerEnabledRoutine != null)
{
StopCoroutine(emitControllerEnabledRoutine);
}
}
}
}