A game about forced loneliness, made by TACStudios
1using UnityEngine;
2using System;
3using System.Collections.Generic;
4using UnityEngine.Experimental.Rendering;
5using UnityEvent = UnityEngine.Event;
6
7namespace UnityEditor.U2D.Sprites
8{
9 [Serializable]
10 internal class SpriteEditorMenuSetting : ScriptableObject
11 {
12 public enum SlicingType
13 {
14 Automatic = 0,
15 GridByCellSize = 1,
16 GridByCellCount = 2,
17 IsometricGrid = 3
18 }
19
20 [SerializeField]
21 public Vector2 gridCellCount = new Vector2(1, 1);
22 [SerializeField]
23 public Vector2 gridSpriteSize = new Vector2(64, 64);
24 [SerializeField]
25 public Vector2 gridSpriteOffset = new Vector2(0, 0);
26 [SerializeField]
27 public Vector2 gridSpritePadding = new Vector2(0, 0);
28 [SerializeField]
29 public Vector2 pivot = Vector2.zero;
30 [SerializeField]
31 public int autoSlicingMethod = (int)SpriteFrameModule.AutoSlicingMethod.DeleteAll;
32 [SerializeField]
33 public int spriteAlignment;
34 [SerializeField]
35 public SlicingType slicingType;
36 [SerializeField]
37 public bool keepEmptyRects;
38 [SerializeField]
39 public bool isAlternate;
40 }
41
42 internal class SpriteEditorMenu : EditorWindow
43 {
44 private static Styles s_Styles;
45 private static long s_LastClosedTime;
46 private static SpriteEditorMenuSetting s_Setting;
47 private ITextureDataProvider m_TextureDataProvider;
48 private SpriteFrameModule m_SpriteFrameModule;
49 private List<Rect> m_PotentialRects;
50
51 private class Styles
52 {
53 public GUIStyle background = "grey_border";
54 public GUIStyle notice;
55
56 public Styles()
57 {
58 notice = new GUIStyle(GUI.skin.label);
59 notice.alignment = TextAnchor.MiddleCenter;
60 notice.wordWrap = true;
61 }
62
63 public readonly GUIContent[] spriteAlignmentOptions =
64 {
65 EditorGUIUtility.TrTextContent("Center"),
66 EditorGUIUtility.TrTextContent("Top Left"),
67 EditorGUIUtility.TrTextContent("Top"),
68 EditorGUIUtility.TrTextContent("Top Right"),
69 EditorGUIUtility.TrTextContent("Left"),
70 EditorGUIUtility.TrTextContent("Right"),
71 EditorGUIUtility.TrTextContent("Bottom Left"),
72 EditorGUIUtility.TrTextContent("Bottom"),
73 EditorGUIUtility.TrTextContent("Bottom Right"),
74 EditorGUIUtility.TrTextContent("Custom")
75 };
76
77 public readonly GUIContent[] slicingMethodOptions =
78 {
79 EditorGUIUtility.TrTextContent("Delete Existing"),
80 EditorGUIUtility.TrTextContent("Smart"),
81 EditorGUIUtility.TrTextContent("Safe")
82 };
83 public readonly string[] slicingMethodInfoText =
84 {
85 L10n.Tr("Delete Existing removes all existing Sprites and recreates them from scratch."),
86 L10n.Tr("Smart attempts to create new Sprites while retaining or adjusting existing ones. This slicing method does not remove any existing Sprites."),
87 L10n.Tr("Safe adds new Sprites without changing anything already in place. This slicing method does not remove any existing Sprites.")
88 };
89
90 public readonly GUIContent methodLabel = EditorGUIUtility.TrTextContent("Method");
91 public readonly GUIContent pivotLabel = EditorGUIUtility.TrTextContent("Pivot");
92 public readonly GUIContent typeLabel = EditorGUIUtility.TrTextContent("Type");
93 public readonly GUIContent sliceButtonLabel = EditorGUIUtility.TrTextContent("Slice");
94 public readonly GUIContent columnAndRowLabel = EditorGUIUtility.TrTextContent("Column & Row");
95 public readonly GUIContent columnLabel = EditorGUIUtility.TextContent("C");
96 public readonly GUIContent rowLabel = EditorGUIUtility.TextContent("R");
97 public readonly GUIContent pixelSizeLabel = EditorGUIUtility.TrTextContent("Pixel Size");
98 public readonly GUIContent xLabel = EditorGUIUtility.TextContent("X");
99 public readonly GUIContent yLabel = EditorGUIUtility.TextContent("Y");
100 public readonly GUIContent offsetLabel = EditorGUIUtility.TrTextContent("Offset");
101 public readonly GUIContent paddingLabel = EditorGUIUtility.TrTextContent("Padding");
102 public readonly GUIContent automaticSlicingHintLabel = EditorGUIUtility.TrTextContent("Texture is in compressed format. For better result please use manual slicing.", "Compressed textures may have artifacts that will affect the automatic slicing result. It is recommended to use manual slicing for better result.");
103 public readonly GUIContent customPivotLabel = EditorGUIUtility.TrTextContent("Custom Pivot");
104 public readonly GUIContent keepEmptyRectsLabel = EditorGUIUtility.TrTextContent("Keep Empty Rects");
105 public readonly GUIContent isAlternateLabel = EditorGUIUtility.TrTextContent("Is Alternate");
106
107 public readonly string deleteExistingTitle = L10n.Tr("Potential loss of Sprite data");
108 public readonly string deleteExistingMessage = L10n.Tr("The Delete Existing slicing method recreates all Sprites with their default names. Renamed Sprites will lose their data in the process, and references to these Sprites will be lost. \n\nDo you wish you continue?");
109 public readonly string yes = L10n.Tr("Yes");
110 public readonly string no = L10n.Tr("No");
111 }
112
113 internal List<Rect> GetPotentialRects()
114 {
115 if (m_PotentialRects == null)
116 m_PotentialRects = new List<Rect>();
117 m_PotentialRects.Clear();
118 switch (s_Setting.slicingType)
119 {
120 case SpriteEditorMenuSetting.SlicingType.Automatic:
121 // Do not show rects for Automatic
122 break;
123 case SpriteEditorMenuSetting.SlicingType.GridByCellCount:
124 DetermineGridCellSizeWithCellCount(out var cellSize);
125 m_PotentialRects.AddRange(m_SpriteFrameModule.GetGridRects(cellSize
126 , s_Setting.gridSpriteOffset
127 , s_Setting.gridSpritePadding
128 , true));
129 break;
130 case SpriteEditorMenuSetting.SlicingType.GridByCellSize:
131 m_PotentialRects.AddRange(m_SpriteFrameModule.GetGridRects(s_Setting.gridSpriteSize
132 , s_Setting.gridSpriteOffset
133 , s_Setting.gridSpritePadding
134 , true));
135 break;
136 case SpriteEditorMenuSetting.SlicingType.IsometricGrid:
137 m_PotentialRects.AddRange(m_SpriteFrameModule.GetIsometricRects(s_Setting.gridSpriteSize
138 , s_Setting.gridSpriteOffset
139 , s_Setting.isAlternate
140 , true));
141 break;
142 }
143
144 return m_PotentialRects;
145 }
146
147 private void Init(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider dataProvider)
148 {
149 // Create for once if setting was not created before.
150 if (s_Setting == null)
151 s_Setting = CreateInstance<SpriteEditorMenuSetting>();
152
153 m_SpriteFrameModule = sf;
154 m_SpriteFrameModule.onModuleDeactivated -= OnModuleDeactivate;
155 m_SpriteFrameModule.onModuleDeactivated += OnModuleDeactivate;
156 m_TextureDataProvider = dataProvider;
157
158 buttonRect = GUIUtility.GUIToScreenRect(buttonRect);
159 const float windowHeight = 235f;
160 var windowSize = new Vector2(300, windowHeight);
161 ShowAsDropDown(buttonRect, windowSize);
162
163 Undo.undoRedoPerformed += UndoRedoPerformed;
164
165 RectSettingsDirty();
166 }
167
168 private void UndoRedoPerformed()
169 {
170 Repaint();
171 }
172
173 void OnEnable()
174 {
175 AssemblyReloadEvents.beforeAssemblyReload += Close;
176 }
177
178 private void OnDisable()
179 {
180 AssemblyReloadEvents.beforeAssemblyReload -= Close;
181 Undo.undoRedoPerformed -= UndoRedoPerformed;
182 s_LastClosedTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
183 m_SpriteFrameModule.potentialRects = null;
184 m_SpriteFrameModule.spriteEditor.RequestRepaint();
185 m_SpriteFrameModule.onModuleDeactivated -= OnModuleDeactivate;
186 }
187
188 void OnModuleDeactivate()
189 {
190 this.Close();
191 }
192
193 private void RectSettingsDirty()
194 {
195 m_SpriteFrameModule.potentialRects = GetPotentialRects();
196 m_SpriteFrameModule.spriteEditor.RequestRepaint();
197 }
198
199 internal static bool ShowAtPosition(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider textureProvider)
200 {
201 // We could not use realtimeSinceStartUp since it is set to 0 when entering/exitting playmode, we assume an increasing time when comparing time.
202 long nowMilliSeconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
203 bool justClosed = nowMilliSeconds < s_LastClosedTime + 50;
204 if (!justClosed)
205 {
206 if (UnityEvent.current != null) // Event.current can be null during integration test
207 UnityEvent.current.Use();
208
209 SpriteEditorMenu spriteEditorMenu = CreateInstance<SpriteEditorMenu>();
210 spriteEditorMenu.Init(buttonRect, sf, textureProvider);
211 return true;
212 }
213 return false;
214 }
215
216 private void OnGUI()
217 {
218 if (s_Styles == null)
219 s_Styles = new Styles();
220
221 // Leave some space above the elements
222 GUILayout.Space(4);
223
224 EditorGUIUtility.labelWidth = 124f;
225 EditorGUIUtility.wideMode = true;
226
227 GUI.Label(new Rect(0, 0, position.width, position.height), GUIContent.none, s_Styles.background);
228
229 EditorGUI.BeginChangeCheck();
230 SpriteEditorMenuSetting.SlicingType slicingType = s_Setting.slicingType;
231 slicingType = (SpriteEditorMenuSetting.SlicingType)EditorGUILayout.EnumPopup(s_Styles.typeLabel, slicingType);
232 if (EditorGUI.EndChangeCheck())
233 {
234 Undo.RegisterCompleteObjectUndo(s_Setting, "Change slicing type");
235 s_Setting.slicingType = slicingType;
236
237 UpdateToDefaultAutoSliceMethod();
238 RectSettingsDirty();
239 }
240 switch (slicingType)
241 {
242 case SpriteEditorMenuSetting.SlicingType.GridByCellSize:
243 case SpriteEditorMenuSetting.SlicingType.GridByCellCount:
244 OnGridGUI();
245 break;
246 case SpriteEditorMenuSetting.SlicingType.Automatic:
247 OnAutomaticGUI();
248 break;
249 case SpriteEditorMenuSetting.SlicingType.IsometricGrid:
250 OnIsometricGridGUI();
251 break;
252 }
253
254 DoPivotGUI();
255 GUILayout.Space(2f);
256 EditorGUI.BeginChangeCheck();
257 var slicingMethod = s_Setting.autoSlicingMethod;
258 slicingMethod = EditorGUILayout.Popup(s_Styles.methodLabel, slicingMethod, s_Styles.slicingMethodOptions);
259 if (EditorGUI.EndChangeCheck())
260 {
261 Undo.RegisterCompleteObjectUndo(s_Setting, "Change Slicing Method");
262 s_Setting.autoSlicingMethod = slicingMethod;
263 }
264
265 EditorGUILayout.HelpBox(s_Styles.slicingMethodInfoText[slicingMethod], MessageType.Info);
266
267 GUILayout.FlexibleSpace();
268 GUILayout.BeginHorizontal();
269 GUILayout.Space(EditorGUIUtility.labelWidth + 4);
270 if (GUILayout.Button(s_Styles.sliceButtonLabel))
271 {
272 if (DoesNotNeedWarning() || EditorUtility.DisplayDialog(s_Styles.deleteExistingTitle, s_Styles.deleteExistingMessage, s_Styles.yes, s_Styles.no))
273 DoSlicing();
274 }
275 GUILayout.EndHorizontal();
276 }
277
278 private bool DoesNotNeedWarning()
279 {
280 var hasNoData = m_SpriteFrameModule.spriteCount == 0;
281 var isNotUsingDeleteAll = s_Setting.autoSlicingMethod != (int)SpriteFrameModule.AutoSlicingMethod.DeleteAll;
282 if (hasNoData || isNotUsingDeleteAll)
283 return true;
284
285 var onlyUsingDefaultName = m_SpriteFrameModule.IsOnlyUsingDefaultNamedSpriteRects();
286 return onlyUsingDefaultName;
287 }
288
289 private static void UpdateToDefaultAutoSliceMethod()
290 {
291 s_Setting.autoSlicingMethod = (int)SpriteFrameModule.AutoSlicingMethod.DeleteAll;
292 }
293
294 private void DoSlicing()
295 {
296 switch (s_Setting.slicingType)
297 {
298 case SpriteEditorMenuSetting.SlicingType.GridByCellCount:
299 case SpriteEditorMenuSetting.SlicingType.GridByCellSize:
300 DoGridSlicing();
301 break;
302 case SpriteEditorMenuSetting.SlicingType.Automatic:
303 DoAutomaticSlicing();
304 break;
305 case SpriteEditorMenuSetting.SlicingType.IsometricGrid:
306 DoIsometricGridSlicing();
307 break;
308 }
309 }
310
311 private void TwoIntFields(GUIContent label, GUIContent labelX, GUIContent labelY, ref int x, ref int y)
312 {
313 float height = EditorGUI.kSingleLineHeight;
314 Rect rect = GUILayoutUtility.GetRect(EditorGUILayout.kLabelFloatMinW, EditorGUILayout.kLabelFloatMaxW, height, height, EditorStyles.numberField);
315
316 Rect labelRect = rect;
317 labelRect.width = EditorGUIUtility.labelWidth;
318 labelRect.height = EditorGUI.kSingleLineHeight;
319
320 GUI.Label(labelRect, label);
321
322 Rect fieldRect = rect;
323 fieldRect.width -= EditorGUIUtility.labelWidth;
324 fieldRect.height = EditorGUI.kSingleLineHeight;
325 fieldRect.x += EditorGUIUtility.labelWidth;
326 fieldRect.width /= 2;
327 fieldRect.width -= 2;
328
329 EditorGUIUtility.labelWidth = 12;
330
331 x = EditorGUI.IntField(fieldRect, labelX, x);
332 fieldRect.x += fieldRect.width + 3;
333 y = EditorGUI.IntField(fieldRect, labelY, y);
334
335 EditorGUIUtility.labelWidth = labelRect.width;
336 }
337
338 private void OnGridGUI()
339 {
340 int width, height;
341 m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
342 var texture = m_TextureDataProvider.GetReadableTexture2D();
343 int maxWidth = texture != null ? width : 4096;
344 int maxHeight = texture != null ? height : 4096;
345
346 if (s_Setting.slicingType == SpriteEditorMenuSetting.SlicingType.GridByCellCount)
347 {
348 int x = (int)s_Setting.gridCellCount.x;
349 int y = (int)s_Setting.gridCellCount.y;
350
351 EditorGUI.BeginChangeCheck();
352 TwoIntFields(s_Styles.columnAndRowLabel, s_Styles.columnLabel, s_Styles.rowLabel, ref x, ref y);
353 if (EditorGUI.EndChangeCheck())
354 {
355 Undo.RegisterCompleteObjectUndo(s_Setting, "Change column & row");
356
357 s_Setting.gridCellCount.x = Mathf.Clamp(x, 1, maxWidth);
358 s_Setting.gridCellCount.y = Mathf.Clamp(y, 1, maxHeight);
359 RectSettingsDirty();
360 }
361 }
362 else
363 {
364 int x = (int)s_Setting.gridSpriteSize.x;
365 int y = (int)s_Setting.gridSpriteSize.y;
366
367 EditorGUI.BeginChangeCheck();
368 TwoIntFields(s_Styles.pixelSizeLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
369 if (EditorGUI.EndChangeCheck())
370 {
371 Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid size");
372
373 s_Setting.gridSpriteSize.x = Mathf.Clamp(x, 1, maxWidth);
374 s_Setting.gridSpriteSize.y = Mathf.Clamp(y, 1, maxHeight);
375 RectSettingsDirty();
376 }
377 }
378
379 {
380 int x = (int)s_Setting.gridSpriteOffset.x;
381 int y = (int)s_Setting.gridSpriteOffset.y;
382
383 EditorGUI.BeginChangeCheck();
384 TwoIntFields(s_Styles.offsetLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
385 if (EditorGUI.EndChangeCheck())
386 {
387 Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid offset");
388
389 s_Setting.gridSpriteOffset.x = Mathf.Clamp(x, 0, maxWidth - s_Setting.gridSpriteSize.x);
390 s_Setting.gridSpriteOffset.y = Mathf.Clamp(y, 0, maxHeight - s_Setting.gridSpriteSize.y);
391 RectSettingsDirty();
392 }
393 }
394
395 {
396 int x = (int)s_Setting.gridSpritePadding.x;
397 int y = (int)s_Setting.gridSpritePadding.y;
398
399 EditorGUI.BeginChangeCheck();
400 TwoIntFields(s_Styles.paddingLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
401 if (EditorGUI.EndChangeCheck())
402 {
403 Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid padding");
404
405 s_Setting.gridSpritePadding.x = Mathf.Clamp(x, 0, maxWidth);
406 s_Setting.gridSpritePadding.y = Mathf.Clamp(y, 0, maxHeight);
407 RectSettingsDirty();
408 }
409 }
410
411 EditorGUI.BeginChangeCheck();
412 bool keepEmptyRects = s_Setting.keepEmptyRects;
413 keepEmptyRects = EditorGUILayout.Toggle(s_Styles.keepEmptyRectsLabel, keepEmptyRects);
414 if (EditorGUI.EndChangeCheck())
415 {
416 Undo.RegisterCompleteObjectUndo(s_Setting, "Keep Empty Rects");
417 s_Setting.keepEmptyRects = keepEmptyRects;
418 }
419 }
420
421 private void OnAutomaticGUI()
422 {
423 float spacing = 38f;
424 var texture = m_TextureDataProvider.texture;
425 if (texture != null && GraphicsFormatUtility.IsCompressedFormat(texture.format))
426 {
427 EditorGUILayout.LabelField(s_Styles.automaticSlicingHintLabel, s_Styles.notice);
428 spacing -= 31f;
429 }
430 }
431
432 private void OnIsometricGridGUI()
433 {
434 int width, height;
435 m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
436 var texture = m_TextureDataProvider.GetReadableTexture2D();
437 int maxWidth = texture != null ? width : 4096;
438 int maxHeight = texture != null ? height : 4096;
439
440 {
441 int x = (int)s_Setting.gridSpriteSize.x;
442 int y = (int)s_Setting.gridSpriteSize.y;
443
444 EditorGUI.BeginChangeCheck();
445 TwoIntFields(s_Styles.pixelSizeLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
446 if (EditorGUI.EndChangeCheck())
447 {
448 Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid size");
449
450 s_Setting.gridSpriteSize.x = Mathf.Clamp(x, 1, maxWidth);
451 s_Setting.gridSpriteSize.y = Mathf.Clamp(y, 1, maxHeight);
452 RectSettingsDirty();
453 }
454 }
455
456 {
457 int x = (int)s_Setting.gridSpriteOffset.x;
458 int y = (int)s_Setting.gridSpriteOffset.y;
459
460 EditorGUI.BeginChangeCheck();
461 TwoIntFields(s_Styles.offsetLabel, s_Styles.xLabel, s_Styles.yLabel, ref x, ref y);
462 if (EditorGUI.EndChangeCheck())
463 {
464 Undo.RegisterCompleteObjectUndo(s_Setting, "Change grid offset");
465
466 s_Setting.gridSpriteOffset.x = Mathf.Clamp(x, 0, maxWidth - s_Setting.gridSpriteSize.x);
467 s_Setting.gridSpriteOffset.y = Mathf.Clamp(y, 0, maxHeight - s_Setting.gridSpriteSize.y);
468 RectSettingsDirty();
469 }
470 }
471
472 EditorGUI.BeginChangeCheck();
473 bool keepEmptyRects = s_Setting.keepEmptyRects;
474 keepEmptyRects = EditorGUILayout.Toggle(s_Styles.keepEmptyRectsLabel, keepEmptyRects);
475 if (EditorGUI.EndChangeCheck())
476 {
477 Undo.RegisterCompleteObjectUndo(s_Setting, "Keep Empty Rects");
478 s_Setting.keepEmptyRects = keepEmptyRects;
479 }
480 EditorGUI.BeginChangeCheck();
481 bool isAlternate = s_Setting.isAlternate;
482 isAlternate = EditorGUILayout.Toggle(s_Styles.isAlternateLabel, isAlternate);
483 if (EditorGUI.EndChangeCheck())
484 {
485 Undo.RegisterCompleteObjectUndo(s_Setting, "Is Alternate");
486 s_Setting.isAlternate = isAlternate;
487 RectSettingsDirty();
488 }
489 }
490
491 private void DoPivotGUI()
492 {
493 EditorGUI.BeginChangeCheck();
494 int alignment = s_Setting.spriteAlignment;
495 alignment = EditorGUILayout.Popup(s_Styles.pivotLabel, alignment, s_Styles.spriteAlignmentOptions);
496 if (EditorGUI.EndChangeCheck())
497 {
498 Undo.RegisterCompleteObjectUndo(s_Setting, "Change Alignment");
499 s_Setting.spriteAlignment = alignment;
500 s_Setting.pivot = SpriteEditorUtility.GetPivotValue((SpriteAlignment)alignment, s_Setting.pivot);
501 }
502
503 Vector2 pivot = s_Setting.pivot;
504 EditorGUI.BeginChangeCheck();
505 using (new EditorGUI.DisabledScope(alignment != (int)SpriteAlignment.Custom))
506 {
507 pivot = EditorGUILayout.Vector2Field(s_Styles.customPivotLabel, pivot);
508 }
509 if (EditorGUI.EndChangeCheck())
510 {
511 Undo.RegisterCompleteObjectUndo(s_Setting, "Change custom pivot");
512
513 s_Setting.pivot = pivot;
514 }
515 }
516
517 private void DoAutomaticSlicing()
518 {
519 // 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
520 m_SpriteFrameModule.DoAutomaticSlicing(4, s_Setting.spriteAlignment, s_Setting.pivot, (SpriteFrameModule.AutoSlicingMethod)s_Setting.autoSlicingMethod);
521 }
522
523 private void DoGridSlicing()
524 {
525 if (s_Setting.slicingType == SpriteEditorMenuSetting.SlicingType.GridByCellCount)
526 SetGridCellSizeWithCellCount();
527
528 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);
529 }
530
531 private void DoIsometricGridSlicing()
532 {
533 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);
534 }
535
536 private void SetGridCellSizeWithCellCount()
537 {
538 DetermineGridCellSizeWithCellCount(out var cellSize);
539 s_Setting.gridSpriteSize = cellSize;
540 }
541
542 private void DetermineGridCellSizeWithCellCount(out Vector2 cellSize)
543 {
544 m_TextureDataProvider.GetTextureActualWidthAndHeight(out var width, out var height);
545 var texture = m_TextureDataProvider.GetReadableTexture2D();
546 int maxWidth = texture != null ? width : 4096;
547 int maxHeight = texture != null ? height : 4096;
548
549 SpriteEditorUtility.DetermineGridCellSizeWithCellCount(maxWidth, maxHeight, s_Setting.gridSpriteOffset, s_Setting.gridSpritePadding, s_Setting.gridCellCount, out cellSize);
550 }
551 }
552}