Example #1
0
        bool TryGetRaycastPoint(ref Vector3 raycastPos, ref Vector3 raycastNormal)
        {
            bool raycastHit = false;

            // Raycast against physics
            int hitCount = Physics.RaycastNonAlloc(m_Interactor.attachTransform.position, m_Interactor.attachTransform.forward,
                                                   m_RaycastHits, m_MaxRaycastDistance, m_RaycastMask);

            if (hitCount != 0)
            {
                Array.Sort(m_RaycastHits, 0, hitCount, m_RaycastHitComparer);
                raycastPos    = m_RaycastHits.First().point;
                raycastNormal = m_RaycastHits.First().normal;
                raycastHit    = true;
            }

            // Get last Raycast against EventSystem system with attached XRPointer (if available)
            if (m_XRUIPointer && m_XRUIPointer.enabled)
            {
                TrackedDeviceModel model             = m_XRUIPointer.GetTrackedDeviceModel();
                RaycastResult      lastRaycastResult = model.implementationData.lastFrameRaycast;
                if (lastRaycastResult.isValid)
                {
                    if ((lastRaycastResult.worldPosition - m_Interactor.transform.position).sqrMagnitude <
                        (raycastPos - m_Interactor.transform.position).sqrMagnitude)
                    {
                        raycastPos    = lastRaycastResult.worldPosition;
                        raycastNormal = lastRaycastResult.worldNormal;
                    }
                    raycastHit = true;
                }
            }

            return(raycastHit);
        }