Files
2026-03-04 10:03:45 +08:00

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