123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482 |
- using System;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.U2D;
- using UnityObject = UnityEngine.Object;
-
- namespace UnityEditor.U2D.Sprites
- {
- internal class SpriteDataProviderBase
- {
- public SpriteDataProviderBase(TextureImporterDataProvider dp)
- {
- dataProvider = dp;
- }
-
- protected TextureImporterDataProvider dataProvider { get; private set; }
- }
-
- internal class SpriteBoneDataTransfer : SpriteDataProviderBase, ISpriteBoneDataProvider
- {
- public SpriteBoneDataTransfer(TextureImporterDataProvider dp) : base(dp)
- {}
-
- public List<SpriteBone> GetBones(GUID guid)
- {
- var index = dataProvider.GetSpriteDataIndex(guid);
- return Load(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
- }
-
- public void SetBones(GUID guid, List<SpriteBone> bones)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).spriteBone = bones;
- }
-
- private static List<SpriteBone> Load(SerializedObject importer, SpriteImportMode mode, int index)
- {
- var sp = mode == SpriteImportMode.Multiple ?
- importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index).FindPropertyRelative("m_Bones") :
- importer.FindProperty("m_SpriteSheet.m_Bones");
-
- var spriteBone = new List<SpriteBone>(sp.arraySize);
- if (sp.arraySize > 0)
- {
- var boneSO = sp.GetArrayElementAtIndex(0);
- for (int i = 0; i < sp.arraySize; ++i, boneSO.Next(false))
- {
- var sb = new SpriteBone();
- sb.length = boneSO.FindPropertyRelative("length").floatValue;
- sb.position = boneSO.FindPropertyRelative("position").vector3Value;
- sb.rotation = boneSO.FindPropertyRelative("rotation").quaternionValue;
- sb.parentId = boneSO.FindPropertyRelative("parentId").intValue;
- sb.name = boneSO.FindPropertyRelative("name").stringValue;
- sb.guid = boneSO.FindPropertyRelative("guid").stringValue;
- sb.color = boneSO.FindPropertyRelative("color").colorValue;
- spriteBone.Add(sb);
- }
- }
- return spriteBone;
- }
-
- public static void Apply(SerializedProperty rectSP, List<SpriteBone> spriteBone)
- {
- var sp = rectSP.FindPropertyRelative("m_Bones");
- sp.arraySize = spriteBone.Count;
- if (spriteBone.Count > 0)
- {
- var boneSO = sp.GetArrayElementAtIndex(0);
- for (int i = 0; i < sp.arraySize; ++i, boneSO.Next(false))
- {
- var sb = spriteBone[i];
- boneSO.FindPropertyRelative("length").floatValue = sb.length;
- boneSO.FindPropertyRelative("position").vector3Value = sb.position;
- boneSO.FindPropertyRelative("rotation").quaternionValue = sb.rotation;
- boneSO.FindPropertyRelative("parentId").intValue = sb.parentId;
- boneSO.FindPropertyRelative("name").stringValue = sb.name;
- boneSO.FindPropertyRelative("guid").stringValue = sb.guid;
- boneSO.FindPropertyRelative("color").colorValue = sb.color;
- }
- }
- }
- }
-
- internal class SpriteOutlineDataTransfer : SpriteDataProviderBase, ISpriteOutlineDataProvider
- {
- public SpriteOutlineDataTransfer(TextureImporterDataProvider dp) : base(dp)
- {}
-
- public List<Vector2[]> GetOutlines(GUID guid)
- {
- var index = dataProvider.GetSpriteDataIndex(guid);
- return Load(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
- }
-
- public void SetOutlines(GUID guid, List<Vector2[]> data)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).spriteOutline = data;
- }
-
- public float GetTessellationDetail(GUID guid)
- {
- return ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail;
- }
-
- public void SetTessellationDetail(GUID guid, float value)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail = value;
- }
-
- private static List<Vector2[]> Load(SerializedObject importer, SpriteImportMode mode, int index)
- {
- var outlineSP = mode == SpriteImportMode.Multiple ?
- importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index).FindPropertyRelative("m_Outline") :
- importer.FindProperty("m_SpriteSheet.m_Outline");
-
- var outline = new List<Vector2[]>();
- if (outlineSP.arraySize > 0)
- {
- var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
- for (int j = 0; j < outlineSP.arraySize; ++j, outlinePathSP.Next(false))
- {
- var o = new Vector2[outlinePathSP.arraySize];
- if (o.Length > 0)
- {
- var psp = outlinePathSP.GetArrayElementAtIndex(0);
- for (int k = 0; k < outlinePathSP.arraySize; ++k, psp.Next(false))
- {
- o[k] = psp.vector2Value;
- }
- }
- outline.Add(o);
- }
- }
- return outline;
- }
-
- public static void Apply(SerializedProperty rectSP, List<Vector2[]> outline)
- {
- var outlineSP = rectSP.FindPropertyRelative("m_Outline");
- outlineSP.arraySize = outline.Count;
- if (outline.Count > 0)
- {
- var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
- for (int j = 0; j < outline.Count; ++j, outlinePathSP.Next(false))
- {
- var o = outline[j];
- outlinePathSP.arraySize = o.Length;
- if (o.Length > 0)
- {
- var psp = outlinePathSP.GetArrayElementAtIndex(0);
- for (int k = 0; k < o.Length; ++k, psp.Next(false))
- {
- psp.vector2Value = o[k];
- }
- }
- }
- }
- }
- }
-
- internal class SpriteMeshDataTransfer : SpriteDataProviderBase, ISpriteMeshDataProvider
- {
- public SpriteMeshDataTransfer(TextureImporterDataProvider dp) : base(dp)
- {}
-
- public Vertex2DMetaData[] GetVertices(GUID guid)
- {
- var index = dataProvider.GetSpriteDataIndex(guid);
- return LoadVertex2DMetaData(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
- }
-
- public void SetVertices(GUID guid, Vertex2DMetaData[] data)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).vertices = new List<Vertex2DMetaData>(data);
- }
-
- public int[] GetIndices(GUID guid)
- {
- var index = dataProvider.GetSpriteDataIndex(guid);
- return LoadIndices(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
- }
-
- public void SetIndices(GUID guid, int[] indices)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).indices = new List<int>(indices);
- }
-
- public Vector2Int[] GetEdges(GUID guid)
- {
- var index = dataProvider.GetSpriteDataIndex(guid);
- return LoadEdges(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
- }
-
- public void SetEdges(GUID guid, Vector2Int[] edges)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).edges = new List<Vector2Int>(edges);
- }
-
- private Vertex2DMetaData[] LoadVertex2DMetaData(SerializedObject importer, SpriteImportMode mode, int index)
- {
- var so = mode == SpriteImportMode.Multiple ?
- importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index) :
- importer.FindProperty("m_SpriteSheet");
-
- var verticesSP = so.FindPropertyRelative("m_Vertices");
- var vertices = new Vertex2DMetaData[verticesSP.arraySize];
- if (verticesSP.arraySize > 0)
- {
- var weightsSP = so.FindPropertyRelative("m_Weights");
- var vsp = verticesSP.GetArrayElementAtIndex(0);
- var wsp = weightsSP.GetArrayElementAtIndex(0);
- for (int i = 0; i < verticesSP.arraySize; ++i, vsp.Next(false), wsp.Next(false))
- {
- vertices[i] = new Vertex2DMetaData
- {
- position = vsp.vector2Value,
- boneWeight = new BoneWeight
- {
- weight0 = wsp.FindPropertyRelative("weight[0]").floatValue,
- weight1 = wsp.FindPropertyRelative("weight[1]").floatValue,
- weight2 = wsp.FindPropertyRelative("weight[2]").floatValue,
- weight3 = wsp.FindPropertyRelative("weight[3]").floatValue,
- boneIndex0 = wsp.FindPropertyRelative("boneIndex[0]").intValue,
- boneIndex1 = wsp.FindPropertyRelative("boneIndex[1]").intValue,
- boneIndex2 = wsp.FindPropertyRelative("boneIndex[2]").intValue,
- boneIndex3 = wsp.FindPropertyRelative("boneIndex[3]").intValue
- }
- };
- }
- }
- return vertices;
- }
-
- private int[] LoadIndices(SerializedObject importer, SpriteImportMode mode, int index)
- {
- var so = mode == SpriteImportMode.Multiple ?
- importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index) :
- importer.FindProperty("m_SpriteSheet");
-
- var indicesSP = so.FindPropertyRelative("m_Indices");
- var indices = new int[indicesSP.arraySize];
- if (indices.Length > 0)
- {
- var isp = indicesSP.GetArrayElementAtIndex(0);
- for (int i = 0; i < indicesSP.arraySize; ++i, isp.Next(false))
- {
- indices[i] = isp.intValue;
- }
- }
-
- return indices;
- }
-
- private Vector2Int[] LoadEdges(SerializedObject importer, SpriteImportMode mode, int index)
- {
- var so = mode == SpriteImportMode.Multiple ?
- importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index) :
- importer.FindProperty("m_SpriteSheet");
-
- var edgesSP = so.FindPropertyRelative("m_Edges");
- var edges = new Vector2Int[edgesSP.arraySize];
- if (edges.Length > 0)
- {
- var esp = edgesSP.GetArrayElementAtIndex(0);
- for (int i = 0; i < edgesSP.arraySize; ++i, esp.Next(false))
- {
- edges[i] = esp.vector2IntValue;
- }
- }
-
- return edges;
- }
-
- public static void Apply(SerializedProperty rectSP, List<Vertex2DMetaData> vertices, List<int> indices, List<Vector2Int> edges)
- {
- var verticesSP = rectSP.FindPropertyRelative("m_Vertices");
- var weightsSP = rectSP.FindPropertyRelative("m_Weights");
- var indicesSP = rectSP.FindPropertyRelative("m_Indices");
- var edgesSP = rectSP.FindPropertyRelative("m_Edges");
-
- verticesSP.arraySize = vertices.Count;
- weightsSP.arraySize = vertices.Count;
- if (vertices.Count > 0)
- {
- var vsp = verticesSP.GetArrayElementAtIndex(0);
- var wsp = weightsSP.GetArrayElementAtIndex(0);
- for (int i = 0; i < vertices.Count; ++i, vsp.Next(false), wsp.Next(false))
- {
- vsp.vector2Value = vertices[i].position;
- wsp.FindPropertyRelative("weight[0]").floatValue = vertices[i].boneWeight.weight0;
- wsp.FindPropertyRelative("weight[1]").floatValue = vertices[i].boneWeight.weight1;
- wsp.FindPropertyRelative("weight[2]").floatValue = vertices[i].boneWeight.weight2;
- wsp.FindPropertyRelative("weight[3]").floatValue = vertices[i].boneWeight.weight3;
- wsp.FindPropertyRelative("boneIndex[0]").intValue = vertices[i].boneWeight.boneIndex0;
- wsp.FindPropertyRelative("boneIndex[1]").intValue = vertices[i].boneWeight.boneIndex1;
- wsp.FindPropertyRelative("boneIndex[2]").intValue = vertices[i].boneWeight.boneIndex2;
- wsp.FindPropertyRelative("boneIndex[3]").intValue = vertices[i].boneWeight.boneIndex3;
- }
- }
-
- indicesSP.arraySize = indices.Count;
- if (indices.Count > 0)
- {
- var isp = indicesSP.GetArrayElementAtIndex(0);
- for (int i = 0; i < indices.Count; ++i, isp.Next(false))
- {
- isp.intValue = indices[i];
- }
- }
-
- edgesSP.arraySize = edges.Count;
- if (edges.Count > 0)
- {
- var esp = edgesSP.GetArrayElementAtIndex(0);
- for (int i = 0; i < edges.Count; ++i, esp.Next(false))
- {
- esp.vector2IntValue = edges[i];
- }
- }
- }
- }
-
- internal class SpritePhysicsOutlineDataTransfer : SpriteDataProviderBase, ISpritePhysicsOutlineDataProvider
- {
- public SpritePhysicsOutlineDataTransfer(TextureImporterDataProvider dp) : base(dp)
- {}
-
- public List<Vector2[]> GetOutlines(GUID guid)
- {
- var index = dataProvider.GetSpriteDataIndex(guid);
- return Load(dataProvider.GetSerializedObject(), dataProvider.spriteImportMode, index);
- }
-
- public void SetOutlines(GUID guid, List<Vector2[]> data)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).spritePhysicsOutline = data;
- }
-
- public float GetTessellationDetail(GUID guid)
- {
- return ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail;
- }
-
- public void SetTessellationDetail(GUID guid, float value)
- {
- ((SpriteDataExt)dataProvider.GetSpriteData(guid)).tessellationDetail = value;
- }
-
- private static List<Vector2[]> Load(SerializedObject importer, SpriteImportMode mode, int index)
- {
- var outlineSP = mode == SpriteImportMode.Multiple ?
- importer.FindProperty("m_SpriteSheet.m_Sprites").GetArrayElementAtIndex(index).FindPropertyRelative("m_PhysicsShape") :
- importer.FindProperty("m_SpriteSheet.m_PhysicsShape");
-
- var outline = new List<Vector2[]>();
- if (outlineSP.arraySize > 0)
- {
- var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
- for (int j = 0; j < outlineSP.arraySize; ++j, outlinePathSP.Next(false))
- {
- var o = new Vector2[outlinePathSP.arraySize];
- if (o.Length > 0)
- {
- var psp = outlinePathSP.GetArrayElementAtIndex(0);
- for (int k = 0; k < outlinePathSP.arraySize; ++k, psp.Next(false))
- {
- o[k] = psp.vector2Value;
- }
- }
- outline.Add(o);
- }
- }
- return outline;
- }
-
- public static void Apply(SerializedProperty rectSP, List<Vector2[]> value)
- {
- var outlineSP = rectSP.FindPropertyRelative("m_PhysicsShape");
- outlineSP.arraySize = value.Count;
- if (value.Count > 0)
- {
- var outlinePathSP = outlineSP.GetArrayElementAtIndex(0);
- for (int j = 0; j < value.Count; ++j, outlinePathSP.Next(false))
- {
- var o = value[j];
- outlinePathSP.arraySize = o.Length;
- if (o.Length > 0)
- {
- var psp = outlinePathSP.GetArrayElementAtIndex(0);
- for (int k = 0; k < o.Length; ++k, psp.Next(false))
- {
- psp.vector2Value = o[k];
- }
- }
- }
- }
- }
- }
-
- internal class SpriteSecondaryTextureDataTransfer : SpriteDataProviderBase, ISecondaryTextureDataProvider
- {
- public SpriteSecondaryTextureDataTransfer(TextureImporterDataProvider dp) : base(dp)
- {}
-
- public SecondarySpriteTexture[] textures
- {
- get { return dataProvider.secondaryTextures; }
- set { dataProvider.secondaryTextures = value; }
- }
-
- public static SecondarySpriteTexture[] Load(SerializedObject so)
- {
- var secondaryTextures = so.FindProperty("m_SpriteSheet.m_SecondaryTextures");
- var returnValue = new SecondarySpriteTexture[secondaryTextures.arraySize];
- if (secondaryTextures.arraySize > 0)
- {
- var sp = secondaryTextures.GetArrayElementAtIndex(0);
- for (int i = 0; i < returnValue.Length; ++i, sp.Next(false))
- {
- returnValue[i].name = sp.FindPropertyRelative("name").stringValue;
- returnValue[i].texture = sp.FindPropertyRelative("texture").objectReferenceValue as Texture2D;
- }
- }
- return returnValue;
- }
-
- public static void Apply(SerializedObject so, SecondarySpriteTexture[] values)
- {
- var secondaryTextures = so.FindProperty("m_SpriteSheet.m_SecondaryTextures");
- secondaryTextures.arraySize = values.Length;
- if (values.Length > 0)
- {
- var e = secondaryTextures.GetArrayElementAtIndex(0);
- for (int i = 0; i < values.Length; ++i, e.Next(false))
- {
- e.FindPropertyRelative("name").stringValue = values[i].name;
- e.FindPropertyRelative("texture").objectReferenceValue = values[i].texture;
- }
- }
- }
- }
-
- internal class SpriteTextureDataTransfer : SpriteDataProviderBase, ITextureDataProvider
- {
- public SpriteTextureDataTransfer(TextureImporterDataProvider dp) : base(dp)
- {}
-
- Texture2D m_ReadableTexture;
- Texture2D m_OriginalTexture;
-
- public Texture2D texture
- {
- get
- {
- if (m_OriginalTexture == null)
- m_OriginalTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(dataProvider.assetPath);
- return m_OriginalTexture;
- }
- }
-
- public Texture2D previewTexture
- {
- get { return texture; }
- }
-
- public void GetTextureActualWidthAndHeight(out int width, out int height)
- {
- width = height = 0;
- dataProvider.GetWidthAndHeight(ref width, ref height);
- }
-
- public Texture2D GetReadableTexture2D()
- {
- if (m_ReadableTexture == null)
- {
- m_ReadableTexture = UnityEditor.SpriteUtility.CreateTemporaryDuplicate(texture, texture.width, texture.height);
- if (m_ReadableTexture != null)
- m_ReadableTexture.filterMode = texture.filterMode;
- }
- return m_ReadableTexture;
- }
- }
- }
|