Example #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);
        }
 void check_Touchpad3()
 {
     if (_i_onTouchDown == null && _i_onTouchDrag == null && _i_onTouchUp == null)
     {
         event_sets &= ~EEventSet.TouchpadAction3;
     }
 }
 void check_Touchpad2()
 {
     if (_i_onTouchScroll == null)
     {
         event_sets &= ~EEventSet.TouchpadAction2;
     }
 }
 void check_Touchpad1()
 {
     if (_i_onTouchPressDown == null && _i_onTouchPressDrag == null && _i_onTouchPressUp == null)
     {
         event_sets &= ~EEventSet.TouchpadAction1;
     }
 }
 void check_Menu()
 {
     if (_i_onMenuClick == null)
     {
         event_sets &= ~EEventSet.Menu;
     }
 }
 void check_Grip()
 {
     if (_i_onGripDown == null && _i_onGripDrag == null && _i_onGripUp == null)
     {
         event_sets &= ~EEventSet.Grip;
     }
 }
 void check_Trigger()
 {
     if (_i_onTriggerDown == null && _i_onTriggerDrag == null && _i_onTriggerUp == null)
     {
         event_sets &= ~EEventSet.Trigger;
     }
 }
 public ControllerTracker(MonoBehaviour tracker, bool is_hover)
 {
     this.tracker   = tracker;
     creation_order = ++NUMBERING;
     if (is_hover)
     {
         event_sets = EEventSet.Hover;
         SetPriorityFromDistance(0);
     }
     else
     {
         event_sets = 0;
         SetPriority(0);
     }
 }
Example #9
0
        ControllerTracker FindHandler(EEventSet event_set)
        {
            /* returns either tracker_hover or a global tracker, but one
             * that can handle the event_set. */
            if (tracker_hover != null && (tracker_hover._event_sets & event_set) != 0)
            {
                return(tracker_hover);
            }
            else
            {
                /* look for global trackers */
                ControllerTracker best          = null;
                float             best_priority = float.NegativeInfinity;

                foreach (var ct in global_trackers.Values)
                {
                    if ((ct._event_sets & event_set) != 0 && ct.isActiveAndEnabled)
                    {
                        float priority = ct.computePriority(this);
                        if (priority != float.NegativeInfinity)
                        {
                            ct.PickIfBetter(priority, ref best, ref best_priority);
                        }
                    }
                }
                /* If it's a non-concurrent tracker and it is used by the other controller, cancel */
                if (best != null && !best.isConcurrent)
                {
                    foreach (var ctrl in Baroque.GetControllers())
                    {
                        if (ctrl != this && ctrl.ActiveWith(best))
                        {
                            return(null);
                        }
                    }
                }
                return(best);
            }
        }
Example #10
0
        void CallButtonDown()
        {
            const float TOUCHPAD_CLICK_TIME = 0.25f;

            const EEventSet TouchpadAll = (EEventSet.TouchpadAction1 |
                                           EEventSet.TouchpadAction2 |
                                           EEventSet.TouchpadAction3);

            if (bitmask_buttons_down != 0)
            {
                if (active_trigger == null)
                {
                    active_trigger = HandleButtonDown(EControllerButton.Trigger, EEventSet.Trigger);
                }

                if (active_grip == null)
                {
                    active_grip = HandleButtonDown(EControllerButton.Grip, EEventSet.Grip);
                }

                HandleButtonDown(EControllerButton.Menu, EEventSet.Menu);

                /* == Handle the touchpad == */

                if ((bitmask_buttons_down & (1U << (int)EControllerButton.TouchpadTouched)) != 0)
                {
                    /* starting to touch: the only case is "released" => "small delay" */
                    touch_original_pos2 = touchpadPosition;

                    if (active_touchpad_state == ActiveTouchpadState.None)
                    {
                        Debug.Assert(active_touchpad == null);
                        active_touchpad = FindHandler(TouchpadAll);
                        if (active_touchpad != null)
                        {
                            if (active_touchpad == tracker_hover)
                            {
                                tracker_hover_lock |= 1U << (int)EControllerButton.Touchpad;
                            }

                            EEventSet es    = active_touchpad._event_sets;
                            int       count = ((es & EEventSet.TouchpadAction1) != 0 ? 1 : 0) +
                                              ((es & EEventSet.TouchpadAction2) != 0 ? 1 : 0) +
                                              ((es & EEventSet.TouchpadAction3) != 0 ? 1 : 0);
                            float delay = count >= 2 ? TOUCHPAD_CLICK_TIME : 1e-20f;
                            active_touchpad_state   = ActiveTouchpadState.SmallDelay;
                            active_touchpad_timeout = GetTime() + delay;
                            touch_original_pos3     = position;
                        }
                    }
                }

                if ((bitmask_buttons_down & (1U << (int)EControllerButton.Touchpad)) != 0)
                {
                    /* pressing: goes to "action 1" if the tracker handles it */
                    ControllerTracker cs = active_touchpad;
                    if (cs == null)
                    {
                        cs = HandleButtonDown(EControllerButton.Touchpad, EEventSet.TouchpadAction1);
                    }

                    if (cs != null && (cs._event_sets & EEventSet.TouchpadAction1) != 0)
                    {
                        StopTouchpadAction();
                        active_touchpad_state = ActiveTouchpadState.Action1;
                        active_touchpad       = cs;
                        active_touchpad._Call(active_touchpad._i_onTouchPressDown, this);
                    }
                }
            }

            /* == More touchpad handling == */

            if (touchpadTouched)
            {
                if (active_touchpad_state == ActiveTouchpadState.None || active_touchpad_state == ActiveTouchpadState.SmallDelay)
                {
                    const float TOUCHPAD_SCROLL_DISTANCE     = 0.22f;
                    const float TOUCHPAD_DRAG_SPACE_DISTANCE = 0.08f;

                    ControllerTracker cs = active_touchpad;
                    if (cs == null)
                    {
                        cs = FindHandler(EEventSet.TouchpadAction2 | EEventSet.TouchpadAction3);
                    }

                    if (cs != null)
                    {
                        if ((cs._event_sets & EEventSet.TouchpadAction2) != 0)
                        {
                            /* detect finger movement */
                            if (Vector2.Distance(touch_original_pos2, touchpadPosition) > TOUCHPAD_SCROLL_DISTANCE)
                            {
                                active_touchpad_timeout = 0;
                                active_touchpad_state   = ActiveTouchpadState.Action2;
                                active_touchpad         = cs;
                                if (active_touchpad == tracker_hover)
                                {
                                    tracker_hover_lock |= 1U << (int)EControllerButton.Touchpad;
                                }
                                scrollWheelVisible |= SWV_SCROLLING;
                                UpdateScrollWheel();
                            }
                        }
                        if (active_touchpad_state == ActiveTouchpadState.SmallDelay && (cs._event_sets & EEventSet.TouchpadAction3) != 0)
                        {
                            /* detect timeout or controller movement from the "small delay" state */
                            if (active_touchpad_timeout <= GetTime() ||
                                Vector3.Distance(touch_original_pos3, position) > TOUCHPAD_DRAG_SPACE_DISTANCE)
                            {
                                Vector3 saved = current_position;
                                active_touchpad_state = ActiveTouchpadState.Action3;
                                active_touchpad       = cs;
                                current_position      = touch_original_pos3;
                                active_touchpad._Call(active_touchpad._i_onTouchDown, this);
                                current_position = saved;
                            }
                        }
                    }
                }
            }
        }