262 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			262 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | 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(); | ||
|  | 		} | ||
|  |     } | ||
|  | } |