namespace VRTK { using UnityEngine; using System; using System.Collections.Generic; public class VRTK_ControllerReference : IEquatable { public static Dictionary controllerReferences = new Dictionary(); public static VRTK_ControllerReference GetControllerReference(uint controllerIndex) { if (controllerIndex < uint.MaxValue) { VRTK_ControllerReference foundReference = VRTK_SharedMethods.GetDictionaryValue(controllerReferences, controllerIndex); if (foundReference != null) { return foundReference; } return new VRTK_ControllerReference(controllerIndex); } return null; } public static VRTK_ControllerReference GetControllerReference(GameObject controllerObject) { //Try and get the index from either the actual or alias uint controllerIndex = VRTK_SDK_Bridge.GetControllerIndex(controllerObject); //If not found then try and get index from the model object if (controllerIndex >= uint.MaxValue) { controllerIndex = VRTK_SDK_Bridge.GetControllerIndex(GetValidObjectFromHand(VRTK_SDK_Bridge.GetControllerModelHand(controllerObject))); } VRTK_ControllerReference foundReference = VRTK_SharedMethods.GetDictionaryValue(controllerReferences, controllerIndex); if (foundReference != null) { return foundReference; } return new VRTK_ControllerReference(controllerIndex); } public static VRTK_ControllerReference GetControllerReference(SDK_BaseController.ControllerHand controllerHand) { GameObject scriptAlias = GetValidObjectFromHand(controllerHand); uint controllerIndex = VRTK_SDK_Bridge.GetControllerIndex(scriptAlias); VRTK_ControllerReference foundReference = VRTK_SharedMethods.GetDictionaryValue(controllerReferences, controllerIndex); if (foundReference != null) { return foundReference; } return new VRTK_ControllerReference(scriptAlias); } public static bool IsValid(VRTK_ControllerReference controllerReference) { return (controllerReference != null ? controllerReference.IsValid() : false); } public static uint GetRealIndex(VRTK_ControllerReference controllerReference) { return (IsValid(controllerReference) ? controllerReference.index : uint.MaxValue); } protected uint storedControllerIndex = uint.MaxValue; public VRTK_ControllerReference(uint controllerIndex) { //Only set up if the given index matches an actual controller if (VRTK_SDK_Bridge.GetControllerByIndex(controllerIndex, true) != null) { storedControllerIndex = controllerIndex; AddToCache(); } } public VRTK_ControllerReference(GameObject controllerObject) : this(GetControllerHand(controllerObject)) { } public VRTK_ControllerReference(SDK_BaseController.ControllerHand controllerHand) { storedControllerIndex = VRTK_SDK_Bridge.GetControllerIndex(GetValidObjectFromHand(controllerHand)); AddToCache(); } public uint index { get { return storedControllerIndex; } } public GameObject scriptAlias { get { return VRTK_SDK_Bridge.GetControllerByIndex(storedControllerIndex, false); } } public GameObject actual { get { return VRTK_SDK_Bridge.GetControllerByIndex(storedControllerIndex, true); } } public GameObject model { get { return VRTK_SDK_Bridge.GetControllerModel(GetValidObjectFromIndex()); } } public SDK_BaseController.ControllerHand hand { get { return GetControllerHand(GetValidObjectFromIndex()); } } public bool IsValid() { return (index < uint.MaxValue); } public override string ToString() { return base.ToString() + " --> INDEX[" + index + "] - ACTUAL[" + actual + "] - SCRIPT_ALIAS[" + scriptAlias + "] - MODEL[" + model + "] - HAND[" + hand + "]"; } public override int GetHashCode() { return (int)index; } public override bool Equals(object obj) { if (obj == null) { return false; } VRTK_ControllerReference objAsPart = obj as VRTK_ControllerReference; if (objAsPart == null) { return false; } else { return Equals(objAsPart); } } public bool Equals(VRTK_ControllerReference other) { if (other == null) { return false; } return (index == other.index); } protected virtual GameObject GetValidObjectFromIndex() { GameObject checkObject = VRTK_SDK_Bridge.GetControllerByIndex(storedControllerIndex, false); return (checkObject == null ? VRTK_SDK_Bridge.GetControllerByIndex(storedControllerIndex, true) : checkObject); } protected virtual void AddToCache() { if (IsValid()) { VRTK_SharedMethods.AddDictionaryValue(controllerReferences, storedControllerIndex, this, true); } } private static GameObject GetValidObjectFromHand(SDK_BaseController.ControllerHand controllerHand) { switch (controllerHand) { case SDK_BaseController.ControllerHand.Left: return (VRTK_SDK_Bridge.GetControllerLeftHand(false) ? VRTK_SDK_Bridge.GetControllerLeftHand(false) : VRTK_SDK_Bridge.GetControllerLeftHand(true)); case SDK_BaseController.ControllerHand.Right: return (VRTK_SDK_Bridge.GetControllerRightHand(false) ? VRTK_SDK_Bridge.GetControllerRightHand(false) : VRTK_SDK_Bridge.GetControllerRightHand(true)); } return null; } private static SDK_BaseController.ControllerHand GetControllerHand(GameObject controllerObject) { if (VRTK_SDK_Bridge.IsControllerLeftHand(controllerObject, false) || VRTK_SDK_Bridge.IsControllerLeftHand(controllerObject, true)) { return SDK_BaseController.ControllerHand.Left; } else if (VRTK_SDK_Bridge.IsControllerRightHand(controllerObject, false) || VRTK_SDK_Bridge.IsControllerRightHand(controllerObject, true)) { return SDK_BaseController.ControllerHand.Right; } return VRTK_SDK_Bridge.GetControllerModelHand(controllerObject); } } }