92 lines
3.2 KiB
C#
Raw Normal View History

2023-04-24 15:49:03 +02:00
using UnityEngine;
namespace Pathfinding.Util {
/// <summary>Helper methods for drawing gizmos and debug lines</summary>
public class Draw {
public static readonly Draw Debug = new Draw { gizmos = false };
public static readonly Draw Gizmos = new Draw { gizmos = true };
bool gizmos;
Matrix4x4 matrix = Matrix4x4.identity;
void SetColor (Color color) {
if (gizmos && UnityEngine.Gizmos.color != color) UnityEngine.Gizmos.color = color;
}
public void Polyline (System.Collections.Generic.List<Vector3> points, Color color, bool cycle = false) {
for (int i = 0; i < points.Count - 1; i++) {
Line(points[i], points[i+1], color);
}
if (cycle && points.Count > 1) Line(points[points.Count - 1], points[0], color);
}
public void Line (Vector3 a, Vector3 b, Color color) {
SetColor(color);
if (gizmos) UnityEngine.Gizmos.DrawLine(matrix.MultiplyPoint3x4(a), matrix.MultiplyPoint3x4(b));
else UnityEngine.Debug.DrawLine(matrix.MultiplyPoint3x4(a), matrix.MultiplyPoint3x4(b), color);
}
public void CircleXZ (Vector3 center, float radius, Color color, float startAngle = 0f, float endAngle = 2*Mathf.PI) {
int steps = 40;
#if UNITY_EDITOR
if (gizmos) steps = (int)Mathf.Clamp(Mathf.Sqrt(radius / UnityEditor.HandleUtility.GetHandleSize((UnityEngine.Gizmos.matrix * matrix).MultiplyPoint3x4(center))) * 25, 4, 40);
#endif
while (startAngle > endAngle) startAngle -= 2*Mathf.PI;
Vector3 prev = new Vector3(Mathf.Cos(startAngle)*radius, 0, Mathf.Sin(startAngle)*radius);
for (int i = 0; i <= steps; i++) {
Vector3 c = new Vector3(Mathf.Cos(Mathf.Lerp(startAngle, endAngle, i/(float)steps))*radius, 0, Mathf.Sin(Mathf.Lerp(startAngle, endAngle, i/(float)steps))*radius);
Line(center + prev, center + c, color);
prev = c;
}
}
public void Cylinder (Vector3 position, Vector3 up, float height, float radius, Color color) {
var tangent = Vector3.Cross(up, Vector3.one).normalized;
matrix = Matrix4x4.TRS(position, Quaternion.LookRotation(tangent, up), new Vector3(radius, height, radius));
CircleXZ(Vector3.zero, 1, color);
if (height > 0) {
CircleXZ(Vector3.up, 1, color);
Line(new Vector3(1, 0, 0), new Vector3(1, 1, 0), color);
Line(new Vector3(-1, 0, 0), new Vector3(-1, 1, 0), color);
Line(new Vector3(0, 0, 1), new Vector3(0, 1, 1), color);
Line(new Vector3(0, 0, -1), new Vector3(0, 1, -1), color);
}
matrix = Matrix4x4.identity;
}
public void CrossXZ (Vector3 position, Color color, float size = 1) {
size *= 0.5f;
Line(position - Vector3.right*size, position + Vector3.right*size, color);
Line(position - Vector3.forward*size, position + Vector3.forward*size, color);
}
public void Bezier (Vector3 a, Vector3 b, Color color) {
Vector3 dir = b - a;
if (dir == Vector3.zero) return;
Vector3 normal = Vector3.Cross(Vector3.up, dir);
Vector3 normalUp = Vector3.Cross(dir, normal);
normalUp = normalUp.normalized;
normalUp *= dir.magnitude*0.1f;
Vector3 p1c = a + normalUp;
Vector3 p2c = b + normalUp;
Vector3 prev = a;
for (int i = 1; i <= 20; i++) {
float t = i/20.0f;
Vector3 p = AstarSplines.CubicBezier(a, p1c, p2c, b, t);
Line(prev, p, color);
prev = p;
}
}
}
}