Skip to content

Instantly share code, notes, and snippets.

@shole
Created March 1, 2016 16:57
Show Gist options
  • Save shole/d4b358151ea6e06d1b8f to your computer and use it in GitHub Desktop.
Save shole/d4b358151ea6e06d1b8f to your computer and use it in GitHub Desktop.
improved SteamVR_TrackedController with held down events
using UnityEngine;
using System.Collections;
public class SteamVR_TrackedController2 : MonoBehaviour {
public uint controllerIndex;
public Valve.VR.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 PadUpdated;
public event ClickedEventHandler Gripped;
public event ClickedEventHandler Ungripped;
// Use this for initialization
void Start() {
if (this.GetComponent<SteamVR_TrackedObject>() == null) {
gameObject.AddComponent<SteamVR_TrackedObject>();
}
this.GetComponent<SteamVR_TrackedObject>().index = (SteamVR_TrackedObject.EIndex)controllerIndex;
if (this.GetComponent<SteamVR_RenderModel>() != null) {
this.GetComponent<SteamVR_RenderModel>().index = (SteamVR_TrackedObject.EIndex)controllerIndex;
}
}
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 OnPadUpdated(ClickedEventArgs e) {
if (PadUpdated != null) {
PadUpdated(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
void Update() {
if (SteamVR.instance.hmd.GetControllerState(controllerIndex, ref controllerState)) {
ClickedEventArgs e;
e.controllerIndex = controllerIndex;
e.flags = (uint)controllerState.ulButtonPressed;
e.padX = controllerState.rAxis[(int)Valve.VR.EVRControllerAxisType.k_eControllerAxis_None].x;
e.padY = controllerState.rAxis[(int)Valve.VR.EVRControllerAxisType.k_eControllerAxis_None].y;
ulong trigger = controllerState.ulButtonPressed &
(1UL << ((int)Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger));
if (trigger > 0L && !triggerPressed) {
triggerPressed = true;
OnTriggerClicked(e);
} else if (trigger == 0L && triggerPressed) {
triggerPressed = false;
OnTriggerUnclicked(e);
}
ulong grip = controllerState.ulButtonPressed & (1UL << ((int)Valve.VR.EVRButtonId.k_EButton_Grip));
if (grip > 0L && !gripped) {
gripped = true;
OnGripped(e);
} else if (grip == 0L && gripped) {
gripped = false;
OnUngripped(e);
}
ulong pad = controllerState.ulButtonPressed &
(1UL << ((int)Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad));
if (pad > 0L && !padPressed) {
padPressed = true;
OnPadClicked(e);
} else if (pad == 0L && padPressed) {
padPressed = false;
OnPadUnclicked(e);
}
ulong menu = controllerState.ulButtonPressed &
(1UL << ((int)Valve.VR.EVRButtonId.k_EButton_ApplicationMenu));
if (menu > 0L && !menuPressed) {
menuPressed = true;
OnMenuClicked(e);
} else if (menu == 0L && menuPressed) {
menuPressed = false;
OnMenuUnclicked(e);
}
pad = controllerState.ulButtonTouched & (1UL << ((int)Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad));
if (pad > 0L && !padTouched) {
padTouched = true;
OnPadTouched(e);
} else if (pad == 0L && padTouched) {
padTouched = false;
OnPadUntouched(e);
} else if (padTouched) {
OnPadUpdated(e);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment