A game about forced loneliness, made by TACStudios
at master 539 lines 23 kB view raw
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}