aboutsummaryrefslogtreecommitdiff
path: root/JamHelper/Assets/JamTools/Scripts/Utils/ColliderUtility.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2022-01-29 11:36:08 +0800
committerchai <chaifix@163.com>2022-01-29 11:36:08 +0800
commit60c2e26bc432273d41365165c5457db7e51aa03d (patch)
tree7596f14d5e870793c267f531712a37809bb6deac /JamHelper/Assets/JamTools/Scripts/Utils/ColliderUtility.cs
parent53593cf28d07d544a4d498dc807e7f9e53f17236 (diff)
*rename
Diffstat (limited to 'JamHelper/Assets/JamTools/Scripts/Utils/ColliderUtility.cs')
-rw-r--r--JamHelper/Assets/JamTools/Scripts/Utils/ColliderUtility.cs59
1 files changed, 59 insertions, 0 deletions
diff --git a/JamHelper/Assets/JamTools/Scripts/Utils/ColliderUtility.cs b/JamHelper/Assets/JamTools/Scripts/Utils/ColliderUtility.cs
new file mode 100644
index 0000000..3efe155
--- /dev/null
+++ b/JamHelper/Assets/JamTools/Scripts/Utils/ColliderUtility.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace JamTools
+{
+
+ public static class ColliderUtility
+ {
+ private static readonly List<Vector3> s_Vertices = new List<Vector3>();
+
+ private static readonly List<int> s_Triangles = new List<int>();
+
+ private static Plane GetWorldTriangle(Transform collider, int index)
+ {
+ Vector3 position = ColliderUtility.s_Vertices[ColliderUtility.s_Triangles[3 * index]];
+ Vector3 position2 = ColliderUtility.s_Vertices[ColliderUtility.s_Triangles[3 * index + 1]];
+ Vector3 position3 = ColliderUtility.s_Vertices[ColliderUtility.s_Triangles[3 * index + 2]];
+ return new Plane(collider.TransformPoint(position), collider.TransformPoint(position2), collider.TransformPoint(position3));
+ }
+
+ public static Vector3 FindClosestPoint(Collider collider, Vector3 position)
+ {
+ return ColliderUtility.FindClosestPoint(collider, position, false);
+ }
+
+ public static Vector3 FindClosestPoint(Collider collider, Vector3 position, bool ignoreVerticalTriangles)
+ {
+ MeshCollider meshCollider;
+ if ((meshCollider = (collider as MeshCollider)) != null && !meshCollider.convex)
+ {
+ Mesh sharedMesh = meshCollider.sharedMesh;
+ sharedMesh.GetVertices(ColliderUtility.s_Vertices);
+ Plane plane = default(Plane);
+ float num = float.PositiveInfinity;
+ for (int i = 0; i < sharedMesh.subMeshCount; i++)
+ {
+ sharedMesh.GetTriangles(ColliderUtility.s_Triangles, i);
+ int j = 0;
+ int num2 = ColliderUtility.s_Triangles.Count / 3;
+ while (j < num2)
+ {
+ Plane worldTriangle = ColliderUtility.GetWorldTriangle(meshCollider.transform, j);
+ float num3 = Mathf.Abs(worldTriangle.GetDistanceToPoint(position));
+ if ((!ignoreVerticalTriangles || (!(worldTriangle.normal == Vector3.up) && !(worldTriangle.normal == Vector3.down))) && ((i == 0 && j == 0) || num3 < num))
+ {
+ plane = worldTriangle;
+ num = num3;
+ }
+ j++;
+ }
+ }
+ return plane.ClosestPointOnPlane(position);
+ }
+ return collider.ClosestPoint(position);
+ }
+ }
+
+}