123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- using UnityEngine;
- using UnityEvent = UnityEngine.Event;
- namespace UnityEditor.U2D.Sprites
- {
- internal static class SpriteEditorHandles
- {
- private static Vector2 s_CurrentMousePosition;
- private static Vector2 s_DragStartScreenPosition;
- private static Vector2 s_DragScreenOffset;
- static internal Vector2 PointSlider(Vector2 pos, MouseCursor cursor, GUIStyle dragDot, GUIStyle dragDotActive)
- {
- int id = GUIUtility.GetControlID("Slider1D".GetHashCode(), FocusType.Keyboard);
- Vector2 screenVal = Handles.matrix.MultiplyPoint(pos);
- Rect handleScreenPos = new Rect(
- screenVal.x - dragDot.fixedWidth * .5f,
- screenVal.y - dragDot.fixedHeight * .5f,
- dragDot.fixedWidth,
- dragDot.fixedHeight
- );
- var evt = UnityEvent.current;
- switch (evt.GetTypeForControl(id))
- {
- case EventType.Repaint:
- if (GUIUtility.hotControl == id)
- dragDotActive.Draw(handleScreenPos, GUIContent.none, id);
- else
- dragDot.Draw(handleScreenPos, GUIContent.none, id);
- break;
- }
- return ScaleSlider(pos, cursor, handleScreenPos);
- }
- static internal Vector2 ScaleSlider(Vector2 pos, MouseCursor cursor, Rect cursorRect)
- {
- int id = GUIUtility.GetControlID("Slider1D".GetHashCode(), FocusType.Keyboard);
- return ScaleSlider(id, pos, cursor, cursorRect);
- }
- static private Vector2 ScaleSlider(int id, Vector2 pos, MouseCursor cursor, Rect cursorRect)
- {
- Vector2 screenVal = Handles.matrix.MultiplyPoint(pos);
- var evt = UnityEvent.current;
- switch (evt.GetTypeForControl(id))
- {
- case EventType.MouseDown:
- // am I closest to the thingy?
- if (evt.button == 0 &&
- cursorRect.Contains(UnityEvent.current.mousePosition) &&
- !evt.alt)
- {
- GUIUtility.hotControl = GUIUtility.keyboardControl = id; // Grab mouse focus
- s_CurrentMousePosition = evt.mousePosition;
- s_DragStartScreenPosition = evt.mousePosition;
- s_DragScreenOffset = s_CurrentMousePosition - screenVal;
- evt.Use();
- EditorGUIUtility.SetWantsMouseJumping(1);
- }
- break;
- case EventType.MouseDrag:
- if (GUIUtility.hotControl == id)
- {
- s_CurrentMousePosition += evt.delta;
- Vector2 oldPos = pos;
- pos = Handles.inverseMatrix.MultiplyPoint(s_CurrentMousePosition);
- if (!Mathf.Approximately((oldPos - pos).magnitude, 0f))
- GUI.changed = true;
- evt.Use();
- }
- break;
- case EventType.MouseUp:
- if (GUIUtility.hotControl == id && (evt.button == 0 || evt.button == 2))
- {
- GUIUtility.hotControl = 0;
- evt.Use();
- EditorGUIUtility.SetWantsMouseJumping(0);
- }
- break;
- case EventType.KeyDown:
- if (GUIUtility.hotControl == id)
- {
- if (evt.keyCode == KeyCode.Escape)
- {
- pos = Handles.inverseMatrix.MultiplyPoint(s_DragStartScreenPosition - s_DragScreenOffset);
- GUIUtility.hotControl = 0;
- GUI.changed = true;
- evt.Use();
- }
- }
- break;
- case EventType.Repaint:
- if (GUIUtility.hotControl == 0 || GUIUtility.hotControl == id)
- EditorGUIUtility.AddCursorRect(cursorRect, cursor, id);
- break;
- }
- return pos;
- }
- static internal Vector2 PivotSlider(Rect sprite, Vector2 pos, GUIStyle pivotDot, GUIStyle pivotDotActive)
- {
- int id = GUIUtility.GetControlID("Slider1D".GetHashCode(), FocusType.Keyboard);
- // Convert from normalized space to texture space
- pos = new Vector2(sprite.xMin + sprite.width * pos.x, sprite.yMin + sprite.height * pos.y);
- Vector2 screenVal = Handles.matrix.MultiplyPoint(pos);
- Rect handleScreenPos = new Rect(
- screenVal.x - pivotDot.fixedWidth * .5f,
- screenVal.y - pivotDot.fixedHeight * .5f,
- pivotDotActive.fixedWidth,
- pivotDotActive.fixedHeight
- );
- var evt = UnityEvent.current;
- switch (evt.GetTypeForControl(id))
- {
- case EventType.MouseDown:
- // am I closest to the thingy?
- if (evt.button == 0 && handleScreenPos.Contains(UnityEvent.current.mousePosition) && !evt.alt)
- {
- GUIUtility.hotControl = GUIUtility.keyboardControl = id; // Grab mouse focus
- s_CurrentMousePosition = evt.mousePosition;
- s_DragStartScreenPosition = evt.mousePosition;
- Vector2 rectScreenCenter = Handles.matrix.MultiplyPoint(pos);
- s_DragScreenOffset = s_CurrentMousePosition - rectScreenCenter;
- evt.Use();
- EditorGUIUtility.SetWantsMouseJumping(1);
- }
- break;
- case EventType.MouseDrag:
- if (GUIUtility.hotControl == id)
- {
- s_CurrentMousePosition += evt.delta;
- Vector2 oldPos = pos;
- Vector3 scrPos = Handles.inverseMatrix.MultiplyPoint(s_CurrentMousePosition - s_DragScreenOffset);
- pos = new Vector2(scrPos.x, scrPos.y);
- if (!Mathf.Approximately((oldPos - pos).magnitude, 0f))
- GUI.changed = true;
- evt.Use();
- }
- break;
- case EventType.MouseUp:
- if (GUIUtility.hotControl == id && (evt.button == 0 || evt.button == 2))
- {
- GUIUtility.hotControl = 0;
- evt.Use();
- EditorGUIUtility.SetWantsMouseJumping(0);
- }
- break;
- case EventType.KeyDown:
- if (GUIUtility.hotControl == id)
- {
- if (evt.keyCode == KeyCode.Escape)
- {
- pos = Handles.inverseMatrix.MultiplyPoint(s_DragStartScreenPosition - s_DragScreenOffset);
- GUIUtility.hotControl = 0;
- GUI.changed = true;
- evt.Use();
- }
- }
- break;
- case EventType.Repaint:
- EditorGUIUtility.AddCursorRect(handleScreenPos, MouseCursor.Arrow, id);
- if (GUIUtility.hotControl == id)
- pivotDotActive.Draw(handleScreenPos, GUIContent.none, id);
- else
- pivotDot.Draw(handleScreenPos, GUIContent.none, id);
- break;
- }
- // Convert from texture space back to normalized space
- pos = new Vector2((pos.x - sprite.xMin) / sprite.width, (pos.y - sprite.yMin) / sprite.height);
- return pos;
- }
- static internal Rect SliderRect(Rect pos)
- {
- int id = GUIUtility.GetControlID("SliderRect".GetHashCode(), FocusType.Keyboard);
- var evt = UnityEvent.current;
- // SpriteEditorWindow is telling us we got selected and so we fake a mousedown on our Repaint event to get "one-click dragging" going on
- if (SpriteEditorWindow.s_OneClickDragStarted && evt.type == EventType.Repaint)
- {
- HandleSliderRectMouseDown(id, evt, pos);
- SpriteEditorWindow.s_OneClickDragStarted = false;
- }
- switch (evt.GetTypeForControl(id))
- {
- case EventType.MouseDown:
- // am I closest to the thingy?
- if (evt.button == 0 && pos.Contains(Handles.inverseMatrix.MultiplyPoint(UnityEvent.current.mousePosition)) && !evt.alt)
- {
- HandleSliderRectMouseDown(id, evt, pos);
- evt.Use();
- }
- break;
- case EventType.MouseDrag:
- if (GUIUtility.hotControl == id)
- {
- s_CurrentMousePosition += evt.delta;
- Vector2 oldCenter = pos.center;
- pos.center = Handles.inverseMatrix.MultiplyPoint(s_CurrentMousePosition - s_DragScreenOffset);
- if (!Mathf.Approximately((oldCenter - pos.center).magnitude, 0f))
- GUI.changed = true;
- evt.Use();
- }
- break;
- case EventType.MouseUp:
- if (GUIUtility.hotControl == id && (evt.button == 0 || evt.button == 2))
- {
- GUIUtility.hotControl = 0;
- evt.Use();
- EditorGUIUtility.SetWantsMouseJumping(0);
- }
- break;
- case EventType.KeyDown:
- if (GUIUtility.hotControl == id)
- {
- if (evt.keyCode == KeyCode.Escape)
- {
- pos.center = Handles.inverseMatrix.MultiplyPoint(s_DragStartScreenPosition - s_DragScreenOffset);
- GUIUtility.hotControl = 0;
- GUI.changed = true;
- evt.Use();
- }
- }
- break;
- case EventType.Repaint:
- Vector2 topleft = Handles.inverseMatrix.MultiplyPoint(new Vector2(pos.xMin, pos.yMin));
- Vector2 bottomright = Handles.inverseMatrix.MultiplyPoint(new Vector2(pos.xMax, pos.yMax));
- EditorGUIUtility.AddCursorRect(new Rect(topleft.x, topleft.y, bottomright.x - topleft.x, bottomright.y - topleft.y), MouseCursor.Arrow, id);
- break;
- }
- return pos;
- }
- static internal void HandleSliderRectMouseDown(int id, UnityEvent evt, Rect pos)
- {
- GUIUtility.hotControl = GUIUtility.keyboardControl = id; // Grab mouse focus
- s_CurrentMousePosition = evt.mousePosition;
- s_DragStartScreenPosition = evt.mousePosition;
- Vector2 rectScreenCenter = Handles.matrix.MultiplyPoint(pos.center);
- s_DragScreenOffset = s_CurrentMousePosition - rectScreenCenter;
- EditorGUIUtility.SetWantsMouseJumping(1);
- }
- static int s_RectSelectionID = GUIUtility.GetPermanentControlID();
- static internal Rect RectCreator(Rect textureArea, GUIStyle rectStyle)
- {
- var evt = UnityEvent.current;
- Vector2 mousePos = evt.mousePosition;
- int id = s_RectSelectionID;
- Rect result = new Rect();
- switch (evt.GetTypeForControl(id))
- {
- case EventType.MouseDown:
- if (evt.button == 0)
- {
- GUIUtility.hotControl = id;
- // Make sure that the starting position is clamped to inside texture area
- s_DragStartScreenPosition = Handles.inverseMatrix.MultiplyPoint(mousePos);
- s_DragStartScreenPosition.x = Mathf.Min(Mathf.Max(s_DragStartScreenPosition.x, textureArea.xMin), textureArea.xMax);
- s_DragStartScreenPosition.y = Mathf.Min(Mathf.Max(s_DragStartScreenPosition.y, textureArea.yMin), textureArea.yMax);
- evt.Use();
- }
- break;
- case EventType.MouseDrag:
- if (GUIUtility.hotControl == id)
- {
- evt.Use();
- }
- break;
- case EventType.Repaint:
- {
- var startDragPoint = Handles.matrix.MultiplyPoint(s_DragStartScreenPosition);
- if (GUIUtility.hotControl == id && ValidRect(startDragPoint, mousePos))
- {
- // TODO: use rectstyle
- //rectStyle.Draw (GetCurrentRect (true, textureWidth, textureHeight, s_DragStartScreenPosition, s_CurrentMousePosition), GUIContent.none, false, false, false, false);
- SpriteEditorUtility.BeginLines(Color.green * 1.5f);
- SpriteEditorUtility.DrawBox(GetCurrentRect(false, textureArea, startDragPoint, mousePos));
- SpriteEditorUtility.EndLines();
- }
- }
- break;
- case EventType.MouseUp:
- if (GUIUtility.hotControl == id && evt.button == 0)
- {
- var startDragPoint = Handles.matrix.MultiplyPoint(s_DragStartScreenPosition);
- if (ValidRect(startDragPoint, mousePos))
- {
- result = GetCurrentRect(false, textureArea, startDragPoint, mousePos);
- GUI.changed = true;
- evt.Use();
- }
- GUIUtility.hotControl = 0;
- }
- break;
- case EventType.KeyDown:
- if (GUIUtility.hotControl == id)
- {
- if (evt.keyCode == KeyCode.Escape)
- {
- GUIUtility.hotControl = 0;
- GUI.changed = true;
- evt.Use();
- }
- }
- break;
- }
- return result;
- }
- static internal Rect RectCreator(float textureWidth, float textureHeight, GUIStyle rectStyle)
- {
- return RectCreator(new Rect(0, 0, textureWidth, textureHeight), rectStyle);
- }
- static private bool ValidRect(Vector2 startPoint, Vector2 endPoint)
- {
- return Mathf.Abs((endPoint - startPoint).x) > 5f && Mathf.Abs((endPoint - startPoint).y) > 5f;
- }
- static private Rect GetCurrentRect(bool screenSpace, Rect clampArea, Vector2 startPoint, Vector2 endPoint)
- {
- Rect r = EditorGUIExt.FromToRect(Handles.inverseMatrix.MultiplyPoint(startPoint), Handles.inverseMatrix.MultiplyPoint(endPoint));
- r = SpriteEditorUtility.ClampedRect(SpriteEditorUtility.RoundToInt(r), clampArea, false);
- if (screenSpace)
- {
- Vector2 topleft = Handles.matrix.MultiplyPoint(new Vector2(r.xMin, r.yMin));
- Vector2 bottomright = Handles.matrix.MultiplyPoint(new Vector2(r.xMax, r.yMax));
- r = new Rect(topleft.x, topleft.y, bottomright.x - topleft.x, bottomright.y - topleft.y);
- }
- return r;
- }
- }
- }
|