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); } }
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); } }
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; } } } } } }