Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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");
        }
Exemplo n.º 3
0
 public bool GetButton(EControllerButton btn)
 {
     return((bitmask_buttons & (1U << (int)btn)) != 0);
 }
Exemplo n.º 4
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);
                }
            }
        }