68 lines
1.9 KiB
C#
68 lines
1.9 KiB
C#
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<Vector3> list = new List<Vector3>();
|
|
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();
|
|
}
|
|
}
|
|
}
|