IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
Controller.cs
1 using UnityEngine;
2 using UnityEngine.EventSystems;
3 using System.Collections;
4 
5 public class Controller : MonoBehaviour {
6 
7  //--------------- controller stuff---------------------
8  private SteamVR_Controller.Device controller {
9  get{
10  if( trackedObj == null )
11  trackedObj = this.GetComponent<SteamVR_TrackedObject> ();
12  if (trackedObj == null)
13  return null;
14  return SteamVR_Controller.Input ((int)trackedObj.index);
15  }
16  }
17  private SteamVR_TrackedObject trackedObj = null;
18 
19  private Valve.VR.EVRButtonId triggerButton = Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger;
20 
21  public SteamVR_TrackedObject.EIndex controllerIndex {
22  get {
23  if (trackedObj != null) {
24  return trackedObj.index;
25  } else {
26  return 0;
27  }
28  }
29  }
30 
31  //private PointerEventData.FramePressState leftButtonState;
32  protected bool triggerPressedDown = false; //True if the trigger is pressed down
33  protected bool helpState = false; //Before releasing the button press it again to avoid scrolling in lists
34 
35  protected Vector2 previousTouchpad = Vector2.zero;
36  public Vector2 touchpadValue { protected set; get; }
37  public Vector2 touchpadDelta { protected set; get; }
38 
40  protected PointerEventData.FramePressState m_triggerButtonState = PointerEventData.FramePressState.NotChanged;
41  public PointerEventData.FramePressState triggerButtonState {
42  get {
43  return m_triggerButtonState;
44  }
45  }
47  protected PointerEventData.FramePressState m_touchpadButtonState = PointerEventData.FramePressState.NotChanged;
48  public PointerEventData.FramePressState touchpadButtonState {
49  get {
50  return m_touchpadButtonState;
51  }
52  }
53  //-----------------------------------------------------
54 
56  public Vector3 positionDelta { protected set; get; }
57 
58  private Vector3 previousPosition;
59 
61  private GameObject spriteTouchpadCenter;
62  private GameObject spriteTouchpadLeft;
63  private GameObject spriteTouchpadRight;
64  private GameObject spriteTouchpadUp;
65  private GameObject spriteTouchpadDown;
66 
67  public Color iconColor = new Color( 0.7f, 0.85f, 1.0f );
68  public Color iconColorHighlight = new Color( 0.85f, 1.0f, 0.85f );
69 
70  // Use this for initialization
71  public void Start () {
72  //trackedObj = this.GetComponent<SteamVR_TrackedObject> ();
73  positionDelta = Vector3.zero;
74  previousPosition = Vector3.zero;
75 
76  // Add Icons for later usage:
77  spriteTouchpadCenter = new GameObject("SpriteTouchpadCenter");
78  spriteTouchpadCenter.transform.SetParent( transform );
79  spriteTouchpadCenter.AddComponent<SpriteRenderer> ();
80  spriteTouchpadCenter.transform.localPosition = new Vector3 (0f, 0.0068f, -0.0488f);
81  spriteTouchpadCenter.transform.localEulerAngles = new Vector3 (85f, 0f, 0f);
82  spriteTouchpadCenter.transform.localScale = new Vector3 (0.015f, 0.015f, 0.015f);
83  spriteTouchpadCenter.GetComponent<SpriteRenderer> ().color = iconColor;
84 
85  spriteTouchpadLeft = new GameObject("SpriteTouchpadLeft");
86  spriteTouchpadLeft.transform.SetParent( transform );
87  spriteTouchpadLeft.AddComponent<SpriteRenderer> ();
88  spriteTouchpadLeft.transform.localPosition = new Vector3 (-0.015f, 0.0068f, -0.049f);
89  spriteTouchpadLeft.transform.localEulerAngles = new Vector3 (85f, 0f, 0f);
90  spriteTouchpadLeft.transform.localScale = new Vector3 (0.015f, 0.015f, 0.015f);
91  spriteTouchpadLeft.GetComponent<SpriteRenderer> ().color = iconColor;
92 
93  spriteTouchpadRight = new GameObject("SpriteTouchpadRight");
94  spriteTouchpadRight.transform.SetParent( transform );
95  spriteTouchpadRight.AddComponent<SpriteRenderer> ();
96  spriteTouchpadRight.transform.localPosition = new Vector3 (0.015f, 0.0068f, -0.049f);
97  spriteTouchpadRight.transform.localEulerAngles = new Vector3 (85f, 0f, 0f);
98  spriteTouchpadRight.transform.localScale = new Vector3 (0.015f, 0.015f, 0.015f);
99  spriteTouchpadRight.GetComponent<SpriteRenderer> ().color = iconColor;
100 
101  spriteTouchpadUp = new GameObject("SpriteTouchpadUp");
102  spriteTouchpadUp.transform.SetParent( transform );
103  spriteTouchpadUp.AddComponent<SpriteRenderer> ();
104  spriteTouchpadUp.transform.localPosition = new Vector3 (0f, 0.0068f, -0.035f);
105  spriteTouchpadUp.transform.localEulerAngles = new Vector3 (85f, 0f, 0f);
106  spriteTouchpadUp.transform.localScale = new Vector3 (0.015f, 0.015f, 0.015f);
107  spriteTouchpadUp.GetComponent<SpriteRenderer> ().color = iconColor;
108 
109  spriteTouchpadDown = new GameObject("SpriteTouchpadDown");
110  spriteTouchpadDown.transform.SetParent( transform );
111  spriteTouchpadDown.AddComponent<SpriteRenderer> ();
112  spriteTouchpadDown.transform.localPosition = new Vector3 (0f, 0.0068f, -0.064f);
113  spriteTouchpadDown.transform.localEulerAngles = new Vector3 (85f, 0f, 0f);
114  spriteTouchpadDown.transform.localScale = new Vector3 (0.015f, 0.015f, 0.015f);
115  spriteTouchpadDown.GetComponent<SpriteRenderer> ().color = iconColor;
116  }
117 
118  public void Update() {
119  positionDelta = transform.position - previousPosition;
120  previousPosition = transform.position;
121 
122  UpdateTriggerState ();
123  UpdateTouchpadButton ();
124  UpdateTouchpad ();
125 
126  spriteTouchpadCenter.GetComponent<SpriteRenderer> ().color = iconColor;
127  spriteTouchpadLeft.GetComponent<SpriteRenderer> ().color = iconColor;
128  spriteTouchpadRight.GetComponent<SpriteRenderer> ().color = iconColor;
129  spriteTouchpadUp.GetComponent<SpriteRenderer> ().color = iconColor;
130  spriteTouchpadDown.GetComponent<SpriteRenderer> ().color = iconColor;
131 
132  if( controller.GetTouch(Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad) )
133  {
134  if (hoverTouchpadCenter ()) {
135  spriteTouchpadCenter.GetComponent<SpriteRenderer> ().color = iconColorHighlight;
136  } else if (hoverTouchpadLeft()) {
137  spriteTouchpadLeft.GetComponent<SpriteRenderer> ().color = iconColorHighlight;
138  } else if (hoverTouchpadRight()) {
139  spriteTouchpadRight.GetComponent<SpriteRenderer> ().color = iconColorHighlight;
140  } else if (hoverTouchpadUp()) {
141  spriteTouchpadUp.GetComponent<SpriteRenderer> ().color = iconColorHighlight;
142  } else if (hoverTouchpadDown()) {
143  spriteTouchpadDown.GetComponent<SpriteRenderer> ().color = iconColorHighlight;
144  }
145  }
146  }
147 
148  public bool hoverTouchpadCenter()
149  {
150  if (!controller.GetTouch (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad))
151  return false;
152  return touchpadValue.magnitude < 0.4;
153  }
154  public bool hoverTouchpadLeft()
155  {
156  if (!controller.GetTouch (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad))
157  return false;
158  return Mathf.Abs (touchpadValue.y) < 0.7 && touchpadValue.x < -0.55f;
159  }
160  public bool hoverTouchpadRight()
161  {
162  if (!controller.GetTouch (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad))
163  return false;
164  return Mathf.Abs (touchpadValue.y) < 0.7 && touchpadValue.x > 0.55f;
165  }
166  public bool hoverTouchpadUp()
167  {
168  if (!controller.GetTouch (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad))
169  return false;
170  return Mathf.Abs (touchpadValue.x) < 0.7 && touchpadValue.y > 0.55f;
171  }
172  public bool hoverTouchpadDown()
173  {
174  if (!controller.GetTouch (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad))
175  return false;
176  return Mathf.Abs (touchpadValue.x) < 0.7 && touchpadValue.y < -0.55f;
177  }
178 
180  public bool triggerPressed(){
181  if( controller == null )
182  return false;
183  //Checks if the trigger is pressed down till it clicks
184  //Returns true as long as the trigger is pressed down
185  if (controller.GetAxis (triggerButton) == new Vector2 (1.0f, 0.0f)) {
186  return true;
187  //Debug.Log ("Trigger compelete pressed");
188  }
189  return false;
190  }
191 
193  public float triggerValue(){
194  if( controller == null )
195  return 0f;
196 
197  return controller.GetAxis (triggerButton).x;
198  }
199 
201  public bool touchpadPressed() {
202  if( controller == null )
203  return false;
204 
205  return controller.GetPressDown (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad);
206  }
207 
208  protected void UpdateTouchpad() {
209  touchpadValue = controller.GetAxis (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad);
210  if( touchpadValue.sqrMagnitude < 0.01f || previousTouchpad.sqrMagnitude < 0.01f )
211  {
212  touchpadDelta = Vector2.zero;
213  } else {
214  touchpadDelta = touchpadValue - previousTouchpad;
215  }
216  previousTouchpad = touchpadValue;
217  }
218 
219  protected PointerEventData.FramePressState UpdateTriggerState() {
220 
221  switch (m_triggerButtonState) {
222  case PointerEventData.FramePressState.NotChanged:
223  if (triggerPressed () && !triggerPressedDown) {
224  m_triggerButtonState = PointerEventData.FramePressState.Pressed;
225  }
226  if (!triggerPressed () && triggerPressedDown) {
227  if (helpState == false) {
228  m_triggerButtonState = PointerEventData.FramePressState.Pressed;
229  helpState = true;
230  } else {
231  m_triggerButtonState = PointerEventData.FramePressState.Released;
232  }
233  }
234  break;
235 
236  case PointerEventData.FramePressState.Pressed:
237  if (helpState) {
238  helpState = false;
239  m_triggerButtonState = PointerEventData.FramePressState.Released;
240  } else {
241  triggerPressedDown = true;
242  if (triggerPressed () && triggerPressedDown) {
243  m_triggerButtonState = PointerEventData.FramePressState.NotChanged;
244  } else if (!triggerPressed () && triggerPressedDown) {
245  m_triggerButtonState = PointerEventData.FramePressState.Released;
246  }
247  }
248  break;
249 
250  //case PointerEventData.FramePressState.PressedAndReleased:
251  //break;
252 
253  case PointerEventData.FramePressState.Released:
254  if (!triggerPressed ()) {
255  m_triggerButtonState = PointerEventData.FramePressState.NotChanged;
256  } else {
257  m_triggerButtonState = PointerEventData.FramePressState.Pressed;
258  }
259  triggerPressedDown = false;
260  break;
261  }
262 
263  return m_triggerButtonState;
264  }
265 
266  protected PointerEventData.FramePressState UpdateTouchpadButton() {
267 
268  if (controller == null)
269  return m_touchpadButtonState;
270 
271  if (controller.GetPressDown (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad)) {
272  m_touchpadButtonState = PointerEventData.FramePressState.Pressed;
273  } else if (controller.GetPressUp (Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad)) {
274  m_touchpadButtonState = PointerEventData.FramePressState.Released;
275  } else {
276  m_touchpadButtonState = PointerEventData.FramePressState.NotChanged;
277  }
278 
279  return m_touchpadButtonState;
280  }
281 
282  public void shake( float seconds, float strength = 1f )
283  {
284  //SteamVR_Controller.Input( (int)controllerIndex ).TriggerHapticPulse( milliseconds );
285  StartHapticVibration( seconds, strength );
286  }
287 
288  public void set3DDelta( Vector2 delta ) {
289  positionDelta = delta;
290  }
291 
292  public void setTouchpadCentralIcon( Sprite s )
293  {
294  spriteTouchpadCenter.GetComponent<SpriteRenderer> ().sprite = s;
295  }
296 
297  public void setTouchpadDirectionIcons( Sprite l, Sprite r, Sprite u, Sprite d )
298  {
299  spriteTouchpadLeft.GetComponent<SpriteRenderer> ().sprite = l;
300  spriteTouchpadRight.GetComponent<SpriteRenderer> ().sprite = r;
301  spriteTouchpadUp.GetComponent<SpriteRenderer> ().sprite = u;
302  spriteTouchpadDown.GetComponent<SpriteRenderer> ().sprite = d;
303  }
304 
305  //-----------------------------------------------------
306  // Haptic Functions (adapted from MoBenZ), steamcommunity.com
307 
308  protected Coroutine vibrationCoroutine;
309 
310  public void StartHapticVibration( float length, float strength) {
311  if (vibrationCoroutine != null)
312  return;
313 
314  Coroutine coroutine = StartCoroutine(HapticVibrationCoroutine(length,strength));
315  vibrationCoroutine = coroutine;
316  }
317 
318  public void StopHapticVibration() {
319 
320  if( vibrationCoroutine == null ) {
321  return;
322  }
323  StopCoroutine(vibrationCoroutine);
324  vibrationCoroutine = null;
325  }
326 
327  protected IEnumerator HapticVibrationCoroutine(float length, float strength) {
328 
329  for(float i = 0; i < length; i += Time.deltaTime) {
330  controller.TriggerHapticPulse((ushort)Mathf.Lerp(0, 3999, strength));
331  yield return null;
332  }
333  vibrationCoroutine = null;
334  }
335 }
Vector3 positionDelta
The movement of the controller since the previous frame in world space:
Definition: Controller.cs:56
PointerEventData.FramePressState m_triggerButtonState
Definition: Controller.cs:40
float triggerValue()
Definition: Controller.cs:193
bool touchpadPressed()
Definition: Controller.cs:201
PointerEventData.FramePressState m_touchpadButtonState
Definition: Controller.cs:47
bool triggerPressed()
Definition: Controller.cs:180