/// <summary> /// Cast a ray (in model space) against a mesh. /// </summary> /// <param name="InRay"></param> /// <param name="vertices"></param> /// <param name="triangles"></param> /// <param name="hit"></param> /// <param name="distance"></param> /// <param name="cullingMode"></param> /// <returns></returns> internal static bool MeshRaycast(Ray InRay, Vector3[] vertices, int[] triangles, out PolyRaycastHit hit, float distance = Mathf.Infinity, Culling cullingMode = Culling.Front) { Vector3 hitNormal = Vector3.zero; // vars used in loop Vector3 vert0, vert1, vert2; Vector3 origin = InRay.origin, direction = InRay.direction; hit = new PolyRaycastHit(Mathf.Infinity, Vector3.zero, Vector3.zero, -1); /** * Iterate faces, testing for nearest hit to ray origin. */ for (int CurTri = 0; CurTri < triangles.Length; CurTri += 3) { if (CurTri + 2 >= triangles.Length) { continue; } if (triangles[CurTri + 2] >= vertices.Length) { continue; } vert0 = vertices[triangles[CurTri + 0]]; vert1 = vertices[triangles[CurTri + 1]]; vert2 = vertices[triangles[CurTri + 2]]; // Second pass, test intersection with triangle if (Math.RayIntersectsTriangle2(origin, direction, vert0, vert1, vert2, ref distance, ref hitNormal)) { if (distance < hit.distance) { hit.distance = distance; hit.triangle = CurTri / 3; hit.position = InRay.GetPoint(hit.distance); hit.normal = hitNormal; } } } hit = new PolyRaycastHit(hit.distance, InRay.GetPoint(hit.distance), hitNormal, hit.triangle); return(hit.triangle > -1); }