protected MouseState InputToPointerEvent(CursorInput input)
        {
            if (_leftData == null)
            {
                _leftData = new RayPointerEventData(eventSystem);
            }

            // Populate the left button...
            _leftData.Reset();

            //_leftData.delta = input.MovementDelta;
            _leftData.delta       = Vector2.zero;
            _leftData.scrollDelta = input.ScrollDelta;
            _leftData.button      = PointerEventData.InputButton.Left;
            _leftData.Ray         = input.Ray;
            eventSystem.RaycastAll(_leftData, m_RaycastResultCache);
            var raycast = FindFirstRaycast(m_RaycastResultCache);

            if (raycast.gameObject != null)
            {
                //Debug.Log("first raycast " + raycast.gameObject.name, raycast.gameObject);
                //Debug.Log("hit objects: " + string.Join(", ", m_RaycastResultCache.Select(r => r.gameObject.name).ToArray()));
            }
            _leftData.pointerCurrentRaycast = raycast;
            m_RaycastResultCache.Clear();

//            var raycaster = raycast.module as RayBasedRaycaster;
//            if (raycaster != null) {
//                _leftData.position = raycaster.GetScreenPos(raycast.worldPosition);
//            } else {
//                _leftData.position = input.ScreenPosition;
//            }
            _leftData.position = input.ScreenPosition;

            // copy the apropriate data into right and middle slots
//            PointerEventData rightData;
//            GetPointerData(kMouseRightId, out rightData, true);
//            CopyFromTo(_leftData, rightData);
//            rightData.button = PointerEventData.InputButton.Right;
//
//            PointerEventData middleData;
//            GetPointerData(kMouseMiddleId, out middleData, true);
//            CopyFromTo(_leftData, middleData);
//            middleData.button = PointerEventData.InputButton.Middle;

            _mouseState.SetButtonState(PointerEventData.InputButton.Left, input.SubmitEvent, _leftData);
//            _mouseState.SetButtonState(PointerEventData.InputButton.Right, PointerEventData.FramePressState.NotChanged, rightData);
//            _mouseState.SetButtonState(PointerEventData.InputButton.Middle, PointerEventData.FramePressState.NotChanged, middleData);
            return(_mouseState);
        }
        public void Process(CursorInput cursorInput, NavigationInput navInput)
        {
            bool usedEvent = SendUpdateEventToSelectedObject();

            if (eventSystem.sendNavigationEvents)
            {
                if (!usedEvent)
                {
                    usedEvent |= SendMoveEventToSelectedObject(navInput);
                }

                if (!usedEvent)
                {
                    SendSubmitEventToSelectedObject(navInput);
                }
            }

            ProcessMouseEvent(cursorInput);
        }
        /// <summary>
        /// Process all mouse events.
        /// </summary>
        protected void ProcessMouseEvent(CursorInput input)
        {
            var mouseData      = InputToPointerEvent(input);
            var leftButtonData = mouseData.GetButtonState(PointerEventData.InputButton.Left).eventData;

            // Process the first mouse button fully
            ProcessMousePress(leftButtonData);
            ProcessMove(leftButtonData.buttonData);
            ProcessDrag(leftButtonData.buttonData);

            // Now process right / middle clicks
//            ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData);
//            ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData.buttonData);
//            ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData);
//            ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData.buttonData);

            if (!Mathf.Approximately(leftButtonData.buttonData.scrollDelta.sqrMagnitude, 0.0f))
            {
                var scrollHandler = ExecuteEvents.GetEventHandler <IScrollHandler>(leftButtonData.buttonData.pointerCurrentRaycast.gameObject);
                ExecuteEvents.ExecuteHierarchy(scrollHandler, leftButtonData.buttonData, ExecuteEvents.scrollHandler);
            }
        }