private static Vector4 CompleteTriJob(TriJobHandle handle) { handle.handle.Complete(); handle.vertices.Dispose(); handle.triangles.Dispose(); return(new Vector4(triangleHitPoint.x, triangleHitPoint.y, triangleHitPoint.z, closestTriID)); }
/// <summary> /// /// </summary> /// <param name="meshVertices"></param> /// <param name="meshTriangles"></param> /// <param name="meshTransform"></param> /// <param name="camera"></param> /// <param name="mouseDir"></param> /// <returns> x,y,z: hit point world position; w: fisrt vertex id in hit triangle</returns> internal static Vector4 GetNeatestTriHitByMouseRay(Vector3[] meshVertices, int[] meshTriangles, Matrix4x4 meshTransform, Camera camera, Vector3 mouseDir) { TriJobHandle newResultAndHandle = new TriJobHandle(); ScheduleTriJob(ref newResultAndHandle, meshVertices, meshTriangles, meshTransform, camera, mouseDir); return(CompleteTriJob(newResultAndHandle)); }
private static void ScheduleTriJob(ref TriJobHandle handle, Vector3[] meshVertices, int[] meshTriangles, Matrix4x4 meshTransform, Camera camera, Vector3 mouseDir) { handle.vertices = new NativeArray <Vector3>(array: meshVertices, allocator: Allocator.TempJob); handle.triangles = new NativeArray <int>(array: meshTriangles, allocator: Allocator.TempJob); closestTriDistance = 40000; closestTriID = -1; FindClosestTriangleJob newJob = new FindClosestTriangleJob { vertices = handle.vertices, triangles = handle.triangles, cameraPos = camera.transform.position, mouseDir = mouseDir, localToWorldMat = meshTransform, }; handle.handle = newJob.Schedule(meshTriangles.Length / 3, 16); }