|
|
- namespace VRTK
- {
- using UnityEngine;
- using System;
- using System.Collections.Generic;
-
- public class VRTK_ControllerReference : IEquatable<VRTK_ControllerReference>
- {
- public static Dictionary<uint, VRTK_ControllerReference> controllerReferences = new Dictionary<uint, VRTK_ControllerReference>();
-
- 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);
- }
- }
- }
|