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;
    }
示例#2
0
    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;
        }
    }
示例#4
0
    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);
    }
示例#10
0
    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;
    }
示例#12
0
    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;
        }
    }
示例#16
0
    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];
        }
    }
示例#17
0
    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();
        }
    }
示例#18
0
 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;
    }
示例#20
0
    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);
        }
    }
示例#21
0
    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 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 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;
        }
    }
示例#24
0
 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];
     }
 }
示例#25
0
    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");
        }
    }