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.
 
 
 

208 lines
7.2 KiB

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);
}
}
}