TextureImporterDataProvider.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace UnityEditor.U2D.Sprites
  6. {
  7. internal class TextureImporterDataProviderFactory :
  8. ISpriteDataProviderFactory<Texture2D>,
  9. ISpriteDataProviderFactory<Sprite>,
  10. ISpriteDataProviderFactory<TextureImporter>,
  11. ISpriteDataProviderFactory<GameObject>
  12. {
  13. public ISpriteEditorDataProvider CreateDataProvider(Texture2D obj)
  14. {
  15. var ti = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(obj)) as TextureImporter;
  16. if (ti != null)
  17. return new TextureImporterDataProvider(ti);
  18. return null;
  19. }
  20. public ISpriteEditorDataProvider CreateDataProvider(Sprite obj)
  21. {
  22. var ti = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(obj)) as TextureImporter;
  23. if (ti != null)
  24. return new TextureImporterDataProvider(ti);
  25. return null;
  26. }
  27. public ISpriteEditorDataProvider CreateDataProvider(GameObject obj)
  28. {
  29. var spriteRenderer = obj.GetComponent<SpriteRenderer>();
  30. if (spriteRenderer != null && spriteRenderer.sprite != null)
  31. {
  32. var ti = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(spriteRenderer.sprite)) as TextureImporter;
  33. if (ti != null)
  34. return new TextureImporterDataProvider(ti);
  35. }
  36. return null;
  37. }
  38. public ISpriteEditorDataProvider CreateDataProvider(TextureImporter obj)
  39. {
  40. return new TextureImporterDataProvider(obj);
  41. }
  42. [SpriteEditorAssetPathProviderAttribute]
  43. static string GetAssetPathFromSpriteRenderer(UnityEngine.Object obj)
  44. {
  45. var go = obj as GameObject;
  46. if (go != null)
  47. {
  48. var spriteRenderer = go.GetComponent<SpriteRenderer>();
  49. if (spriteRenderer != null && spriteRenderer.sprite != null)
  50. return AssetDatabase.GetAssetPath(spriteRenderer.sprite);
  51. }
  52. return null;
  53. }
  54. [SpriteObjectProvider]
  55. static Sprite GetSpriteObjectFromSpriteRenderer(UnityEngine.Object obj)
  56. {
  57. var go = obj as GameObject;
  58. if (go != null)
  59. {
  60. var spriteRenderer = go.GetComponent<SpriteRenderer>();
  61. if (spriteRenderer != null)
  62. return spriteRenderer.sprite;
  63. }
  64. return null;
  65. }
  66. }
  67. internal class TextureImporterDataProvider : ISpriteEditorDataProvider
  68. {
  69. TextureImporter m_TextureImporter;
  70. List<SpriteDataExt> m_SpritesMultiple;
  71. SpriteDataExt m_SpriteSingle;
  72. SpriteImportMode m_SpriteImportMode = SpriteImportMode.None;
  73. SecondarySpriteTexture[] m_SecondaryTextureDataTransfer;
  74. internal TextureImporterDataProvider(TextureImporter importer)
  75. {
  76. m_TextureImporter = importer;
  77. if (m_TextureImporter != null)
  78. m_SpriteImportMode = m_TextureImporter.spriteImportMode;
  79. }
  80. float ISpriteEditorDataProvider.pixelsPerUnit
  81. {
  82. get { return m_TextureImporter.spritePixelsPerUnit; }
  83. }
  84. UnityEngine.Object ISpriteEditorDataProvider.targetObject
  85. {
  86. get { return m_TextureImporter; }
  87. }
  88. public SpriteImportMode spriteImportMode
  89. {
  90. get { return m_SpriteImportMode; }
  91. }
  92. SpriteRect[] ISpriteEditorDataProvider.GetSpriteRects()
  93. {
  94. return spriteImportMode == SpriteImportMode.Multiple ? m_SpritesMultiple.Select(x => new SpriteDataExt(x) as SpriteRect).ToArray() : new[] { new SpriteDataExt(m_SpriteSingle) };
  95. }
  96. public SerializedObject GetSerializedObject()
  97. {
  98. return new SerializedObject(m_TextureImporter);
  99. }
  100. public string assetPath
  101. {
  102. get { return m_TextureImporter.assetPath; }
  103. }
  104. public void GetWidthAndHeight(ref int width, ref int height)
  105. {
  106. m_TextureImporter.GetWidthAndHeight(ref width, ref height);
  107. }
  108. void ISpriteEditorDataProvider.SetSpriteRects(SpriteRect[] spriteRects)
  109. {
  110. if (spriteImportMode != SpriteImportMode.Multiple && spriteImportMode != SpriteImportMode.None && spriteRects.Length == 1)
  111. {
  112. m_SpriteSingle.CopyFromSpriteRect(spriteRects[0]);
  113. }
  114. else if (spriteImportMode == SpriteImportMode.Multiple)
  115. {
  116. for (int i = m_SpritesMultiple.Count - 1; i >= 0; --i)
  117. {
  118. var spriteID = m_SpritesMultiple[i].spriteID;
  119. if (spriteRects.FirstOrDefault(x => x.spriteID == spriteID) == null)
  120. m_SpritesMultiple.RemoveAt(i);
  121. }
  122. for (int i = 0; i < spriteRects.Length; i++)
  123. {
  124. var spriteRect = spriteRects[i];
  125. var index = m_SpritesMultiple.FindIndex(x => x.spriteID == spriteRect.spriteID);
  126. if (-1 == index)
  127. m_SpritesMultiple.Add(new SpriteDataExt(spriteRect));
  128. else
  129. m_SpritesMultiple[index].CopyFromSpriteRect(spriteRects[i]);
  130. }
  131. }
  132. }
  133. internal SpriteRect GetSpriteData(GUID guid)
  134. {
  135. return spriteImportMode == SpriteImportMode.Multiple ? m_SpritesMultiple.FirstOrDefault(x => x.spriteID == guid) : m_SpriteSingle;
  136. }
  137. internal int GetSpriteDataIndex(GUID guid)
  138. {
  139. switch (spriteImportMode)
  140. {
  141. case SpriteImportMode.Single:
  142. case SpriteImportMode.Polygon:
  143. return 0;
  144. case SpriteImportMode.Multiple:
  145. {
  146. return m_SpritesMultiple.FindIndex(x => x.spriteID == guid);
  147. }
  148. default:
  149. throw new InvalidOperationException(string.Format("Sprite with GUID {0} not found", guid));
  150. }
  151. }
  152. void ISpriteEditorDataProvider.Apply()
  153. {
  154. var so = new SerializedObject(m_TextureImporter);
  155. m_SpriteSingle.Apply(so);
  156. var spriteSheetSO = so.FindProperty("m_SpriteSheet.m_Sprites");
  157. GUID[] guids = new GUID[spriteSheetSO.arraySize];
  158. for (int i = 0; i < spriteSheetSO.arraySize; ++i)
  159. {
  160. var element = spriteSheetSO.GetArrayElementAtIndex(i);
  161. guids[i] = SpriteRect.GetSpriteIDFromSerializedProperty(element);
  162. // find the GUID in our sprite list and apply to it;
  163. var smd = m_SpritesMultiple.Find(x => x.spriteID == guids[i]);
  164. if (smd == null) // we can't find it, it is already deleted
  165. {
  166. spriteSheetSO.DeleteArrayElementAtIndex(i);
  167. --i;
  168. }
  169. else
  170. smd.Apply(element);
  171. }
  172. // Add new ones
  173. var newSprites = m_SpritesMultiple.Where(x => !guids.Contains(x.spriteID));
  174. foreach (var newSprite in newSprites)
  175. {
  176. spriteSheetSO.InsertArrayElementAtIndex(spriteSheetSO.arraySize);
  177. var element = spriteSheetSO.GetArrayElementAtIndex(spriteSheetSO.arraySize - 1);
  178. newSprite.Apply(element);
  179. }
  180. SpriteSecondaryTextureDataTransfer.Apply(so, m_SecondaryTextureDataTransfer);
  181. so.ApplyModifiedPropertiesWithoutUndo();
  182. }
  183. void ISpriteEditorDataProvider.InitSpriteEditorDataProvider()
  184. {
  185. var so = new SerializedObject(m_TextureImporter);
  186. var spriteSheetSO = so.FindProperty("m_SpriteSheet.m_Sprites");
  187. m_SpritesMultiple = new List<SpriteDataExt>();
  188. m_SpriteSingle = new SpriteDataExt(so);
  189. for (int i = 0; i < spriteSheetSO.arraySize; ++i)
  190. {
  191. var sp = spriteSheetSO.GetArrayElementAtIndex(i);
  192. var data = new SpriteDataExt(sp);
  193. m_SpritesMultiple.Add(data);
  194. }
  195. m_SecondaryTextureDataTransfer = SpriteSecondaryTextureDataTransfer.Load(so);
  196. }
  197. T ISpriteEditorDataProvider.GetDataProvider<T>()
  198. {
  199. if (typeof(T) == typeof(ISpriteBoneDataProvider))
  200. {
  201. return new SpriteBoneDataTransfer(this) as T;
  202. }
  203. if (typeof(T) == typeof(ISpriteMeshDataProvider))
  204. {
  205. return new SpriteMeshDataTransfer(this) as T;
  206. }
  207. if (typeof(T) == typeof(ISpriteOutlineDataProvider))
  208. {
  209. return new SpriteOutlineDataTransfer(this) as T;
  210. }
  211. if (typeof(T) == typeof(ISpritePhysicsOutlineDataProvider))
  212. {
  213. return new SpritePhysicsOutlineDataTransfer(this) as T;
  214. }
  215. if (typeof(T) == typeof(ITextureDataProvider))
  216. {
  217. return new SpriteTextureDataTransfer(this) as T;
  218. }
  219. if (typeof(T) == typeof(ISecondaryTextureDataProvider))
  220. {
  221. return new SpriteSecondaryTextureDataTransfer(this) as T;
  222. }
  223. else
  224. return this as T;
  225. }
  226. bool ISpriteEditorDataProvider.HasDataProvider(Type type)
  227. {
  228. if (type == typeof(ISpriteBoneDataProvider) ||
  229. type == typeof(ISpriteMeshDataProvider) ||
  230. type == typeof(ISpriteOutlineDataProvider) ||
  231. type == typeof(ISpritePhysicsOutlineDataProvider) ||
  232. type == typeof(ITextureDataProvider) ||
  233. type == typeof(ISecondaryTextureDataProvider))
  234. {
  235. return true;
  236. }
  237. else
  238. return type.IsAssignableFrom(GetType());
  239. }
  240. public override bool Equals(object a)
  241. {
  242. return this == (a as TextureImporterDataProvider);
  243. }
  244. public override int GetHashCode()
  245. {
  246. return base.GetHashCode();
  247. }
  248. public static bool operator!=(TextureImporterDataProvider t1, TextureImporterDataProvider t2)
  249. {
  250. return !(t1 == t2);
  251. }
  252. public static bool operator==(TextureImporterDataProvider t1, TextureImporterDataProvider t2)
  253. {
  254. if (ReferenceEquals(null, t1) && (!ReferenceEquals(null, t2) && t2.m_TextureImporter == null) ||
  255. ReferenceEquals(null, t2) && (!ReferenceEquals(null, t1) && t1.m_TextureImporter == null))
  256. return true;
  257. if (!ReferenceEquals(null, t1) && !ReferenceEquals(null, t2))
  258. {
  259. if (t1.m_TextureImporter == null && t2.m_TextureImporter == null ||
  260. t1.m_TextureImporter == t2.m_TextureImporter)
  261. return true;
  262. }
  263. if (ReferenceEquals(t1, t2))
  264. return true;
  265. return false;
  266. }
  267. public SecondarySpriteTexture[] secdonaryTextures
  268. {
  269. get { return m_SecondaryTextureDataTransfer; }
  270. set { m_SecondaryTextureDataTransfer = value; }
  271. }
  272. }
  273. }