231 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			231 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace UnityEditor.U2D.Animation | ||
|  | { | ||
|  |     internal struct SliderData | ||
|  |     { | ||
|  |         public Vector3 position; | ||
|  |         public Vector3 forward; | ||
|  |         public Vector3 up; | ||
|  |         public Vector3 right; | ||
|  | 
 | ||
|  |         public static readonly SliderData zero = new SliderData() { position = Vector3.zero, forward = Vector3.forward, up = Vector3.up, right = Vector3.right }; | ||
|  |     } | ||
|  | 
 | ||
|  |     internal interface IGUIWrapper | ||
|  |     { | ||
|  |         Vector2 mousePosition { get; } | ||
|  |         int mouseButton { get; } | ||
|  |         int clickCount { get; } | ||
|  |         bool isShiftDown { get; } | ||
|  |         bool isAltDown { get; } | ||
|  |         bool isActionKeyDown { get; } | ||
|  |         EventType eventType { get; } | ||
|  |         string commandName { get; } | ||
|  |         bool IsMouseDown(int button); | ||
|  |         bool IsMouseUp(int button); | ||
|  |         bool IsKeyDown(KeyCode keyCode); | ||
|  |         int GetControlID(int hint, FocusType focusType); | ||
|  |         void LayoutControl(int controlID, float distance); | ||
|  |         bool IsControlNearest(int controlID); | ||
|  |         bool IsControlHot(int controlID); | ||
|  |         bool IsMultiStepControlHot(int controlID); | ||
|  |         void SetControlHot(int controlID); | ||
|  |         void SetMultiStepControlHot(int controlID); | ||
|  |         bool DoSlider(int id, SliderData sliderData, out Vector3 newPosition); | ||
|  |         void UseCurrentEvent(); | ||
|  |         float DistanceToSegment(Vector3 p1, Vector3 p2); | ||
|  |         float DistanceToSegmentClamp(Vector3 p1, Vector3 p2); | ||
|  |         float DistanceToCircle(Vector3 center, float radius); | ||
|  |         Vector3 GUIToWorld(Vector2 guiPosition); | ||
|  |         Vector3 GUIToWorld(Vector2 guiPosition, Vector3 planeNormal, Vector3 planePosition); | ||
|  |         void Repaint(); | ||
|  |         bool IsRepainting(); | ||
|  |         bool IsEventOutsideWindow(); | ||
|  |         void SetGuiChanged(bool changed); | ||
|  |         float GetHandleSize(Vector3 position); | ||
|  |         bool IsViewToolActive(); | ||
|  |         bool HasCurrentCamera(); | ||
|  |     } | ||
|  | 
 | ||
|  |     internal class GUIWrapper : IGUIWrapper | ||
|  |     { | ||
|  |         private Handles.CapFunction nullCap = (int c, Vector3 p, Quaternion r, float s, EventType ev) => { }; | ||
|  |         private int m_MultiStepHotControl = 0; | ||
|  | 
 | ||
|  |         public Vector2 mousePosition | ||
|  |         { | ||
|  |             get { return Event.current.mousePosition; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public int mouseButton | ||
|  |         { | ||
|  |             get { return Event.current.button; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public int clickCount | ||
|  |         { | ||
|  |             get { return Event.current.clickCount; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool isShiftDown | ||
|  |         { | ||
|  |             get { return Event.current.shift; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool isAltDown | ||
|  |         { | ||
|  |             get { return Event.current.alt; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool isActionKeyDown | ||
|  |         { | ||
|  |             get { return EditorGUI.actionKey; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public EventType eventType | ||
|  |         { | ||
|  |             get { return Event.current.type; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public string commandName | ||
|  |         { | ||
|  |             get { return Event.current.commandName; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsMouseDown(int button) | ||
|  |         { | ||
|  |             return Event.current.type == EventType.MouseDown && Event.current.button == button; | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsMouseUp(int button) | ||
|  |         { | ||
|  |             return Event.current.type == EventType.MouseUp && Event.current.button == button; | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsKeyDown(KeyCode keyCode) | ||
|  |         { | ||
|  |             return Event.current.type == EventType.KeyDown && Event.current.keyCode == keyCode; | ||
|  |         } | ||
|  | 
 | ||
|  |         public int GetControlID(int hint, FocusType focusType) | ||
|  |         { | ||
|  |             return GUIUtility.GetControlID(hint, focusType); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void LayoutControl(int controlID, float distance) | ||
|  |         { | ||
|  |             if (Event.current.type == EventType.Layout) | ||
|  |                 HandleUtility.AddControl(controlID, distance); | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsControlNearest(int controlID) | ||
|  |         { | ||
|  |             return HandleUtility.nearestControl == controlID; | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsControlHot(int controlID) | ||
|  |         { | ||
|  |             return GUIUtility.hotControl == controlID; | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsMultiStepControlHot(int controlID) | ||
|  |         { | ||
|  |             return m_MultiStepHotControl == controlID; | ||
|  |         } | ||
|  | 
 | ||
|  |         public void SetControlHot(int controlID) | ||
|  |         { | ||
|  |             GUIUtility.hotControl = controlID; | ||
|  |         } | ||
|  | 
 | ||
|  |         public void SetMultiStepControlHot(int controlID) | ||
|  |         { | ||
|  |             m_MultiStepHotControl = controlID; | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool DoSlider(int id, SliderData sliderData, out Vector3 newPosition) | ||
|  |         { | ||
|  |             EditorGUI.BeginChangeCheck(); | ||
|  | 
 | ||
|  |             if (HasCurrentCamera()) | ||
|  |                 newPosition = Handles.Slider2D(id, sliderData.position, sliderData.forward, sliderData.right, sliderData.up, 1f, nullCap, Vector2.zero); | ||
|  |             else | ||
|  |                 newPosition = Slider2D.Do(id, sliderData.position, null); | ||
|  | 
 | ||
|  |             return EditorGUI.EndChangeCheck(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void UseCurrentEvent() | ||
|  |         { | ||
|  |             Event.current.Use(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public float DistanceToSegment(Vector3 p1, Vector3 p2) | ||
|  |         { | ||
|  |             p1 = HandleUtility.WorldToGUIPoint(p1); | ||
|  |             p2 = HandleUtility.WorldToGUIPoint(p2); | ||
|  | 
 | ||
|  |             return HandleUtility.DistancePointToLineSegment(mousePosition, p1, p2); | ||
|  |         } | ||
|  | 
 | ||
|  |         public float DistanceToSegmentClamp(Vector3 p1, Vector3 p2) | ||
|  |         { | ||
|  |             p1 = HandleUtility.WorldToGUIPoint(p1); | ||
|  |             p2 = HandleUtility.WorldToGUIPoint(p2); | ||
|  | 
 | ||
|  |             return MathUtility.DistanceToSegmentClamp(mousePosition, p1, p2); | ||
|  |         } | ||
|  | 
 | ||
|  |         public float DistanceToCircle(Vector3 center, float radius) | ||
|  |         { | ||
|  |             return HandleUtility.DistanceToCircle(center, radius); | ||
|  |         } | ||
|  | 
 | ||
|  |         public Vector3 GUIToWorld(Vector2 guiPosition) | ||
|  |         { | ||
|  |             return ModuleUtility.GUIToWorld(guiPosition); | ||
|  |         } | ||
|  | 
 | ||
|  |         public Vector3 GUIToWorld(Vector2 guiPosition, Vector3 planeNormal, Vector3 planePosition) | ||
|  |         { | ||
|  |             return ModuleUtility.GUIToWorld(guiPosition, planeNormal, planePosition); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Repaint() | ||
|  |         { | ||
|  |             HandleUtility.Repaint(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsRepainting() | ||
|  |         { | ||
|  |             return eventType == EventType.Repaint; | ||
|  |         } | ||
|  | 
 | ||
|  |         public void SetGuiChanged(bool changed) | ||
|  |         { | ||
|  |             GUI.changed = true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsEventOutsideWindow() | ||
|  |         { | ||
|  |             return Event.current.type == EventType.Ignore; | ||
|  |         } | ||
|  | 
 | ||
|  |         public float GetHandleSize(Vector3 position) | ||
|  |         { | ||
|  |             return HandleUtility.GetHandleSize(position); | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsViewToolActive() | ||
|  |         { | ||
|  |             return UnityEditor.Tools.current == Tool.View || isAltDown || mouseButton == 1 || mouseButton == 2; | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool HasCurrentCamera() | ||
|  |         { | ||
|  |             return Camera.current != null; | ||
|  |         } | ||
|  |     } | ||
|  | } |