Inheritance: EditorWindow, IEditorHost
 void OnDestroy()
 {
     tk2dSpriteThumbnailCache.ReleaseSpriteThumbnailCache();
     inst = null;
 }
 void OnEnable()
 {
     inst = this;
 }
 void OnDestroy()
 {
     tk2dSpriteThumbnailCache.ReleaseSpriteThumbnailCache();
     inst = null;
 }
    void OnEnable()
    {
        inst = this;

        int MAX_PAD_AMOUNT = 17;
        extraPadAmountValues = new int[MAX_PAD_AMOUNT];
        extraPadAmountLabels = new string[MAX_PAD_AMOUNT];
        for (int i = 0; i < MAX_PAD_AMOUNT; ++i)
        {
            extraPadAmountValues[i] = i;
            extraPadAmountLabels[i] = (i==0)?"None":(i.ToString());
        }
    }
    public static void SpriteSelector(tk2dSpriteCollectionData spriteCollection, int spriteId, SpriteChangedCallback callback, object callbackData)
    {
        tk2dSpriteCollectionData newCollection = spriteCollection;
        int newSpriteId = spriteId;

        GUILayout.BeginHorizontal();

        GUILayout.BeginVertical();

        GUILayout.BeginHorizontal();
        newCollection = SpriteCollectionList("Collection", spriteCollection);

        if (newCollection != spriteCollection)
        {
            string oldSpriteName = (spriteCollection == null || spriteCollection.inst == null) ? "" : spriteCollection.inst.spriteDefinitions[spriteId].name;
            int    distance      = -1;
            for (int i = 0; i < newCollection.inst.spriteDefinitions.Length; ++i)
            {
                if (newCollection.inst.spriteDefinitions[i].Valid)
                {
                    string newSpriteName = newCollection.inst.spriteDefinitions[i].name;

                    int tmpDistance = (newSpriteName == oldSpriteName) ? 0 :
                                      Mathf.Abs((oldSpriteName.ToLower()).CompareTo(newSpriteName.ToLower()));

                    if (distance == -1 || tmpDistance < distance)
                    {
                        distance    = tmpDistance;
                        newSpriteId = i;
                    }
                }
            }
        }

        if (spriteCollection != null && GUILayout.Button("o", EditorStyles.miniButton, GUILayout.Width(18)))
        {
            EditorGUIUtility.PingObject(spriteCollection);
        }
        GUILayout.EndHorizontal();

        if (spriteCollection != null && spriteCollection.Count != 0)
        {
            if (spriteId < 0 || spriteId >= spriteCollection.Count || !spriteCollection.inst.spriteDefinitions[spriteId].Valid)
            {
                newSpriteId = spriteCollection.FirstValidDefinitionIndex;
            }

            GUILayout.BeginHorizontal();
            newSpriteId = SpriteList("Sprite", newSpriteId, spriteCollection);

            if (spriteCollection != null && spriteCollection.dataGuid != TransientGUID &&
                GUILayout.Button("e", EditorStyles.miniButton, GUILayout.Width(18), GUILayout.MaxHeight(14f)))
            {
                tk2dSpriteCollection gen = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(spriteCollection.spriteCollectionGUID), typeof(tk2dSpriteCollection)) as tk2dSpriteCollection;
                if (gen != null)
                {
                    tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup;
                    v.SetGeneratorAndSelectedSprite(gen, spriteId);
                }
            }

            GUILayout.EndHorizontal();
        }

        if (callback != null && (newCollection != spriteCollection || newSpriteId != spriteId))
        {
            callback(newCollection, newSpriteId, callbackData);
        }
        GUILayout.EndVertical();

        if (spriteCollection != null && GUILayout.Button("...", GUILayout.Height(32), GUILayout.Width(32)))
        {
            SpriteSelectorPopup(spriteCollection, spriteId, callback, callbackData);
        }

        GUILayout.EndHorizontal();
    }
 void OnEnable()
 {
     inst = this;
 }
	void DrawSettingsPanel()
	{
		// Tilemap data
		tk2dTileMapData newData = (tk2dTileMapData)EditorGUILayout.ObjectField("Tile Map Data", tileMap.data, typeof(tk2dTileMapData), false);
		if (newData != tileMap.data)
		{
			tileMap.data = newData;
			LoadTileMapData();
		}
		if (tileMap.data == null)
		{
			if (tk2dGuiUtility.InfoBoxWithButtons(
				"TileMap needs an data object to proceed. " +
				"Please create one or drag an existing data object into the inspector slot.\n",
				tk2dGuiUtility.WarningLevel.Info, 
				"Create") != -1)
			{
				string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Data", "tileMapData", "asset", "");
				if (assetPath.Length > 0)
				{
					tk2dTileMapData tileMapData = ScriptableObject.CreateInstance<tk2dTileMapData>();
					AssetDatabase.CreateAsset(tileMapData, assetPath);
					tileMap.data = tileMapData;
					EditorUtility.SetDirty(tileMap);
					
					Init(tileMapData);
					LoadTileMapData();
				}
			}
		}
		
		// Editor data
		tk2dTileMapEditorData newEditorData = (tk2dTileMapEditorData)EditorGUILayout.ObjectField("Editor Data", editorData, typeof(tk2dTileMapEditorData), false);
		if (newEditorData != editorData)
		{
			string assetPath = AssetDatabase.GetAssetPath(newEditorData);
			if (assetPath.Length > 0)
			{
				tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath);
				EditorUtility.SetDirty(tileMap);
				LoadTileMapData();
			}
		}
		if (editorData == null)
		{
			if (tk2dGuiUtility.InfoBoxWithButtons(
				"TileMap needs an editor data object to proceed. " +
				"Please create one or drag an existing data object into the inspector slot.\n",
				tk2dGuiUtility.WarningLevel.Info, 
				"Create") != -1)
			{
				string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Editor Data", "tileMapEditorData", "asset", "");
				if (assetPath.Length > 0)
				{
					tk2dTileMapEditorData tileMapEditorData = ScriptableObject.CreateInstance<tk2dTileMapEditorData>();
					AssetDatabase.CreateAsset(tileMapEditorData, assetPath);
					tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath);
					EditorUtility.SetDirty(tileMap);
					LoadTileMapData();
				}
			}
		}
		
		// Sprite collection
		GUILayout.BeginHorizontal();
		Object selectedSpriteCollectionObject = EditorGUILayout.ObjectField("Sprite Collection", tileMap.Editor__SpriteCollection, typeof(Object), false) as Object;
		if (tileMap.Editor__SpriteCollection != null && GUILayout.Button(">", EditorStyles.miniButton, GUILayout.Width(19)))
		{
			tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow( typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor" ) as tk2dSpriteCollectionEditorPopup;
			string assetPath = AssetDatabase.GUIDToAssetPath(tileMap.Editor__SpriteCollection.spriteCollectionGUID);
			var spriteCollection = AssetDatabase.LoadAssetAtPath(assetPath, typeof(tk2dSpriteCollection)) as tk2dSpriteCollection;
			v.SetGeneratorAndSelectedSprite(spriteCollection, 0);
		}
		GUILayout.EndHorizontal();
		if (selectedSpriteCollectionObject != tileMap.Editor__SpriteCollection)
		{
			string assetPath = AssetDatabase.GetAssetPath(selectedSpriteCollectionObject);
			string guid = AssetDatabase.AssetPathToGUID(assetPath);
			tk2dIndex index = tk2dEditorUtility.GetOrCreateIndex();
			
			foreach (var scIndex in index.GetSpriteCollectionIndex())
			{
				if (scIndex.spriteCollectionGUID == guid ||
					scIndex.spriteCollectionDataGUID == guid)
				{
					string realDataPath = AssetDatabase.GUIDToAssetPath(scIndex.spriteCollectionDataGUID);
					tk2dSpriteCollectionData data = AssetDatabase.LoadAssetAtPath(realDataPath, typeof(tk2dSpriteCollectionData)) as tk2dSpriteCollectionData;
					
					if (data.allowMultipleAtlases)
					{
						Debug.Log("Atlas spanning not allowed");
					}
					else
					{
						tileMap.Editor__SpriteCollection = data;
						data.InitMaterialIds();
						LoadTileMapData();
						
						EditorUtility.SetDirty(tileMap);
						
						if (Ready)
						{
							Init(tileMap.data);
							tileMap.BeginEditMode();
						}
						break;						
					}
				}
			}
		}
		
		// If not set up, don't bother drawing anything else
		if (!Ready)
			return;
		
		// this is intentionally read only
		EditorGUILayout.ObjectField("Render Data", tileMap.renderData, typeof(GameObject), false);
		GUILayout.BeginHorizontal();
		EditorGUILayout.PrefixLabel(" ");
		if (GUILayout.Button("Make Unique")) {
			tk2dEditor.TileMap.TileMapUtility.MakeUnique(tileMap);
		}
		GUILayout.EndHorizontal();
		
		// tile map size
		
		if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Dimensions, "Dimensions"))
		{
			EditorGUI.indentLevel++;
			
			width = Mathf.Clamp(EditorGUILayout.IntField("Width", width), 1, tk2dEditor.TileMap.TileMapUtility.MaxWidth);
			height = Mathf.Clamp(EditorGUILayout.IntField("Height", height), 1, tk2dEditor.TileMap.TileMapUtility.MaxHeight);
			partitionSizeX = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeX", partitionSizeX), 4, 32);
			partitionSizeY = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeY", partitionSizeY), 4, 32);
			
			// Create a default tilemap with given dimensions
			if (!tileMap.AreSpritesInitialized())
			{
				tk2dRuntime.TileMap.BuilderUtil.InitDataStore(tileMap);
				tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, tileMap.partitionSizeX, tileMap.partitionSizeY);	
			}
			
			if (width != tileMap.width || height != tileMap.height || partitionSizeX != tileMap.partitionSizeX || partitionSizeY != tileMap.partitionSizeY)
			{
				if ((width < tileMap.width || height < tileMap.height))
				{
					tk2dGuiUtility.InfoBox("The new size of the tile map is smaller than the current size." +
						"Some clipping will occur.", tk2dGuiUtility.WarningLevel.Warning);
				}
				
				GUILayout.BeginHorizontal();
				GUILayout.FlexibleSpace();
				if (GUILayout.Button("Apply", EditorStyles.miniButton))
				{
					tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, partitionSizeX, partitionSizeY);
				}
				GUILayout.EndHorizontal();
			}

			EditorGUI.indentLevel--;
		}
		
		if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Layers, "Layers"))
		{
			EditorGUI.indentLevel++;
			
			DrawLayersPanel(true);
			
			EditorGUI.indentLevel--;
		}
		
		// tilemap info
		if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Info, "Info"))
		{
			EditorGUI.indentLevel++;
			
			int numActiveChunks = 0;
			if (tileMap.Layers != null)
			{
				foreach (var layer in tileMap.Layers)
					numActiveChunks += layer.NumActiveChunks;
			}
			EditorGUILayout.LabelField("Active chunks", numActiveChunks.ToString());
			int partitionMemSize = partitionSizeX * partitionSizeY * 4;
			EditorGUILayout.LabelField("Memory", ((numActiveChunks * partitionMemSize) / 1024).ToString() + "kB" );
			
			int numActiveColorChunks = 0;
			if (tileMap.ColorChannel != null)
				numActiveColorChunks += tileMap.ColorChannel.NumActiveChunks;
			EditorGUILayout.LabelField("Active color chunks", numActiveColorChunks.ToString());
			int colorMemSize = (partitionSizeX + 1) * (partitionSizeY + 1) * 4;
			EditorGUILayout.LabelField("Memory", ((numActiveColorChunks * colorMemSize) / 1024).ToString() + "kB" );
			
			EditorGUI.indentLevel--;
		}
		
		// tile properties
		if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.TileProperties, "Tile Properties"))
		{
			EditorGUI.indentLevel++;

			// sort method
			tk2dGuiUtility.BeginChangeCheck();
			tileMap.data.tileType = (tk2dTileMapData.TileType)EditorGUILayout.EnumPopup("Tile Type", tileMap.data.tileType);
			tileMap.data.sortMethod = (tk2dTileMapData.SortMethod)EditorGUILayout.EnumPopup("Sort Method", tileMap.data.sortMethod);
			if (tk2dGuiUtility.EndChangeCheck())
			{
				tileMap.BeginEditMode();
			}
			

			// reset sizes			
			GUILayout.BeginHorizontal();
			EditorGUILayout.PrefixLabel("Reset sizes");
			GUILayout.FlexibleSpace();
			if (GUILayout.Button("Reset", EditorStyles.miniButtonRight))
			{
				Init(tileMap.data);
				Build(true);
			}
			GUILayout.EndHorizontal();

			// convert these to pixel units
			Vector3 texelSize = SpriteCollection.spriteDefinitions[0].texelSize;
			Vector3 tileOriginPixels = new Vector3(tileMap.data.tileOrigin.x / texelSize.x, tileMap.data.tileOrigin.y / texelSize.y, tileMap.data.tileOrigin.z);
			Vector3 tileSizePixels = new Vector3(tileMap.data.tileSize.x / texelSize.x, tileMap.data.tileSize.y / texelSize.y, tileMap.data.tileSize.z);
			
			Vector3 newTileOriginPixels = EditorGUILayout.Vector3Field("Origin", tileOriginPixels);
			Vector3 newTileSizePixels = EditorGUILayout.Vector3Field("Size", tileSizePixels);
			
			if (newTileOriginPixels != tileOriginPixels ||
				newTileSizePixels != tileSizePixels)
			{
				tileMap.data.tileOrigin = new Vector3(newTileOriginPixels.x * texelSize.x, newTileOriginPixels.y * texelSize.y, newTileOriginPixels.z);
				tileMap.data.tileSize = new Vector3(newTileSizePixels.x * texelSize.x, newTileSizePixels.y * texelSize.y, newTileSizePixels.z);
				Build(true);
			}

			// preview tile origin and size setting
			Vector2 spritePixelOrigin = Vector2.zero;
			Vector2 spritePixelSize = Vector2.one;
			tk2dSpriteDefinition[] spriteDefs = tileMap.SpriteCollectionInst.spriteDefinitions;
			tk2dSpriteDefinition spriteDef = (tilePropertiesPreviewIdx < spriteDefs.Length) ? spriteDefs[tilePropertiesPreviewIdx] : null;
			if (!spriteDef.Valid) spriteDef = null;
			if (spriteDef != null) {
				spritePixelOrigin = new Vector2(spriteDef.untrimmedBoundsData[0].x / spriteDef.texelSize.x, spriteDef.untrimmedBoundsData[0].y / spriteDef.texelSize.y);
				spritePixelSize = new Vector2(spriteDef.untrimmedBoundsData[1].x / spriteDef.texelSize.x, spriteDef.untrimmedBoundsData[1].y / spriteDef.texelSize.y);
			}
			float zoomFactor = (Screen.width - 32.0f) / (spritePixelSize.x * 2.0f);
			EditorGUILayout.BeginScrollView(Vector2.zero, GUILayout.Height(spritePixelSize.y * 2.0f * zoomFactor + 32.0f));
			Rect innerRect = new Rect(0, 0, spritePixelSize.x * 2.0f * zoomFactor, spritePixelSize.y * 2.0f * zoomFactor);
			tk2dGrid.Draw(innerRect);
			if (spriteDef != null) {
				// Preview tiles
				tk2dSpriteThumbnailCache.DrawSpriteTexture(new Rect(spritePixelSize.x * 0.5f * zoomFactor, spritePixelSize.y * 0.5f * zoomFactor, spritePixelSize.x * zoomFactor, spritePixelSize.y * zoomFactor), spriteDef);
				// Preview cursor
				Vector2 cursorOffset = (spritePixelSize * 0.5f - spritePixelOrigin) * zoomFactor;
				Vector2 cursorSize = new Vector2(tileSizePixels.x * zoomFactor, tileSizePixels.y * zoomFactor);
				cursorOffset.x += tileOriginPixels.x * zoomFactor;
				cursorOffset.y += tileOriginPixels.y * zoomFactor;
				cursorOffset.x += spritePixelSize.x * 0.5f * zoomFactor;
				cursorOffset.y += spritePixelSize.y * 0.5f * zoomFactor;
				float top = spritePixelSize.y * 2.0f * zoomFactor;
				Vector3[] cursorVerts = new Vector3[] {
					new Vector3(cursorOffset.x, top - cursorOffset.y, 0),
					new Vector3(cursorOffset.x + cursorSize.x, top - cursorOffset.y, 0),
					new Vector3(cursorOffset.x + cursorSize.x, top - (cursorOffset.y + cursorSize.y), 0),
					new Vector3(cursorOffset.x, top - (cursorOffset.y + cursorSize.y), 0)
				};
				Handles.DrawSolidRectangleWithOutline(cursorVerts, new Color(1.0f, 1.0f, 1.0f, 0.2f), Color.white);
			}
			if (GUILayout.Button(new GUIContent("", "Click - preview using different tile"), "label", GUILayout.Width(innerRect.width), GUILayout.Height(innerRect.height))) {
				int n = spriteDefs.Length;
				for (int i = 0; i < n; ++i) {
					if (++tilePropertiesPreviewIdx >= n)
						tilePropertiesPreviewIdx = 0;
					if (spriteDefs[tilePropertiesPreviewIdx].Valid)
						break;
				}
			}
			EditorGUILayout.EndScrollView();

			EditorGUI.indentLevel--;
		}
		
		if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.PaletteProperties, "Palette Properties"))
		{
			EditorGUI.indentLevel++;
			int newTilesPerRow = Mathf.Clamp(EditorGUILayout.IntField("Tiles Per Row", editorData.paletteTilesPerRow),
											1, SpriteCollection.Count);
			if (newTilesPerRow != editorData.paletteTilesPerRow)
			{
				guiBrushBuilder.Reset();
				
				editorData.paletteTilesPerRow = newTilesPerRow;
				editorData.CreateDefaultPalette(tileMap.SpriteCollectionInst, editorData.paletteBrush, editorData.paletteTilesPerRow);
			}
			
			GUILayout.BeginHorizontal();
			editorData.brushDisplayScale = EditorGUILayout.FloatField("Display Scale", editorData.brushDisplayScale);
			editorData.brushDisplayScale = Mathf.Clamp(editorData.brushDisplayScale, 1.0f / 16.0f, 4.0f);
			if (GUILayout.Button("Reset", EditorStyles.miniButtonRight, GUILayout.ExpandWidth(false)))
			{
				editorData.brushDisplayScale = 1.0f;
				Repaint();
			}
			GUILayout.EndHorizontal();
			
			EditorGUILayout.PrefixLabel("Preview");
			Rect innerRect = brushRenderer.GetBrushViewRect(editorData.paletteBrush, editorData.paletteTilesPerRow);
			paletteSettingsScrollPos = EditorGUILayout.BeginScrollView(paletteSettingsScrollPos, GUILayout.MinHeight(innerRect.height * editorData.brushDisplayScale + 32.0f));
			innerRect.width *= editorData.brushDisplayScale;
			innerRect.height *= editorData.brushDisplayScale;
			tk2dGrid.Draw(innerRect);
			brushRenderer.DrawBrush(tileMap, editorData.paletteBrush, editorData.brushDisplayScale, true, editorData.paletteTilesPerRow);
			EditorGUILayout.EndScrollView();
			EditorGUI.indentLevel--;
		}

		if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Import, "Import"))
		{
			EditorGUI.indentLevel++;
			
			if (GUILayout.Button("Import TMX"))
			{
				if (tk2dEditor.TileMap.Importer.Import(tileMap, tk2dEditor.TileMap.Importer.Format.TMX)) 
				{
					Build(true);	
					width = tileMap.width;
					height = tileMap.height;
					partitionSizeX = tileMap.partitionSizeX;
					partitionSizeY = tileMap.partitionSizeY;
				}
			}
			
			EditorGUI.indentLevel--;
		}
	}
    public static void SpriteSelector(tk2dSpriteCollectionData spriteCollection, int spriteId, SpriteChangedCallback callback, object callbackData)
    {
        tk2dSpriteCollectionData newCollection = spriteCollection;
        int newSpriteId = spriteId;

        GUILayout.BeginHorizontal();

        GUILayout.BeginVertical();

        GUILayout.BeginHorizontal();
        newCollection = SpriteCollectionList("Collection", newCollection);

        if (newCollection != spriteCollection)
        {
            newSpriteId = GetNamedSpriteInNewCollection(spriteCollection, spriteId, newCollection);
        }

        if (showOpenEditShortcuts && newCollection != null && GUILayout.Button("o", EditorStyles.miniButton, GUILayout.Width(18)))
        {
            EditorGUIUtility.PingObject(newCollection);
        }
        GUILayout.EndHorizontal();

        if (newCollection != null && newCollection.Count != 0)
        {
            if (newSpriteId < 0 || newSpriteId >= newCollection.Count || !newCollection.inst.spriteDefinitions[newSpriteId].Valid)
            {
                newSpriteId = newCollection.FirstValidDefinitionIndex;
            }

            GUILayout.BeginHorizontal();
            newSpriteId = SpriteList("Sprite", newSpriteId, newCollection);

            if (showOpenEditShortcuts &&
                newCollection != null && newCollection.dataGuid != TransientGUID &&
                GUILayout.Button("e", EditorStyles.miniButton, GUILayout.Width(18), GUILayout.MaxHeight(14f)))
            {
                tk2dSpriteCollection gen = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(newCollection.spriteCollectionGUID), typeof(tk2dSpriteCollection)) as tk2dSpriteCollection;
                if (gen != null)
                {
                    tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup;
                    v.SetGeneratorAndSelectedSprite(gen, newSpriteId);
                    v.Show();
                }
            }

            GUILayout.EndHorizontal();
        }

        GUILayout.EndVertical();

        if (newCollection != null && GUILayout.Button("...", GUILayout.Height(32), GUILayout.Width(32)))
        {
            SpriteSelectorPopup(newCollection, newSpriteId, callback, callbackData);
        }

        GUILayout.EndHorizontal();

        // Handle drag and drop
        Rect rect = GUILayoutUtility.GetLastRect();

        if (rect.Contains(Event.current.mousePosition))
        {
            if (Event.current.type == EventType.DragUpdated)
            {
                bool valid = false;
                if (DragAndDrop.objectReferences.Length == 1 && DragAndDrop.objectReferences[0] is GameObject)
                {
                    GameObject go = DragAndDrop.objectReferences[0] as GameObject;
                    if (go.GetComponent <tk2dSpriteCollection>() || go.GetComponent <tk2dSpriteCollectionData>())
                    {
                        valid = true;
                    }
                    Event.current.Use();
                }

                if (valid)
                {
                    DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
                }
                else
                {
                    DragAndDrop.visualMode = DragAndDropVisualMode.None;
                }
                Event.current.Use();
            }
            else if (Event.current.type == EventType.DragPerform)
            {
                DragAndDrop.visualMode = DragAndDropVisualMode.None;
                Event.current.Use();

                GameObject               go  = DragAndDrop.objectReferences[0] as GameObject;
                tk2dSpriteCollection     sc  = go.GetComponent <tk2dSpriteCollection>();
                tk2dSpriteCollectionData scd = go.GetComponent <tk2dSpriteCollectionData>();
                if (sc != null && scd == null)
                {
                    scd = sc.spriteCollection;
                }
                if (scd != null)
                {
                    newCollection = scd;
                    if (newCollection != spriteCollection)
                    {
                        newSpriteId = GetNamedSpriteInNewCollection(spriteCollection, spriteId, newCollection);
                    }
                }
            }
        }

        // Final callback
        if (callback != null && (newCollection != spriteCollection || newSpriteId != spriteId))
        {
            callback(newCollection, newSpriteId, callbackData);
        }
    }
Beispiel #9
0
    void DrawSettingsPanel()
    {
        // Tilemap data
        tk2dTileMapData newData = (tk2dTileMapData)EditorGUILayout.ObjectField("Tile Map Data", tileMap.data, typeof(tk2dTileMapData), false);

        if (newData != tileMap.data)
        {
            tileMap.data = newData;
            LoadTileMapData();
        }
        if (tileMap.data == null)
        {
            if (tk2dGuiUtility.InfoBoxWithButtons(
                    "TileMap needs an data object to proceed. " +
                    "Please create one or drag an existing data object into the inspector slot.\n",
                    tk2dGuiUtility.WarningLevel.Info,
                    "Create") != -1)
            {
                string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Data", "tileMapData", "asset", "");
                if (assetPath.Length > 0)
                {
                    tk2dTileMapData tileMapData = ScriptableObject.CreateInstance <tk2dTileMapData>();
                    AssetDatabase.CreateAsset(tileMapData, assetPath);
                    tileMap.data = tileMapData;
                    EditorUtility.SetDirty(tileMap);

                    Init(tileMapData);
                    LoadTileMapData();
                }
            }
        }

        // Editor data
        tk2dTileMapEditorData newEditorData = (tk2dTileMapEditorData)EditorGUILayout.ObjectField("Editor Data", editorData, typeof(tk2dTileMapEditorData), false);

        if (newEditorData != editorData)
        {
            string assetPath = AssetDatabase.GetAssetPath(newEditorData);
            if (assetPath.Length > 0)
            {
                tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath);
                EditorUtility.SetDirty(tileMap);
                LoadTileMapData();
            }
        }
        if (editorData == null)
        {
            if (tk2dGuiUtility.InfoBoxWithButtons(
                    "TileMap needs an editor data object to proceed. " +
                    "Please create one or drag an existing data object into the inspector slot.\n",
                    tk2dGuiUtility.WarningLevel.Info,
                    "Create") != -1)
            {
                string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Editor Data", "tileMapEditorData", "asset", "");
                if (assetPath.Length > 0)
                {
                    tk2dTileMapEditorData tileMapEditorData = ScriptableObject.CreateInstance <tk2dTileMapEditorData>();
                    AssetDatabase.CreateAsset(tileMapEditorData, assetPath);
                    tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath);
                    EditorUtility.SetDirty(tileMap);
                    LoadTileMapData();
                }
            }
        }

        // Sprite collection
        GUILayout.BeginHorizontal();
        Object selectedSpriteCollectionObject = EditorGUILayout.ObjectField("Sprite Collection", tileMap.Editor__SpriteCollection, typeof(Object), false) as Object;

        if (tileMap.Editor__SpriteCollection != null && GUILayout.Button(">", EditorStyles.miniButton, GUILayout.Width(19)))
        {
            tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup;
            string assetPath        = AssetDatabase.GUIDToAssetPath(tileMap.Editor__SpriteCollection.spriteCollectionGUID);
            var    spriteCollection = AssetDatabase.LoadAssetAtPath(assetPath, typeof(tk2dSpriteCollection)) as tk2dSpriteCollection;
            v.SetGeneratorAndSelectedSprite(spriteCollection, 0);
        }
        GUILayout.EndHorizontal();
        if (selectedSpriteCollectionObject != tileMap.Editor__SpriteCollection)
        {
            string    assetPath = AssetDatabase.GetAssetPath(selectedSpriteCollectionObject);
            string    guid      = AssetDatabase.AssetPathToGUID(assetPath);
            tk2dIndex index     = tk2dEditorUtility.GetOrCreateIndex();

            foreach (var scIndex in index.GetSpriteCollectionIndex())
            {
                if (scIndex.spriteCollectionGUID == guid ||
                    scIndex.spriteCollectionDataGUID == guid)
                {
                    string realDataPath           = AssetDatabase.GUIDToAssetPath(scIndex.spriteCollectionDataGUID);
                    tk2dSpriteCollectionData data = AssetDatabase.LoadAssetAtPath(realDataPath, typeof(tk2dSpriteCollectionData)) as tk2dSpriteCollectionData;

                    if (data.allowMultipleAtlases)
                    {
                        Debug.Log("Atlas spanning not allowed");
                    }
                    else
                    {
                        tileMap.Editor__SpriteCollection = data;
                        data.InitMaterialIds();
                        LoadTileMapData();

                        EditorUtility.SetDirty(tileMap);

                        if (Ready)
                        {
                            Init(tileMap.data);
                            tileMap.BeginEditMode();
                        }
                        break;
                    }
                }
            }
        }

        // If not set up, don't bother drawing anything else
        if (!Ready)
        {
            return;
        }

        // this is intentionally read only
        EditorGUILayout.ObjectField("Render Data", tileMap.renderData, typeof(GameObject), false);
        GUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel(" ");
        if (GUILayout.Button("Make Unique"))
        {
            tk2dRuntime.TileMap.BuilderUtil.CleanRenderData(tileMap);
            tileMap.renderData = null;
        }
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel(" ");
        if (!tileMap.serializeRenderData && GUILayout.Button("Make Serializable"))
        {
            if (tileMap.serializeRenderData == true)
            {
                tk2dRuntime.TileMap.BuilderUtil.CleanRenderData(tileMap);                 // clear everything (i.e. all serialized meshes will be back in "serializedMeshes")
                tileMap.serializeRenderData = false;
            }

            string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Render Data", "Tilemap Render Data 1", "asset",
                                                                    "Select an asset file to save the render data to.\n" +
                                                                    "It is best to save this in an empty directory, as the tilemap may contain more than one mesh");
            if (assetPath.Length > 0)
            {
                tileMap.serializeRenderData = true;
                tileMap.serializedMeshPath  = assetPath;
                if (tileMap.renderData)
                {
                    List <Mesh>    existingMeshes = new List <Mesh>();
                    MeshFilter[]   meshFilters    = tileMap.renderData.GetComponentsInChildren <MeshFilter>();
                    MeshCollider[] meshColliders  = tileMap.renderData.GetComponentsInChildren <MeshCollider>();
                    foreach (var j in meshFilters)
                    {
                        existingMeshes.Add(j.sharedMesh);
                    }
                    foreach (var j in meshColliders)
                    {
                        existingMeshes.Add(j.sharedMesh);
                    }

                    existingMeshes.RemoveAll(a => a == null);
                    foreach (var j in existingMeshes)
                    {
                        j.RecalculateNormals();                         // normals are likely to be missing here
                        AssetDatabase.CreateAsset(j, AssetDatabase.GenerateUniqueAssetPath(tileMap.serializedMeshPath));
                    }
                }
            }
        }
        if (tileMap.serializeRenderData)
        {
            if (GUILayout.Toggle(true, "Serialized", "button") == false)
            {
                GameObject.DestroyImmediate(tileMap.renderData);
                tileMap.renderData          = null;
                tileMap.serializeRenderData = false;

                Build(true);
            }
        }
        GUILayout.EndHorizontal();

        // tile map size

        if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Dimensions, "Dimensions"))
        {
            EditorGUI.indentLevel++;

            width          = Mathf.Clamp(EditorGUILayout.IntField("Width", width), 1, tk2dEditor.TileMap.TileMapUtility.MaxWidth);
            height         = Mathf.Clamp(EditorGUILayout.IntField("Height", height), 1, tk2dEditor.TileMap.TileMapUtility.MaxHeight);
            partitionSizeX = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeX", partitionSizeX), 4, 32);
            partitionSizeY = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeY", partitionSizeY), 4, 32);

            // Create a default tilemap with given dimensions
            if (!tileMap.AreSpritesInitialized())
            {
                tk2dRuntime.TileMap.BuilderUtil.InitDataStore(tileMap);
                tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, tileMap.partitionSizeX, tileMap.partitionSizeY);
            }

            if (width != tileMap.width || height != tileMap.height || partitionSizeX != tileMap.partitionSizeX || partitionSizeY != tileMap.partitionSizeY)
            {
                if ((width < tileMap.width || height < tileMap.height))
                {
                    tk2dGuiUtility.InfoBox("The new size of the tile map is smaller than the current size." +
                                           "Some clipping will occur.", tk2dGuiUtility.WarningLevel.Warning);
                }

                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Apply", EditorStyles.miniButton))
                {
                    tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, partitionSizeX, partitionSizeY);
                }
                GUILayout.EndHorizontal();
            }

            EditorGUI.indentLevel--;
        }

        if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Layers, "Layers"))
        {
            EditorGUI.indentLevel++;

            DrawLayersPanel(true);

            EditorGUI.indentLevel--;
        }

        // tilemap info
        if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Info, "Info"))
        {
            EditorGUI.indentLevel++;

            int numActiveChunks = 0;
            if (tileMap.Layers != null)
            {
                foreach (var layer in tileMap.Layers)
                {
                    numActiveChunks += layer.NumActiveChunks;
                }
            }
            EditorGUILayout.LabelField("Active chunks", numActiveChunks.ToString());
            int partitionMemSize = partitionSizeX * partitionSizeY * 4;
            EditorGUILayout.LabelField("Memory", ((numActiveChunks * partitionMemSize) / 1024).ToString() + "kB");

            int numActiveColorChunks = 0;
            if (tileMap.ColorChannel != null)
            {
                numActiveColorChunks += tileMap.ColorChannel.NumActiveChunks;
            }
            EditorGUILayout.LabelField("Active color chunks", numActiveColorChunks.ToString());
            int colorMemSize = (partitionSizeX + 1) * (partitionSizeY + 1) * 4;
            EditorGUILayout.LabelField("Memory", ((numActiveColorChunks * colorMemSize) / 1024).ToString() + "kB");

            EditorGUI.indentLevel--;
        }

        // tile properties
        if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.TileProperties, "Tile Properties"))
        {
            EditorGUI.indentLevel++;

            // sort method
            tk2dGuiUtility.BeginChangeCheck();
            tileMap.data.tileType   = (tk2dTileMapData.TileType)EditorGUILayout.EnumPopup("Tile Type", tileMap.data.tileType);
            tileMap.data.sortMethod = (tk2dTileMapData.SortMethod)EditorGUILayout.EnumPopup("Sort Method", tileMap.data.sortMethod);
            if (tk2dGuiUtility.EndChangeCheck())
            {
                tileMap.BeginEditMode();
            }


            // reset sizes
            GUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Reset sizes");
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Reset", EditorStyles.miniButtonRight))
            {
                Init(tileMap.data);
                Build(true);
            }
            GUILayout.EndHorizontal();

            // convert these to pixel units
            Vector3 texelSize        = SpriteCollection.spriteDefinitions[0].texelSize;
            Vector3 tileOriginPixels = new Vector3(tileMap.data.tileOrigin.x / texelSize.x, tileMap.data.tileOrigin.y / texelSize.y, tileMap.data.tileOrigin.z);
            Vector3 tileSizePixels   = new Vector3(tileMap.data.tileSize.x / texelSize.x, tileMap.data.tileSize.y / texelSize.y, tileMap.data.tileSize.z);

            Vector3 newTileOriginPixels = EditorGUILayout.Vector3Field("Origin", tileOriginPixels);
            Vector3 newTileSizePixels   = EditorGUILayout.Vector3Field("Size", tileSizePixels);

            if (newTileOriginPixels != tileOriginPixels ||
                newTileSizePixels != tileSizePixels)
            {
                tileMap.data.tileOrigin = new Vector3(newTileOriginPixels.x * texelSize.x, newTileOriginPixels.y * texelSize.y, newTileOriginPixels.z);
                tileMap.data.tileSize   = new Vector3(newTileSizePixels.x * texelSize.x, newTileSizePixels.y * texelSize.y, newTileSizePixels.z);
                Build(true);
            }
            EditorGUI.indentLevel--;
        }

        if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.PaletteProperties, "Palette Properties"))
        {
            EditorGUI.indentLevel++;
            int newTilesPerRow = Mathf.Clamp(EditorGUILayout.IntField("Tiles Per Row", editorData.paletteTilesPerRow),
                                             1, SpriteCollection.Count);
            if (newTilesPerRow != editorData.paletteTilesPerRow)
            {
                guiBrushBuilder.Reset();

                editorData.paletteTilesPerRow = newTilesPerRow;
                editorData.CreateDefaultPalette(tileMap.SpriteCollectionInst, editorData.paletteBrush, editorData.paletteTilesPerRow);
            }

            GUILayout.BeginHorizontal();
            editorData.brushDisplayScale = EditorGUILayout.FloatField("Display Scale", editorData.brushDisplayScale);
            editorData.brushDisplayScale = Mathf.Clamp(editorData.brushDisplayScale, 1.0f / 16.0f, 4.0f);
            if (GUILayout.Button("Reset", EditorStyles.miniButtonRight, GUILayout.ExpandWidth(false)))
            {
                editorData.brushDisplayScale = 1.0f;
                Repaint();
            }
            GUILayout.EndHorizontal();

            EditorGUILayout.PrefixLabel("Preview");
            brushRenderer.DrawBrush(tileMap, editorData.paletteBrush, editorData.brushDisplayScale, true, editorData.paletteTilesPerRow);
            EditorGUI.indentLevel--;
        }

        if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Import, "Import"))
        {
            EditorGUI.indentLevel++;

            if (GUILayout.Button("Import TMX"))
            {
                if (tk2dEditor.TileMap.Importer.Import(tileMap, tk2dEditor.TileMap.Importer.Format.TMX))
                {
                    Build(true);
                    width          = tileMap.width;
                    height         = tileMap.height;
                    partitionSizeX = tileMap.partitionSizeX;
                    partitionSizeY = tileMap.partitionSizeY;
                }
            }

            EditorGUI.indentLevel--;
        }
    }
    public override void OnInspectorGUI()
    {
        tk2dSpriteCollection gen = (tk2dSpriteCollection)target;

        GUILayout.BeginVertical();
        GUILayout.Space(8);

        if (gen.managedSpriteCollection)
        {
            string label         = showDefaultInspector?"Hide Default Inspector":"Show Default Inspector";
            int    buttonPressed = tk2dGuiUtility.InfoBoxWithButtons("This is a managed sprite collection. Please do not modify.",
                                                                     tk2dGuiUtility.WarningLevel.Info,
                                                                     new string[] { label });
            if (buttonPressed == 0)
            {
                showDefaultInspector = !showDefaultInspector;
            }
            if (showDefaultInspector)
            {
                GUILayout.Space(16);
                DrawDefaultInspector();
            }
        }
        else
        {
            string assetPath   = AssetDatabase.GetAssetPath(gen).ToLower();
            bool   inResources = assetPath.IndexOf("/resources/") != -1;

            if (inResources)
            {
                string msg = "Sprite collection is in a resources directory. " +
                             "All source textures will be included in build.\n\n" +
                             "Editor is disabled. Move it out of the resources directory to continue.";
                tk2dGuiUtility.InfoBox(msg, tk2dGuiUtility.WarningLevel.Error);
            }
            else
            {
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Open Editor...", GUILayout.MinWidth(120)))
                {
                    if (gen.name == defaultSpriteCollectionName)
                    {
                        EditorUtility.DisplayDialog("Invalid Sprite Collection name", "Please rename sprite collection before proceeding", "Ok");
                    }
                    else
                    {
                        tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), true, "SpriteCollection") as tk2dSpriteCollectionEditorPopup;
                        v.SetGenerator(gen);
                        v.Show();
                    }
                }
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
            }
        }

        EditorGUILayout.EndVertical();

        GUILayout.Space(64);

        if (viewData && !(gen.managedSpriteCollection && showDefaultInspector))
        {
            DrawDefaultInspector();
            return;
        }
    }
    protected void DrawSpriteEditorGUI(tk2dBaseSprite sprite)
    {
        // maybe cache this if its too slow later
        if (generatorCache.all == null || generatorCache.current != sprite.collection)
        {
            generatorCache.all = tk2dEditorUtility.GetOrCreateIndex().GetSpriteCollectionIndex();
            if (generatorCache.all != null)
            {
                string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(sprite.collection));

                for (int i = 0; i < generatorCache.all.Length; ++i)
                {
                    if (generatorCache.all[i].spriteCollectionDataGUID == guid)
                    {
                        generatorCache.current     = sprite.collection;
                        generatorCache.currentGUID = guid;
                        break;
                    }
                }
            }
        }

        if (generatorCache.all == null)
        {
            EditorGUILayout.LabelField("Collection", "Error");
        }
        else
        {
            string[] collNames = new string[generatorCache.all.Length];
            int      selIndex  = -1;
            for (int i = 0; i < generatorCache.all.Length; ++i)
            {
                collNames[i] = generatorCache.all[i].name;
                if (generatorCache.all[i].spriteCollectionDataGUID == generatorCache.currentGUID)
                {
                    selIndex = i;
                }
            }

            EditorGUILayout.BeginHorizontal();

            int newIndex = EditorGUILayout.Popup("Collection", (selIndex != -1) ? selIndex : 0, collNames);
            if (newIndex != selIndex)
            {
                generatorCache.currentGUID = generatorCache.all[newIndex].spriteCollectionDataGUID;
                GameObject go = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(generatorCache.currentGUID), typeof(GameObject)) as GameObject;
                tk2dSpriteCollectionData data = go.GetComponent <tk2dSpriteCollectionData>();
                if (data != null)
                {
                    generatorCache.current = data;
                    int newId = (sprite.spriteId >= generatorCache.current.Count)?0:sprite.spriteId;

                    sprite.SwitchCollectionAndSprite(generatorCache.current, newId);
                    sprite.EditMode__CreateCollider();
                }
            }

            if (GUILayout.Button("Edit...", GUILayout.MaxWidth(40f), GUILayout.MaxHeight(14f)))
            {
                tk2dSpriteCollection gen = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(generatorCache.current.spriteCollectionGUID), typeof(tk2dSpriteCollection)) as tk2dSpriteCollection;
                if (gen != null)
                {
                    tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup;
                    v.SetGeneratorAndSelectedSprite(gen, sprite.spriteId);
                }
            }

            EditorGUILayout.EndHorizontal();
        }

        if (sprite.collection)
        {
            // sanity check sprite id
            if (sprite.spriteId < 0 || sprite.spriteId >= sprite.collection.Count)
            {
                sprite.spriteId = 0;
                sprite.EditMode__CreateCollider();
            }

            int newSpriteId = sprite.spriteId;

            if (generatorCache.current)
            {
                newSpriteId = tk2dEditorUtility.SpriteSelectorPopup("Sprite", sprite.spriteId, generatorCache.current);

                if (tk2dPreferences.inst.displayTextureThumbs)
                {
                    if (generatorCache.current.version < 1)
                    {
                        GUILayout.Label("No thumbnail data.\nPlease rebuild Sprite Collection.");
                    }
                    else
                    {
                        var tex = tk2dSpriteThumbnailCache.GetThumbnailTexture(generatorCache.current, sprite.spriteId);
                        if (tex)
                        {
                            float w       = tex.width;
                            float h       = tex.height;
                            float maxSize = 128.0f;
                            if (w > maxSize)
                            {
                                h = h / w * maxSize;
                                w = maxSize;
                            }

                            Rect r = GUILayoutUtility.GetRect(w, h);
                            GUI.DrawTexture(r, tex, ScaleMode.ScaleToFit);
                            //GUILayout.Box(tex, GUILayout.Width(w), GUILayout.Height(h));
                        }
                    }
                }
            }
            else
            {
                newSpriteId = EditorGUILayout.IntSlider(sprite.spriteId, 0, sprite.collection.Count - 1);
            }

            if (newSpriteId != sprite.spriteId)
            {
                sprite.spriteId = newSpriteId;
                sprite.EditMode__CreateCollider();
                GUI.changed = true;
            }

            sprite.color = EditorGUILayout.ColorField("Color", sprite.color);
            Vector3 newScale = EditorGUILayout.Vector3Field("Scale", sprite.scale);
            if (newScale != sprite.scale)
            {
                sprite.scale = newScale;
                sprite.EditMode__CreateCollider();
            }

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("HFlip"))
            {
                Vector3 s = sprite.scale;
                s.x         *= -1.0f;
                sprite.scale = s;
                GUI.changed  = true;
            }
            if (GUILayout.Button("VFlip"))
            {
                Vector3 s = sprite.scale;
                s.y         *= -1.0f;
                sprite.scale = s;
                GUI.changed  = true;
            }

            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button(new GUIContent("Reset Scale", "Set scale to 1")))
            {
                Vector3 s = sprite.scale;
                s.x          = Mathf.Sign(s.x);
                s.y          = Mathf.Sign(s.y);
                s.z          = Mathf.Sign(s.z);
                sprite.scale = s;
                GUI.changed  = true;
            }

            if (GUILayout.Button(new GUIContent("Bake Scale", "Transfer scale from transform.scale -> sprite")))
            {
                tk2dScaleUtility.Bake(sprite.transform);
                GUI.changed = true;
            }

            GUIContent pixelPerfectButton = new GUIContent("1:1", "Make Pixel Perfect");
            if (GUILayout.Button(pixelPerfectButton))
            {
                if (tk2dPixelPerfectHelper.inst)
                {
                    tk2dPixelPerfectHelper.inst.Setup();
                }
                sprite.MakePixelPerfect();
                GUI.changed = true;
            }

            sprite.pixelPerfect = GUILayout.Toggle(sprite.pixelPerfect, new GUIContent("Always", "Always keep pixel perfect"), GUILayout.Width(60.0f));
            EditorGUILayout.EndHorizontal();
        }
        else
        {
            EditorGUILayout.IntSlider("Need a collection bound", 0, 0, 1);
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(sprite);
        }
    }