A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using UnityEngine;
4using UnityObject = UnityEngine.Object;
5
6namespace UnityEditor.U2D.Sprites
7{
8 internal partial class SpriteFrameModule : SpriteFrameModuleBase, ISpriteEditorDataProvider, ITextureDataProvider
9 {
10 void CleanUpDataDataProviderOverride()
11 {
12 m_OriginalSpriteDataProvider = null;
13 m_OriginalTextureDataProvider = null;
14 m_SourceOverrideCallback = null;
15 m_MainTexture = null;
16 m_PreviewTexture = null;
17 m_ReadableTexture = null;
18 }
19
20 #region ISpriteEditor implementation override for SpriteEditorMode support
21 public override void SetPreviewTexture(Texture2D texture, int width, int height)
22 {
23 var targetObject = spriteEditor?.GetDataProvider<ISpriteEditorDataProvider>()?.targetObject;
24 if(targetObject != null && targetObject == m_OriginalSpriteDataProvider?.targetObject)
25 base.SetPreviewTexture(texture, width, height);
26 }
27 #endregion
28
29 #region ISpriteEditorDataProvider implementation
30 ISpriteEditorDataProvider m_OriginalSpriteDataProvider;
31
32 ISpriteEditorDataProvider originalSpriteEditorDataProvider
33 {
34 get
35 {
36 if (m_OriginalSpriteDataProvider == null)
37 {
38 m_OriginalSpriteDataProvider = spriteEditor.GetDataProvider<ISpriteEditorDataProvider>();
39 m_OriginalSpriteDataProvider.InitSpriteEditorDataProvider();
40 }
41 return m_OriginalSpriteDataProvider;
42 }
43 }
44 event Action<ISpriteEditorDataProvider> m_OnSpriteEditorDataChangeCallback = _ => { };
45 public SpriteImportMode spriteImportMode => originalSpriteEditorDataProvider.spriteImportMode;
46 public float pixelsPerUnit => originalSpriteEditorDataProvider.pixelsPerUnit;
47 public UnityObject targetObject => originalSpriteEditorDataProvider.targetObject;
48
49 public SpriteRect[] GetSpriteRects()
50 {
51 if (m_RectsCache == null)
52 return originalSpriteEditorDataProvider.GetSpriteRects();
53
54 return m_RectsCache.GetSpriteRects().ToArray();
55 }
56
57 public void SetSpriteRects(SpriteRect[] spriteRects)
58 {
59 m_RectsCache.SetSpriteRects(spriteRects);
60 spriteEditor.spriteRects = new List<SpriteRect>(spriteRects);
61 NotifyOnSpriteRectChanged();
62 }
63
64 public void Apply()
65 {
66 originalSpriteEditorDataProvider.Apply();
67 }
68
69 public void InitSpriteEditorDataProvider()
70 { }
71
72 public override T GetDataProvider<T>() where T : class
73 {
74 if(typeof(T) == typeof(ISpriteEditorDataProvider))
75 return this as T;
76 else if (typeof(T) == typeof(ITextureDataProvider))
77 return this as T;
78 return spriteEditor.GetDataProvider<T>();
79 }
80
81 public bool HasDataProvider(Type type)
82 {
83 return originalSpriteEditorDataProvider.HasDataProvider(type);
84 }
85
86 public void RegisterDataChangeCallback(Action<ISpriteEditorDataProvider> action)
87 {
88 m_OnSpriteEditorDataChangeCallback+= action;
89 }
90
91 public void UnregisterDataChangeCallback(Action<ISpriteEditorDataProvider> action)
92 {
93 m_OnSpriteEditorDataChangeCallback-= action;
94 }
95
96 protected override void NotifyOnSpriteRectChanged()
97 {
98 PopulateSpriteFrameInspectorField();
99 m_OnSpriteEditorDataChangeCallback.Invoke(this);
100 }
101 #endregion
102
103 #region ITextureDataProvider implementation
104
105 ITextureDataProvider m_OriginalTextureDataProvider;
106
107 ITextureDataProvider originalTextureDataProvider
108 {
109 get
110 {
111 if (m_OriginalTextureDataProvider == null)
112 {
113 m_OriginalTextureDataProvider = spriteEditor.GetDataProvider<ITextureDataProvider>();
114 }
115 return m_OriginalTextureDataProvider;
116 }
117 }
118
119 Texture2D m_MainTexture;
120 Texture2D m_PreviewTexture;
121 Texture2D m_ReadableTexture;
122 int m_OverrideSourceTextureWidth;
123 int m_OverrideSourceTextureHeight;
124 event Action<ITextureDataProvider> m_OnTextureDataChangeCallback = _ => { };
125 Action<string> m_SourceOverrideCallback;
126 public Texture2D texture => m_MainTexture ?? originalTextureDataProvider.texture;
127 public Texture2D previewTexture => m_PreviewTexture ?? originalTextureDataProvider.previewTexture;
128 public void GetTextureActualWidthAndHeight(out int width, out int height)
129 {
130 if(m_MainTexture != null)
131 {
132 width = m_OverrideSourceTextureWidth;
133 height = m_OverrideSourceTextureHeight;
134 }
135 else
136 originalTextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
137 }
138
139 public Texture2D GetReadableTexture2D()
140 {
141 if (m_MainTexture != null && m_ReadableTexture == null)
142 {
143 m_ReadableTexture = UnityEditor.SpriteUtility.CreateTemporaryDuplicate(m_MainTexture, m_MainTexture.width, m_MainTexture.height);
144 if (m_ReadableTexture != null)
145 m_ReadableTexture.filterMode = m_MainTexture.filterMode;
146 }
147 return m_ReadableTexture ?? originalTextureDataProvider?.GetReadableTexture2D();
148 }
149
150 public bool OverrideTextures(Texture2D mainTexture, Texture2D previewTexture, int width, int height)
151 {
152 m_MainTexture = mainTexture;
153 m_PreviewTexture = previewTexture;
154 m_ReadableTexture = null;
155 m_OverrideSourceTextureWidth = width;
156 m_OverrideSourceTextureHeight = height;
157 m_OnTextureDataChangeCallback.Invoke(this);
158 return true;
159 }
160
161 /// <summary>
162 /// Registers a callback to override the source texture.
163 /// </summary>
164 /// <param name="action">Callback that will write to the source texture with the path of the source texture.</param>
165 public void RegisterSourceTextureOverride(Action<string> action)
166 {
167 m_SourceOverrideCallback = action;
168 }
169
170 public void UnregisterSourceTextureOverride(Action<string> action)
171 {
172 if (m_SourceOverrideCallback == action)
173 m_SourceOverrideCallback = null;
174 }
175
176 public void RegisterDataChangeCallback(Action<ITextureDataProvider> action)
177 {
178 m_OnTextureDataChangeCallback += action;
179 }
180
181 public void UnregisterDataChangeCallback(Action<ITextureDataProvider> action)
182 {
183 m_OnTextureDataChangeCallback -= action;
184 }
185 #endregion
186 }
187}