55using UnityEngine ;
66using UnityEditor ;
77using System ;
8+ using System . Linq ;
89using UnityEditor . Experimental . U2D ;
910using UnityEditor . U2D ;
1011using UnityAssetImporter = UnityEditor . AssetImporter ;
@@ -15,12 +16,7 @@ namespace UnityEditor.U2D.Interface
1516{
1617 internal abstract class ITextureImporter
1718 {
18- public abstract void GetWidthAndHeight ( ref int width , ref int height ) ;
1919 public abstract SpriteImportMode spriteImportMode { get ; }
20- public abstract Vector4 spriteBorder { get ; }
21- public abstract Vector2 spritePivot { get ; }
22-
23- public abstract string assetPath { get ; }
2420
2521 public static bool operator == ( ITextureImporter t1 , ITextureImporter t2 )
2622 {
@@ -56,18 +52,16 @@ public override int GetHashCode()
5652 internal class TextureImporter : ITextureImporter , ISpriteEditorDataProvider
5753 {
5854 protected UnityAssetImporter m_AssetImporter ;
59- List < SpriteDataMultipleMode > m_SpritesMultiple ;
60- SpriteDataSingleMode m_SpriteSingle ;
61- SerializedObject m_TextureImporterSO ;
55+ List < SpriteDataExt > m_SpritesMultiple ;
56+ SpriteDataExt m_SpriteSingle ;
57+ SpriteImportMode m_SpriteImportMode ;
6258
6359 public TextureImporter ( UnityTextureImporter textureImporter )
6460 {
6561 m_AssetImporter = textureImporter ;
66- }
67-
68- public override string assetPath
69- {
70- get { return m_AssetImporter . assetPath ; }
62+ m_SpriteImportMode = textureImporter . textureType != TextureImporterType . Sprite ?
63+ SpriteImportMode . None :
64+ textureImporter . spriteImportMode ;
7165 }
7266
7367 public override bool Equals ( object other )
@@ -83,122 +77,160 @@ public override int GetHashCode()
8377 return m_AssetImporter . GetHashCode ( ) ;
8478 }
8579
86- public override void GetWidthAndHeight ( ref int width , ref int height )
87- {
88- ( ( UnityTextureImporter ) m_AssetImporter ) . GetWidthAndHeight ( ref width , ref height ) ;
89- }
90-
9180 public override SpriteImportMode spriteImportMode
9281 {
93- get { return ( ( UnityTextureImporter ) m_AssetImporter ) . spriteImportMode ; }
82+ get { return m_SpriteImportMode ; }
9483 }
9584
96- public override Vector4 spriteBorder
85+ // ISpriteEditorDataProvider interface
86+ public float pixelsPerUnit
9787 {
98- get { return ( ( UnityTextureImporter ) m_AssetImporter ) . spriteBorder ; }
88+ get { return ( ( UnityTextureImporter ) m_AssetImporter ) . spritePixelsPerUnit ; }
9989 }
10090
101- public override Vector2 spritePivot
91+ public UnityEngine . Object targetObject
10292 {
103- get { return ( ( UnityTextureImporter ) m_AssetImporter ) . spritePivot ; }
93+ get { return m_AssetImporter ; }
10494 }
10595
106- public void InitSpriteEditorDataProvider ( SerializedObject so )
96+ public SpriteRect [ ] GetSpriteRects ( )
10797 {
108- m_TextureImporterSO = so ;
109- var spriteSheetSO = m_TextureImporterSO . FindProperty ( "m_SpriteSheet.m_Sprites" ) ;
110- m_SpritesMultiple = new List < SpriteDataMultipleMode > ( ) ;
111- m_SpriteSingle = new SpriteDataSingleMode ( ) ;
112- m_SpriteSingle . Load ( m_TextureImporterSO ) ;
113- for ( int i = 0 ; i < spriteSheetSO . arraySize ; ++ i )
114- {
115- var data = new SpriteDataMultipleMode ( ) ;
116- var sp = spriteSheetSO . GetArrayElementAtIndex ( i ) ;
117- data . Load ( sp ) ;
118- m_SpritesMultiple . Add ( data ) ;
119- }
98+ return spriteImportMode == SpriteImportMode . Multiple ? m_SpritesMultiple . Select ( x => x as SpriteRect ) . ToArray ( ) : new [ ] { m_SpriteSingle } ;
12099 }
121100
122- public int spriteDataCount
101+ public void SetSpriteRects ( SpriteRect [ ] spriteRects )
123102 {
124- get
103+ if ( spriteImportMode == SpriteImportMode . Single && spriteRects . Length == 1 )
125104 {
126- switch ( spriteImportMode )
127- {
128- case SpriteImportMode . Multiple :
129- return m_SpritesMultiple . Count ;
130- case SpriteImportMode . Single :
131- case SpriteImportMode . Polygon :
132- return 1 ;
133- }
134- return 0 ;
105+ m_SpriteSingle . CopyFromSpriteRect ( spriteRects [ 0 ] ) ;
135106 }
136-
137- set
107+ else if ( spriteImportMode == SpriteImportMode . Multiple )
138108 {
139- if ( spriteImportMode != SpriteImportMode . Multiple )
109+ for ( int i = m_SpritesMultiple . Count - 1 ; i >= 0 ; -- i )
140110 {
141- Debug . LogError ( "SetSpriteDataSize can only be called when in SpriteImportMode.Multiple" ) ;
142- return ;
111+ if ( ! spriteRects . Contains ( m_SpritesMultiple [ i ] ) )
112+ m_SpritesMultiple . RemoveAt ( i ) ;
143113 }
144-
145- while ( m_SpritesMultiple . Count < value )
146- m_SpritesMultiple . Add ( new SpriteDataMultipleMode ( ) ) ;
147- if ( m_SpritesMultiple . Count > value )
114+ for ( int i = 0 ; i < spriteRects . Length ; i ++ )
148115 {
149- var diff = m_SpritesMultiple . Count - value ;
150- m_SpritesMultiple . RemoveRange ( m_SpritesMultiple . Count - diff , diff ) ;
116+ var spriteRect = spriteRects [ i ] ;
117+ var index = m_SpritesMultiple . FindIndex ( x => x . spriteID == spriteRect . spriteID ) ;
118+ if ( - 1 == index )
119+ m_SpritesMultiple . Add ( new SpriteDataExt ( spriteRect ) ) ;
120+ else
121+ m_SpritesMultiple [ index ] . CopyFromSpriteRect ( spriteRects [ i ] ) ;
151122 }
152123 }
153124 }
154125
155- public UnityEngine . Object targetObject
126+ public SpriteRect GetSpriteData ( GUID guid )
156127 {
157- get
158- {
159- return m_AssetImporter ;
160- }
128+ return spriteImportMode == SpriteImportMode . Multiple ? m_SpritesMultiple . Where ( x => x . spriteID == guid ) . FirstOrDefault ( ) : m_SpriteSingle ;
161129 }
162130
163- public SpriteDataBase GetSpriteData ( int i )
131+ public int GetSpriteDataIndex ( GUID guid )
164132 {
165133 switch ( spriteImportMode )
166134 {
167- case SpriteImportMode . Multiple :
168- if ( m_SpritesMultiple . Count > i )
169- return m_SpritesMultiple [ i ] ;
170- break ;
171135 case SpriteImportMode . Single :
172136 case SpriteImportMode . Polygon :
173- return m_SpriteSingle ;
137+ return 0 ;
138+ case SpriteImportMode . Multiple :
139+ {
140+ return m_SpritesMultiple . FindIndex ( x => x . spriteID == guid ) ;
141+ }
142+ default :
143+ throw new InvalidOperationException ( "GUID not found" ) ;
174144 }
175- return null ;
176145 }
177146
178- public void Apply ( SerializedObject so )
147+ public void Apply ( )
179148 {
149+ var so = new SerializedObject ( m_AssetImporter ) ;
180150 m_SpriteSingle . Apply ( so ) ;
181-
182151 var spriteSheetSO = so . FindProperty ( "m_SpriteSheet.m_Sprites" ) ;
183- for ( int i = 0 ; i < m_SpritesMultiple . Count ; ++ i )
152+ GUID [ ] guids = new GUID [ spriteSheetSO . arraySize ] ;
153+ for ( int i = 0 ; i < spriteSheetSO . arraySize ; ++ i )
184154 {
185- if ( spriteSheetSO . arraySize < m_SpritesMultiple . Count )
155+ var element = spriteSheetSO . GetArrayElementAtIndex ( i ) ;
156+ guids [ i ] = SpriteRect . GetSpriteIDFromSerializedProperty ( element ) ;
157+ // find the GUID in our sprite list and apply to it;
158+ var smd = m_SpritesMultiple . Find ( x => x . spriteID == guids [ i ] ) ;
159+ if ( smd == null ) // we can't find it, it is already deleted
186160 {
187- spriteSheetSO . InsertArrayElementAtIndex ( spriteSheetSO . arraySize ) ;
161+ spriteSheetSO . DeleteArrayElementAtIndex ( i ) ;
162+ -- i ;
188163 }
164+ else
165+ smd . Apply ( element ) ;
166+ }
167+
168+ // Add new ones
169+ var newSprites = m_SpritesMultiple . Where ( x => ! guids . Contains ( x . spriteID ) ) ;
170+ foreach ( var newSprite in newSprites )
171+ {
172+ spriteSheetSO . InsertArrayElementAtIndex ( spriteSheetSO . arraySize ) ;
173+ var element = spriteSheetSO . GetArrayElementAtIndex ( spriteSheetSO . arraySize - 1 ) ;
174+ newSprite . Apply ( element ) ;
175+ }
176+ so . ApplyModifiedPropertiesWithoutUndo ( ) ;
177+ }
178+
179+ public void InitSpriteEditorDataProvider ( )
180+ {
181+ var so = new SerializedObject ( m_AssetImporter ) ;
182+ var spriteSheetSO = so . FindProperty ( "m_SpriteSheet.m_Sprites" ) ;
183+ m_SpritesMultiple = new List < SpriteDataExt > ( ) ;
184+ m_SpriteSingle = new SpriteDataExt ( ) ;
185+ m_SpriteSingle . Load ( so ) ;
186+
187+ for ( int i = 0 ; i < spriteSheetSO . arraySize ; ++ i )
188+ {
189+ var data = new SpriteDataExt ( ) ;
189190 var sp = spriteSheetSO . GetArrayElementAtIndex ( i ) ;
190- m_SpritesMultiple [ i ] . Apply ( sp ) ;
191+ data . Load ( sp ) ;
192+ m_SpritesMultiple . Add ( data ) ;
191193 }
192- while ( m_SpritesMultiple . Count < spriteSheetSO . arraySize )
194+ }
195+
196+ public T GetDataProvider < T > ( ) where T : class
197+ {
198+ if ( typeof ( T ) == typeof ( ISpriteBoneDataProvider ) )
199+ {
200+ return new SpriteBoneDataTransfer ( this ) as T ;
201+ }
202+ if ( typeof ( T ) == typeof ( ISpriteMeshDataProvider ) )
203+ {
204+ return new SpriteMeshDataTransfer ( this ) as T ;
205+ }
206+ if ( typeof ( T ) == typeof ( ISpriteOutlineDataProvider ) )
193207 {
194- spriteSheetSO . DeleteArrayElementAtIndex ( m_SpritesMultiple . Count ) ;
208+ return new SpriteOutlineDataTransfer ( this ) as T ;
195209 }
210+ if ( typeof ( T ) == typeof ( ISpritePhysicsOutlineDataProvider ) )
211+ {
212+ return new SpritePhysicsOutlineDataTransfer ( this ) as T ;
213+ }
214+ if ( typeof ( T ) == typeof ( ITextureDataProvider ) )
215+ {
216+ return new SpriteTextureDataTransfer ( this ) as T ;
217+ }
218+ else
219+ return this as T ;
196220 }
197221
198- public void GetTextureActualWidthAndHeight ( out int width , out int height )
222+ public bool HasDataProvider ( Type type )
199223 {
200- width = height = 0 ;
201- ( ( UnityTextureImporter ) m_AssetImporter ) . GetWidthAndHeight ( ref width , ref height ) ;
224+ if ( type == typeof ( ISpriteBoneDataProvider ) ||
225+ type == typeof ( ISpriteMeshDataProvider ) ||
226+ type == typeof ( ISpriteOutlineDataProvider ) ||
227+ type == typeof ( ISpritePhysicsOutlineDataProvider ) ||
228+ type == typeof ( ITextureDataProvider ) )
229+ {
230+ return true ;
231+ }
232+ else
233+ return type . IsAssignableFrom ( GetType ( ) ) ;
202234 }
203235 }
204236}
0 commit comments