using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Es.InkPainter { public class MeshOperator { private Mesh mesh; private int[] meshTriangles; private Vector3[] meshVertices; private Vector2[] meshUV; public MeshOperator(Mesh mesh) { if (mesh == null) { throw new ArgumentNullException("mesh"); } this.mesh = mesh; meshTriangles = this.mesh.triangles; meshVertices = this.mesh.vertices; meshUV = this.mesh.uv; } public bool LocalPointToUV(Vector3 localPoint, Matrix4x4 matrixMVP, out Vector2 uv) { for (int i = 0; i < meshTriangles.Length; i += 3) { int num = i; int num2 = i + 1; int num3 = i + 2; Vector3 t = meshVertices[meshTriangles[num]]; Vector3 t2 = meshVertices[meshTriangles[num2]]; Vector3 t3 = meshVertices[meshTriangles[num3]]; if (Math.ExistPointInPlane(localPoint, t, t2, t3) && (Math.ExistPointOnTriangleEdge(localPoint, t, t2, t3) || Math.ExistPointInTriangle(localPoint, t, t2, t3))) { Vector2 t1UV = meshUV[meshTriangles[num]]; Vector2 t2UV = meshUV[meshTriangles[num2]]; Vector2 t3UV = meshUV[meshTriangles[num3]]; uv = Math.TextureCoordinateCalculation(localPoint, t, t1UV, t2, t2UV, t3, t3UV, matrixMVP); return true; } } uv = default(Vector3); return false; } public Vector3 NearestLocalSurfacePoint(Vector3 localPoint) { Vector3[] nearestVerticesTriangle = Math.GetNearestVerticesTriangle(localPoint, meshVertices, meshTriangles); List list = new List(); for (int i = 0; i < nearestVerticesTriangle.Length; i += 3) { int num = i; int num2 = i + 1; int num3 = i + 2; list.Add(Math.TriangleSpaceProjection(localPoint, nearestVerticesTriangle[num], nearestVerticesTriangle[num2], nearestVerticesTriangle[num3])); } return list.OrderBy((Vector3 t) => Vector3.Distance(localPoint, t)).First(); } } }