public RagePixelRow AddRow(int key, int index, int pixelSizeX, int pixelSizeY) { RagePixelRow newRow = new RagePixelRow(); newRow.key = key; newRow.pixelSizeX = pixelSizeX; newRow.pixelSizeY = pixelSizeY; newRow.newPixelSizeX = pixelSizeX; newRow.newPixelSizeY = pixelSizeY; RagePixelRow[] tmpArr = new RagePixelRow[rows.Length + 1]; for (int i = 0; i < tmpArr.Length; i++) { if (i < index) { tmpArr[i] = rows[i]; } else if (i == index) { tmpArr[i] = newRow; } else if (i > 0) { tmpArr[i] = rows[i-1]; } } rows = tmpArr; return newRow; }
public static void ImportRowFromSheetTexture( RagePixelSpriteSheet spritesheet, RagePixelRow destRow, Texture2D tex, int importSpriteWidth, int importSpriteHeight, bool importSpriteTopLeft ) { int framesWide = tex.width / importSpriteWidth; int framesHigh = tex.height / importSpriteHeight; int cellCount = framesWide * framesHigh; destRow.Clear(); //loop to allocate cell space for (int i = 0; i < cellCount; i++) { destRow.InsertCell(i, RagePixelUtil.RandomKey()); } RebuildAtlas(spritesheet, true, "Import row from spritesheet"); float importUVPerFrameW = 1.0f / framesWide; float importUVPerFrameH = 1.0f / framesHigh; Texture2D spritesheetTexture = spritesheet.atlas.GetTexture("_MainTex") as Texture2D; //loop to copy texture to UVs for (int i = 0; i < cellCount; i++) { int y = i / framesWide; int x = i - (y * framesWide); Rect importUVs = new Rect(x * importUVPerFrameW, (importSpriteTopLeft ? (framesHigh - 1 - y) : y) * importUVPerFrameH, importUVPerFrameW, importUVPerFrameH); Rect uvs = destRow.cells[i].uv; RagePixelUtil.CopyPixels(tex, importUVs, spritesheetTexture, uvs); } }
public void MoveRow(int fromIndex, int toIndex) { if (fromIndex >= 0 && fromIndex < rows.Length && toIndex >= 0 && toIndex <= rows.Length) { RagePixelRow[] tmpArr = new RagePixelRow[rows.Length]; for (int i = 0; i < tmpArr.Length; i++) { if (i == toIndex) { tmpArr[toIndex] = rows[fromIndex]; } else if (i < fromIndex && i < toIndex || i > fromIndex && i > toIndex) { tmpArr[i] = rows[i]; } else if (i >= fromIndex && i < toIndex) { tmpArr[i] = rows[i + 1]; } else if (i <= fromIndex && i > toIndex) { tmpArr[i] = rows[i - 1]; } } rows = tmpArr; } }
public static RagePixelSpriteSheet CreateNewSpritesheet() { RagePixelSpriteSheet spriteSheet = ScriptableObject.CreateInstance("RagePixelSpriteSheet") as RagePixelSpriteSheet; int cnt = 1; string path = defaultSpritesheetPath + assetDatabaseDirSeparatorChar + "spritesheet_" + cnt.ToString() + ".asset"; while (File.Exists(path)) { cnt++; path = defaultSpritesheetPath + assetDatabaseDirSeparatorChar + "spritesheet_" + cnt.ToString() + ".asset"; } spriteSheet.name = "spritesheet_" + cnt.ToString(); spriteSheet.atlas = CreateNewAtlas(defaultAtlasSize, spriteSheet.name); if (!Directory.Exists(defaultSpritesheetPath)) { Directory.CreateDirectory(defaultSpritesheetPath); } RagePixelRow row = spriteSheet.AddRow(RandomKey(), defaultSpriteSize, defaultSpriteSize); int newKey = RandomKey(); row.InsertCell(0, newKey); row.cells[0].uv = new Rect(0f, 0f, 1f, 1f); AssetDatabase.CreateAsset(spriteSheet, path); //spriteSheet.hideFlags = HideFlags.DontSave; AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); return(spriteSheet); }
public RagePixelRow AddRow(int key, int index, int pixelSizeX, int pixelSizeY) { RagePixelRow newRow = new RagePixelRow(); newRow.key = key; newRow.pixelSizeX = pixelSizeX; newRow.pixelSizeY = pixelSizeY; newRow.newPixelSizeX = pixelSizeX; newRow.newPixelSizeY = pixelSizeY; RagePixelRow[] tmpArr = new RagePixelRow[rows.Length + 1]; for (int i = 0; i < tmpArr.Length; i++) { if (i < index) { tmpArr[i] = rows[i]; } else if (i == index) { tmpArr[i] = newRow; } else if (i > 0) { tmpArr[i] = rows[i - 1]; } } rows = tmpArr; return(newRow); }
public Color[] getImage(int rowIndex, int cellIndex, int left, int top, int width, int height) { Texture2D src = atlas.GetTexture("_MainTex") as Texture2D; RagePixelRow row = rows[Mathf.Clamp(rowIndex, 0, rows.Length - 1)]; if (row.cells.Length > cellIndex) { if (row.cells[cellIndex] != null && src != null) { Color[] pixels = new Color[width * height]; if (top + height <= row.pixelSizeY && left + width <= row.pixelSizeX) { for (int y = top; y < top + height; y++) { for (int x = left; x < left + width; x++) { int srcX = Mathf.Clamp(Mathf.FloorToInt((float)src.width * row.cells[cellIndex].uv.x) + Mathf.FloorToInt((float)x), 0, src.width - 1); int srcY = Mathf.Clamp(Mathf.FloorToInt((float)src.height * row.cells[cellIndex].uv.y) + Mathf.FloorToInt((float)y), 0, src.height - 1); pixels[(x - left) + (y - top) * width] = src.GetPixel(srcX, srcY); } } return(pixels); } else { //Debug.Log("top:" + top + ", height:" + height + ", left:" + left + ", width:" + width + ", pixelsizeX:" + row.pixelSizeX + ", pixelsizeY:" + row.pixelSizeY); } } } return(new Color[0]); }
public Color[] getImage(int rowIndex, int cellIndex) { Texture2D src = atlas.GetTexture("_MainTex") as Texture2D; RagePixelRow row = rows[Mathf.Clamp(rowIndex, 0, rows.Length - 1)]; if (row.cells.Length > cellIndex) { if (row.cells[cellIndex] != null && src != null) { Color[] pixels = new Color[row.pixelSizeX * row.pixelSizeY]; for (int y = 0; y < row.pixelSizeY; y++) { for (int x = 0; x < row.pixelSizeX; x++) { int srcX = Mathf.Clamp(Mathf.FloorToInt((float)src.width * row.cells[cellIndex].uv.x) + Mathf.FloorToInt((float)x), 0, src.width - 1); int srcY = Mathf.Clamp(Mathf.FloorToInt((float)src.height * row.cells[cellIndex].uv.y) + Mathf.FloorToInt((float)y), 0, src.height - 1); pixels[x + y * row.pixelSizeX] = src.GetPixel(srcX, srcY); } } return(pixels); } } return(new Color[0]); }
public Color[] getPreviewImage(int rowIndex, int cellIndex, int width, int height, bool selected, Color selectedBorder) { Texture2D src = atlas.GetTexture("_MainTex") as Texture2D; Color[] pixels = new Color[width * height]; RagePixelRow row = rows[Mathf.Clamp(rowIndex, 0, rows.Length - 1)]; if (row.cells.Length > cellIndex) { if (row.cells[cellIndex] != null && src != null) { float ratioX = row.pixelSizeX >= row.pixelSizeY ? (float)row.pixelSizeX / (float)width : (float)row.pixelSizeY / (float)width; float ratioY = row.pixelSizeX >= row.pixelSizeY ? (float)row.pixelSizeX / (float)height : (float)row.pixelSizeY / (float)height; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int srcX = Mathf.Clamp(Mathf.FloorToInt((float)src.width * row.cells[cellIndex].uv.x) + Mathf.FloorToInt((float)x * ratioX), 0, src.width - 1); int srcY = Mathf.Clamp(Mathf.FloorToInt((float)src.height * row.cells[cellIndex].uv.y) + Mathf.FloorToInt((float)y * ratioY), 0, src.height - 1); if (srcX <= Mathf.FloorToInt((float)src.width * (row.cells[cellIndex].uv.x + row.cells[cellIndex].uv.width)) && srcY <= Mathf.FloorToInt((float)src.height * (row.cells[cellIndex].uv.y + row.cells[cellIndex].uv.height))) { pixels[x + y * width] = selected ? src.GetPixel(srcX, srcY) : src.GetPixel(srcX, srcY) * 0.5f; } else { pixels[x + y * width] = new Color(0f, 0f, 0f, 0f); } } } if (selected) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (x == 0 || x == width - 1 || y == 0 || y == height - 1) { pixels[x + y * width] = selectedBorder; } } } } } } return(pixels); }
public Color replaceColor(Color32[] before, Color oldColor, Color newColor, RagePixelRow targetRow) { Texture2D src = atlas.GetTexture("_MainTex") as Texture2D; src.SetPixels32(before); int width = src.width; int height = src.height; Color newActualColor = newColor; bool actualNewColorPicked = false; int sampleX = -1; int sampleY = -1; foreach (RagePixelCell cell in targetRow.cells) { int cellXMin = Mathf.FloorToInt(cell.uv.xMin * width); int cellYMin = Mathf.FloorToInt(cell.uv.yMin * height); int cellXMax = Mathf.FloorToInt(cell.uv.xMax * width); int cellYMax = Mathf.FloorToInt(cell.uv.yMax * height); for (int y = cellYMin; y < cellYMax; y++) { for (int x = cellXMin; x < cellXMax; x++) { if (src.GetPixel(x, y) == oldColor) { src.SetPixel(x, y, newColor); if (!actualNewColorPicked) { actualNewColorPicked = true; sampleX = x; sampleY = y; //newActualColor = src.GetPixel(x, y); //newActualColor = newColor; } } } } } src.Apply(); if (actualNewColorPicked) { newActualColor = src.GetPixel(sampleX, sampleY); } return(newActualColor); }
public RagePixelRow AddRow(int key, int pixelSizeX, int pixelSizeY) { RagePixelRow newRow = new RagePixelRow(); newRow.key = key; newRow.pixelSizeX = pixelSizeX; newRow.pixelSizeY = pixelSizeY; newRow.newPixelSizeX = pixelSizeX; newRow.newPixelSizeY = pixelSizeY; Array.Resize(ref _rows, rows.Length + 1); rows[rows.Length - 1] = newRow; return(newRow); }
public RagePixelRow AddRow(int key, int pixelSizeX, int pixelSizeY) { RagePixelRow newRow = new RagePixelRow(); newRow.key = key; newRow.pixelSizeX = pixelSizeX; newRow.pixelSizeY = pixelSizeY; newRow.newPixelSizeX = pixelSizeX; newRow.newPixelSizeY = pixelSizeY; Array.Resize(ref _rows, rows.Length + 1); rows[rows.Length - 1] = newRow; return newRow; }
public void UpdateSprite(SpriteSheetUpdateTarget target) { Texture2D spritesheetTexture = spriteSheet.atlas.GetTexture("_MainTex") as Texture2D; switch (target) { case SpriteSheetUpdateTarget.SelectedSprite: { RagePixelRow row = spriteSheet.GetRow(spriteSheetGUI.currentRowKey); foreach (RagePixelCell cell in row.cells) { UpdateCell(cell, spritesheetTexture); } break; } case SpriteSheetUpdateTarget.SelectedFrame: { UpdateCell(spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey), spritesheetTexture); break; } case SpriteSheetUpdateTarget.AllSprites: { foreach (RagePixelRow row in spriteSheet.rows) { foreach (RagePixelCell cell in row.cells) { UpdateCell(cell, spritesheetTexture); } } break; } } RagePixelUtil.SaveSpritesheetTextureToDisk(spriteSheet); RagePixelUtil.RebuildAtlas(spriteSheet, true, "save after update"); spriteSheetGUI.isDirty = true; animStripGUI.isDirty = true; if (inspector != null) { inspector.animStripGUI.isDirty = true; inspector.spriteSheetGUI.isDirty = true; } }
public RagePixelRow AddRow(int key, int pixelSizeX, int pixelSizeY) { RagePixelRow newRow = new RagePixelRow(); newRow.key = key; newRow.pixelSizeX = pixelSizeX; newRow.pixelSizeY = pixelSizeY; newRow.newPixelSizeX = pixelSizeX; newRow.newPixelSizeY = pixelSizeY; RagePixelRow[] tmpArr = new RagePixelRow[rows.Length+1]; rows.CopyTo(tmpArr, 0); tmpArr[tmpArr.Length - 1] = newRow; rows = tmpArr; return newRow; }
public RagePixelRow AddRow(int key, int pixelSizeX, int pixelSizeY) { RagePixelRow newRow = new RagePixelRow(); newRow.key = key; newRow.pixelSizeX = pixelSizeX; newRow.pixelSizeY = pixelSizeY; newRow.newPixelSizeX = pixelSizeX; newRow.newPixelSizeY = pixelSizeY; RagePixelRow[] tmpArr = new RagePixelRow[rows.Length + 1]; rows.CopyTo(tmpArr, 0); tmpArr[tmpArr.Length - 1] = newRow; rows = tmpArr; return(newRow); }
public void RemoveRowByIndex(int index) { if (rows.Length > 0) { RagePixelRow[] tmpArr = new RagePixelRow[rows.Length - 1]; for (int i = 0; i < rows.Length; i++) { if (i < index) { tmpArr[i] = rows[i]; } else if (i > index) { tmpArr[i - 1] = rows[i]; } } rows = tmpArr; } }
public void CopyAnimationsFrom(RagePixelRow other, bool append = false) { if (other == this) { Debug.LogError("Can't copy " + name + " from itself!"); } if (!append) { Array.Resize(ref _animations, 0); } //replace existing names //add rest int oldCount = animations.Length; var newAnims = new List <RagePixelAnimation>(); RagePixelAnimation[] otherAnims = other.animations; for (int i = 0; i < otherAnims.Length; i++) { string otherName = otherAnims[i].name; bool found = false; for (int j = 0; j < oldCount; j++) { if (animations[j].name.Equals(otherName)) { animations[j] = otherAnims[i].Clone(); found = true; break; } } if (!found) { newAnims.Add(otherAnims[i].Clone()); } } Array.Resize(ref _animations, animations.Length + newAnims.Count); for (int i = 0; i < newAnims.Count; i++) { animations[i + oldCount] = newAnims[i]; } }
void Awake() { lastRowSpriteSheetCache = null; lastCellSpriteSheetCache = null; lastRowCache = null; lastCellCache = null; lastCellCacheKey = 0; lastRowCacheKey = 0; meshIsDirty = true; vertexColorsAreDirty = true; if (!Application.isPlaying) { MeshFilter meshFilter = null; MeshRenderer meshRenderer = null; meshRenderer = gameObject.GetComponent("MeshRenderer") as MeshRenderer; if (meshRenderer == null) { meshRenderer = gameObject.AddComponent("MeshRenderer") as MeshRenderer; } meshFilter = gameObject.GetComponent("MeshFilter") as MeshFilter; if (meshFilter == null) { meshFilter = gameObject.AddComponent("MeshFilter") as MeshFilter; } if (meshFilter.sharedMesh != null) { RagePixelSprite[] ragePixelSprites = GameObject.FindObjectsOfType(typeof(RagePixelSprite)) as RagePixelSprite[]; foreach (RagePixelSprite ragePixelSprite in ragePixelSprites) { MeshFilter otherMeshFilter = ragePixelSprite.GetComponent(typeof(MeshFilter)) as MeshFilter; if (otherMeshFilter != null) { if (otherMeshFilter.sharedMesh == meshFilter.sharedMesh && otherMeshFilter != meshFilter) { meshFilter.mesh = new Mesh(); toBeRefreshed = true; } } } } if (meshFilter.sharedMesh == null) { meshFilter.sharedMesh = new Mesh(); toBeRefreshed = true; } } else { meshIsDirty = true; refreshMesh(); } }
public RagePixelRow GetCurrentRow() { if (Application.isPlaying) { if (lastRowCacheKey == currentRowKey && lastRowSpriteSheetCache.Equals(spriteSheet)) { return lastRowCache; } else { lastRowCache = spriteSheet.GetRow(currentRowKey); lastRowCacheKey = currentRowKey; lastRowSpriteSheetCache = spriteSheet; return lastRowCache; } } else { return spriteSheet.GetRow(currentRowKey); } }
public Color replaceColor(Color32[] before, Color oldColor, Color newColor, RagePixelRow targetRow) { Texture2D src = atlas.GetTexture("_MainTex") as Texture2D; src.SetPixels32(before); int width = src.width; int height = src.height; Color newActualColor = newColor; bool actualNewColorPicked = false; int sampleX = -1; int sampleY = -1; foreach(RagePixelCell cell in targetRow.cells) { int cellXMin = Mathf.FloorToInt(cell.uv.xMin * width); int cellYMin = Mathf.FloorToInt(cell.uv.yMin * height); int cellXMax = Mathf.FloorToInt(cell.uv.xMax * width); int cellYMax = Mathf.FloorToInt(cell.uv.yMax * height); for (int y = cellYMin; y < cellYMax; y++) { for (int x = cellXMin; x < cellXMax; x++) { if (src.GetPixel(x, y) == oldColor) { src.SetPixel(x, y, newColor); if (!actualNewColorPicked) { actualNewColorPicked = true; sampleX = x; sampleY = y; //newActualColor = src.GetPixel(x, y); //newActualColor = newColor; } } } } } src.Apply(); if (actualNewColorPicked) { newActualColor = src.GetPixel(sampleX, sampleY); } return newActualColor; }
public void OnGUI() { int y = 2; int x = 5; spriteSheet = (RagePixelSpriteSheet)EditorGUI.ObjectField( new Rect(x, y, Screen.width - x * 2, 16), "Sprite sheet", spriteSheet, typeof(RagePixelSpriteSheet), false ); y += 20; if (spriteSheet != null) { if (spriteSheet != spriteSheetGUI.spriteSheet) { spriteSheetGUI.spriteSheet = spriteSheet; spriteSheetGUI.currentRowKey = spriteSheet.rows[0].key; animStripGUI.currentCellKey = spriteSheet.rows[0].cells[0].key; } spriteSheetGUI.positionX = x; spriteSheetGUI.positionY = y; animStripGUI.positionX = x; animStripGUI.positionY = spriteSheetGUI.positionY + spriteSheetGUI.pixelHeight + 5; GUI.color = RagePixelGUIIcons.greenButtonColor; if (GUI.Button(new Rect(Screen.width - 38f * 2 - 5, spriteSheetGUI.positionY + spriteSheetGUI.pixelHeight - 32f, 38f, 32f), "NEW")) { int index = spriteSheet.GetIndex(spriteSheetGUI.currentRowKey); RagePixelRow row = spriteSheet.AddRow( RagePixelUtil.RandomKey(), index + 1, spriteSheet.GetRow(spriteSheetGUI.currentRowKey).pixelSizeX, spriteSheet.GetRow(spriteSheetGUI.currentRowKey).pixelSizeY ); RagePixelCell cell = row.InsertCell(0, RagePixelUtil.RandomKey()); spriteSheetGUI.currentRowKey = row.key; animStripGUI.currentCellKey = cell.key; RagePixelUtil.RebuildAtlas(spriteSheet, true, "AddRow"); } GUI.color = RagePixelGUIIcons.redButtonColor; if (GUI.Button(new Rect(Screen.width - 38f - 5, spriteSheetGUI.positionY + spriteSheetGUI.pixelHeight - 32f, 38f, 32f), "DEL")) { if (spriteSheet.rows.Length > 1) { if (EditorUtility.DisplayDialog("Delete selected sprite?", "Are you sure?", "Delete", "Cancel")) { int index = spriteSheet.GetIndex(spriteSheetGUI.currentRowKey); spriteSheet.RemoveRowByKey(spriteSheetGUI.currentRowKey); int newKey = spriteSheet.rows[Mathf.Clamp(index, 0, spriteSheet.rows.Length - 1)].key; if (selectedSprite != null) { if (selectedSprite.currentRowKey == spriteSheetGUI.currentRowKey) { selectedSprite.meshIsDirty = true; selectedSprite.currentRowKey = newKey; selectedSprite.pixelSizeX = selectedSprite.GetCurrentRow().pixelSizeX; selectedSprite.pixelSizeY = selectedSprite.GetCurrentRow().pixelSizeY; } } spriteSheetGUI.currentRowKey = newKey; animStripGUI.currentCellKey = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells[0].key; RagePixelUtil.RebuildAtlas(spriteSheet, false, "DeleteRow"); if (inspector != null) { inspector.spriteSheetGUI.isDirty = true; inspector.animStripGUI.isDirty = true; } } } else { EditorUtility.DisplayDialog("Cannot delete", "Cannot delete the last sprite.", "OK"); } } y += spriteSheetGUI.pixelHeight + animStripGUI.pixelHeight + 10; GUI.color = RagePixelGUIIcons.greenButtonColor; if (GUI.Button(new Rect(Screen.width - 38f * 2 - 5, animStripGUI.positionY + animStripGUI.pixelHeight - 32f, 38f, 32f), "NEW")) { int index = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetIndex(animStripGUI.currentCellKey) + 1; RagePixelCell cell = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).InsertCell(index, RagePixelUtil.RandomKey()); animStripGUI.currentCellKey = cell.key; RagePixelUtil.RebuildAtlas(spriteSheet, true, "AddCell"); } GUI.color = RagePixelGUIIcons.redButtonColor; if (GUI.Button(new Rect(Screen.width - 38f - 5, animStripGUI.positionY + animStripGUI.pixelHeight - 32f, 38f, 32f), "DEL")) { if (spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells.Length > 1) { if (EditorUtility.DisplayDialog("Delete selected animation frame?", "Are you sure?", "Delete", "Cancel")) { int index = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetIndex(animStripGUI.currentCellKey); spriteSheet.GetRow(spriteSheetGUI.currentRowKey).RemoveCellByKey(animStripGUI.currentCellKey); int newKey = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells[Mathf.Clamp(index, 0, spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells.Length - 1)].key; if (selectedSprite != null) { if (selectedSprite.currentCellKey == animStripGUI.currentCellKey) { selectedSprite.meshIsDirty = true; selectedSprite.currentCellKey = newKey; selectedSprite.pixelSizeX = selectedSprite.GetCurrentRow().pixelSizeX; selectedSprite.pixelSizeY = selectedSprite.GetCurrentRow().pixelSizeY; } } animStripGUI.currentCellKey = newKey; RagePixelUtil.RebuildAtlas(spriteSheet, true, "DeleteCell"); if (inspector != null) { inspector.spriteSheetGUI.isDirty = true; inspector.animStripGUI.isDirty = true; } } } else { EditorUtility.DisplayDialog("Cannot delete", "Cannot delete the last animation frame.", "OK"); } } GUI.color = Color.white; spriteSheet.GetRow(spriteSheetGUI.currentRowKey).name = EditorGUI.TextField( new Rect(x, y, Mathf.Min(350, Screen.width - x * 2), 16), "Sprite Name", spriteSheet.GetRow(spriteSheetGUI.currentRowKey).name); y += 20; EditorGUI.LabelField( new Rect(x, y, Screen.width - x * 2, 16), "Frame Index", spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetIndex(animStripGUI.currentCellKey).ToString() + " (" + (spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells.Length - 1).ToString() + ")"); y += 20; spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey).delay = EditorGUI.IntField( new Rect(x, y, Mathf.Min(200, Screen.width - x * 2), 16), "Frame Time", (int)spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey).delay); y += 20; GUILayout.Space(y + 20); int namedAnimationsFoldoutHeight = 0; showNamedAnimationsFoldout = EditorGUI.Foldout(new Rect(x, y, Screen.width - x * 2, 20), showNamedAnimationsFoldout, "Named animations"); y += 20; if (showNamedAnimationsFoldout) { GUI.color = Color.gray; x = 5; GUI.Label(new Rect(x, y, 170, 16), "Name"); x += 175; GUI.Label(new Rect(x, y, 40, 16), "Start"); x += 45; GUI.Label(new Rect(x, y, 40, 16), "End"); x += 45; GUI.Label(new Rect(x, y, 130, 16), "Type"); GUI.color = Color.white; y += 20; RagePixelAnimation[] animations = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).animations; for (int animIndex = 0; animIndex < animations.Length; animIndex++) { x = 5; animations[animIndex].name = EditorGUI.TextField(new Rect(x, y, 170, 16), animations[animIndex].name); x += 175; animations[animIndex].startIndex = EditorGUI.IntField(new Rect(x, y, 40, 16), animations[animIndex].startIndex); x += 45; animations[animIndex].endIndex = EditorGUI.IntField(new Rect(x, y, 40, 16), animations[animIndex].endIndex); x += 45; animations[animIndex].mode = (RagePixelSprite.AnimationMode)EditorGUI.EnumPopup(new Rect(x, y, 130, 16), animations[animIndex].mode); x += 135; if (GUI.Button(new Rect(x, y, 60, 16), "Delete")) { spriteSheet.GetRow(spriteSheetGUI.currentRowKey).RemoveAnimation(animIndex); } y += 20; namedAnimationsFoldoutHeight += 20; } x = 5; if (GUI.Button(new Rect(x, y, 50, 16), "Add")) { spriteSheet.GetRow(spriteSheetGUI.currentRowKey).AddAnimation(); } y += 20; namedAnimationsFoldoutHeight += 20; GUILayout.Space(namedAnimationsFoldoutHeight + 26); y += 6; } x = 5; showImportFoldout = EditorGUI.Foldout(new Rect(x, y, Screen.width - x * 2, 16), showImportFoldout, "Import"); if (showImportFoldout) { GUILayout.BeginHorizontal(); newTexture = (Texture2D)EditorGUILayout.ObjectField(" ", newTexture, typeof(Texture2D), false); GUILayout.BeginVertical(); if (GUI.Button(new Rect(x + 240f, y, 180f, 19f), "Import to selected frame")) { if (newTexture != null) { ImportSprite(SpriteSheetImportTarget.Selected); } } y += 21; if (GUI.Button(new Rect(x + 240f, y, 180f, 19f), "Import as new frame")) { if (newTexture != null) { ImportSprite(SpriteSheetImportTarget.NewFrame); } } y += 21; if (GUI.Button(new Rect(x + 240f, y, 180f, 19f), "Import as new sprite")) { if (newTexture != null) { ImportSprite(SpriteSheetImportTarget.NewSprite); } } GUILayout.EndVertical(); GUILayout.EndHorizontal(); } int oldRowKey = spriteSheetGUI.currentRowKey; animStripGUI.HandleGUIEvent(Event.current); spriteSheetGUI.HandleGUIEvent(Event.current); if (oldRowKey != spriteSheetGUI.currentRowKey) { animStripGUI.currentCellKey = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells[0].key; } if (animStripGUI.isDirty || spriteSheetGUI.isDirty) { Repaint(); if (inspector != null) { inspector.spriteSheetGUI.isDirty = true; inspector.animStripGUI.isDirty = true; inspector.Repaint(); } if (selectedSprite != null) { selectedSprite.meshIsDirty = true; selectedSprite.refreshMesh(); } } spriteSheetGUI.maxWidth = scenePixelWidth - 38 * 2 - 10 - spriteSheetGUI.positionX; animStripGUI.maxWidth = scenePixelWidth - 38 * 2 - 10 - animStripGUI.positionX; EditorGUI.DrawPreviewTexture(spriteSheetGUI.bounds, spriteSheetGUI.spriteSheetTexture); EditorGUI.DrawPreviewTexture(animStripGUI.bounds, animStripGUI.animStripTexture); } if (GUI.changed) { EditorUtility.SetDirty(spriteSheet); } }
public void OnGUI() { int y = 2; int x = 5; spriteSheet = (RagePixelSpriteSheet)EditorGUI.ObjectField( new Rect(x, y, Screen.width - x * 2, 16), "Sprite sheet", spriteSheet, typeof(RagePixelSpriteSheet), false ); y += 20; if (spriteSheet != null) { if (spriteSheet != spriteSheetGUI.spriteSheet) { spriteSheetGUI.spriteSheet = spriteSheet; spriteSheetGUI.currentRowKey = spriteSheet.rows[0].key; copySpriteSheetGUI.spriteSheet = spriteSheet; copySpriteSheetGUI.currentRowKey = spriteSheet.rows[0].key; animStripGUI.currentCellKey = spriteSheet.rows[0].cells[0].key; } spriteSheetGUI.positionX = x; spriteSheetGUI.positionY = y; animStripGUI.positionX = x; animStripGUI.positionY = spriteSheetGUI.positionY + spriteSheetGUI.pixelHeight + 5; GUI.color = RagePixelGUIIcons.greenButtonColor; if (GUI.Button(new Rect(Screen.width - 38f * 2 - 5, spriteSheetGUI.positionY + spriteSheetGUI.pixelHeight - 32f, 38f, 32f), "NEW")) { int index = spriteSheet.GetIndex(spriteSheetGUI.currentRowKey); RagePixelRow row = spriteSheet.AddRow( RagePixelUtil.RandomKey(), index + 1, spriteSheet.GetRow(spriteSheetGUI.currentRowKey).pixelSizeX, spriteSheet.GetRow(spriteSheetGUI.currentRowKey).pixelSizeY ); RagePixelCell cell = row.InsertCell(0, RagePixelUtil.RandomKey()); spriteSheetGUI.currentRowKey = row.key; animStripGUI.currentCellKey = cell.key; RagePixelUtil.RebuildAtlas(spriteSheet, true, "AddRow"); } GUI.color = RagePixelGUIIcons.redButtonColor; if (GUI.Button(new Rect(Screen.width - 38f - 5, spriteSheetGUI.positionY + spriteSheetGUI.pixelHeight - 32f, 38f, 32f), "DEL")) { if (spriteSheet.rows.Length > 1) { if (EditorUtility.DisplayDialog("Delete selected sprite?", "Are you sure?", "Delete", "Cancel")) { int index = spriteSheet.GetIndex(spriteSheetGUI.currentRowKey); spriteSheet.RemoveRowByKey(spriteSheetGUI.currentRowKey); int newKey = spriteSheet.rows[Mathf.Clamp(index, 0, spriteSheet.rows.Length - 1)].key; if (selectedSprite != null) { if (selectedSprite.currentRowKey == spriteSheetGUI.currentRowKey) { selectedSprite.meshIsDirty = true; selectedSprite.currentRowKey = newKey; selectedSprite.pixelSizeX = selectedSprite.GetCurrentRow().pixelSizeX; selectedSprite.pixelSizeY = selectedSprite.GetCurrentRow().pixelSizeY; } } spriteSheetGUI.currentRowKey = newKey; animStripGUI.currentCellKey = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells[0].key; RagePixelUtil.RebuildAtlas(spriteSheet, false, "DeleteRow"); if (inspector != null) { inspector.spriteSheetGUI.isDirty = true; inspector.animStripGUI.isDirty = true; } } } else { EditorUtility.DisplayDialog("Cannot delete", "Cannot delete the last sprite.", "OK"); } } y += spriteSheetGUI.pixelHeight + animStripGUI.pixelHeight + 10; GUI.color = RagePixelGUIIcons.greenButtonColor; if (GUI.Button(new Rect(Screen.width - 38f * 2 - 5, animStripGUI.positionY + animStripGUI.pixelHeight - 32f, 38f, 32f), "NEW")) { int index = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetIndex(animStripGUI.currentCellKey) + 1; RagePixelCell cell = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).InsertCell(index, RagePixelUtil.RandomKey()); animStripGUI.currentCellKey = cell.key; RagePixelUtil.RebuildAtlas(spriteSheet, true, "AddCell"); } GUI.color = RagePixelGUIIcons.redButtonColor; if (GUI.Button(new Rect(Screen.width - 38f - 5, animStripGUI.positionY + animStripGUI.pixelHeight - 32f, 38f, 32f), "DEL")) { if (spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells.Length > 1) { if (EditorUtility.DisplayDialog("Delete selected animation frame?", "Are you sure?", "Delete", "Cancel")) { int index = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetIndex(animStripGUI.currentCellKey); spriteSheet.GetRow(spriteSheetGUI.currentRowKey).RemoveCellByKey(animStripGUI.currentCellKey); int newKey = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells[Mathf.Clamp(index, 0, spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells.Length - 1)].key; if (selectedSprite != null) { if (selectedSprite.currentCellKey == animStripGUI.currentCellKey) { selectedSprite.meshIsDirty = true; selectedSprite.currentCellKey = newKey; selectedSprite.pixelSizeX = selectedSprite.GetCurrentRow().pixelSizeX; selectedSprite.pixelSizeY = selectedSprite.GetCurrentRow().pixelSizeY; } } animStripGUI.currentCellKey = newKey; RagePixelUtil.RebuildAtlas(spriteSheet, true, "DeleteCell"); if (inspector != null) { inspector.spriteSheetGUI.isDirty = true; inspector.animStripGUI.isDirty = true; } } } else { EditorUtility.DisplayDialog("Cannot delete", "Cannot delete the last animation frame.", "OK"); } } GUI.color = Color.white; if (spriteSheet.GetRow(spriteSheetGUI.currentRowKey).name == null) { spriteSheet.GetRow(spriteSheetGUI.currentRowKey).name = ""; } spriteSheet.GetRow(spriteSheetGUI.currentRowKey).name = EditorGUI.TextField( new Rect(x, y, Mathf.Min(350, Screen.width - x * 2), 16), "Sprite Name", spriteSheet.GetRow(spriteSheetGUI.currentRowKey).name); y += 20; RagePixelCell selectedCell = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey); EditorGUI.LabelField( new Rect(x, y, Screen.width - x * 2, 16), "Frame Index", spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetIndex(animStripGUI.currentCellKey).ToString() + " (" + (spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells.Length - 1).ToString() + ")" + (selectedCell.importAssetPath == "" ? "" : (" - " + selectedCell.importAssetPath))); y += 20; spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey).delay = EditorGUI.IntField( new Rect(x, y, Mathf.Min(200, Screen.width - x * 2), 16), "Frame Time", (int)spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey).delay); y += 20; GUILayout.Space(y + 20); int rangeAnimationsFoldoutHeight = 0; showRangeAnimationsFoldout = EditorGUI.Foldout(new Rect(x, y, Screen.width - x * 2, 20), showRangeAnimationsFoldout, "Range animations"); y += 20; if (showRangeAnimationsFoldout) { GUI.color = Color.gray; x = 5; GUI.Label(new Rect(x, y, 170, 16), "Name"); x += 175; GUI.Label(new Rect(x, y, 40, 16), "Start"); x += 45; GUI.Label(new Rect(x, y, 40, 16), "End"); x += 45; GUI.Label(new Rect(x, y, 130, 16), "Type"); GUI.color = Color.white; y += 20; RagePixelAnimation[] animations = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).animations; for (int animIndex = 0; animIndex < animations.Length; animIndex++) { if (animations[animIndex].frameMode != RagePixelSprite.FrameMode.Range) { continue; } x = 5; animations[animIndex].name = EditorGUI.TextField(new Rect(x, y, 170, 16), animations[animIndex].name); x += 175; animations[animIndex].startIndex = EditorGUI.IntField(new Rect(x, y, 40, 16), animations[animIndex].startIndex); x += 45; animations[animIndex].endIndex = EditorGUI.IntField(new Rect(x, y, 40, 16), animations[animIndex].endIndex); x += 45; animations[animIndex].mode = (RagePixelSprite.AnimationMode)EditorGUI.EnumPopup(new Rect(x, y, 130, 16), animations[animIndex].mode); x += 135; if (GUI.Button(new Rect(x, y, 60, 16), "Delete")) { spriteSheet.GetRow(spriteSheetGUI.currentRowKey).RemoveAnimation(animIndex); } y += 20; rangeAnimationsFoldoutHeight += 20; } x = 5; if (GUI.Button(new Rect(x, y, 50, 16), "Add")) { RagePixelAnimation anim = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).AddAnimation(); anim.frameMode = RagePixelSprite.FrameMode.Range; } y += 20; rangeAnimationsFoldoutHeight += 20; GUILayout.Space(rangeAnimationsFoldoutHeight + 26); y += 6; } int sequenceAnimationsFoldoutHeight = 0; showSequenceAnimationsFoldout = EditorGUI.Foldout(new Rect(x, y, Screen.width - x * 2, 20), showSequenceAnimationsFoldout, "Sequence animations"); y += 20; if (showSequenceAnimationsFoldout) { GUI.color = Color.gray; x = 5; GUI.Label(new Rect(x, y, 170, 16), "Name"); x += 175; GUI.Label(new Rect(x, y, 40, 16), "Type"); x += 135; GUI.Label(new Rect(x, y, 60, 16), "Frames"); GUI.color = Color.white; y += 20; RagePixelAnimation[] animations = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).animations; for (int animIndex = 0; animIndex < animations.Length; animIndex++) { if (animations[animIndex].frameMode != RagePixelSprite.FrameMode.Sequence) { continue; } x = 5; animations[animIndex].name = EditorGUI.TextField(new Rect(x, y, 170, 16), animations[animIndex].name); x += 175; animations[animIndex].mode = (RagePixelSprite.AnimationMode)EditorGUI.EnumPopup(new Rect(x, y, 130, 16), animations[animIndex].mode); x += 135; //frames if (animations[animIndex].frames == null || animations[animIndex].frames.Length == 0) { animations[animIndex].frames = new int[] { 0 }; } for (int i = 0; i < animations[animIndex].frames.Length; i++) { animations[animIndex].frames[i] = EditorGUI.IntField(new Rect(x, y, 24, 16), animations[animIndex].frames[i]); x += 28; } if (GUI.Button(new Rect(x, y, 20, 16), "-")) { //reduce length by 1 Array.Resize(ref animations[animIndex].frames, animations[animIndex].frames.Length - 1); } x += 22; if (GUI.Button(new Rect(x, y, 20, 16), "+")) { //increase length by 1 Array.Resize(ref animations[animIndex].frames, animations[animIndex].frames.Length + 1); } x += 28; if (GUI.Button(new Rect(x, y, 60, 16), "Delete")) { spriteSheet.GetRow(spriteSheetGUI.currentRowKey).RemoveAnimation(animIndex); } y += 20; sequenceAnimationsFoldoutHeight += 20; } x = 5; if (GUI.Button(new Rect(x, y, 50, 16), "Add")) { RagePixelAnimation anim = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).AddAnimation(); anim.frameMode = RagePixelSprite.FrameMode.Sequence; } y += 20; sequenceAnimationsFoldoutHeight += 20; GUILayout.Space(sequenceAnimationsFoldoutHeight + 26); y += 6; } x = 5; showCopyAnimationsFoldout = EditorGUI.Foldout(new Rect(x, y, Screen.width - x * 2, 16), showCopyAnimationsFoldout, "Copy Animations"); if (showCopyAnimationsFoldout) { y += 20; GUI.Label(new Rect(x, y, Screen.width - x * 2, 16), "Other Sprite"); y += 20; copySpriteSheetGUI.positionX = x; copySpriteSheetGUI.positionY = y; y += copySpriteSheetGUI.pixelHeight + 10; GUI.enabled = spriteSheetGUI.currentRowKey != copySpriteSheetGUI.currentRowKey; if (GUI.Button(new Rect(x, y, 180f, 19f), "Copy From Other")) { RagePixelRow thisRow = spriteSheet.GetRow(spriteSheetGUI.currentRowKey); RagePixelRow otherRow = spriteSheet.GetRow(copySpriteSheetGUI.currentRowKey); thisRow.CopyAnimationsFrom(otherRow); } if (GUI.Button(new Rect(x + 190, y, 180f, 19f), "Copy To Other")) { RagePixelRow thisRow = spriteSheet.GetRow(spriteSheetGUI.currentRowKey); RagePixelRow otherRow = spriteSheet.GetRow(copySpriteSheetGUI.currentRowKey); otherRow.CopyAnimationsFrom(thisRow); } GUI.enabled = true; y += 21; } y += 20; showImportFoldout = EditorGUI.Foldout(new Rect(x, y, Screen.width - x * 2, 16), showImportFoldout, "Import"); if (showImportFoldout) { GUILayout.Space(24); GUILayout.BeginHorizontal(); newTexture = (Texture2D)EditorGUILayout.ObjectField(" ", newTexture, typeof(Texture2D), false); GUILayout.BeginVertical(); y += 10; if (GUI.Button(new Rect(x + 240f, y, 180f, 19f), "Import to selected frame")) { if (newTexture != null) { ImportSprite(SpriteSheetImportTarget.Selected); } } y += 21; if (GUI.Button(new Rect(x + 240f, y, 180f, 19f), "Import as new frame")) { if (newTexture != null) { ImportSprite(SpriteSheetImportTarget.NewFrame); } } y += 21; if (GUI.Button(new Rect(x + 240f, y, 180f, 19f), "Import as new sprite")) { if (newTexture != null) { ImportSprite(SpriteSheetImportTarget.NewSprite); } } y += 21; if (GUI.Button(new Rect(x + 240f, y, 180f, 19f), "Import spritesheet")) { if (newTexture != null) { ImportSprite(SpriteSheetImportTarget.SpriteSheet); } } //sprite width, sprite height y += 21; importSpriteWidth = EditorGUI.IntField(new Rect(x + 240f, y, 180f, 19f), "Frame Width", importSpriteWidth); y += 21; importSpriteHeight = EditorGUI.IntField(new Rect(x + 240f, y, 180f, 19f), "Frame Height", importSpriteHeight); y += 21; importSpriteTopLeft = EditorGUI.Toggle(new Rect(x + 240f, y, 180f, 19f), "First Frame at Top Left", importSpriteTopLeft); GUILayout.EndVertical(); GUILayout.EndHorizontal(); } // Update references to sprites y += 20; showUpdateFoldout = EditorGUI.Foldout(new Rect(x, y, Screen.width - x * 2, 16), showUpdateFoldout, "Update"); if (showUpdateFoldout) { y += 20; GUILayout.BeginVertical(); if (GUI.Button(new Rect(5, y, 180f, 19f), "Update Selected Frame")) { UpdateSprite(SpriteSheetUpdateTarget.SelectedFrame); } /* * if(GUI.Button(new Rect(190, y, 180f, 19f), "Save Frame to Source")) * { * if(newTexture != null) * { * * } * } */ y += 21; if (GUI.Button(new Rect(5, y, 180f, 19f), "Update Selected Sprite")) { UpdateSprite(SpriteSheetUpdateTarget.SelectedSprite); } y += 21; if (GUI.Button(new Rect(5, y, 180f, 19f), "Update All Sprites")) { UpdateSprite(SpriteSheetUpdateTarget.AllSprites); } GUILayout.EndVertical(); } int oldRowKey = spriteSheetGUI.currentRowKey; animStripGUI.HandleGUIEvent(Event.current); spriteSheetGUI.HandleGUIEvent(Event.current); if (oldRowKey != spriteSheetGUI.currentRowKey) { animStripGUI.currentCellKey = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).cells[0].key; } if (animStripGUI.isDirty || spriteSheetGUI.isDirty) { Repaint(); if (inspector != null) { inspector.spriteSheetGUI.isDirty = true; inspector.animStripGUI.isDirty = true; inspector.Repaint(); } if (selectedSprite != null) { selectedSprite.meshIsDirty = true; selectedSprite.refreshMesh(); } } spriteSheetGUI.maxWidth = scenePixelWidth - 38 * 2 - 10 - spriteSheetGUI.positionX; animStripGUI.maxWidth = scenePixelWidth - 38 * 2 - 10 - animStripGUI.positionX; EditorGUI.DrawPreviewTexture(spriteSheetGUI.bounds, spriteSheetGUI.spriteSheetTexture); EditorGUI.DrawPreviewTexture(animStripGUI.bounds, animStripGUI.animStripTexture); if (showCopyAnimationsFoldout) { copySpriteSheetGUI.HandleGUIEvent(Event.current); copySpriteSheetGUI.maxWidth = scenePixelWidth - 38 * 2 - 10 - copySpriteSheetGUI.positionX; EditorGUI.DrawPreviewTexture(copySpriteSheetGUI.bounds, copySpriteSheetGUI.spriteSheetTexture); } } if (GUI.changed) { EditorUtility.SetDirty(spriteSheet); } }
public void CopyAnimationsFrom(RagePixelRow other, bool append=false) { if(other == this) { Debug.LogError("Can't copy " + name + " from itself!"); } if(!append) { Array.Resize(ref _animations, 0); } //replace existing names //add rest int oldCount = animations.Length; var newAnims = new List<RagePixelAnimation>(); RagePixelAnimation[] otherAnims = other.animations; for(int i = 0; i < otherAnims.Length; i++) { string otherName = otherAnims[i].name; bool found = false; for(int j = 0; j < oldCount; j++) { if(animations[j].name.Equals(otherName)) { animations[j] = otherAnims[i].Clone(); found = true; break; } } if(!found) { newAnims.Add(otherAnims[i].Clone()); } } Array.Resize(ref _animations, animations.Length + newAnims.Count); for(int i = 0; i < newAnims.Count; i++) { animations[i + oldCount] = newAnims[i]; } }
public void ImportSprite(SpriteSheetImportTarget target) { string path = AssetDatabase.GetAssetPath(newTexture); TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter; textureImporter.isReadable = true; textureImporter.filterMode = FilterMode.Point; textureImporter.npotScale = TextureImporterNPOTScale.None; textureImporter.textureFormat = TextureImporterFormat.AutomaticTruecolor; AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate); if (textureImporter.isReadable) { int newKey = RagePixelUtil.RandomKey(); int newKey2 = RagePixelUtil.RandomKey(); Texture2D spritesheetTexture = spriteSheet.atlas.GetTexture("_MainTex") as Texture2D; switch (target) { case SpriteSheetImportTarget.SpriteSheet: { RagePixelRow row = spriteSheet.AddRow(newKey, importSpriteWidth, importSpriteHeight); row.name = newTexture.name; RagePixelUtil.ImportRowFromSheetTexture( spriteSheet, row, newTexture, importSpriteWidth, importSpriteHeight, importSpriteTopLeft ); spriteSheetGUI.currentRowKey = newKey; animStripGUI.currentCellKey = row.cells[0].key; break; } case SpriteSheetImportTarget.NewSprite: { RagePixelRow row = spriteSheet.AddRow(newKey, newTexture.width, newTexture.height); row.InsertCell(0, newKey2).importAssetPath = path; spriteSheetGUI.currentRowKey = newKey; animStripGUI.currentCellKey = newKey2; RagePixelUtil.RebuildAtlas(spriteSheet, true, "Import texture as new sprite"); Rect uvs = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey).uv; RagePixelUtil.CopyPixels(newTexture, new Rect(0f, 0f, 1f, 1f), spritesheetTexture, uvs); break; } case SpriteSheetImportTarget.NewFrame: { RagePixelRow row = spriteSheet.GetRow(spriteSheetGUI.currentRowKey); int index = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetIndex(animStripGUI.currentCellKey) + 1; row.InsertCell(index, newKey2).importAssetPath = path; animStripGUI.currentCellKey = newKey2; RagePixelUtil.RebuildAtlas(spriteSheet, true, "Import texture as new frame"); Rect uvs = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey).uv; RagePixelUtil.CopyPixels(newTexture, new Rect(0f, 0f, 1f, 1f), spritesheetTexture, uvs); break; } case SpriteSheetImportTarget.Selected: { RagePixelCell cell = spriteSheet.GetRow(spriteSheetGUI.currentRowKey).GetCell(animStripGUI.currentCellKey); Rect uvs = cell.uv; RagePixelUtil.CopyPixels(newTexture, new Rect(0f, 0f, 1f, 1f), spritesheetTexture, uvs); cell.importAssetPath = path; break; } } RagePixelUtil.SaveSpritesheetTextureToDisk(spriteSheet); RagePixelUtil.RebuildAtlas(spriteSheet, true, "save after import"); spriteSheetGUI.isDirty = true; animStripGUI.isDirty = true; if (inspector != null) { inspector.animStripGUI.isDirty = true; inspector.spriteSheetGUI.isDirty = true; } } else { EditorUtility.DisplayDialog("Texture is not readable", "Set texture type to advanced and read/write as enabled from the import options.", "OK"); } }