123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- using UnityEngine;
- namespace Pathfinding {
-
-
-
-
-
-
-
-
-
-
-
- public class GraphUpdateShape {
- Vector3[] _points;
- Vector3[] _convexPoints;
- bool _convex;
- Vector3 right = Vector3.right;
- Vector3 forward = Vector3.forward;
- Vector3 up = Vector3.up;
- Vector3 origin;
- public float minimumHeight;
-
-
-
-
-
- public Vector3[] points {
- get {
- return _points;
- }
- set {
- _points = value;
- if (convex) CalculateConvexHull();
- }
- }
-
-
-
-
- public bool convex {
- get {
- return _convex;
- }
- set {
- if (_convex != value && value) {
- CalculateConvexHull();
- }
- _convex = value;
- }
- }
- public GraphUpdateShape () {
- }
-
-
-
-
-
-
-
-
-
-
- public GraphUpdateShape (Vector3[] points, bool convex, Matrix4x4 matrix, float minimumHeight) {
- this.convex = convex;
- this.points = points;
- origin = matrix.MultiplyPoint3x4(Vector3.zero);
- right = matrix.MultiplyPoint3x4(Vector3.right) - origin;
- up = matrix.MultiplyPoint3x4(Vector3.up) - origin;
- forward = matrix.MultiplyPoint3x4(Vector3.forward) - origin;
- this.minimumHeight = minimumHeight;
- }
- void CalculateConvexHull () {
- _convexPoints = points != null? Polygon.ConvexHullXZ(points) : null;
- }
-
- public Bounds GetBounds () {
- return GetBounds(convex ? _convexPoints : points, right, up, forward, origin, minimumHeight);
- }
- public static Bounds GetBounds (Vector3[] points, Matrix4x4 matrix, float minimumHeight) {
- var origin = matrix.MultiplyPoint3x4(Vector3.zero);
- var right = matrix.MultiplyPoint3x4(Vector3.right) - origin;
- var up = matrix.MultiplyPoint3x4(Vector3.up) - origin;
- var forward = matrix.MultiplyPoint3x4(Vector3.forward) - origin;
- return GetBounds(points, right, up, forward, origin, minimumHeight);
- }
- static Bounds GetBounds (Vector3[] points, Vector3 right, Vector3 up, Vector3 forward, Vector3 origin, float minimumHeight) {
- if (points == null || points.Length == 0) return new Bounds();
- float miny = points[0].y, maxy = points[0].y;
- for (int i = 0; i < points.Length; i++) {
- miny = Mathf.Min(miny, points[i].y);
- maxy = Mathf.Max(maxy, points[i].y);
- }
- var extraHeight = Mathf.Max(minimumHeight - (maxy - miny), 0) * 0.5f;
- miny -= extraHeight;
- maxy += extraHeight;
- Vector3 min = right * points[0].x + up * points[0].y + forward * points[0].z;
- Vector3 max = min;
- for (int i = 0; i < points.Length; i++) {
- var p = right * points[i].x + forward * points[i].z;
- var p1 = p + up * miny;
- var p2 = p + up * maxy;
- min = Vector3.Min(min, p1);
- min = Vector3.Min(min, p2);
- max = Vector3.Max(max, p1);
- max = Vector3.Max(max, p2);
- }
- return new Bounds((min+max)*0.5F + origin, max-min);
- }
- public bool Contains (GraphNode node) {
- return Contains((Vector3)node.position);
- }
- public bool Contains (Vector3 point) {
-
- point -= origin;
- var localSpacePoint = new Vector3(Vector3.Dot(point, right)/right.sqrMagnitude, 0, Vector3.Dot(point, forward)/forward.sqrMagnitude);
- if (convex) {
- if (_convexPoints == null) return false;
- for (int i = 0, j = _convexPoints.Length-1; i < _convexPoints.Length; j = i, i++) {
- if (VectorMath.RightOrColinearXZ(_convexPoints[i], _convexPoints[j], localSpacePoint)) return false;
- }
- return true;
- } else {
- return _points != null && Polygon.ContainsPointXZ(_points, localSpacePoint);
- }
- }
- }
- }
|