ControllerTracker HandleButtonDown(EControllerButton btn, EEventSet event_set) { if ((bitmask_buttons_down & (1U << (int)btn)) == 0) { return(null); /* not actually pressing this button */ } ControllerTracker tracker = FindHandler(event_set); if (tracker != null) { if (tracker == tracker_hover && btn != EControllerButton.Menu) { tracker_hover_lock |= 1U << (int)btn; } ControllerEvent ev = null; switch (btn) { case EControllerButton.Trigger: ev = tracker._i_onTriggerDown; break; case EControllerButton.Grip: ev = tracker._i_onGripDown; break; case EControllerButton.Menu: ev = tracker._i_onMenuClick; break; } tracker._Call(ev, this); } return(tracker); }
public void Reset() { beamForwardVelocity = 10f; beamUpVelocity = 3f; controllerSelection = EControllerSelection.Either; controllerButton = EControllerButton.Touchpad; traceLayerMask = 1 << LayerMask.NameToLayer("Default"); teleportMaterial = Resources.Load <Material>("BaroqueUI/TeleportPointer"); validArcColor = new Color(0.0f, 0.8f, 1.0f, 0.7f); invalidArcColor = new Color(0.8f, 0f, 0.3f, 0.7f); GameObject go = Resources.Load <GameObject>("BaroqueUI/Teleporting"); invalidReticlePrefab = go == null ? null : go.transform.Find("InvalidReticle"); destinationReticlePrefab = go == null ? null : go.transform.Find("DestinationReticle"); }
public bool GetButton(EControllerButton btn) { return((bitmask_buttons & (1U << (int)btn)) != 0); }
void ReadControllerState() { /* updates the state fields; updates 'is_tracking' and 'is_clicking_now'; * may cause un-grabbing and so 'is_grabbing' may be reset to false; * sets 'tracker_hover_next'. */ is_clicking_now = false; var system = OpenVR.System; if (system == null || !isActiveAndEnabled || !system.GetControllerState((uint)trackedObject.index, ref controllerState, (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t)))) { tracker_hover_next = null; bitmask_buttons = 0; if (is_tracking) { if (is_grabbing) { UnGrab(); } is_tracking = false; ResetVelocityEstimates(); } } else { is_tracking = true; /* read the button state */ ulong trigger = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Trigger)); ulong pad = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_SteamVR_Touchpad)); ulong grip = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_Grip)); ulong menu = controllerState.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_ApplicationMenu)); uint b = 0; if (menu != 0) { b |= (1U << (int)EControllerButton.Menu); } if (grip != 0) { if (!GetButton(EControllerButton.Grip)) { is_clicking_now = true; clicking_button = EControllerButton.Grip; } b |= (1U << (int)EControllerButton.Grip); } if (pad != 0) { b |= (1U << (int)EControllerButton.Touchpad); } if (trigger != 0) { if (!GetButton(EControllerButton.Trigger)) { is_clicking_now = true; clicking_button = EControllerButton.Trigger; } b |= (1U << (int)EControllerButton.Trigger); } bitmask_buttons = b; if (is_grabbing && grabbing_button.HasValue && !GetButton(grabbing_button.Value)) { UnGrab(); } /* read the position/rotation and update the velocity estimation */ current_position = transform.position + transform.rotation * POS_TO_CURSOR; current_rotation = transform.rotation; UpdateVelocityEstimates(); /* find the next BaseControllerTracker at that position, taking the highest * priority one. If is_grabbing, then keep the current one instead. */ if (is_grabbing) { tracker_hover_next = tracker_hover; tracker_hover_next_priority = float.PositiveInfinity; } else { Collider[] lst = Physics.OverlapSphere(current_position, 0.02f, Physics.AllLayers, QueryTriggerInteraction.Collide); var potential = new HashSet <Transform>(); foreach (var coll in lst) { Transform tr = coll.transform; while (tr != null) { if (!potential.Add(tr)) { break; /* already in the set */ } tr = tr.parent; } } float best_priority = float.NegativeInfinity; BaseControllerTracker best = null; foreach (Transform tr in potential) { foreach (var tracker in tr.GetComponents <BaseControllerTracker>()) { if (tracker is ControllerTracker && !Matches((tracker as ControllerTracker).selectableControllers)) { continue; } float priority = tracker.GetPriority(this); if (priority == float.NegativeInfinity) { continue; } Debug.Assert(priority < float.PositiveInfinity); if (priority > best_priority || (priority == best_priority && tracker.creation_order > best.creation_order)) { best_priority = priority; best = tracker; } } } tracker_hover_next = best; tracker_hover_next_priority = best_priority; } /* sanity check */ if (is_grabbing) { Debug.Assert(tracker_hover); } } }