IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
SteamVR_TrackedController.cs
1 //======= Copyright (c) Valve Corporation, All rights reserved. ===============
2 using UnityEngine;
3 using Valve.VR;
4 
5 public struct ClickedEventArgs
6 {
7  public uint controllerIndex;
8  public uint flags;
9  public float padX, padY;
10 }
11 
12 public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);
13 
14 public class SteamVR_TrackedController : MonoBehaviour
15 {
16  public uint controllerIndex;
17  public VRControllerState_t controllerState;
18  public bool triggerPressed = false;
19  public bool steamPressed = false;
20  public bool menuPressed = false;
21  public bool padPressed = false;
22  public bool padTouched = false;
23  public bool gripped = false;
24 
25  public event ClickedEventHandler MenuButtonClicked;
26  public event ClickedEventHandler MenuButtonUnclicked;
27  public event ClickedEventHandler TriggerClicked;
28  public event ClickedEventHandler TriggerUnclicked;
29  public event ClickedEventHandler SteamClicked;
30  public event ClickedEventHandler PadClicked;
31  public event ClickedEventHandler PadUnclicked;
32  public event ClickedEventHandler PadTouched;
33  public event ClickedEventHandler PadUntouched;
34  public event ClickedEventHandler Gripped;
35  public event ClickedEventHandler Ungripped;
36 
37  // Use this for initialization
38  protected virtual void Start()
39  {
40  if (this.GetComponent<SteamVR_TrackedObject>() == null)
41  {
42  gameObject.AddComponent<SteamVR_TrackedObject>();
43  }
44 
45  if (controllerIndex != 0)
46  {
47  this.GetComponent<SteamVR_TrackedObject>().index = (SteamVR_TrackedObject.EIndex)controllerIndex;
48  if (this.GetComponent<SteamVR_RenderModel>() != null)
49  {
50  this.GetComponent<SteamVR_RenderModel>().index = (SteamVR_TrackedObject.EIndex)controllerIndex;
51  }
52  }
53  else
54  {
55  controllerIndex = (uint)this.GetComponent<SteamVR_TrackedObject>().index;
56  }
57  }
58 
59  public void SetDeviceIndex(int index)
60  {
61  this.controllerIndex = (uint)index;
62  }
63 
64  public virtual void OnTriggerClicked(ClickedEventArgs e)
65  {
66  if (TriggerClicked != null)
67  TriggerClicked(this, e);
68  }
69 
70  public virtual void OnTriggerUnclicked(ClickedEventArgs e)
71  {
72  if (TriggerUnclicked != null)
73  TriggerUnclicked(this, e);
74  }
75 
76  public virtual void OnMenuClicked(ClickedEventArgs e)
77  {
78  if (MenuButtonClicked != null)
79  MenuButtonClicked(this, e);
80  }
81 
82  public virtual void OnMenuUnclicked(ClickedEventArgs e)
83  {
84  if (MenuButtonUnclicked != null)
85  MenuButtonUnclicked(this, e);
86  }
87 
88  public virtual void OnSteamClicked(ClickedEventArgs e)
89  {
90  if (SteamClicked != null)
91  SteamClicked(this, e);
92  }
93 
94  public virtual void OnPadClicked(ClickedEventArgs e)
95  {
96  if (PadClicked != null)
97  PadClicked(this, e);
98  }
99 
100  public virtual void OnPadUnclicked(ClickedEventArgs e)
101  {
102  if (PadUnclicked != null)
103  PadUnclicked(this, e);
104  }
105 
106  public virtual void OnPadTouched(ClickedEventArgs e)
107  {
108  if (PadTouched != null)
109  PadTouched(this, e);
110  }
111 
112  public virtual void OnPadUntouched(ClickedEventArgs e)
113  {
114  if (PadUntouched != null)
115  PadUntouched(this, e);
116  }
117 
118  public virtual void OnGripped(ClickedEventArgs e)
119  {
120  if (Gripped != null)
121  Gripped(this, e);
122  }
123 
124  public virtual void OnUngripped(ClickedEventArgs e)
125  {
126  if (Ungripped != null)
127  Ungripped(this, e);
128  }
129 
130  // Update is called once per frame
131  protected virtual void Update()
132  {
133  var system = OpenVR.System;
134  if (system != null && system.GetControllerState(controllerIndex, ref controllerState, (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t))))
135  {
136  ulong trigger = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Trigger));
137  if (trigger > 0L && !triggerPressed)
138  {
139  triggerPressed = true;
141  e.controllerIndex = controllerIndex;
142  e.flags = (uint)controllerState.ulButtonPressed;
143  e.padX = controllerState.rAxis0.x;
144  e.padY = controllerState.rAxis0.y;
145  OnTriggerClicked(e);
146 
147  }
148  else if (trigger == 0L && triggerPressed)
149  {
150  triggerPressed = false;
152  e.controllerIndex = controllerIndex;
153  e.flags = (uint)controllerState.ulButtonPressed;
154  e.padX = controllerState.rAxis0.x;
155  e.padY = controllerState.rAxis0.y;
156  OnTriggerUnclicked(e);
157  }
158 
159  ulong grip = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_Grip));
160  if (grip > 0L && !gripped)
161  {
162  gripped = true;
164  e.controllerIndex = controllerIndex;
165  e.flags = (uint)controllerState.ulButtonPressed;
166  e.padX = controllerState.rAxis0.x;
167  e.padY = controllerState.rAxis0.y;
168  OnGripped(e);
169 
170  }
171  else if (grip == 0L && gripped)
172  {
173  gripped = false;
175  e.controllerIndex = controllerIndex;
176  e.flags = (uint)controllerState.ulButtonPressed;
177  e.padX = controllerState.rAxis0.x;
178  e.padY = controllerState.rAxis0.y;
179  OnUngripped(e);
180  }
181 
182  ulong pad = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Touchpad));
183  if (pad > 0L && !padPressed)
184  {
185  padPressed = true;
187  e.controllerIndex = controllerIndex;
188  e.flags = (uint)controllerState.ulButtonPressed;
189  e.padX = controllerState.rAxis0.x;
190  e.padY = controllerState.rAxis0.y;
191  OnPadClicked(e);
192  }
193  else if (pad == 0L && padPressed)
194  {
195  padPressed = false;
197  e.controllerIndex = controllerIndex;
198  e.flags = (uint)controllerState.ulButtonPressed;
199  e.padX = controllerState.rAxis0.x;
200  e.padY = controllerState.rAxis0.y;
201  OnPadUnclicked(e);
202  }
203 
204  ulong menu = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_ApplicationMenu));
205  if (menu > 0L && !menuPressed)
206  {
207  menuPressed = true;
209  e.controllerIndex = controllerIndex;
210  e.flags = (uint)controllerState.ulButtonPressed;
211  e.padX = controllerState.rAxis0.x;
212  e.padY = controllerState.rAxis0.y;
213  OnMenuClicked(e);
214  }
215  else if (menu == 0L && menuPressed)
216  {
217  menuPressed = false;
219  e.controllerIndex = controllerIndex;
220  e.flags = (uint)controllerState.ulButtonPressed;
221  e.padX = controllerState.rAxis0.x;
222  e.padY = controllerState.rAxis0.y;
223  OnMenuUnclicked(e);
224  }
225 
226  pad = controllerState.ulButtonTouched & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Touchpad));
227  if (pad > 0L && !padTouched)
228  {
229  padTouched = true;
231  e.controllerIndex = controllerIndex;
232  e.flags = (uint)controllerState.ulButtonPressed;
233  e.padX = controllerState.rAxis0.x;
234  e.padY = controllerState.rAxis0.y;
235  OnPadTouched(e);
236 
237  }
238  else if (pad == 0L && padTouched)
239  {
240  padTouched = false;
242  e.controllerIndex = controllerIndex;
243  e.flags = (uint)controllerState.ulButtonPressed;
244  e.padX = controllerState.rAxis0.x;
245  e.padY = controllerState.rAxis0.y;
246  OnPadUntouched(e);
247  }
248  }
249  }
250 }