123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725 |
- using System;
- using UnityEditor.UIElements;
- using UnityEngine.UIElements;
- using UnityEngine;
- namespace UnityEditor.U2D.Sprites
- {
- internal abstract partial class SpriteFrameModuleBase : SpriteEditorModuleBase
- {
- protected enum GizmoMode
- {
- BorderEditing,
- RectEditing
- }
- protected class Styles
- {
- public readonly GUIStyle dragdot = "U2D.dragDot";
- public readonly GUIStyle dragdotactive = "U2D.dragDotActive";
- public readonly GUIStyle createRect = "U2D.createRect";
- public readonly GUIStyle pivotdotactive = "U2D.pivotDotActive";
- public readonly GUIStyle pivotdot = "U2D.pivotDot";
- public readonly GUIStyle dragBorderdot = new GUIStyle();
- public readonly GUIStyle dragBorderDotActive = new GUIStyle();
- public readonly GUIStyle toolbar;
- public Styles()
- {
- toolbar = new GUIStyle(EditorStyles.inspectorBig);
- toolbar.margin.top = 0;
- toolbar.margin.bottom = 0;
- createRect.border = new RectOffset(3, 3, 3, 3);
- dragBorderdot.fixedHeight = 5f;
- dragBorderdot.fixedWidth = 5f;
- dragBorderdot.normal.background = EditorGUIUtility.whiteTexture;
- dragBorderDotActive.fixedHeight = dragBorderdot.fixedHeight;
- dragBorderDotActive.fixedWidth = dragBorderdot.fixedWidth;
- dragBorderDotActive.normal.background = EditorGUIUtility.whiteTexture;
- }
- }
- private static Styles s_Styles;
- protected static Styles styles
- {
- get
- {
- if (s_Styles == null)
- s_Styles = new Styles();
- return s_Styles;
- }
- }
- private const float kInspectorWidth = 330f;
- private const float kInspectorHeight = 170;
- private const float kPivotFieldPrecision = 0.0001f;
- private float m_Zoom = 1.0f;
- private GizmoMode m_GizmoMode;
- private VisualElement m_NameElement;
- private TextField m_NameField;
- private VisualElement m_PositionElement;
- private IntegerField m_PositionFieldX;
- private IntegerField m_PositionFieldY;
- private IntegerField m_PositionFieldW;
- private IntegerField m_PositionFieldH;
- private IntegerField m_BorderFieldL;
- private IntegerField m_BorderFieldT;
- private IntegerField m_BorderFieldR;
- private IntegerField m_BorderFieldB;
- private EnumField m_PivotField;
- private EnumField m_PivotUnitModeField;
- private VisualElement m_CustomPivotElement;
- private FloatField m_CustomPivotFieldX;
- private FloatField m_CustomPivotFieldY;
- private VisualElement m_SelectedFrameInspector;
- private bool ShouldShowRectScaling()
- {
- return hasSelected && m_GizmoMode == GizmoMode.RectEditing;
- }
- private static Rect inspectorRect
- {
- get
- {
- return new Rect(
- 0, 0,
- kInspectorWidth,
- kInspectorHeight);
- }
- }
- private void RemoveMainUI(VisualElement mainView)
- {
- if (mainView.Contains(m_SelectedFrameInspector))
- mainView.Remove(m_SelectedFrameInspector);
- mainView.UnregisterCallback<SpriteSelectionChangeEvent>(SelectionChange);
- }
- protected void UpdatePositionField(FocusOutEvent evt)
- {
- if (hasSelected)
- {
- m_PositionFieldX.SetValueWithoutNotify((int)selectedSpriteRect.x);
- m_PositionFieldY.SetValueWithoutNotify((int)selectedSpriteRect.y);
- m_PositionFieldW.SetValueWithoutNotify((int)selectedSpriteRect.width);
- m_PositionFieldH.SetValueWithoutNotify((int)selectedSpriteRect.height);
- }
- }
- private void UpdateBorderField(FocusOutEvent evt)
- {
- if (hasSelected)
- {
- m_BorderFieldL.SetValueWithoutNotify((int)selectedSpriteBorder.x);
- m_BorderFieldB.SetValueWithoutNotify((int)selectedSpriteBorder.y);
- m_BorderFieldR.SetValueWithoutNotify((int)selectedSpriteBorder.z);
- m_BorderFieldT.SetValueWithoutNotify((int)selectedSpriteBorder.w);
- }
- }
- void SetupIntegerField(IntegerField field, EventCallback<FocusOutEvent> onFocusOutEvent, EventCallback<ChangeEvent<int>> onChangeEvent)
- {
- field.RegisterCallback(onFocusOutEvent);
- field.RegisterValueChangedCallback(onChangeEvent);
- }
- void SetDragFieldLimit(IntegerField field, int value)
- {
- // The only way to know if value change is due to dragger or text input
- var t = field.Q("unity-text-input");
- if (!t.focusController.IsFocused(t))
- {
- // Value changed due to drag. We set back the field so to show the drag limit
- field.SetValueWithoutNotify(value);
- }
- }
- void OnPositionIntXChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var rect = selectedSpriteRect;
- rect.x = evt.newValue;
- selectedSpriteRect = rect;
- SetDragFieldLimit(m_PositionFieldX, (int)selectedSpriteRect.x);
- m_PositionFieldW.SetValueWithoutNotify((int)selectedSpriteRect.width);
- }
- }
- void OnPositionIntYChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var rect = selectedSpriteRect;
- rect.y = evt.newValue;
- selectedSpriteRect = rect;
- SetDragFieldLimit(m_PositionFieldY, (int)selectedSpriteRect.y);
- m_PositionFieldH.SetValueWithoutNotify((int)selectedSpriteRect.height);
- }
- }
- void OnPositionIntWChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var rect = selectedSpriteRect;
- rect.width = evt.newValue;
- selectedSpriteRect = rect;
- SetDragFieldLimit(m_PositionFieldW, (int)selectedSpriteRect.width);
- m_PositionFieldX.SetValueWithoutNotify((int)selectedSpriteRect.x);
- }
- }
- void OnPositionIntHChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var rect = selectedSpriteRect;
- rect.height = evt.newValue;
- selectedSpriteRect = rect;
- SetDragFieldLimit(m_PositionFieldH, (int)selectedSpriteRect.height);
- m_PositionFieldY.SetValueWithoutNotify((int)selectedSpriteRect.y);
- }
- }
- void OnBorderIntLChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var border = selectedSpriteBorder;
- border.x = evt.newValue;
- selectedSpriteBorder = border;
- SetDragFieldLimit(m_BorderFieldL, (int)selectedSpriteBorder.x);
- }
- }
- void OnBorderIntBChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var border = selectedSpriteBorder;
- border.y = evt.newValue;
- selectedSpriteBorder = border;
- SetDragFieldLimit(m_BorderFieldB, (int)selectedSpriteBorder.y);
- }
- }
- void OnBorderIntRChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var border = selectedSpriteBorder;
- border.z = (evt.newValue + border.x) <= selectedSpriteRect.width ? evt.newValue : selectedSpriteRect.width - border.x;
- selectedSpriteBorder = border;
- SetDragFieldLimit(m_BorderFieldR, (int)selectedSpriteBorder.z);
- }
- }
- void OnBorderIntTChange(ChangeEvent<int> evt)
- {
- if (hasSelected)
- {
- var border = selectedSpriteBorder;
- border.w = (evt.newValue + border.y) <= selectedSpriteRect.height ? evt.newValue : selectedSpriteRect.height - border.y;
- selectedSpriteBorder = border;
- SetDragFieldLimit(m_BorderFieldT, (int)selectedSpriteBorder.w);
- }
- }
- private void AddMainUI(VisualElement mainView)
- {
- var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Packages/com.unity.2d.sprite/Editor/UI/SpriteEditor/SpriteFrameModuleInspector.uxml") as VisualTreeAsset;
- m_SelectedFrameInspector = visualTree.CloneTree().Q("spriteFrameModuleInspector");
- m_NameElement = m_SelectedFrameInspector.Q("name");
- m_NameField = m_SelectedFrameInspector.Q<TextField>("spriteName");
- m_NameField.RegisterValueChangedCallback((evt) =>
- {
- if (hasSelected)
- {
- selectedSpriteName = evt.newValue;
- }
- });
- m_NameField.RegisterCallback<FocusOutEvent>((focus) =>
- {
- if (hasSelected)
- {
- m_NameField.SetValueWithoutNotify(selectedSpriteName);
- }
- });
- m_PositionElement = m_SelectedFrameInspector.Q("position");
- m_PositionFieldX = m_PositionElement.Q<IntegerField>("positionX");
- SetupIntegerField(m_PositionFieldX, UpdatePositionField, OnPositionIntXChange);
- m_PositionFieldY = m_PositionElement.Q<IntegerField>("positionY");
- SetupIntegerField(m_PositionFieldY, UpdatePositionField, OnPositionIntYChange);
- m_PositionFieldW = m_PositionElement.Q<IntegerField>("positionW");
- SetupIntegerField(m_PositionFieldW, UpdatePositionField, OnPositionIntWChange);
- m_PositionFieldH = m_PositionElement.Q<IntegerField>("positionH");
- SetupIntegerField(m_PositionFieldH, UpdatePositionField, OnPositionIntHChange);
- var borderElement = m_SelectedFrameInspector.Q("border");
- m_BorderFieldL = borderElement.Q<IntegerField>("borderL");
- SetupIntegerField(m_BorderFieldL, UpdateBorderField, OnBorderIntLChange);
- m_BorderFieldT = borderElement.Q<IntegerField>("borderT");
- SetupIntegerField(m_BorderFieldT, UpdateBorderField, OnBorderIntTChange);
- m_BorderFieldR = borderElement.Q<IntegerField>("borderR");
- SetupIntegerField(m_BorderFieldR, UpdateBorderField, OnBorderIntRChange);
- m_BorderFieldB = borderElement.Q<IntegerField>("borderB");
- SetupIntegerField(m_BorderFieldB, UpdateBorderField, OnBorderIntBChange);
- m_PivotField = m_SelectedFrameInspector.Q<EnumField>("pivotField");
- m_PivotField.Init(SpriteAlignment.Center);
- m_PivotField.label = L10n.Tr("Pivot");
- m_PivotField.RegisterValueChangedCallback((evt) =>
- {
- if (hasSelected)
- {
- SpriteAlignment alignment = (SpriteAlignment)evt.newValue;
- SetSpritePivotAndAlignment(selectedSpritePivot, alignment);
- m_CustomPivotElement.SetEnabled(selectedSpriteAlignment == SpriteAlignment.Custom);
- Vector2 pivot = selectedSpritePivotInCurUnitMode;
- m_CustomPivotFieldX.SetValueWithoutNotify(pivot.x);
- m_CustomPivotFieldY.SetValueWithoutNotify(pivot.y);
- }
- });
- m_PivotUnitModeField = m_SelectedFrameInspector.Q<EnumField>("pivotUnitModeField");
- m_PivotUnitModeField.Init(PivotUnitMode.Normalized);
- m_PivotUnitModeField.label = L10n.Tr("Pivot Unit Mode");
- m_PivotUnitModeField.RegisterValueChangedCallback((evt) =>
- {
- if (hasSelected)
- {
- m_PivotUnitMode = (PivotUnitMode)evt.newValue;
- Vector2 pivot = selectedSpritePivotInCurUnitMode;
- m_CustomPivotFieldX.SetValueWithoutNotify(pivot.x);
- m_CustomPivotFieldY.SetValueWithoutNotify(pivot.y);
- }
- });
- m_CustomPivotElement = m_SelectedFrameInspector.Q("customPivot");
- m_CustomPivotFieldX = m_CustomPivotElement.Q<FloatField>("customPivotX");
- m_CustomPivotFieldX.RegisterValueChangedCallback((evt) =>
- {
- if (hasSelected)
- {
- float newValue = (float)evt.newValue;
- float pivotX = m_PivotUnitMode == PivotUnitMode.Pixels
- ? ConvertFromRectToNormalizedSpace(new Vector2(newValue, 0.0f), selectedSpriteRect).x
- : newValue;
- var pivot = selectedSpritePivot;
- pivot.x = pivotX;
- SetSpritePivotAndAlignment(pivot, selectedSpriteAlignment);
- }
- });
- m_CustomPivotFieldY = m_CustomPivotElement.Q<FloatField>("customPivotY");
- m_CustomPivotFieldY.RegisterValueChangedCallback((evt) =>
- {
- if (hasSelected)
- {
- float newValue = (float)evt.newValue;
- float pivotY = m_PivotUnitMode == PivotUnitMode.Pixels
- ? ConvertFromRectToNormalizedSpace(new Vector2(0.0f, newValue), selectedSpriteRect).y
- : newValue;
- var pivot = selectedSpritePivot;
- pivot.y = pivotY;
- SetSpritePivotAndAlignment(pivot, selectedSpriteAlignment);
- }
- });
- //// Force an update of all the fields.
- PopulateSpriteFrameInspectorField();
- mainView.RegisterCallback<SpriteSelectionChangeEvent>(SelectionChange);
- // Stop mouse events from reaching the main view.
- m_SelectedFrameInspector.pickingMode = PickingMode.Ignore;
- m_SelectedFrameInspector.RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
- m_SelectedFrameInspector.RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
- m_SelectedFrameInspector.AddToClassList("moduleWindow");
- m_SelectedFrameInspector.AddToClassList("bottomRightFloating");
- mainView.Add(m_SelectedFrameInspector);
- }
- private void SelectionChange(SpriteSelectionChangeEvent evt)
- {
- m_SelectedFrameInspector.style.display = hasSelected ? DisplayStyle.Flex : DisplayStyle.None;
- PopulateSpriteFrameInspectorField();
- }
- private void UIUndoCallback()
- {
- PopulateSpriteFrameInspectorField();
- }
- protected void PopulateSpriteFrameInspectorField()
- {
- m_SelectedFrameInspector.style.display = hasSelected ? DisplayStyle.Flex : DisplayStyle.None;
- if (!hasSelected)
- return;
- m_NameElement.SetEnabled(containsMultipleSprites);
- m_NameField.SetValueWithoutNotify(selectedSpriteName);
- m_PositionElement.SetEnabled(containsMultipleSprites);
- var spriteRect = selectedSpriteRect;
- m_PositionFieldX.SetValueWithoutNotify(Mathf.RoundToInt(spriteRect.x));
- m_PositionFieldY.SetValueWithoutNotify(Mathf.RoundToInt(spriteRect.y));
- m_PositionFieldW.SetValueWithoutNotify(Mathf.RoundToInt(spriteRect.width));
- m_PositionFieldH.SetValueWithoutNotify(Mathf.RoundToInt(spriteRect.height));
- var spriteBorder = selectedSpriteBorder;
- m_BorderFieldL.SetValueWithoutNotify(Mathf.RoundToInt(spriteBorder.x));
- m_BorderFieldT.SetValueWithoutNotify(Mathf.RoundToInt(spriteBorder.w));
- m_BorderFieldR.SetValueWithoutNotify(Mathf.RoundToInt(spriteBorder.z));
- m_BorderFieldB.SetValueWithoutNotify(Mathf.RoundToInt(spriteBorder.y));
- m_PivotField.SetValueWithoutNotify(selectedSpriteAlignment);
- m_PivotUnitModeField.SetValueWithoutNotify(m_PivotUnitMode);
- Vector2 pivot = selectedSpritePivotInCurUnitMode;
- m_CustomPivotFieldX.SetValueWithoutNotify(pivot.x);
- m_CustomPivotFieldY.SetValueWithoutNotify(pivot.y);
- m_CustomPivotElement.SetEnabled(hasSelected && selectedSpriteAlignment == SpriteAlignment.Custom);
- }
- private static Vector2 ApplySpriteAlignmentToPivot(Vector2 pivot, Rect rect, SpriteAlignment alignment)
- {
- if (alignment != SpriteAlignment.Custom)
- {
- Vector2[] snapPoints = GetSnapPointsArray(rect);
- Vector2 texturePos = snapPoints[(int)alignment];
- return ConvertFromTextureToNormalizedSpace(texturePos, rect);
- }
- return pivot;
- }
- private static Vector2 ConvertFromTextureToNormalizedSpace(Vector2 texturePos, Rect rect)
- {
- return new Vector2((texturePos.x - rect.xMin) / rect.width, (texturePos.y - rect.yMin) / rect.height);
- }
- private static Vector2 ConvertFromNormalizedToRectSpace(Vector2 normalizedPos, Rect rect)
- {
- Vector2 rectPos = new Vector2(rect.width * normalizedPos.x, rect.height * normalizedPos.y);
- // This is to combat the lack of precision formating on the UI controls.
- rectPos.x = Mathf.Round(rectPos.x / kPivotFieldPrecision) * kPivotFieldPrecision;
- rectPos.y = Mathf.Round(rectPos.y / kPivotFieldPrecision) * kPivotFieldPrecision;
- return rectPos;
- }
- private static Vector2 ConvertFromRectToNormalizedSpace(Vector2 rectPos, Rect rect)
- {
- return new Vector2(rectPos.x / rect.width, rectPos.y / rect.height);
- }
- private static Vector2[] GetSnapPointsArray(Rect rect)
- {
- Vector2[] snapPoints = new Vector2[9];
- snapPoints[(int)SpriteAlignment.TopLeft] = new Vector2(rect.xMin, rect.yMax);
- snapPoints[(int)SpriteAlignment.TopCenter] = new Vector2(rect.center.x, rect.yMax);
- snapPoints[(int)SpriteAlignment.TopRight] = new Vector2(rect.xMax, rect.yMax);
- snapPoints[(int)SpriteAlignment.LeftCenter] = new Vector2(rect.xMin, rect.center.y);
- snapPoints[(int)SpriteAlignment.Center] = new Vector2(rect.center.x, rect.center.y);
- snapPoints[(int)SpriteAlignment.RightCenter] = new Vector2(rect.xMax, rect.center.y);
- snapPoints[(int)SpriteAlignment.BottomLeft] = new Vector2(rect.xMin, rect.yMin);
- snapPoints[(int)SpriteAlignment.BottomCenter] = new Vector2(rect.center.x, rect.yMin);
- snapPoints[(int)SpriteAlignment.BottomRight] = new Vector2(rect.xMax, rect.yMin);
- return snapPoints;
- }
- protected void Repaint()
- {
- spriteEditor.RequestRepaint();
- }
- protected void HandleGizmoMode()
- {
- GizmoMode oldGizmoMode = m_GizmoMode;
- var evt = eventSystem.current;
- if (evt.control)
- m_GizmoMode = GizmoMode.BorderEditing;
- else
- m_GizmoMode = GizmoMode.RectEditing;
- if (oldGizmoMode != m_GizmoMode && (evt.type == EventType.KeyDown || evt.type == EventType.KeyUp) && (evt.keyCode == KeyCode.LeftControl || evt.keyCode == KeyCode.RightControl || evt.keyCode == KeyCode.LeftAlt || evt.keyCode == KeyCode.RightAlt))
- Repaint();
- }
- protected bool MouseOnTopOfInspector()
- {
- if (hasSelected == false)
- return false;
- var point = GUIClip.Unclip(eventSystem.current.mousePosition);
- point = m_SelectedFrameInspector.parent.LocalToWorld(point);
- var selectedElement = m_SelectedFrameInspector.panel.Pick(point);
- if (selectedElement != null
- && selectedElement.pickingMode != PickingMode.Ignore
- && selectedElement.FindCommonAncestor(m_SelectedFrameInspector) == m_SelectedFrameInspector)
- return true;
- return false;
- }
- protected void HandlePivotHandle()
- {
- if (!hasSelected)
- return;
- EditorGUI.BeginChangeCheck();
- SpriteAlignment alignment = selectedSpriteAlignment;
- Vector2 pivot = selectedSpritePivot;
- Rect rect = selectedSpriteRect;
- pivot = ApplySpriteAlignmentToPivot(pivot, rect, alignment);
- Vector2 pivotHandlePosition = SpriteEditorHandles.PivotSlider(rect, pivot, styles.pivotdot, styles.pivotdotactive);
- if (EditorGUI.EndChangeCheck())
- {
- // Pivot snapping only happen when ctrl is press. Same as scene view snapping move
- if (eventSystem.current.control)
- SnapPivotToSnapPoints(pivotHandlePosition, out pivot, out alignment);
- else if (m_PivotUnitMode == PivotUnitMode.Pixels)
- SnapPivotToPixels(pivotHandlePosition, out pivot, out alignment);
- else
- {
- pivot = pivotHandlePosition;
- alignment = SpriteAlignment.Custom;
- }
- SetSpritePivotAndAlignment(pivot, alignment);
- PopulateSpriteFrameInspectorField();
- }
- }
- protected void HandleBorderSidePointScalingSliders()
- {
- if (!hasSelected)
- return;
- GUIStyle dragDot = styles.dragBorderdot;
- GUIStyle dragDotActive = styles.dragBorderDotActive;
- var color = new Color(0f, 1f, 0f);
- Rect rect = selectedSpriteRect;
- Vector4 border = selectedSpriteBorder;
- float left = rect.xMin + border.x;
- float right = rect.xMax - border.z;
- float top = rect.yMax - border.w;
- float bottom = rect.yMin + border.y;
- EditorGUI.BeginChangeCheck();
- float horizontal = bottom - (bottom - top) / 2;
- float vertical = left - (left - right) / 2;
- float center = horizontal;
- HandleBorderPointSlider(ref left, ref center, MouseCursor.ResizeHorizontal, false, dragDot, dragDotActive, color);
- center = horizontal;
- HandleBorderPointSlider(ref right, ref center, MouseCursor.ResizeHorizontal, false, dragDot, dragDotActive, color);
- center = vertical;
- HandleBorderPointSlider(ref center, ref top, MouseCursor.ResizeVertical, false, dragDot, dragDotActive, color);
- center = vertical;
- HandleBorderPointSlider(ref center, ref bottom, MouseCursor.ResizeVertical, false, dragDot, dragDotActive, color);
- if (EditorGUI.EndChangeCheck())
- {
- border.x = left - rect.xMin;
- border.z = rect.xMax - right;
- border.w = rect.yMax - top;
- border.y = bottom - rect.yMin;
- selectedSpriteBorder = border;
- PopulateSpriteFrameInspectorField();
- }
- }
- protected void HandleBorderCornerScalingHandles()
- {
- if (!hasSelected)
- return;
- GUIStyle dragDot = styles.dragBorderdot;
- GUIStyle dragDotActive = styles.dragBorderDotActive;
- var color = new Color(0f, 1f, 0f);
- Rect rect = selectedSpriteRect;
- Vector4 border = selectedSpriteBorder;
- float left = rect.xMin + border.x;
- float right = rect.xMax - border.z;
- float top = rect.yMax - border.w;
- float bottom = rect.yMin + border.y;
- EditorGUI.BeginChangeCheck();
- // Handle corner points, but hide them if border values are below 1
- HandleBorderPointSlider(ref left, ref top, MouseCursor.ResizeUpLeft, border.x < 1 && border.w < 1, dragDot, dragDotActive, color);
- HandleBorderPointSlider(ref right, ref top, MouseCursor.ResizeUpRight, border.z < 1 && border.w < 1, dragDot, dragDotActive, color);
- HandleBorderPointSlider(ref left, ref bottom, MouseCursor.ResizeUpRight, border.x < 1 && border.y < 1, dragDot, dragDotActive, color);
- HandleBorderPointSlider(ref right, ref bottom, MouseCursor.ResizeUpLeft, border.z < 1 && border.y < 1, dragDot, dragDotActive, color);
- if (EditorGUI.EndChangeCheck())
- {
- border.x = left - rect.xMin;
- border.z = rect.xMax - right;
- border.w = rect.yMax - top;
- border.y = bottom - rect.yMin;
- selectedSpriteBorder = border;
- PopulateSpriteFrameInspectorField();
- }
- }
- protected void HandleBorderSideScalingHandles()
- {
- if (hasSelected == false)
- return;
- Rect rect = new Rect(selectedSpriteRect);
- Vector4 border = selectedSpriteBorder;
- float left = rect.xMin + border.x;
- float right = rect.xMax - border.z;
- float top = rect.yMax - border.w;
- float bottom = rect.yMin + border.y;
- Vector2 screenRectTopLeft = Handles.matrix.MultiplyPoint(new Vector3(rect.xMin, rect.yMin));
- Vector2 screenRectBottomRight = Handles.matrix.MultiplyPoint(new Vector3(rect.xMax, rect.yMax));
- float screenRectWidth = Mathf.Abs(screenRectBottomRight.x - screenRectTopLeft.x);
- float screenRectHeight = Mathf.Abs(screenRectBottomRight.y - screenRectTopLeft.y);
- EditorGUI.BeginChangeCheck();
- left = HandleBorderScaleSlider(left, rect.yMax, screenRectWidth, screenRectHeight, true);
- right = HandleBorderScaleSlider(right, rect.yMax, screenRectWidth, screenRectHeight, true);
- top = HandleBorderScaleSlider(rect.xMin, top, screenRectWidth, screenRectHeight, false);
- bottom = HandleBorderScaleSlider(rect.xMin, bottom, screenRectWidth, screenRectHeight, false);
- if (EditorGUI.EndChangeCheck())
- {
- border.x = left - rect.xMin;
- border.z = rect.xMax - right;
- border.w = rect.yMax - top;
- border.y = bottom - rect.yMin;
- selectedSpriteBorder = border;
- PopulateSpriteFrameInspectorField();
- }
- }
- protected void HandleBorderPointSlider(ref float x, ref float y, MouseCursor mouseCursor, bool isHidden, GUIStyle dragDot, GUIStyle dragDotActive, Color color)
- {
- var originalColor = GUI.color;
- if (isHidden)
- GUI.color = new Color(0, 0, 0, 0);
- else
- GUI.color = color;
- Vector2 point = SpriteEditorHandles.PointSlider(new Vector2(x, y), mouseCursor, dragDot, dragDotActive);
- x = point.x;
- y = point.y;
- GUI.color = originalColor;
- }
- protected float HandleBorderScaleSlider(float x, float y, float width, float height, bool isHorizontal)
- {
- float handleSize = styles.dragBorderdot.fixedWidth;
- Vector2 point = Handles.matrix.MultiplyPoint(new Vector2(x, y));
- float result;
- EditorGUI.BeginChangeCheck();
- if (isHorizontal)
- {
- Rect newRect = new Rect(point.x - handleSize * .5f, point.y, handleSize, height);
- result = SpriteEditorHandles.ScaleSlider(point, MouseCursor.ResizeHorizontal, newRect).x;
- }
- else
- {
- Rect newRect = new Rect(point.x, point.y - handleSize * .5f, width, handleSize);
- result = SpriteEditorHandles.ScaleSlider(point, MouseCursor.ResizeVertical, newRect).y;
- }
- if (EditorGUI.EndChangeCheck())
- return result;
- return isHorizontal ? x : y;
- }
- protected void DrawSpriteRectGizmos()
- {
- if (eventSystem.current.type != EventType.Repaint)
- return;
- SpriteEditorUtility.BeginLines(new Color(0f, 1f, 0f, 0.7f));
- var selectedGUID = selected != null ? selected.spriteID : new GUID();
- for (int i = 0; i < spriteCount; i++)
- {
- Vector4 border = GetSpriteBorderAt(i);
- if (m_GizmoMode != GizmoMode.BorderEditing && (m_RectsCache != null && m_RectsCache.spriteRects[i].spriteID != selectedGUID))
- {
- if (Mathf.Approximately(border.sqrMagnitude, 0))
- continue;
- }
- var rect = GetSpriteRectAt(i);
- SpriteEditorUtility.DrawLine(new Vector3(rect.xMin + border.x, rect.yMin), new Vector3(rect.xMin + border.x, rect.yMax));
- SpriteEditorUtility.DrawLine(new Vector3(rect.xMax - border.z, rect.yMin), new Vector3(rect.xMax - border.z, rect.yMax));
- SpriteEditorUtility.DrawLine(new Vector3(rect.xMin, rect.yMin + border.y), new Vector3(rect.xMax, rect.yMin + border.y));
- SpriteEditorUtility.DrawLine(new Vector3(rect.xMin, rect.yMax - border.w), new Vector3(rect.xMax, rect.yMax - border.w));
- }
- SpriteEditorUtility.EndLines();
- if (ShouldShowRectScaling())
- {
- Rect r = selectedSpriteRect;
- SpriteEditorUtility.BeginLines(new Color(0f, 0.1f, 0.3f, 0.25f));
- SpriteEditorUtility.DrawBox(new Rect(r.xMin + 1f / m_Zoom, r.yMin + 1f / m_Zoom, r.width, r.height));
- SpriteEditorUtility.EndLines();
- SpriteEditorUtility.BeginLines(new Color(0.25f, 0.5f, 1f, 0.75f));
- SpriteEditorUtility.DrawBox(r);
- SpriteEditorUtility.EndLines();
- }
- }
- // implements ISpriteEditorModule
- public override void DoMainGUI()
- {
- m_Zoom = Handles.matrix.GetColumn(0).magnitude;
- }
- public override void DoPostGUI()
- {
- }
- }
- }
|