Rasagar/Library/PackageCache/com.unity.2d.sprite/Editor/SpriteEditorModule/TextureImporterDataProviderImplementation.cs
2024-08-26 23:07:20 +03:00

540 lines
22 KiB
C#

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;
}
}
internal class SpriteCustomDataTransfer : SpriteDataProviderBase, ISpriteCustomDataProvider
{
const string k_SpriteCustomMetadataPropertyName = "m_SpriteCustomMetadata";
const string k_EntriesPropertyName = "m_Entries";
const string k_KeyPropertyName = "m_Key";
const string k_ValuePropertyName = "m_Value";
public static Dictionary<string, string> Load(SerializedProperty parentProperty)
{
var customDataProperty = parentProperty.FindPropertyRelative(k_SpriteCustomMetadataPropertyName);
var entriesProperty = customDataProperty.FindPropertyRelative(k_EntriesPropertyName);
var entriesCount = entriesProperty.arraySize;
var data = new Dictionary<string, string>();
data.EnsureCapacity(entriesCount);
for (var i = 0; i < entriesCount; i++)
{
var entry = entriesProperty.GetArrayElementAtIndex(i);
var key = entry.FindPropertyRelative(k_KeyPropertyName).stringValue;
var value = entry.FindPropertyRelative(k_ValuePropertyName).stringValue;
data.TryAdd(key, value);
}
return data;
}
public static void Apply(SerializedProperty parentProperty, Dictionary<string, string> data)
{
data ??= new Dictionary<string, string>();
var customDataProperty = parentProperty.FindPropertyRelative(k_SpriteCustomMetadataPropertyName);
var entriesProperty = customDataProperty.FindPropertyRelative(k_EntriesPropertyName);
entriesProperty.arraySize = data.Count;
var count = 0;
foreach (var (key, value) in data)
{
var entry = entriesProperty.GetArrayElementAtIndex(count++);
entry.FindPropertyRelative(k_KeyPropertyName).stringValue = key;
entry.FindPropertyRelative(k_ValuePropertyName).stringValue = value;
}
}
public SpriteCustomDataTransfer(TextureImporterDataProvider dp) : base(dp) { }
public IEnumerable<string> GetKeys() => dataProvider.customMetadata.Keys;
public void SetData(string key, string data) => dataProvider.customMetadata[key] = data;
public void RemoveData(string key) => dataProvider.customMetadata.Remove(key);
public bool GetData(string key, out string value) => dataProvider.customMetadata.TryGetValue(key, out value);
}
}