|
|
- //======= Copyright (c) Valve Corporation, All rights reserved. ===============
- using UnityEngine;
- using Valve.VR;
-
- public struct ClickedEventArgs
- {
- public uint controllerIndex;
- public uint flags;
- public float padX, padY;
- }
-
- public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);
-
- public class SteamVR_TrackedController : MonoBehaviour
- {
- public uint controllerIndex;
- public VRControllerState_t controllerState;
- public bool triggerPressed = false;
- public bool steamPressed = false;
- public bool menuPressed = false;
- public bool padPressed = false;
- public bool padTouched = false;
- public bool gripped = false;
-
- public event ClickedEventHandler MenuButtonClicked;
- public event ClickedEventHandler MenuButtonUnclicked;
- public event ClickedEventHandler TriggerClicked;
- public event ClickedEventHandler TriggerUnclicked;
- public event ClickedEventHandler SteamClicked;
- public event ClickedEventHandler PadClicked;
- public event ClickedEventHandler PadUnclicked;
- public event ClickedEventHandler PadTouched;
- public event ClickedEventHandler PadUntouched;
- public event ClickedEventHandler Gripped;
- public event ClickedEventHandler Ungripped;
-
- // Use this for initialization
- protected virtual void Start()
- {
- if (this.GetComponent<SteamVR_TrackedObject>() == null)
- {
- gameObject.AddComponent<SteamVR_TrackedObject>();
- }
-
- if (controllerIndex != 0)
- {
- this.GetComponent<SteamVR_TrackedObject>().index = (SteamVR_TrackedObject.EIndex)controllerIndex;
- if (this.GetComponent<SteamVR_RenderModel>() != null)
- {
- this.GetComponent<SteamVR_RenderModel>().index = (SteamVR_TrackedObject.EIndex)controllerIndex;
- }
- }
- else
- {
- controllerIndex = (uint)this.GetComponent<SteamVR_TrackedObject>().index;
- }
- }
-
- public void SetDeviceIndex(int index)
- {
- this.controllerIndex = (uint)index;
- }
-
- public virtual void OnTriggerClicked(ClickedEventArgs e)
- {
- if (TriggerClicked != null)
- TriggerClicked(this, e);
- }
-
- public virtual void OnTriggerUnclicked(ClickedEventArgs e)
- {
- if (TriggerUnclicked != null)
- TriggerUnclicked(this, e);
- }
-
- public virtual void OnMenuClicked(ClickedEventArgs e)
- {
- if (MenuButtonClicked != null)
- MenuButtonClicked(this, e);
- }
-
- public virtual void OnMenuUnclicked(ClickedEventArgs e)
- {
- if (MenuButtonUnclicked != null)
- MenuButtonUnclicked(this, e);
- }
-
- public virtual void OnSteamClicked(ClickedEventArgs e)
- {
- if (SteamClicked != null)
- SteamClicked(this, e);
- }
-
- public virtual void OnPadClicked(ClickedEventArgs e)
- {
- if (PadClicked != null)
- PadClicked(this, e);
- }
-
- public virtual void OnPadUnclicked(ClickedEventArgs e)
- {
- if (PadUnclicked != null)
- PadUnclicked(this, e);
- }
-
- public virtual void OnPadTouched(ClickedEventArgs e)
- {
- if (PadTouched != null)
- PadTouched(this, e);
- }
-
- public virtual void OnPadUntouched(ClickedEventArgs e)
- {
- if (PadUntouched != null)
- PadUntouched(this, e);
- }
-
- public virtual void OnGripped(ClickedEventArgs e)
- {
- if (Gripped != null)
- Gripped(this, e);
- }
-
- public virtual void OnUngripped(ClickedEventArgs e)
- {
- if (Ungripped != null)
- Ungripped(this, e);
- }
-
- // Update is called once per frame
- protected virtual void Update()
- {
- var system = OpenVR.System;
- if (system != null && system.GetControllerState(controllerIndex, ref controllerState, (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t))))
- {
- ulong trigger = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Trigger));
- if (trigger > 0L && !triggerPressed)
- {
- triggerPressed = true;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnTriggerClicked(e);
-
- }
- else if (trigger == 0L && triggerPressed)
- {
- triggerPressed = false;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnTriggerUnclicked(e);
- }
-
- ulong grip = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_Grip));
- if (grip > 0L && !gripped)
- {
- gripped = true;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnGripped(e);
-
- }
- else if (grip == 0L && gripped)
- {
- gripped = false;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnUngripped(e);
- }
-
- ulong pad = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Touchpad));
- if (pad > 0L && !padPressed)
- {
- padPressed = true;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnPadClicked(e);
- }
- else if (pad == 0L && padPressed)
- {
- padPressed = false;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnPadUnclicked(e);
- }
-
- ulong menu = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_ApplicationMenu));
- if (menu > 0L && !menuPressed)
- {
- menuPressed = true;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnMenuClicked(e);
- }
- else if (menu == 0L && menuPressed)
- {
- menuPressed = false;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnMenuUnclicked(e);
- }
-
- pad = controllerState.ulButtonTouched & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Touchpad));
- if (pad > 0L && !padTouched)
- {
- padTouched = true;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnPadTouched(e);
-
- }
- else if (pad == 0L && padTouched)
- {
- padTouched = false;
- ClickedEventArgs e;
- e.controllerIndex = controllerIndex;
- e.flags = (uint)controllerState.ulButtonPressed;
- e.padX = controllerState.rAxis0.x;
- e.padY = controllerState.rAxis0.y;
- OnPadUntouched(e);
- }
- }
- }
- }
|