Rasagar/Library/PackageCache/com.unity.2d.sprite/Editor/SpriteEditor/SpriteEditorUtility.cs
2024-08-26 23:07:20 +03:00

193 lines
7.0 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEvent = UnityEngine.Event;
namespace UnityEditor.U2D.Sprites
{
static internal class SpriteEditorUtility
{
public static Vector2 GetPivotValue(SpriteAlignment alignment, Vector2 customOffset)
{
switch (alignment)
{
case SpriteAlignment.BottomLeft:
return new Vector2(0f, 0f);
case SpriteAlignment.BottomCenter:
return new Vector2(0.5f, 0f);
case SpriteAlignment.BottomRight:
return new Vector2(1f, 0f);
case SpriteAlignment.LeftCenter:
return new Vector2(0f, 0.5f);
case SpriteAlignment.Center:
return new Vector2(0.5f, 0.5f);
case SpriteAlignment.RightCenter:
return new Vector2(1f, 0.5f);
case SpriteAlignment.TopLeft:
return new Vector2(0f, 1f);
case SpriteAlignment.TopCenter:
return new Vector2(0.5f, 1f);
case SpriteAlignment.TopRight:
return new Vector2(1f, 1f);
case SpriteAlignment.Custom:
return customOffset;
}
return Vector2.zero;
}
public static Rect RoundedRect(Rect rect)
{
return new Rect(
Mathf.RoundToInt(rect.xMin),
Mathf.RoundToInt(rect.yMin),
Mathf.RoundToInt(rect.width),
Mathf.RoundToInt(rect.height)
);
}
public static Rect RoundToInt(Rect r)
{
r.xMin = Mathf.RoundToInt(r.xMin);
r.yMin = Mathf.RoundToInt(r.yMin);
r.xMax = Mathf.RoundToInt(r.xMax);
r.yMax = Mathf.RoundToInt(r.yMax);
return r;
}
public static Rect ClampedRect(Rect rect, Rect clamp, bool maintainSize)
{
Rect r = new Rect(rect);
if (maintainSize)
{
Vector2 center = rect.center;
if (center.x + Mathf.Abs(rect.width) * .5f > clamp.xMax)
center.x = clamp.xMax - rect.width * .5f;
if (center.x - Mathf.Abs(rect.width) * .5f < clamp.xMin)
center.x = clamp.xMin + rect.width * .5f;
if (center.y + Mathf.Abs(rect.height) * .5f > clamp.yMax)
center.y = clamp.yMax - rect.height * .5f;
if (center.y - Mathf.Abs(rect.height) * .5f < clamp.yMin)
center.y = clamp.yMin + rect.height * .5f;
r.center = center;
}
else
{
if (r.width > 0f)
{
r.xMin = Mathf.Max(rect.xMin, clamp.xMin);
r.xMax = Mathf.Min(rect.xMax, clamp.xMax);
}
else
{
r.xMin = Mathf.Min(rect.xMin, clamp.xMax);
r.xMax = Mathf.Max(rect.xMax, clamp.xMin);
}
if (r.height > 0f)
{
r.yMin = Mathf.Max(rect.yMin, clamp.yMin);
r.yMax = Mathf.Min(rect.yMax, clamp.yMax);
}
else
{
r.yMin = Mathf.Min(rect.yMin, clamp.yMax);
r.yMax = Mathf.Max(rect.yMax, clamp.yMin);
}
}
r.width = Mathf.Abs(r.width);
r.height = Mathf.Abs(r.height);
return r;
}
public static void DrawBox(Rect position)
{
var points0 = new Vector3(position.xMin, position.yMin, 0f);
var points1 = new Vector3(position.xMax, position.yMin, 0f);
var points2 = new Vector3(position.xMax, position.yMax, 0f);
var points3 = new Vector3(position.xMin, position.yMax, 0f);
DrawLine(points0, points1);
DrawLine(points1, points2);
DrawLine(points2, points3);
DrawLine(points3, points0);
}
public static void DrawLine(Vector3 p1, Vector3 p2)
{
GL.Vertex(p1);
GL.Vertex(p2);
}
public static void BeginLines(Color color)
{
Assert.IsTrue(UnityEvent.current.type == EventType.Repaint);
HandleUtility.ApplyWireMaterial();
GL.PushMatrix();
GL.MultMatrix(Handles.matrix);
GL.Begin(GL.LINES);
GL.Color(color);
}
public static void EndLines()
{
Assert.IsTrue(UnityEvent.current.type == EventType.Repaint);
GL.End();
GL.PopMatrix();
}
public static void FourIntFields(Vector2 rectSize, GUIContent label, GUIContent labelX, GUIContent labelY, GUIContent labelZ, GUIContent labelW, ref int x, ref int y, ref int z, ref int w)
{
Rect rect = GUILayoutUtility.GetRect(rectSize.x, rectSize.y);
Rect labelRect = rect;
labelRect.width = EditorGUIUtility.labelWidth;
labelRect.height = EditorGUI.kSingleLineHeight;
GUI.Label(labelRect, label);
Rect fieldRect = rect;
fieldRect.width -= EditorGUIUtility.labelWidth;
fieldRect.height = EditorGUI.kSingleLineHeight;
fieldRect.x += EditorGUIUtility.labelWidth;
fieldRect.width /= 2;
fieldRect.width -= EditorGUI.kSpacingSubLabel;
float oldLabelWidth = EditorGUIUtility.labelWidth;
EditorGUIUtility.labelWidth = EditorGUI.kMiniLabelW;
GUI.SetNextControlName("FourIntFields_x");
x = EditorGUI.IntField(fieldRect, labelX, x);
fieldRect.x += fieldRect.width + EditorGUI.kSpacing;
GUI.SetNextControlName("FourIntFields_y");
y = EditorGUI.IntField(fieldRect, labelY, y);
fieldRect.y += EditorGUI.kSingleLineHeight + EditorGUI.kVerticalSpacingMultiField;
fieldRect.x -= fieldRect.width + EditorGUI.kSpacing;
GUI.SetNextControlName("FourIntFields_z");
z = EditorGUI.IntField(fieldRect, labelZ, z);
fieldRect.x += fieldRect.width + EditorGUI.kSpacing;
GUI.SetNextControlName("FourIntFields_w");
w = EditorGUI.IntField(fieldRect, labelW, w);
EditorGUIUtility.labelWidth = oldLabelWidth;
}
public static void DetermineGridCellSizeWithCellCount(int width, int height, Vector2 offset, Vector2 padding, Vector2 cellCount, out Vector2 cellSize)
{
cellSize.x = (width - offset.x - (padding.x * Math.Max(0, cellCount.x - 1))) / cellCount.x;
cellSize.y = (height - offset.y - (padding.y * Math.Max(0, cellCount.y - 1))) / cellCount.y;
cellSize.x = Mathf.Floor(cellSize.x);
cellSize.y = Mathf.Floor(cellSize.y);
cellSize.x = Mathf.Clamp(cellSize.x, 1, width);
cellSize.y = Mathf.Clamp(cellSize.y, 1, height);
}
}
}