A game about forced loneliness, made by TACStudios
1using UnityEngine;
2using System.Collections.Generic;
3
4namespace UnityEditor.U2D.Sprites
5{
6 [RequireSpriteDataProvider(typeof(ISpriteOutlineDataProvider), typeof(ITextureDataProvider))]
7 internal partial class SpritePolygonModeModule : SpriteFrameModuleBase
8 {
9 List<List<Vector2[]>> m_Outline;
10
11 public SpritePolygonModeModule(ISpriteEditor sw, IEventSystem es, IUndoSystem us, IAssetDatabase ad) :
12 base("Sprite Polygon Mode Editor", sw, es, us, ad)
13 {}
14
15 // ISpriteEditorModule implemenation
16 public override void OnModuleActivate()
17 {
18 base.OnModuleActivate();
19 AddMainUI(spriteEditor.GetMainVisualContainer());
20 m_Outline = new List<List<Vector2[]>>();
21
22 for (int i = 0; i < m_RectsCache.spriteRects.Count; ++i)
23 {
24 var rect = m_RectsCache.spriteRects[i];
25 m_Outline.Add(spriteEditor.GetDataProvider<ISpriteOutlineDataProvider>().GetOutlines(rect.spriteID));
26 }
27
28 showChangeShapeWindow = polygonSprite;
29 if (polygonSprite)
30 DeterminePolygonSides();
31 }
32
33 public override bool CanBeActivated()
34 {
35 return SpriteFrameModule.GetSpriteImportMode(spriteEditor.GetDataProvider<ISpriteEditorDataProvider>()) == SpriteImportMode.Polygon;
36 }
37
38 private bool polygonSprite
39 {
40 get { return spriteImportMode == SpriteImportMode.Polygon; }
41 }
42
43 private void DeterminePolygonSides()
44 {
45 if (polygonSprite && m_RectsCache.spriteRects.Count == 1 && m_Outline.Count == 1 && m_Outline[0].Count == 1)
46 {
47 polygonSides = m_Outline[0][0].Length;
48 }
49 else
50 // If for reasons we cannot determine the sides of the polygon, fall back to 0 (Square)
51 polygonSides = 0;
52 ViewUpdateSideCountField();
53 }
54
55 public int GetPolygonSideCount()
56 {
57 DeterminePolygonSides();
58 return polygonSides;
59 }
60
61 public int polygonSides
62 {
63 get;
64 set;
65 }
66
67 public List<Vector2[]> GetSpriteOutlineAt(int i)
68 {
69 return m_Outline[i];
70 }
71
72 public void GeneratePolygonOutline()
73 {
74 for (int i = 0; i < m_RectsCache.spriteRects.Count; i++)
75 {
76 SpriteRect currentRect = m_RectsCache.spriteRects[i];
77
78 var result = UnityEditor.Sprites.SpriteUtility.GeneratePolygonOutlineVerticesOfSize(polygonSides, (int)currentRect.rect.width, (int)currentRect.rect.height);
79
80 m_Outline.Clear();
81 var newOutlineList = new List<Vector2[]>();
82 newOutlineList.Add(result);
83 m_Outline.Add(newOutlineList);
84
85 spriteEditor.SetDataModified();
86 }
87 Repaint();
88 }
89
90 public override bool ApplyRevert(bool apply)
91 {
92 var outlineProvider = spriteEditor.GetDataProvider<ISpriteOutlineDataProvider>();
93 if (apply)
94 {
95 for (int i = 0; i < m_RectsCache.spriteRects.Count && i < m_Outline.Count; ++i)
96 outlineProvider.SetOutlines(m_RectsCache.spriteRects[i].spriteID, m_Outline[i]);
97 }
98 else
99 {
100 m_Outline.Clear();
101 for (int i = 0; i < m_RectsCache.spriteRects.Count; ++i)
102 m_Outline.Add(outlineProvider.GetOutlines(m_RectsCache.spriteRects[i].spriteID));
103 DeterminePolygonSides();
104 ViewUpdateSideCountField();
105 }
106 return base.ApplyRevert(apply);
107 }
108 }
109}