A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using UnityEngine;
4using UnityEngine.U2D;
5using UnityObject = UnityEngine.Object;
6
7namespace UnityEditor.U2D.Sprites
8{
9 internal class SpriteDataProviderBase
10 {
11 public SpriteDataProviderBase(TextureImporterDataProvider dp)
12 {
13 dataProvider = dp;
14 }
15
16 protected TextureImporterDataProvider dataProvider { get; private set; }
17 }
18
19 internal class SpriteBoneDataTransfer : SpriteDataProviderBase, ISpriteBoneDataProvider
20 {
21 public SpriteBoneDataTransfer(TextureImporterDataProvider dp) : base(dp)
22 {}
23
24 public List<SpriteBone> GetBones(GUID guid)
25 {
26 var index = dataProvider.GetSpriteDataIndex(guid);
27 return Load(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
28 }
29
30 public void SetBones(GUID guid, List<SpriteBone> bones)
31 {
32 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).spriteBone = bones;
33 }
34
35 private static List<SpriteBone> Load(SerializedObject importer, SpriteImportMode mode, int index)
36 {
37 var sp = mode == SpriteImportMode.Multiple ?
38 importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index).FindPropertyRelative("m_Bones") :
39 importer.FindProperty("m_SpriteSheet.m_Bones");
40
41 var spriteBone = new List<SpriteBone>(sp.arraySize);
42 if (sp.arraySize > 0)
43 {
44 var boneSO = sp.GetArrayElementAtIndex(0);
45 for (int i = 0; i < sp.arraySize; ++i, boneSO.Next(false))
46 {
47 var sb = new SpriteBone();
48 sb.length = boneSO.FindPropertyRelative("length").floatValue;
49 sb.position = boneSO.FindPropertyRelative("position").vector3Value;
50 sb.rotation = boneSO.FindPropertyRelative("rotation").quaternionValue;
51 sb.parentId = boneSO.FindPropertyRelative("parentId").intValue;
52 sb.name = boneSO.FindPropertyRelative("name").stringValue;
53 sb.guid = boneSO.FindPropertyRelative("guid").stringValue;
54 sb.color = boneSO.FindPropertyRelative("color").colorValue;
55 spriteBone.Add(sb);
56 }
57 }
58 return spriteBone;
59 }
60
61 public static void Apply(SerializedProperty rectSP, List<SpriteBone> spriteBone)
62 {
63 var sp = rectSP.FindPropertyRelative("m_Bones");
64 sp.arraySize = spriteBone.Count;
65 if (spriteBone.Count > 0)
66 {
67 var boneSO = sp.GetArrayElementAtIndex(0);
68 for (int i = 0; i < sp.arraySize; ++i, boneSO.Next(false))
69 {
70 var sb = spriteBone[i];
71 boneSO.FindPropertyRelative("length").floatValue = sb.length;
72 boneSO.FindPropertyRelative("position").vector3Value = sb.position;
73 boneSO.FindPropertyRelative("rotation").quaternionValue = sb.rotation;
74 boneSO.FindPropertyRelative("parentId").intValue = sb.parentId;
75 boneSO.FindPropertyRelative("name").stringValue = sb.name;
76 boneSO.FindPropertyRelative("guid").stringValue = sb.guid;
77 boneSO.FindPropertyRelative("color").colorValue = sb.color;
78 }
79 }
80 }
81 }
82
83 internal class SpriteOutlineDataTransfer : SpriteDataProviderBase, ISpriteOutlineDataProvider
84 {
85 public SpriteOutlineDataTransfer(TextureImporterDataProvider dp) : base(dp)
86 {}
87
88 public List<Vector2[]> GetOutlines(GUID guid)
89 {
90 var index = dataProvider.GetSpriteDataIndex(guid);
91 return Load(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
92 }
93
94 public void SetOutlines(GUID guid, List<Vector2[]> data)
95 {
96 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).spriteOutline = data;
97 }
98
99 public float GetTessellationDetail(GUID guid)
100 {
101 return ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail;
102 }
103
104 public void SetTessellationDetail(GUID guid, float value)
105 {
106 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail = value;
107 }
108
109 private static List<Vector2[]> Load(SerializedObject importer, SpriteImportMode mode, int index)
110 {
111 var outlineSP = mode == SpriteImportMode.Multiple ?
112 importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index).FindPropertyRelative("m_Outline") :
113 importer.FindProperty("m_SpriteSheet.m_Outline");
114
115 var outline = new List<Vector2[]>();
116 if (outlineSP.arraySize > 0)
117 {
118 var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
119 for (int j = 0; j < outlineSP.arraySize; ++j, outlinePathSP.Next(false))
120 {
121 var o = new Vector2[outlinePathSP.arraySize];
122 if (o.Length > 0)
123 {
124 var psp = outlinePathSP.GetArrayElementAtIndex(0);
125 for (int k = 0; k < outlinePathSP.arraySize; ++k, psp.Next(false))
126 {
127 o[k] = psp.vector2Value;
128 }
129 }
130 outline.Add(o);
131 }
132 }
133 return outline;
134 }
135
136 public static void Apply(SerializedProperty rectSP, List<Vector2[]> outline)
137 {
138 var outlineSP = rectSP.FindPropertyRelative("m_Outline");
139 outlineSP.arraySize = outline.Count;
140 if (outline.Count > 0)
141 {
142 var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
143 for (int j = 0; j < outline.Count; ++j, outlinePathSP.Next(false))
144 {
145 var o = outline[j];
146 outlinePathSP.arraySize = o.Length;
147 if (o.Length > 0)
148 {
149 var psp = outlinePathSP.GetArrayElementAtIndex(0);
150 for (int k = 0; k < o.Length; ++k, psp.Next(false))
151 {
152 psp.vector2Value = o[k];
153 }
154 }
155 }
156 }
157 }
158 }
159
160 internal class SpriteMeshDataTransfer : SpriteDataProviderBase, ISpriteMeshDataProvider
161 {
162 public SpriteMeshDataTransfer(TextureImporterDataProvider dp) : base(dp)
163 {}
164
165 public Vertex2DMetaData[] GetVertices(GUID guid)
166 {
167 var index = dataProvider.GetSpriteDataIndex(guid);
168 return LoadVertex2DMetaData(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
169 }
170
171 public void SetVertices(GUID guid, Vertex2DMetaData[] data)
172 {
173 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).vertices = new List<Vertex2DMetaData>(data);
174 }
175
176 public int[] GetIndices(GUID guid)
177 {
178 var index = dataProvider.GetSpriteDataIndex(guid);
179 return LoadIndices(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
180 }
181
182 public void SetIndices(GUID guid, int[] indices)
183 {
184 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).indices = new List<int>(indices);
185 }
186
187 public Vector2Int[] GetEdges(GUID guid)
188 {
189 var index = dataProvider.GetSpriteDataIndex(guid);
190 return LoadEdges(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
191 }
192
193 public void SetEdges(GUID guid, Vector2Int[] edges)
194 {
195 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).edges = new List<Vector2Int>(edges);
196 }
197
198 private Vertex2DMetaData[] LoadVertex2DMetaData(SerializedObject importer, SpriteImportMode mode, int index)
199 {
200 var so = mode == SpriteImportMode.Multiple ?
201 importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index) :
202 importer.FindProperty("m_SpriteSheet");
203
204 var verticesSP = so.FindPropertyRelative("m_Vertices");
205 var vertices = new Vertex2DMetaData[verticesSP.arraySize];
206 if (verticesSP.arraySize > 0)
207 {
208 var weightsSP = so.FindPropertyRelative("m_Weights");
209 var vsp = verticesSP.GetArrayElementAtIndex(0);
210 var wsp = weightsSP.GetArrayElementAtIndex(0);
211 for (int i = 0; i < verticesSP.arraySize; ++i, vsp.Next(false), wsp.Next(false))
212 {
213 vertices[i] = new Vertex2DMetaData
214 {
215 position = vsp.vector2Value,
216 boneWeight = new BoneWeight
217 {
218 weight0 = wsp.FindPropertyRelative("weight[0]").floatValue,
219 weight1 = wsp.FindPropertyRelative("weight[1]").floatValue,
220 weight2 = wsp.FindPropertyRelative("weight[2]").floatValue,
221 weight3 = wsp.FindPropertyRelative("weight[3]").floatValue,
222 boneIndex0 = wsp.FindPropertyRelative("boneIndex[0]").intValue,
223 boneIndex1 = wsp.FindPropertyRelative("boneIndex[1]").intValue,
224 boneIndex2 = wsp.FindPropertyRelative("boneIndex[2]").intValue,
225 boneIndex3 = wsp.FindPropertyRelative("boneIndex[3]").intValue
226 }
227 };
228 }
229 }
230 return vertices;
231 }
232
233 private int[] LoadIndices(SerializedObject importer, SpriteImportMode mode, int index)
234 {
235 var so = mode == SpriteImportMode.Multiple ?
236 importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index) :
237 importer.FindProperty("m_SpriteSheet");
238
239 var indicesSP = so.FindPropertyRelative("m_Indices");
240 var indices = new int[indicesSP.arraySize];
241 if (indices.Length > 0)
242 {
243 var isp = indicesSP.GetArrayElementAtIndex(0);
244 for (int i = 0; i < indicesSP.arraySize; ++i, isp.Next(false))
245 {
246 indices[i] = isp.intValue;
247 }
248 }
249
250 return indices;
251 }
252
253 private Vector2Int[] LoadEdges(SerializedObject importer, SpriteImportMode mode, int index)
254 {
255 var so = mode == SpriteImportMode.Multiple ?
256 importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index) :
257 importer.FindProperty("m_SpriteSheet");
258
259 var edgesSP = so.FindPropertyRelative("m_Edges");
260 var edges = new Vector2Int[edgesSP.arraySize];
261 if (edges.Length > 0)
262 {
263 var esp = edgesSP.GetArrayElementAtIndex(0);
264 for (int i = 0; i < edgesSP.arraySize; ++i, esp.Next(false))
265 {
266 edges[i] = esp.vector2IntValue;
267 }
268 }
269
270 return edges;
271 }
272
273 public static void Apply(SerializedProperty rectSP, List<Vertex2DMetaData> vertices, List<int> indices, List<Vector2Int> edges)
274 {
275 var verticesSP = rectSP.FindPropertyRelative("m_Vertices");
276 var weightsSP = rectSP.FindPropertyRelative("m_Weights");
277 var indicesSP = rectSP.FindPropertyRelative("m_Indices");
278 var edgesSP = rectSP.FindPropertyRelative("m_Edges");
279
280 verticesSP.arraySize = vertices.Count;
281 weightsSP.arraySize = vertices.Count;
282 if (vertices.Count > 0)
283 {
284 var vsp = verticesSP.GetArrayElementAtIndex(0);
285 var wsp = weightsSP.GetArrayElementAtIndex(0);
286 for (int i = 0; i < vertices.Count; ++i, vsp.Next(false), wsp.Next(false))
287 {
288 vsp.vector2Value = vertices[i].position;
289 wsp.FindPropertyRelative("weight[0]").floatValue = vertices[i].boneWeight.weight0;
290 wsp.FindPropertyRelative("weight[1]").floatValue = vertices[i].boneWeight.weight1;
291 wsp.FindPropertyRelative("weight[2]").floatValue = vertices[i].boneWeight.weight2;
292 wsp.FindPropertyRelative("weight[3]").floatValue = vertices[i].boneWeight.weight3;
293 wsp.FindPropertyRelative("boneIndex[0]").intValue = vertices[i].boneWeight.boneIndex0;
294 wsp.FindPropertyRelative("boneIndex[1]").intValue = vertices[i].boneWeight.boneIndex1;
295 wsp.FindPropertyRelative("boneIndex[2]").intValue = vertices[i].boneWeight.boneIndex2;
296 wsp.FindPropertyRelative("boneIndex[3]").intValue = vertices[i].boneWeight.boneIndex3;
297 }
298 }
299
300 indicesSP.arraySize = indices.Count;
301 if (indices.Count > 0)
302 {
303 var isp = indicesSP.GetArrayElementAtIndex(0);
304 for (int i = 0; i < indices.Count; ++i, isp.Next(false))
305 {
306 isp.intValue = indices[i];
307 }
308 }
309
310 edgesSP.arraySize = edges.Count;
311 if (edges.Count > 0)
312 {
313 var esp = edgesSP.GetArrayElementAtIndex(0);
314 for (int i = 0; i < edges.Count; ++i, esp.Next(false))
315 {
316 esp.vector2IntValue = edges[i];
317 }
318 }
319 }
320 }
321
322 internal class SpritePhysicsOutlineDataTransfer : SpriteDataProviderBase, ISpritePhysicsOutlineDataProvider
323 {
324 public SpritePhysicsOutlineDataTransfer(TextureImporterDataProvider dp) : base(dp)
325 {}
326
327 public List<Vector2[]> GetOutlines(GUID guid)
328 {
329 var index = dataProvider.GetSpriteDataIndex(guid);
330 return Load(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
331 }
332
333 public void SetOutlines(GUID guid, List<Vector2[]> data)
334 {
335 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).spritePhysicsOutline = data;
336 }
337
338 public float GetTessellationDetail(GUID guid)
339 {
340 return ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail;
341 }
342
343 public void SetTessellationDetail(GUID guid, float value)
344 {
345 ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail = value;
346 }
347
348 private static List<Vector2[]> Load(SerializedObject importer, SpriteImportMode mode, int index)
349 {
350 var outlineSP = mode == SpriteImportMode.Multiple ?
351 importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index).FindPropertyRelative("m_PhysicsShape") :
352 importer.FindProperty("m_SpriteSheet.m_PhysicsShape");
353
354 var outline = new List<Vector2[]>();
355 if (outlineSP.arraySize > 0)
356 {
357 var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
358 for (int j = 0; j < outlineSP.arraySize; ++j, outlinePathSP.Next(false))
359 {
360 var o = new Vector2[outlinePathSP.arraySize];
361 if (o.Length > 0)
362 {
363 var psp = outlinePathSP.GetArrayElementAtIndex(0);
364 for (int k = 0; k < outlinePathSP.arraySize; ++k, psp.Next(false))
365 {
366 o[k] = psp.vector2Value;
367 }
368 }
369 outline.Add(o);
370 }
371 }
372 return outline;
373 }
374
375 public static void Apply(SerializedProperty rectSP, List<Vector2[]> value)
376 {
377 var outlineSP = rectSP.FindPropertyRelative("m_PhysicsShape");
378 outlineSP.arraySize = value.Count;
379 if (value.Count > 0)
380 {
381 var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
382 for (int j = 0; j < value.Count; ++j, outlinePathSP.Next(false))
383 {
384 var o = value[j];
385 outlinePathSP.arraySize = o.Length;
386 if (o.Length > 0)
387 {
388 var psp = outlinePathSP.GetArrayElementAtIndex(0);
389 for (int k = 0; k < o.Length; ++k, psp.Next(false))
390 {
391 psp.vector2Value = o[k];
392 }
393 }
394 }
395 }
396 }
397 }
398
399 internal class SpriteSecondaryTextureDataTransfer : SpriteDataProviderBase, ISecondaryTextureDataProvider
400 {
401 public SpriteSecondaryTextureDataTransfer(TextureImporterDataProvider dp) : base(dp)
402 {}
403
404 public SecondarySpriteTexture[] textures
405 {
406 get { return dataProvider.secondaryTextures; }
407 set { dataProvider.secondaryTextures = value; }
408 }
409
410 public static SecondarySpriteTexture[] Load(SerializedObject so)
411 {
412 var secondaryTextures = so.FindProperty("m_SpriteSheet.m_SecondaryTextures");
413 var returnValue = new SecondarySpriteTexture[secondaryTextures.arraySize];
414 if (secondaryTextures.arraySize > 0)
415 {
416 var sp = secondaryTextures.GetArrayElementAtIndex(0);
417 for (int i = 0; i < returnValue.Length; ++i, sp.Next(false))
418 {
419 returnValue[i].name = sp.FindPropertyRelative("name").stringValue;
420 returnValue[i].texture = sp.FindPropertyRelative("texture").objectReferenceValue as Texture2D;
421 }
422 }
423 return returnValue;
424 }
425
426 public static void Apply(SerializedObject so, SecondarySpriteTexture[] values)
427 {
428 var secondaryTextures = so.FindProperty("m_SpriteSheet.m_SecondaryTextures");
429 secondaryTextures.arraySize = values.Length;
430 if (values.Length > 0)
431 {
432 var e = secondaryTextures.GetArrayElementAtIndex(0);
433 for (int i = 0; i < values.Length; ++i, e.Next(false))
434 {
435 e.FindPropertyRelative("name").stringValue = values[i].name;
436 e.FindPropertyRelative("texture").objectReferenceValue = values[i].texture;
437 }
438 }
439 }
440 }
441
442 internal class SpriteTextureDataTransfer : SpriteDataProviderBase, ITextureDataProvider
443 {
444 public SpriteTextureDataTransfer(TextureImporterDataProvider dp) : base(dp)
445 {}
446
447 Texture2D m_ReadableTexture;
448 Texture2D m_OriginalTexture;
449
450 public Texture2D texture
451 {
452 get
453 {
454 if (m_OriginalTexture == null)
455 m_OriginalTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(dataProvider.assetPath);
456 return m_OriginalTexture;
457 }
458 }
459
460 public Texture2D previewTexture
461 {
462 get { return texture; }
463 }
464
465 public void GetTextureActualWidthAndHeight(out int width, out int height)
466 {
467 width = height = 0;
468 dataProvider.GetWidthAndHeight(ref width, ref height);
469 }
470
471 public Texture2D GetReadableTexture2D()
472 {
473 if (m_ReadableTexture == null)
474 {
475 m_ReadableTexture = UnityEditor.SpriteUtility.CreateTemporaryDuplicate(texture, texture.width, texture.height);
476 if (m_ReadableTexture != null)
477 m_ReadableTexture.filterMode = texture.filterMode;
478 }
479 return m_ReadableTexture;
480 }
481 }
482
483 internal class SpriteCustomDataTransfer : SpriteDataProviderBase, ISpriteCustomDataProvider
484 {
485 const string k_SpriteCustomMetadataPropertyName = "m_SpriteCustomMetadata";
486 const string k_EntriesPropertyName = "m_Entries";
487 const string k_KeyPropertyName = "m_Key";
488 const string k_ValuePropertyName = "m_Value";
489
490 public static Dictionary<string, string> Load(SerializedProperty parentProperty)
491 {
492 var customDataProperty = parentProperty.FindPropertyRelative(k_SpriteCustomMetadataPropertyName);
493
494 var entriesProperty = customDataProperty.FindPropertyRelative(k_EntriesPropertyName);
495 var entriesCount = entriesProperty.arraySize;
496
497 var data = new Dictionary<string, string>();
498 data.EnsureCapacity(entriesCount);
499
500 for (var i = 0; i < entriesCount; i++)
501 {
502 var entry = entriesProperty.GetArrayElementAtIndex(i);
503 var key = entry.FindPropertyRelative(k_KeyPropertyName).stringValue;
504 var value = entry.FindPropertyRelative(k_ValuePropertyName).stringValue;
505 data.TryAdd(key, value);
506 }
507
508 return data;
509 }
510
511 public static void Apply(SerializedProperty parentProperty, Dictionary<string, string> data)
512 {
513 data ??= new Dictionary<string, string>();
514
515 var customDataProperty = parentProperty.FindPropertyRelative(k_SpriteCustomMetadataPropertyName);
516
517 var entriesProperty = customDataProperty.FindPropertyRelative(k_EntriesPropertyName);
518 entriesProperty.arraySize = data.Count;
519
520 var count = 0;
521 foreach (var (key, value) in data)
522 {
523 var entry = entriesProperty.GetArrayElementAtIndex(count++);
524 entry.FindPropertyRelative(k_KeyPropertyName).stringValue = key;
525 entry.FindPropertyRelative(k_ValuePropertyName).stringValue = value;
526 }
527 }
528
529 public SpriteCustomDataTransfer(TextureImporterDataProvider dp) : base(dp) { }
530
531 public IEnumerable<string> GetKeys() => dataProvider.customMetadata.Keys;
532
533 public void SetData(string key, string data) => dataProvider.customMetadata[key] = data;
534
535 public void RemoveData(string key) => dataProvider.customMetadata.Remove(key);
536
537 public bool GetData(string key, out string value) => dataProvider.customMetadata.TryGetValue(key, out value);
538 }
539}