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);
        }