using UnityEditor.U2D.Common; using UnityEngine; namespace UnityEditor.U2D.Animation { internal class DrawingUtility { public static readonly Color kSpriteBorderColor = new Color(0.25f, 0.5f, 1f, 0.75f); public static void DrawLine(Vector3 p1, Vector3 p2, Vector3 normal, float width) { DrawLine(p1, p2, normal, width, width); } public static void DrawLine(Vector3 p1, Vector3 p2, Vector3 normal, float widthP1, float widthP2) { DrawLine(p1, p2, normal, widthP1, widthP2, Handles.color); } public static void DrawLine(Vector3 p1, Vector3 p2, Vector3 normal, float widthP1, float widthP2, Color color) { if (Event.current.type != EventType.Repaint) return; Vector3 up = Vector3.Cross(normal, p2 - p1).normalized; Shader.SetGlobalFloat("_HandleSize", 1); InternalEditorBridge.ApplyWireMaterial(); GL.PushMatrix(); GL.MultMatrix(Handles.matrix); GL.Begin(4); GL.Color(color); GL.Vertex(p1 + up * widthP1 * 0.5f); GL.Vertex(p1 - up * widthP1 * 0.5f); GL.Vertex(p2 - up * widthP2 * 0.5f); GL.Vertex(p1 + up * widthP1 * 0.5f); GL.Vertex(p2 - up * widthP2 * 0.5f); GL.Vertex(p2 + up * widthP2 * 0.5f); GL.End(); GL.PopMatrix(); } public static void BeginLines(Color color) { InternalEditorBridge.ApplyWireMaterial(); GL.PushMatrix(); GL.MultMatrix(Handles.matrix); GL.Begin(GL.LINES); GL.Color(color); } public static void BeginSolidLines() { InternalEditorBridge.ApplyWireMaterial(); GL.PushMatrix(); GL.MultMatrix(Handles.matrix); GL.Begin(GL.TRIANGLES); } public static void EndLines() { GL.End(); GL.PopMatrix(); } public static void DrawLine(Vector3 p1, Vector3 p2) { GL.Vertex(p1); GL.Vertex(p2); } public static void DrawSolidLine(float width, Vector3 p1, Vector3 p2) { DrawSolidLine(p1, p2, Vector3.forward, width, width); } public static void DrawSolidLine(Vector3 p1, Vector3 p2, Vector3 normal, float widthP1, float widthP2) { GL.Color(Handles.color); Vector3 right = Vector3.Cross(normal, p2 - p1).normalized; GL.Vertex(p1 + right * widthP1 * 0.5f); GL.Vertex(p1 - right * widthP1 * 0.5f); GL.Vertex(p2 - right * widthP2 * 0.5f); GL.Vertex(p1 + right * widthP1 * 0.5f); GL.Vertex(p2 - right * widthP2 * 0.5f); GL.Vertex(p2 + right * widthP2 * 0.5f); } public static void DrawBox(Rect position) { Vector3[] points = new Vector3[5]; int i = 0; points[i++] = new Vector3(position.xMin, position.yMin, 0f); points[i++] = new Vector3(position.xMax, position.yMin, 0f); points[i++] = new Vector3(position.xMax, position.yMax, 0f); points[i++] = new Vector3(position.xMin, position.yMax, 0f); DrawLine(points[0], points[1]); DrawLine(points[1], points[2]); DrawLine(points[2], points[3]); DrawLine(points[3], points[0]); } public static void DrawMesh(Mesh mesh, Material material, Matrix4x4 matrix) { Debug.Assert(mesh != null); Debug.Assert(material != null); if (Event.current.type != EventType.Repaint) return; material.SetFloat("_AdjustLinearForGamma", PlayerSettings.colorSpace == ColorSpace.Linear ? 1.0f : 0.0f); material.SetPass(0); Graphics.DrawMeshNow(mesh, Handles.matrix * matrix); } public static void DrawGUIStyleCap(int controlID, Vector3 position, Quaternion rotation, float size, GUIStyle guiStyle) { if (Event.current.type != EventType.Repaint) return; if (Camera.current && Vector3.Dot(position - Camera.current.transform.position, Camera.current.transform.forward) < 0f) return; Handles.BeginGUI(); guiStyle.Draw(GetGUIStyleRect(guiStyle, position), GUIContent.none, controlID); Handles.EndGUI(); } private static Rect GetGUIStyleRect(GUIStyle style, Vector3 position) { Vector2 vector = HandleUtility.WorldToGUIPoint(position); float fixedWidth = style.fixedWidth; float fixedHeight = style.fixedHeight; return new Rect(vector.x - fixedWidth / 2f, vector.y - fixedHeight / 2f, fixedWidth, fixedHeight); } public static void DrawRect(Rect rect, Vector3 position, Quaternion rotation, Color color, float rectAlpha, float outlineAlpha) { if (Event.current.type != EventType.Repaint) return; Vector3[] corners = new Vector3[4]; for (int i = 0; i < 4; i++) { Vector3 point = GetLocalRectPoint(rect, i); corners[i] = rotation * point + position; } Vector3[] points = new Vector3[] { corners[0], corners[1], corners[2], corners[3], corners[0] }; Color l_color = Handles.color; Handles.color = color; Vector2 offset = new Vector2(1f, 1f); if (!Camera.current) { offset.y *= -1; } Handles.DrawSolidRectangleWithOutline(points, new Color(1f, 1f, 1f, rectAlpha), new Color(1f, 1f, 1f, outlineAlpha)); Handles.color = l_color; } private static Vector2 GetLocalRectPoint(Rect rect, int index) { switch (index) { case (0): return new Vector2(rect.xMin, rect.yMax); case (1): return new Vector2(rect.xMax, rect.yMax); case (2): return new Vector2(rect.xMax, rect.yMin); case (3): return new Vector2(rect.xMin, rect.yMin); } return Vector3.zero; } private static void SetDiscSectionPoints(Vector3[] dest, int count, Vector3 normal, Vector3 from, float angle) { from.Normalize(); Quaternion rotation = Quaternion.AngleAxis(angle / (float)(count - 1), normal); Vector3 vector = from; for (int i = 0; i < count; i++) { dest[i] = vector; vector = rotation * vector; } } static Vector3[] s_array; public static void DrawSolidArc(Vector3 center, Vector3 normal, Vector3 from, float angle, float radius, int numSamples = 60) { if (Event.current.type != EventType.Repaint) return; numSamples = Mathf.Clamp(numSamples, 3, 60); if (s_array == null) s_array = new Vector3[60]; Color color = Handles.color; SetDiscSectionPoints(s_array, numSamples, normal, from, angle); InternalEditorBridge.ApplyWireMaterial(); GL.PushMatrix(); GL.MultMatrix(Handles.matrix); GL.Begin(GL.TRIANGLES); for (int i = 1; i < numSamples; i++) { GL.Color(color); GL.Vertex(center); GL.Vertex(center + s_array[i - 1] * radius); GL.Vertex(center + s_array[i] * radius); } GL.End(); GL.PopMatrix(); } public static void DrawSolidArc(Vector3 center, Vector3 normal, Vector3 from, float angle, float radius, float outlineScale, int numSamples = 60) { if (Event.current.type != EventType.Repaint) return; numSamples = Mathf.Clamp(numSamples, 3, 60); if(s_array == null) s_array = new Vector3[60]; Color color = Handles.color; SetDiscSectionPoints(s_array, numSamples, normal, from, angle); InternalEditorBridge.ApplyWireMaterial(); GL.PushMatrix(); GL.MultMatrix(Handles.matrix); GL.Begin(4); for (int i = 1; i < numSamples; i++) { GL.Color(color); GL.Vertex(center + s_array[i - 1] * radius * outlineScale); GL.Vertex(center + s_array[i - 1] * radius); GL.Vertex(center + s_array[i] * radius); GL.Vertex(center + s_array[i - 1] * radius * outlineScale); GL.Vertex(center + s_array[i] * radius); GL.Vertex(center + s_array[i] * radius * outlineScale); } GL.End(); GL.PopMatrix(); } } }