IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
ControllerHoverHighlight.cs
1 //======= Copyright (c) Valve Corporation, All rights reserved. ===============
2 //
3 // Purpose: Highlights the controller when hovering over interactables
4 //
5 //=============================================================================
6 
7 using UnityEngine;
8 using System.Collections;
9 
10 namespace Valve.VR.InteractionSystem
11 {
12  //-------------------------------------------------------------------------
13  public class ControllerHoverHighlight : MonoBehaviour
14  {
15  public Material highLightMaterial;
16  public bool fireHapticsOnHightlight = true;
17 
18  private Hand hand;
19 
20  private MeshRenderer bodyMeshRenderer;
21  private MeshRenderer trackingHatMeshRenderer;
22  private SteamVR_RenderModel renderModel;
23  private bool renderModelLoaded = false;
24 
25  SteamVR_Events.Action renderModelLoadedAction;
26 
27  //-------------------------------------------------
28  void Start()
29  {
30  hand = GetComponentInParent<Hand>();
31  }
32 
33 
34  //-------------------------------------------------
35  void Awake()
36  {
37  renderModelLoadedAction = SteamVR_Events.RenderModelLoadedAction( OnRenderModelLoaded );
38  }
39 
40 
41  //-------------------------------------------------
42  void OnEnable()
43  {
44  renderModelLoadedAction.enabled = true;
45  }
46 
47 
48  //-------------------------------------------------
49  void OnDisable()
50  {
51  renderModelLoadedAction.enabled = false;
52  }
53 
54 
55  //-------------------------------------------------
56  private void OnHandInitialized( int deviceIndex )
57  {
58  renderModel = gameObject.AddComponent<SteamVR_RenderModel>();
59  renderModel.SetDeviceIndex( deviceIndex );
60  renderModel.updateDynamically = false;
61  }
62 
63 
64  //-------------------------------------------------
65  private void OnRenderModelLoaded( SteamVR_RenderModel renderModel, bool success )
66  {
67  if ( renderModel != this.renderModel )
68  {
69  return;
70  }
71 
72  Transform bodyTransform = transform.Find( "body" );
73  if ( bodyTransform != null )
74  {
75  bodyTransform.gameObject.layer = gameObject.layer;
76  bodyTransform.gameObject.tag = gameObject.tag;
77  bodyMeshRenderer = bodyTransform.GetComponent<MeshRenderer>();
78  bodyMeshRenderer.material = highLightMaterial;
79  bodyMeshRenderer.enabled = false;
80  }
81 
82  Transform trackingHatTransform = transform.Find( "trackhat" );
83  if ( trackingHatTransform != null )
84  {
85  trackingHatTransform.gameObject.layer = gameObject.layer;
86  trackingHatTransform.gameObject.tag = gameObject.tag;
87  trackingHatMeshRenderer = trackingHatTransform.GetComponent<MeshRenderer>();
88  trackingHatMeshRenderer.material = highLightMaterial;
89  trackingHatMeshRenderer.enabled = false;
90  }
91 
92  foreach ( Transform child in transform )
93  {
94  if ( ( child.name != "body" ) && ( child.name != "trackhat" ) )
95  {
96  Destroy( child.gameObject );
97  }
98  }
99 
100  renderModelLoaded = true;
101  }
102 
103 
104  //-------------------------------------------------
105  private void OnParentHandHoverBegin( Interactable other )
106  {
107  if ( !this.isActiveAndEnabled )
108  {
109  return;
110  }
111 
112  if ( other.transform.parent != transform.parent )
113  {
114  ShowHighlight();
115  }
116  }
117 
118 
119  //-------------------------------------------------
120  private void OnParentHandHoverEnd( Interactable other )
121  {
122  HideHighlight();
123  }
124 
125 
126  //-------------------------------------------------
127  private void OnParentHandInputFocusAcquired()
128  {
129  if ( !this.isActiveAndEnabled )
130  {
131  return;
132  }
133 
134  if ( hand.hoveringInteractable && hand.hoveringInteractable.transform.parent != transform.parent )
135  {
136  ShowHighlight();
137  }
138  }
139 
140 
141  //-------------------------------------------------
142  private void OnParentHandInputFocusLost()
143  {
144  HideHighlight();
145  }
146 
147 
148  //-------------------------------------------------
149  public void ShowHighlight()
150  {
151  if ( renderModelLoaded == false )
152  {
153  return;
154  }
155 
156  if ( fireHapticsOnHightlight )
157  {
158  hand.controller.TriggerHapticPulse( 500 );
159  }
160 
161  if ( bodyMeshRenderer != null )
162  {
163  bodyMeshRenderer.enabled = true;
164  }
165 
166  if ( trackingHatMeshRenderer != null )
167  {
168  trackingHatMeshRenderer.enabled = true;
169  }
170  }
171 
172 
173  //-------------------------------------------------
174  public void HideHighlight()
175  {
176  if ( renderModelLoaded == false )
177  {
178  return;
179  }
180 
181  if ( fireHapticsOnHightlight )
182  {
183  hand.controller.TriggerHapticPulse( 300 );
184  }
185 
186  if ( bodyMeshRenderer != null )
187  {
188  bodyMeshRenderer.enabled = false;
189  }
190 
191  if ( trackingHatMeshRenderer != null )
192  {
193  trackingHatMeshRenderer.enabled = false;
194  }
195  }
196  }
197 }