IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
SpawnRenderModel.cs
1 //======= Copyright (c) Valve Corporation, All rights reserved. ===============
2 //
3 // Purpose: Spawns a render model for the controller from SteamVR
4 //
5 //=============================================================================
6 
7 using UnityEngine;
8 using System.Collections;
9 using System.Collections.Generic;
10 
11 namespace Valve.VR.InteractionSystem
12 {
13  //-------------------------------------------------------------------------
14  public class SpawnRenderModel : MonoBehaviour
15  {
16  public Material[] materials;
17 
18  private SteamVR_RenderModel[] renderModels;
19  private Hand hand;
20  private List<MeshRenderer> renderers = new List<MeshRenderer>();
21 
22  private static List<SpawnRenderModel> spawnRenderModels = new List<SpawnRenderModel>();
23  private static int lastFrameUpdated;
24  private static int spawnRenderModelUpdateIndex;
25 
26  SteamVR_Events.Action renderModelLoadedAction;
27 
28 
29  //-------------------------------------------------
30  void Awake()
31  {
32  renderModels = new SteamVR_RenderModel[materials.Length];
33  renderModelLoadedAction = SteamVR_Events.RenderModelLoadedAction( OnRenderModelLoaded );
34  }
35 
36 
37  //-------------------------------------------------
38  void OnEnable()
39  {
40  ShowController();
41 
42  renderModelLoadedAction.enabled = true;
43 
44  spawnRenderModels.Add( this );
45  }
46 
47 
48  //-------------------------------------------------
49  void OnDisable()
50  {
51  HideController();
52 
53  renderModelLoadedAction.enabled = false;
54 
55  spawnRenderModels.Remove( this );
56  }
57 
58 
59  //-------------------------------------------------
60  private void OnAttachedToHand( Hand hand )
61  {
62  this.hand = hand;
63  ShowController();
64  }
65 
66 
67  //-------------------------------------------------
68  private void OnDetachedFromHand( Hand hand )
69  {
70  this.hand = null;
71  HideController();
72  }
73 
74 
75  //-------------------------------------------------
76  void Update()
77  {
78  // Only update one per frame
79  if ( lastFrameUpdated == Time.renderedFrameCount )
80  {
81  return;
82  }
83  lastFrameUpdated = Time.renderedFrameCount;
84 
85 
86  // SpawnRenderModel overflow
87  if ( spawnRenderModelUpdateIndex >= spawnRenderModels.Count )
88  {
89  spawnRenderModelUpdateIndex = 0;
90  }
91 
92 
93  // Perform update
94  if ( spawnRenderModelUpdateIndex < spawnRenderModels.Count )
95  {
96  SteamVR_RenderModel renderModel = spawnRenderModels[spawnRenderModelUpdateIndex].renderModels[0];
97  if ( renderModel != null )
98  {
99  renderModel.UpdateComponents( OpenVR.RenderModels );
100  }
101  }
102 
103  spawnRenderModelUpdateIndex++;
104  }
105 
106 
107  //-------------------------------------------------
108  private void ShowController()
109  {
110  if ( hand == null || hand.controller == null )
111  {
112  return;
113  }
114 
115  for ( int i = 0; i < renderModels.Length; i++ )
116  {
117  if ( renderModels[i] == null )
118  {
119  renderModels[i] = new GameObject( "SteamVR_RenderModel" ).AddComponent<SteamVR_RenderModel>();
120  renderModels[i].updateDynamically = false; // Update one per frame (see Update() method)
121  renderModels[i].transform.parent = transform;
122  Util.ResetTransform( renderModels[i].transform );
123  }
124 
125  renderModels[i].gameObject.SetActive( true );
126  renderModels[i].SetDeviceIndex( (int)hand.controller.index );
127  }
128  }
129 
130 
131  //-------------------------------------------------
132  private void HideController()
133  {
134  for ( int i = 0; i < renderModels.Length; i++ )
135  {
136  if ( renderModels[i] != null )
137  {
138  renderModels[i].gameObject.SetActive( false );
139  }
140  }
141  }
142 
143 
144  //-------------------------------------------------
145  private void OnRenderModelLoaded( SteamVR_RenderModel renderModel, bool success )
146  {
147  for ( int i = 0; i < renderModels.Length; i++ )
148  {
149  if ( renderModel == renderModels[i] )
150  {
151  if ( materials[i] != null )
152  {
153  renderers.Clear();
154  renderModels[i].GetComponentsInChildren<MeshRenderer>( renderers );
155  for ( int j = 0; j < renderers.Count; j++ )
156  {
157  Texture mainTexture = renderers[j].material.mainTexture;
158  renderers[j].sharedMaterial = materials[i];
159  renderers[j].material.mainTexture = mainTexture;
160  renderers[j].gameObject.layer = gameObject.layer;
161  renderers[j].tag = gameObject.tag;
162  }
163  }
164  }
165  }
166  }
167  }
168 }