Tanoda
MeshOperator.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using UnityEngine;
5
6namespace Es.InkPainter
7{
11 public class MeshOperator
12 {
13 #region MeshData
14
15 private readonly Mesh mesh;
16 private readonly int[] meshTriangles;
17 private readonly Vector3[] meshVertices;
18 private readonly Vector2[] meshUV;
19
20 #endregion MeshData
21
22 #region PublicMethod
23
24 public MeshOperator(Mesh mesh)
25 {
26 if (mesh == null)
27 throw new ArgumentNullException("mesh");
28 this.mesh = mesh;
29 meshTriangles = this.mesh.triangles;
30 meshVertices = this.mesh.vertices;
31 if (this.mesh.uv.Length == 0)
32 {
33 var vertices = mesh.vertices;
34 var uvs = new Vector2[vertices.Length];
35
36 for (var i = 0; i < uvs.Length; i++) uvs[i] = new Vector2(vertices[i].x, vertices[i].z);
37 meshUV = uvs;
38 }
39 else
40 {
41 meshUV = this.mesh.uv;
42 }
43 }
44
52 public bool LocalPointToUV(Vector3 localPoint, Matrix4x4 matrixMVP, out Vector2 uv)
53 {
54 int index0;
55 int index1;
56 int index2;
57 Vector3 t1;
58 Vector3 t2;
59 Vector3 t3;
60 var p = localPoint;
61
62 for (var i = 0; i < meshTriangles.Length; i += 3)
63 {
64 index0 = i + 0;
65 index1 = i + 1;
66 index2 = i + 2;
67
68 t1 = meshVertices[meshTriangles[index0]];
69 t2 = meshVertices[meshTriangles[index1]];
70 t3 = meshVertices[meshTriangles[index2]];
71
72 if (!Math.ExistPointInPlane(p, t1, t2, t3))
73 continue;
74 if (!Math.ExistPointOnTriangleEdge(p, t1, t2, t3) && !Math.ExistPointInTriangle(p, t1, t2, t3))
75 continue;
76
77 var uv1 = meshUV[meshTriangles[index0]];
78 var uv2 = meshUV[meshTriangles[index1]];
79 var uv3 = meshUV[meshTriangles[index2]];
80 uv = Math.TextureCoordinateCalculation(p, t1, uv1, t2, uv2, t3, uv3, matrixMVP);
81
82 return true;
83 }
84
85 uv = default(Vector3);
86 return false;
87 }
88
94 public Vector3 NearestLocalSurfacePoint(Vector3 localPoint)
95 {
96 var p = localPoint;
97 var tris = Math.GetNearestVerticesTriangle(p, meshVertices, meshTriangles);
98 var pds = new List<Vector3>();
99 for (var i = 0; i < tris.Length; i += 3)
100 {
101 var i0 = i;
102 var i1 = i + 1;
103 var i2 = i + 2;
104 pds.Add(Math.TriangleSpaceProjection(p, tris[i0], tris[i1], tris[i2]));
105 }
106
107 return pds.OrderBy(t => Vector3.Distance(p, t)).First();
108 }
109
110 #endregion PublicMethod
111 }
112}
Es.InkPainter.Math Math
Definition: PaintTest.cs:7
A class that manipulates Mesh.
Definition: MeshOperator.cs:12
bool LocalPointToUV(Vector3 localPoint, Matrix4x4 matrixMVP, out Vector2 uv)
Convert local-space point to texture coordinates.
Definition: MeshOperator.cs:52
Vector3 NearestLocalSurfacePoint(Vector3 localPoint)
Returns the point on the surface of Mesh closest to the point on the specified local-space.
Definition: MeshOperator.cs:94