/// <summary> /// Generate Native Appdata from mesh /// </summary> /// <param name="appdatas"></param> /// <param name="triangles"></param> /// <returns></returns> vertex Count public static int GetAppDataFromMesh(Mesh mesh, out NativeArray <MeshAppdata> meshData, out int[] triangles) { Vector3[] vertices = mesh.vertices; Vector2[] uv = mesh.uv; Vector4[] tan = mesh.tangents; Vector3[] normal = mesh.normals; if (uv.Length != vertices.Length) { uv = new Vector2[vertices.Length]; } if (tan.Length != vertices.Length) { tan = new Vector4[vertices.Length]; } if (normal.Length != vertices.Length) { normal = new Vector3[vertices.Length]; } if (uv.Length != vertices.Length) { uv = new Vector2[vertices.Length]; } meshData = new NativeArray <MeshAppdata>(vertices.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory); for (int i = 0; i < meshData.Length; ++i) { meshData[i] = new MeshAppdata { vertex = vertices[i], normal = normal[i], tangent = tan[i], uv = uv[i] }; } triangles = mesh.triangles; return(vertices.Length); }
public void Execute(int index) { index *= 3; MeshAppdata v0 = appdatas[triangles[index]]; MeshAppdata v1 = appdatas[triangles[index + 1]]; MeshAppdata v2 = appdatas[triangles[index + 2]]; float t = float.MaxValue; float2 uv = 0; if (IntersectTriangle(origin, dir, mul(*transformMatrix, float4(v0.vertex, 1)).xyz, mul(*transformMatrix, float4(v1.vertex, 1)).xyz, mul(*transformMatrix, float4(v2.vertex, 1)).xyz, &t, &uv) && t > 0) { results.ConcurrentAdd(new RayIntersectResult { t = t, triangle = new TriangleData { v0 = v0, v1 = v1, v2 = v2 }, uv = uv }); } }