// overrides BaseRaycaster
    public override void Raycast(PointerEventData eventData, List <RaycastResult> resultAppendList)
    {
        if (eventData.IsVRPointer() == false || _pointer.interactable == false)
        {
            return;
        }

        var   ray  = _pointer.GetWorldRay();
        float dist = eventCamera.farClipPlane - eventCamera.nearClipPlane;
        var   hits = Physics.RaycastAll(ray, dist, finalEventMask);

        if (hits.Length > 0)
        {
            if (hits.Length > 1)
            {
                System.Array.Sort(hits, (r1, r2) => r1.distance.CompareTo(r2.distance));
            }

            for (int i = 0; i < hits.Length; i++)
            {
                var result = new RaycastResult {
                    gameObject    = hits[i].collider.gameObject,
                    module        = this,
                    distance      = hits[i].distance,
                    index         = resultAppendList.Count,
                    worldPosition = hits[0].point,
                    worldNormal   = hits[0].normal
                };
                resultAppendList.Add(result);
            }
        }
    }
    private MouseState getAirVRPointerEventData(AirVRPointer pointer)
    {
        AirVRPointerEventData leftData;
        var created = getAirVRPointerData(pointer, kMouseLeftId, out leftData, true);

        leftData.Reset();

        leftData.worldSpaceRay    = pointer.GetWorldRay();
        leftData.button           = PointerEventData.InputButton.Left;
        leftData.scrollDelta      = Vector2.zero;
        leftData.useDragThreshold = false;

        raycastForAirVRPointer(pointer, leftData, _raycastResultCache);
        var raycast = FindFirstRaycast(_raycastResultCache);

        leftData.pointerCurrentRaycast = raycast;
        _raycastResultCache.Clear();

        Vector2 position = Vector2.zero;
        AirVRGraphicRaycaster airvrRaycaster = raycast.module as AirVRGraphicRaycaster;

        if (airvrRaycaster)
        {
            position = airvrRaycaster.GetScreenPosition(raycast);
        }

        AirVRPhysicsRaycaster airvrPhysicsRaycaster = raycast.module as AirVRPhysicsRaycaster;

        if (airvrPhysicsRaycaster)
        {
            position = airvrPhysicsRaycaster.GetScreenPosition(raycast.worldPosition);
        }

        if (created)
        {
            leftData.position = position;
        }
        leftData.delta    = position - leftData.position;
        leftData.position = position;

        AirVRPointerEventData rightData;

        getAirVRPointerData(pointer, kMouseRightId, out rightData, true);
        copyAirVRPointerEventData(leftData, rightData);
        rightData.button = PointerEventData.InputButton.Right;

        AirVRPointerEventData middleData;

        getAirVRPointerData(pointer, kMouseMiddleId, out middleData, true);
        copyAirVRPointerEventData(leftData, middleData);
        middleData.button = PointerEventData.InputButton.Middle;

        _mouseState.SetButtonState(PointerEventData.InputButton.Left, getAirVRPointerButtonState(pointer), leftData);
        _mouseState.SetButtonState(PointerEventData.InputButton.Right, PointerEventData.FramePressState.NotChanged, rightData);
        _mouseState.SetButtonState(PointerEventData.InputButton.Middle, PointerEventData.FramePressState.NotChanged, middleData);

        return(_mouseState);
    }