private void CompleteSelection()
    {
        //hide radial image
        _reticle.ShowRadialImage(false);

        //radial progress completed, call completion events on target
        _target.GazeComplete(m_pointerEventData);

        if (_target.Repeat)
        {
            _target         = null;
            _previousTarget = null;
            _reticle.ResetProgress();
            _reticle.SetPosition();
        }
    }
    private void GazeRaycast()
    {
        // Show the debug ray
        if (_showDebugRay)
        {
            Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.forward * _debugRayLength, Color.blue, _debugRayDuration);
        }

        //Set up PointerEventData
        m_pointerEventData = new PointerEventData(_eventSystem);

        //handle positioning for gaze raycast depending on platform or using Unity editor
        #if UNITY_EDITOR
        m_pointerEventData.position = new Vector2(Screen.width / 2, Screen.height / 2);
        #elif UNITY_IOS || UNITY_ANDROID
        m_pointerEventData.position = new Vector2(UnityEngine.XR.XRSettings.eyeTextureWidth / 2, UnityEngine.XR.XRSettings.eyeTextureHeight / 2);
        #endif

        //Create a list of Raycast Results
        List <RaycastResult> results = new List <RaycastResult>();
        _eventSystem.RaycastAll(m_pointerEventData, results);

        //loop through all items hit
        for (int i = 0; i < results.Count; i++)
        {
            if (results[i].gameObject.GetComponent <VRTargetItem>())
            {
                _target        = results[i].gameObject.GetComponent <VRTargetItem>();
                _currentTarget = results[i];

                // Something was hit, set position to hit position.
                if (_reticle)
                {
                    _reticle.SetPosition(results[i]);
                }
                break;
            }

            //no targets found
            _target = null;
        }

        // If current interactive item is not the same as the last interactive item, then call GazeEnter and start fill
        if (_target && _target != _previousTarget)
        {
            _reticle.ShowRadialImage(true);
            _target.GazeEnter(m_pointerEventData);
            if (_previousTarget)
            {
                _previousTarget.GazeExit(m_pointerEventData);
            }
            _reticle.StartProgress();
            _previousTarget = _target;
        }
        else if (_target && _target == _previousTarget) //hovering over same item, advance fill progress
        {
            if (_reticle.ProgressRadialImage())         //returns true if selection is completed
            {
                CompleteSelection();
            }
        }
        else
        {
            //no target hit
            if (_previousTarget)
            {
                _previousTarget.GazeExit(m_pointerEventData);
            }

            _target         = null;
            _previousTarget = null;
            _reticle.ShowRadialImage(false);
            _reticle.ResetProgress();
            _reticle.SetPosition();
        }
    }