refreshMesh() public method

public refreshMesh ( ) : void
return void
Esempio n. 1
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 override void OnInspectorGUI()
    {
        Transform t = (Transform)target;
        bool      useStandardTransformInspector = false;

        // Replicate the standard transform inspector gui
        if (t.gameObject.GetComponent(typeof(RagePixelSprite)))
        {
            bool            clicked         = false;
            RagePixelSprite ragePixelSprite = t.gameObject.GetComponent(typeof(RagePixelSprite)) as RagePixelSprite;

            if (ragePixelSprite.spriteSheet != null && !Application.isPlaying)
            {
                EditorGUIUtility.LookLikeControls();
                EditorGUI.indentLevel = 0;
                Vector3 position = EditorGUILayout.Vector2Field("Position", t.localPosition);

                //Vector3 eulerAngles = EditorGUILayout.Vector3Field("Rotation", t.localEulerAngles);

                Vector3 scale = new Vector3();
                if (ragePixelSprite.GetCurrentRow().newPixelSizeX != ragePixelSprite.GetCurrentRow().pixelSizeX || ragePixelSprite.GetCurrentRow().newPixelSizeY != ragePixelSprite.GetCurrentRow().pixelSizeY)
                {
                    GUI.color = Color.green;
                    EditorGUILayout.Vector2Field("Size (bitmap)", new Vector2(ragePixelSprite.GetCurrentRow().newPixelSizeX, ragePixelSprite.GetCurrentRow().newPixelSizeY));
                    GUI.color = Color.white;
                    scale     = new Vector2(ragePixelSprite.pixelSizeX, ragePixelSprite.pixelSizeY);
                }
                else
                {
                    scale = EditorGUILayout.Vector2Field("Size", new Vector2(ragePixelSprite.pixelSizeX, ragePixelSprite.pixelSizeY));
                }

                GUILayout.Label("Rotation");
                EditorGUILayout.BeginHorizontal();
                EditorGUI.indentLevel = 1;
                t.localEulerAngles    = new Vector3(0f, 0f, (int)EditorGUILayout.FloatField("Degrees", -t.localEulerAngles.z)) * -1f;
                EditorGUI.indentLevel = 0;
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.Space();

                GUILayout.BeginHorizontal();
                GUILayout.Label("Layer ");
                ragePixelSprite.ZLayer = EditorGUILayout.IntField(ragePixelSprite.ZLayer, GUILayout.Width(30));
                if (GUILayout.Button("Forward"))
                {
                    ragePixelSprite.ZLayer--;
                    clicked = true;
                }
                if (GUILayout.Button("Backward"))
                {
                    ragePixelSprite.ZLayer++;
                    clicked = true;
                }

                GUILayout.EndHorizontal();
                position.z = ragePixelSprite.ZLayer;
                GUILayout.Space(5f);

                EditorGUIUtility.LookLikeInspector();

                if (GUI.changed || clicked)
                {
                    Undo.RegisterUndo(t, "Transform Change");

                    t.localPosition             = FixIfNaN(position);
                    ragePixelSprite.pixelSizeX  = Mathf.RoundToInt(FixIfNaN(scale).x);
                    ragePixelSprite.pixelSizeY  = Mathf.RoundToInt(FixIfNaN(scale).y);
                    ragePixelSprite.meshIsDirty = true;
                    ragePixelSprite.refreshMesh();
                }
            }
            else
            {
                useStandardTransformInspector = true;
            }
        }
        else
        {
            useStandardTransformInspector = true;
        }

        if (useStandardTransformInspector)
        {
            EditorGUIUtility.LookLikeControls();
            EditorGUI.indentLevel = 0;
            Vector3 position    = EditorGUILayout.Vector3Field("Position", t.localPosition);
            Vector3 eulerAngles = EditorGUILayout.Vector3Field("Rotation", t.localEulerAngles);
            Vector3 scale       = EditorGUILayout.Vector3Field("Scale", t.localScale);
            EditorGUIUtility.LookLikeInspector();

            if (GUI.changed)
            {
                Undo.RegisterUndo(t, "Transform Change");

                t.localPosition    = FixIfNaN(position);
                t.localEulerAngles = FixIfNaN(eulerAngles);
                t.localScale       = FixIfNaN(scale);
            }
        }
    }
Esempio n. 3
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);
        }
    }