No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TextureImporterDataProviderImplementation.cs 20KB

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