Guest User

Untitled

a guest
Jul 16th, 2016
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.73 KB | None | 0 0
  1. //========= Copyright 2016, Valve Corporation, All rights reserved. ===========
  2. //
  3. // Purpose: Enables/disables objects based on connectivity and assigned roles.
  4. //
  5. //=============================================================================
  6.  
  7. using UnityEngine;
  8. using System.Collections.Generic;
  9. using Valve.VR;
  10.  
  11. public class SteamVR_ControllerManager : MonoBehaviour
  12. {
  13.     public GameObject left, right;
  14.     public GameObject[] objects; // populate with objects you want to assign to additional controllers
  15.  
  16.     uint[] indices; // assigned
  17.     bool[] connected = new bool[OpenVR.k_unMaxTrackedDeviceCount]; // controllers only
  18.  
  19.     // cached roles - may or may not be connected
  20.     uint leftIndex = OpenVR.k_unTrackedDeviceIndexInvalid;
  21.     uint rightIndex = OpenVR.k_unTrackedDeviceIndexInvalid;
  22.  
  23.     void Awake()
  24.     {
  25.         // Add left and right entries to the head of the list so we only have to operate on the list itself.
  26.         var additional = (this.objects != null) ? this.objects.Length : 0;
  27.         var objects = new GameObject[2 + additional];
  28.         indices = new uint[2 + additional];
  29.         objects[0] = right;
  30.         indices[0] = OpenVR.k_unTrackedDeviceIndexInvalid;
  31.         objects[1] = left;
  32.         indices[1] = OpenVR.k_unTrackedDeviceIndexInvalid;
  33.         for (int i = 0; i < additional; i++)
  34.         {
  35.             objects[2 + i] = this.objects[i];
  36.             indices[2 + i] = OpenVR.k_unTrackedDeviceIndexInvalid;
  37.         }
  38.         this.objects = objects;
  39.     }
  40.  
  41.     void OnEnable()
  42.     {
  43.         for (int i = 0; i < objects.Length; i++)
  44.         {
  45.             var obj = objects[i];
  46.             if (obj != null)
  47.                 obj.SetActive(false);
  48.         }
  49.  
  50.         OnTrackedDeviceRoleChanged();
  51.  
  52.         for (int i = 0; i < SteamVR.connected.Length; i++)
  53.             if (SteamVR.connected[i])
  54.                 OnDeviceConnected(i, true);
  55.  
  56.         SteamVR_Utils.Event.Listen("input_focus", OnInputFocus);
  57.         SteamVR_Utils.Event.Listen("device_connected", OnDeviceConnected);
  58.         SteamVR_Utils.Event.Listen("TrackedDeviceRoleChanged", OnTrackedDeviceRoleChanged);
  59.     }
  60.  
  61.     void OnDisable()
  62.     {
  63.         SteamVR_Utils.Event.Remove("input_focus", OnInputFocus);
  64.         SteamVR_Utils.Event.Remove("device_connected", OnDeviceConnected);
  65.         SteamVR_Utils.Event.Remove("TrackedDeviceRoleChanged", OnTrackedDeviceRoleChanged);
  66.     }
  67.  
  68.     static string[] labels = { "left", "right" };
  69.  
  70.     // Hide controllers when the dashboard is up.
  71.     private void OnInputFocus(params object[] args)
  72.     {
  73.         bool hasFocus = (bool)args[0];
  74.         if (hasFocus)
  75.         {
  76.             for (int i = 0; i < objects.Length; i++)
  77.             {
  78.                 var obj = objects[i];
  79.                 if (obj != null)
  80.                 {
  81.                     var label = (i < 2) ? labels[i] : (i - 1).ToString();
  82.                     ShowObject(obj.transform, "hidden (" + label + ")");
  83.                 }
  84.             }
  85.         }
  86.         else
  87.         {
  88.             for (int i = 0; i < objects.Length; i++)
  89.             {
  90.                 var obj = objects[i];
  91.                 if (obj != null)
  92.                 {
  93.                     var label = (i < 2) ? labels[i] : (i - 1).ToString();
  94.                     HideObject(obj.transform, "hidden (" + label + ")");
  95.                 }
  96.             }
  97.         }
  98.     }
  99.  
  100.     // Reparents to a new object and deactivates that object (this allows
  101.     // us to call SetActive in OnDeviceConnected independently.
  102.     private void HideObject(Transform t, string name)
  103.     {
  104.         var hidden = new GameObject(name).transform;
  105.         hidden.parent = t.parent;
  106.         t.parent = hidden;
  107.         hidden.gameObject.SetActive(false);
  108.     }
  109.     private void ShowObject(Transform t, string name)
  110.     {
  111.         var hidden = t.parent;
  112.         if (hidden.gameObject.name != name)
  113.             return;
  114.         t.parent = hidden.parent;
  115.         Destroy(hidden.gameObject);
  116.     }
  117.  
  118.     private void SetTrackedDeviceIndex(int objectIndex, uint trackedDeviceIndex)
  119.     {
  120.         // First make sure no one else is already using this index.
  121.         if (trackedDeviceIndex != OpenVR.k_unTrackedDeviceIndexInvalid)
  122.         {
  123.             for (int i = 0; i < objects.Length; i++)
  124.             {
  125.                 if (i != objectIndex && indices[i] == trackedDeviceIndex)
  126.                 {
  127.                     var obj = objects[i];
  128.                     if (obj != null)
  129.                         obj.SetActive(false);
  130.  
  131.                     indices[i] = OpenVR.k_unTrackedDeviceIndexInvalid;
  132.                 }
  133.             }
  134.         }
  135.  
  136.         // Only set when changed.
  137.         if (trackedDeviceIndex != indices[objectIndex])
  138.         {
  139.             indices[objectIndex] = trackedDeviceIndex;
  140.  
  141.             var obj = objects[objectIndex];
  142.             if (obj != null)
  143.             {
  144.                 if (trackedDeviceIndex == OpenVR.k_unTrackedDeviceIndexInvalid)
  145.                     obj.SetActive(false);
  146.                 else
  147.                 {
  148.                     obj.SetActive(true);
  149.                     obj.BroadcastMessage("SetDeviceIndex", (int)trackedDeviceIndex, SendMessageOptions.DontRequireReceiver);
  150.                 }
  151.             }
  152.         }
  153.     }
  154.  
  155.     // Keep track of assigned roles.
  156.     private void OnTrackedDeviceRoleChanged(params object[] args)
  157.     {
  158.         Refresh();
  159.     }
  160.  
  161.     // Keep track of connected controller indices.
  162.     private void OnDeviceConnected(params object[] args)
  163.     {
  164.         var index = (uint)(int)args[0];
  165.         bool changed = this.connected[index];
  166.         this.connected[index] = false;
  167.  
  168.         var connected = (bool)args[1];
  169.         if (connected)
  170.         {
  171.             var system = OpenVR.System;
  172.             if (system != null && system.GetTrackedDeviceClass(index) == ETrackedDeviceClass.Controller)
  173.             {
  174.                 this.connected[index] = true;
  175.                 changed = !changed; // if we clear and set the same index, nothing has changed
  176.             }
  177.         }
  178.  
  179.         if (changed)
  180.             Refresh();
  181.     }
  182.  
  183.     public void Refresh()
  184.     {
  185.         int objectIndex = 0;
  186.  
  187.         var system = OpenVR.System;
  188.         if (system != null)
  189.         {
  190.             leftIndex = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
  191.             rightIndex = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
  192.         }
  193.  
  194.         // If neither role has been assigned yet, try hooking up at least the right controller.
  195.         if (leftIndex == OpenVR.k_unTrackedDeviceIndexInvalid && rightIndex == OpenVR.k_unTrackedDeviceIndexInvalid)
  196.         {
  197.             for (uint deviceIndex = 0; deviceIndex < connected.Length; deviceIndex++)
  198.             {
  199.                 if (connected[deviceIndex])
  200.                 {
  201.                     SetTrackedDeviceIndex(objectIndex++, deviceIndex);
  202.                     break;
  203.                 }
  204.             }
  205.         }
  206.         else
  207.         {
  208.             SetTrackedDeviceIndex(objectIndex++, (rightIndex < connected.Length && connected[rightIndex]) ? rightIndex : OpenVR.k_unTrackedDeviceIndexInvalid);
  209.             SetTrackedDeviceIndex(objectIndex++, (leftIndex < connected.Length && connected[leftIndex]) ? leftIndex : OpenVR.k_unTrackedDeviceIndexInvalid);
  210.  
  211.             // Assign out any additional controllers only after both left and right have been assigned.
  212.             if (leftIndex != OpenVR.k_unTrackedDeviceIndexInvalid && rightIndex != OpenVR.k_unTrackedDeviceIndexInvalid)
  213.             {
  214.                 for (uint deviceIndex = 0; deviceIndex < connected.Length; deviceIndex++)
  215.                 {
  216.                     if (objectIndex >= objects.Length)
  217.                         break;
  218.  
  219.                     if (!connected[deviceIndex])
  220.                         continue;
  221.  
  222.                     if (deviceIndex != leftIndex && deviceIndex != rightIndex)
  223.                     {
  224.                         SetTrackedDeviceIndex(objectIndex++, deviceIndex);
  225.                     }
  226.                 }
  227.             }
  228.         }
  229.  
  230.         // Reset the rest.
  231.         while (objectIndex < objects.Length)
  232.         {
  233.             SetTrackedDeviceIndex(objectIndex++, OpenVR.k_unTrackedDeviceIndexInvalid);
  234.         }
  235.     }
  236. }
Add Comment
Please, Sign In to add comment