515 lines
22 KiB
C#
515 lines
22 KiB
C#
using UnityEngine;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEvent = UnityEngine.Event;
|
|
|
|
namespace UnityEditor.U2D.Sprites
|
|
{
|
|
[Serializable]
|
|
internal class SpriteEditorMenuSetting : ScriptableObject
|
|
{
|
|
public enum SlicingType
|
|
{
|
|
Automatic = 0,
|
|
GridByCellSize = 1,
|
|
GridByCellCount = 2,
|
|
IsometricGrid = 3
|
|
}
|
|
|
|
[SerializeField]
|
|
public Vector2 gridCellCount = new Vector2(1, 1);
|
|
[SerializeField]
|
|
public Vector2 gridSpriteSize = new Vector2(64, 64);
|
|
[SerializeField]
|
|
public Vector2 gridSpriteOffset = new Vector2(0, 0);
|
|
[SerializeField]
|
|
public Vector2 gridSpritePadding = new Vector2(0, 0);
|
|
[SerializeField]
|
|
public Vector2 pivot = Vector2.zero;
|
|
[SerializeField]
|
|
public int autoSlicingMethod = (int)SpriteFrameModule.AutoSlicingMethod.DeleteAll;
|
|
[SerializeField]
|
|
public int spriteAlignment;
|
|
[SerializeField]
|
|
public SlicingType slicingType;
|
|
[SerializeField]
|
|
public bool keepEmptyRects;
|
|
[SerializeField]
|
|
public bool isAlternate;
|
|
}
|
|
|
|
internal class SpriteEditorMenu : EditorWindow
|
|
{
|
|
private static Styles s_Styles;
|
|
private static long s_LastClosedTime;
|
|
private static SpriteEditorMenuSetting s_Setting;
|
|
private ITextureDataProvider m_TextureDataProvider;
|
|
private SpriteFrameModule m_SpriteFrameModule;
|
|
private List<Rect> m_PotentialRects;
|
|
|
|
private class Styles
|
|
{
|
|
public GUIStyle background = "grey_border";
|
|
public GUIStyle notice;
|
|
|
|
public Styles()
|
|
{
|
|
notice = new GUIStyle(GUI.skin.label);
|
|
notice.alignment = TextAnchor.MiddleCenter;
|
|
notice.wordWrap = true;
|
|
}
|
|
|
|
public readonly GUIContent[] spriteAlignmentOptions =
|
|
{
|
|
EditorGUIUtility.TrTextContent("Center"),
|
|
EditorGUIUtility.TrTextContent("Top Left"),
|
|
EditorGUIUtility.TrTextContent("Top"),
|
|
EditorGUIUtility.TrTextContent("Top Right"),
|
|
EditorGUIUtility.TrTextContent("Left"),
|
|
EditorGUIUtility.TrTextContent("Right"),
|
|
EditorGUIUtility.TrTextContent("Bottom Left"),
|
|
EditorGUIUtility.TrTextContent("Bottom"),
|
|
EditorGUIUtility.TrTextContent("Bottom Right"),
|
|
EditorGUIUtility.TrTextContent("Custom")
|
|
};
|
|
|
|
public readonly GUIContent[] slicingMethodOptions =
|
|
{
|
|
EditorGUIUtility.TrTextContent("Delete Existing", "Delete all existing sprite assets before the slicing operation"),
|
|
EditorGUIUtility.TrTextContent("Smart", "Try to match existing sprite rects to sliced rects from the slicing operation"),
|
|
EditorGUIUtility.TrTextContent("Safe", "Keep existing sprite rects intact")
|
|
};
|
|
|
|
public readonly GUIContent methodLabel = EditorGUIUtility.TrTextContent("Method");
|
|
public readonly GUIContent pivotLabel = EditorGUIUtility.TrTextContent("Pivot");
|
|
public readonly GUIContent typeLabel = EditorGUIUtility.TrTextContent("Type");
|
|
public readonly GUIContent sliceButtonLabel = EditorGUIUtility.TrTextContent("Slice");
|
|
public readonly GUIContent columnAndRowLabel = EditorGUIUtility.TrTextContent("Column & Row");
|
|
public readonly GUIContent columnLabel = EditorGUIUtility.TextContent("C");
|
|
public readonly GUIContent rowLabel = EditorGUIUtility.TextContent("R");
|
|
public readonly GUIContent pixelSizeLabel = EditorGUIUtility.TrTextContent("Pixel Size");
|
|
public readonly GUIContent xLabel = EditorGUIUtility.TextContent("X");
|
|
public readonly GUIContent yLabel = EditorGUIUtility.TextContent("Y");
|
|
public readonly GUIContent offsetLabel = EditorGUIUtility.TrTextContent("Offset");
|
|
public readonly GUIContent paddingLabel = EditorGUIUtility.TrTextContent("Padding");
|
|
public readonly GUIContent automaticSlicingHintLabel = EditorGUIUtility.TrTextContent("To obtain more accurate slicing results, manual slicing is recommended!");
|
|
public readonly GUIContent customPivotLabel = EditorGUIUtility.TrTextContent("Custom Pivot");
|
|
public readonly GUIContent keepEmptyRectsLabel = EditorGUIUtility.TrTextContent("Keep Empty Rects");
|
|
public readonly GUIContent isAlternateLabel = EditorGUIUtility.TrTextContent("Is Alternate");
|
|
}
|
|
|
|
internal List<Rect> GetPotentialRects()
|
|
{
|
|
if (m_PotentialRects == null)
|
|
m_PotentialRects = new List<Rect>();
|
|
m_PotentialRects.Clear();
|
|
switch (s_Setting.slicingType)
|
|
{
|
|
case SpriteEditorMenuSetting.SlicingType.Automatic:
|
|
// Do not show rects for Automatic
|
|
break;
|
|
case SpriteEditorMenuSetting.SlicingType.GridByCellCount:
|
|
DetermineGridCellSizeWithCellCount(out var cellSize);
|
|
m_PotentialRects.AddRange(m_SpriteFrameModule.GetGridRects(cellSize
|
|
, s_Setting.gridSpriteOffset
|
|
, s_Setting.gridSpritePadding
|
|
, true));
|
|
break;
|
|
case SpriteEditorMenuSetting.SlicingType.GridByCellSize:
|
|
m_PotentialRects.AddRange(m_SpriteFrameModule.GetGridRects(s_Setting.gridSpriteSize
|
|
, s_Setting.gridSpriteOffset
|
|
, s_Setting.gridSpritePadding
|
|
, true));
|
|
break;
|
|
case SpriteEditorMenuSetting.SlicingType.IsometricGrid:
|
|
m_PotentialRects.AddRange(m_SpriteFrameModule.GetIsometricRects(s_Setting.gridSpriteSize
|
|
, s_Setting.gridSpriteOffset
|
|
, s_Setting.isAlternate
|
|
, true));
|
|
break;
|
|
}
|
|
|
|
return m_PotentialRects;
|
|
}
|
|
|
|
private void Init(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider dataProvider)
|
|
{
|
|
// Create for once if setting was not created before.
|
|
if (s_Setting == null)
|
|
s_Setting = CreateInstance<SpriteEditorMenuSetting>();
|
|
|
|
m_SpriteFrameModule = sf;
|
|
m_TextureDataProvider = dataProvider;
|
|
|
|
buttonRect = GUIUtility.GUIToScreenRect(buttonRect);
|
|
float windowHeight = 195;
|
|
var windowSize = new Vector2(300, windowHeight);
|
|
ShowAsDropDown(buttonRect, windowSize);
|
|
|
|
Undo.undoRedoPerformed += UndoRedoPerformed;
|
|
|
|
RectSettingsDirty();
|
|
}
|
|
|
|
private void UndoRedoPerformed()
|
|
{
|
|
Repaint();
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
AssemblyReloadEvents.beforeAssemblyReload += Close;
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
AssemblyReloadEvents.beforeAssemblyReload -= Close;
|
|
Undo.undoRedoPerformed -= UndoRedoPerformed;
|
|
s_LastClosedTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
|
m_SpriteFrameModule.potentialRects = null;
|
|
m_SpriteFrameModule.spriteEditor.RequestRepaint();
|
|
}
|
|
|
|
private void RectSettingsDirty()
|
|
{
|
|
m_SpriteFrameModule.potentialRects = GetPotentialRects();
|
|
m_SpriteFrameModule.spriteEditor.RequestRepaint();
|
|
}
|
|
|
|
internal static bool ShowAtPosition(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider textureProvider)
|
|
{
|
|
// We could not use realtimeSinceStartUp since it is set to 0 when entering/exitting playmode, we assume an increasing time when comparing time.
|
|
long nowMilliSeconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
|
|
bool justClosed = nowMilliSeconds < s_LastClosedTime + 50;
|
|
if (!justClosed)
|
|
{
|
|
if (UnityEvent.current != null) // Event.current can be null during integration test
|
|
UnityEvent.current.Use();
|
|
|
|
SpriteEditorMenu spriteEditorMenu = CreateInstance<SpriteEditorMenu>();
|
|
spriteEditorMenu.Init(buttonRect, sf, textureProvider);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void OnGUI()
|
|
{
|
|
if (s_Styles == null)
|
|
s_Styles = new Styles();
|
|
|
|
// Leave some space above the elements
|
|
GUILayout.Space(4);
|
|
|
|
EditorGUIUtility.labelWidth = 124f;
|
|
EditorGUIUtility.wideMode = true;
|
|
|
|
GUI.Label(new Rect(0, 0, position.width, position.height), GUIContent.none, s_Styles.background);
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
SpriteEditorMenuSetting.SlicingType slicingType = s_Setting.slicingType;
|
|
slicingType = (SpriteEditorMenuSetting.SlicingType)EditorGUILayout.EnumPopup(s_Styles.typeLabel, slicingType);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change slicing type");
|
|
s_Setting.slicingType = slicingType;
|
|
RectSettingsDirty();
|
|
}
|
|
switch (slicingType)
|
|
{
|
|
case SpriteEditorMenuSetting.SlicingType.GridByCellSize:
|
|
case SpriteEditorMenuSetting.SlicingType.GridByCellCount:
|
|
OnGridGUI();
|
|
break;
|
|
case SpriteEditorMenuSetting.SlicingType.Automatic:
|
|
OnAutomaticGUI();
|
|
break;
|
|
case SpriteEditorMenuSetting.SlicingType.IsometricGrid:
|
|
OnIsometricGridGUI();
|
|
break;
|
|
}
|
|
|
|
DoPivotGUI();
|
|
GUILayout.Space(2f);
|
|
EditorGUI.BeginChangeCheck();
|
|
int slicingMethod = s_Setting.autoSlicingMethod;
|
|
slicingMethod = EditorGUILayout.Popup(s_Styles.methodLabel, slicingMethod, s_Styles.slicingMethodOptions);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change Slicing Method");
|
|
s_Setting.autoSlicingMethod = slicingMethod;
|
|
}
|
|
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.Space(EditorGUIUtility.labelWidth + 4);
|
|
if (GUILayout.Button(s_Styles.sliceButtonLabel))
|
|
DoSlicing();
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
private void DoSlicing()
|
|
{
|
|
switch (s_Setting.slicingType)
|
|
{
|
|
case SpriteEditorMenuSetting.SlicingType.GridByCellCount:
|
|
case SpriteEditorMenuSetting.SlicingType.GridByCellSize:
|
|
DoGridSlicing();
|
|
break;
|
|
case SpriteEditorMenuSetting.SlicingType.Automatic:
|
|
DoAutomaticSlicing();
|
|
break;
|
|
case SpriteEditorMenuSetting.SlicingType.IsometricGrid:
|
|
DoIsometricGridSlicing();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void TwoIntFields(GUIContent label, GUIContent labelX, GUIContent labelY, ref int x, ref int y)
|
|
{
|
|
float height = EditorGUI.kSingleLineHeight;
|
|
Rect rect = GUILayoutUtility.GetRect(EditorGUILayout.kLabelFloatMinW, EditorGUILayout.kLabelFloatMaxW, height, height, EditorStyles.numberField);
|
|
|
|
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 -= 2;
|
|
|
|
EditorGUIUtility.labelWidth = 12;
|
|
|
|
x = EditorGUI.IntField(fieldRect, labelX, x);
|
|
fieldRect.x += fieldRect.width + 3;
|
|
y = EditorGUI.IntField(fieldRect, labelY, y);
|
|
|
|
EditorGUIUtility.labelWidth = labelRect.width;
|
|
}
|
|
|
|
private void OnGridGUI()
|
|
{
|
|
int width, height;
|
|
m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
|
|
var texture = m_TextureDataProvider.GetReadableTexture2D();
|
|
int maxWidth = texture != null ? width : 4096;
|
|
int maxHeight = texture != null ? height : 4096;
|
|
|
|
if (s_Setting.slicingType == SpriteEditorMenuSetting.SlicingType.GridByCellCount)
|
|
{
|
|
int x = (int)s_Setting.gridCellCount.x;
|
|
int y = (int)s_Setting.gridCellCount.y;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
TwoIntFields(s_Styles.columnAndRowLabel, s_Styles.columnLabel, s_Styles.rowLabel, ref x, ref y);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change column & row");
|
|
|
|
s_Setting.gridCellCount.x = Mathf.Clamp(x, 1, maxWidth);
|
|
s_Setting.gridCellCount.y = Mathf.Clamp(y, 1, maxHeight);
|
|
RectSettingsDirty();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int x = (int)s_Setting.gridSpriteSize.x;
|
|
int y = (int)s_Setting.gridSpriteSize.y;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
TwoIntFields(s_Styles.pixelSizeLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid size");
|
|
|
|
s_Setting.gridSpriteSize.x = Mathf.Clamp(x, 1, maxWidth);
|
|
s_Setting.gridSpriteSize.y = Mathf.Clamp(y, 1, maxHeight);
|
|
RectSettingsDirty();
|
|
}
|
|
}
|
|
|
|
{
|
|
int x = (int)s_Setting.gridSpriteOffset.x;
|
|
int y = (int)s_Setting.gridSpriteOffset.y;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
TwoIntFields(s_Styles.offsetLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid offset");
|
|
|
|
s_Setting.gridSpriteOffset.x = Mathf.Clamp(x, 0, maxWidth - s_Setting.gridSpriteSize.x);
|
|
s_Setting.gridSpriteOffset.y = Mathf.Clamp(y, 0, maxHeight - s_Setting.gridSpriteSize.y);
|
|
RectSettingsDirty();
|
|
}
|
|
}
|
|
|
|
{
|
|
int x = (int)s_Setting.gridSpritePadding.x;
|
|
int y = (int)s_Setting.gridSpritePadding.y;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
TwoIntFields(s_Styles.paddingLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid padding");
|
|
|
|
s_Setting.gridSpritePadding.x = Mathf.Clamp(x, 0, maxWidth);
|
|
s_Setting.gridSpritePadding.y = Mathf.Clamp(y, 0, maxHeight);
|
|
RectSettingsDirty();
|
|
}
|
|
}
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
bool keepEmptyRects = s_Setting.keepEmptyRects;
|
|
keepEmptyRects = EditorGUILayout.Toggle(s_Styles.keepEmptyRectsLabel, keepEmptyRects);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Keep Empty Rects");
|
|
s_Setting.keepEmptyRects = keepEmptyRects;
|
|
}
|
|
}
|
|
|
|
private void OnAutomaticGUI()
|
|
{
|
|
float spacing = 38f;
|
|
var texture = m_TextureDataProvider.GetReadableTexture2D();
|
|
if (texture != null && UnityEditor.TextureUtil.IsCompressedTextureFormat(texture.format))
|
|
{
|
|
EditorGUILayout.LabelField(s_Styles.automaticSlicingHintLabel, s_Styles.notice);
|
|
spacing -= 31f;
|
|
}
|
|
}
|
|
|
|
private void OnIsometricGridGUI()
|
|
{
|
|
int width, height;
|
|
m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
|
|
var texture = m_TextureDataProvider.GetReadableTexture2D();
|
|
int maxWidth = texture != null ? width : 4096;
|
|
int maxHeight = texture != null ? height : 4096;
|
|
|
|
{
|
|
int x = (int)s_Setting.gridSpriteSize.x;
|
|
int y = (int)s_Setting.gridSpriteSize.y;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
TwoIntFields(s_Styles.pixelSizeLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid size");
|
|
|
|
s_Setting.gridSpriteSize.x = Mathf.Clamp(x, 1, maxWidth);
|
|
s_Setting.gridSpriteSize.y = Mathf.Clamp(y, 1, maxHeight);
|
|
RectSettingsDirty();
|
|
}
|
|
}
|
|
|
|
{
|
|
int x = (int)s_Setting.gridSpriteOffset.x;
|
|
int y = (int)s_Setting.gridSpriteOffset.y;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
TwoIntFields(s_Styles.offsetLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid offset");
|
|
|
|
s_Setting.gridSpriteOffset.x = Mathf.Clamp(x, 0, maxWidth - s_Setting.gridSpriteSize.x);
|
|
s_Setting.gridSpriteOffset.y = Mathf.Clamp(y, 0, maxHeight - s_Setting.gridSpriteSize.y);
|
|
RectSettingsDirty();
|
|
}
|
|
}
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
bool keepEmptyRects = s_Setting.keepEmptyRects;
|
|
keepEmptyRects = EditorGUILayout.Toggle(s_Styles.keepEmptyRectsLabel, keepEmptyRects);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Keep Empty Rects");
|
|
s_Setting.keepEmptyRects = keepEmptyRects;
|
|
}
|
|
EditorGUI.BeginChangeCheck();
|
|
bool isAlternate = s_Setting.isAlternate;
|
|
isAlternate = EditorGUILayout.Toggle(s_Styles.isAlternateLabel, isAlternate);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Is Alternate");
|
|
s_Setting.isAlternate = isAlternate;
|
|
RectSettingsDirty();
|
|
}
|
|
}
|
|
|
|
private void DoPivotGUI()
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
int alignment = s_Setting.spriteAlignment;
|
|
alignment = EditorGUILayout.Popup(s_Styles.pivotLabel, alignment, s_Styles.spriteAlignmentOptions);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change Alignment");
|
|
s_Setting.spriteAlignment = alignment;
|
|
s_Setting.pivot = SpriteEditorUtility.GetPivotValue((SpriteAlignment)alignment, s_Setting.pivot);
|
|
}
|
|
|
|
Vector2 pivot = s_Setting.pivot;
|
|
EditorGUI.BeginChangeCheck();
|
|
using (new EditorGUI.DisabledScope(alignment != (int)SpriteAlignment.Custom))
|
|
{
|
|
pivot = EditorGUILayout.Vector2Field(s_Styles.customPivotLabel, pivot);
|
|
}
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Undo.RegisterCompleteObjectUndo(s_Setting, "Change custom pivot");
|
|
|
|
s_Setting.pivot = pivot;
|
|
}
|
|
}
|
|
|
|
private void DoAutomaticSlicing()
|
|
{
|
|
// 4 seems to be a pretty nice min size for a automatic sprite slicing. It used to be exposed to the slicing dialog, but it is actually better workflow to slice&crop manually than find a suitable size number
|
|
m_SpriteFrameModule.DoAutomaticSlicing(4, s_Setting.spriteAlignment, s_Setting.pivot, (SpriteFrameModule.AutoSlicingMethod)s_Setting.autoSlicingMethod);
|
|
}
|
|
|
|
private void DoGridSlicing()
|
|
{
|
|
if (s_Setting.slicingType == SpriteEditorMenuSetting.SlicingType.GridByCellCount)
|
|
SetGridCellSizeWithCellCount();
|
|
|
|
m_SpriteFrameModule.DoGridSlicing(s_Setting.gridSpriteSize, s_Setting.gridSpriteOffset, s_Setting.gridSpritePadding, s_Setting.spriteAlignment, s_Setting.pivot, (SpriteFrameModule.AutoSlicingMethod)s_Setting.autoSlicingMethod, s_Setting.keepEmptyRects);
|
|
}
|
|
|
|
private void DoIsometricGridSlicing()
|
|
{
|
|
m_SpriteFrameModule.DoIsometricGridSlicing(s_Setting.gridSpriteSize, s_Setting.gridSpriteOffset, s_Setting.spriteAlignment, s_Setting.pivot, (SpriteFrameModule.AutoSlicingMethod)s_Setting.autoSlicingMethod, s_Setting.keepEmptyRects, s_Setting.isAlternate);
|
|
}
|
|
|
|
private void SetGridCellSizeWithCellCount()
|
|
{
|
|
DetermineGridCellSizeWithCellCount(out var cellSize);
|
|
s_Setting.gridSpriteSize = cellSize;
|
|
}
|
|
|
|
private void DetermineGridCellSizeWithCellCount(out Vector2 cellSize)
|
|
{
|
|
int width, height;
|
|
m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
|
|
var texture = m_TextureDataProvider.GetReadableTexture2D();
|
|
int maxWidth = texture != null ? width : 4096;
|
|
int maxHeight = texture != null ? height : 4096;
|
|
|
|
cellSize.x = (maxWidth - s_Setting.gridSpriteOffset.x - (s_Setting.gridSpritePadding.x * s_Setting.gridCellCount.x)) / s_Setting.gridCellCount.x;
|
|
cellSize.y = (maxHeight - s_Setting.gridSpriteOffset.y - (s_Setting.gridSpritePadding.y * s_Setting.gridCellCount.y)) / s_Setting.gridCellCount.y;
|
|
|
|
cellSize.x = Mathf.Clamp(cellSize.x, 1, maxWidth);
|
|
cellSize.y = Mathf.Clamp(cellSize.y, 1, maxHeight);
|
|
}
|
|
}
|
|
}
|