Exemplo n.º 1
0
    // ------------------------------------------------------------------
    // Desc:
    // ------------------------------------------------------------------

    void OnGUI()
    {
        EditorGUI.indentLevel = 0;

        if (curEdit == null)
        {
            GUILayout.Space(10);
            GUILayout.Label("Please select an Sprite Animation Clip");
            return;
        }

        // ========================================================
        // toolbar
        // ========================================================

        GUILayout.BeginHorizontal(EditorStyles.toolbar);

        // ========================================================
        // Play
        // ========================================================

        playing = GUILayout.Toggle(playing,
                                   exEditorHelper.AnimationPlayTexture(),
                                   EditorStyles.toolbarButton);
        if (playing == false)
        {
            startPlaying   = false;
            playingSeconds = 0.0f;
        }
        else if (startPlaying == false)
        {
            startPlaying   = true;
            curSeconds     = 0.0f;
            playingSeconds = playingSelects ? playingStart : 0.0f;
        }

        //
        if (playing &&
            curEdit.wrapMode == WrapMode.Once &&
            curSeconds >= curEdit.length)
        {
            playing = false;
        }

        // ========================================================
        // prev frame
        // ========================================================

        if (GUILayout.Button(exEditorHelper.AnimationPrevTexture(), EditorStyles.toolbarButton))
        {
            exSpriteAnimClip.FrameInfo fi = curEdit.GetFrameInfoBySeconds(curSeconds, WrapMode.Once);
            int i = curEdit.frameInfos.IndexOf(fi) - 1;
            if (i >= 0)
            {
                curSeconds = 0.0f;
                for (int j = 0; j < i; ++j)
                {
                    curSeconds += curEdit.frameInfos[j].length;
                }
                curSeconds += 0.1f / totalWidth * curEdit.length;
            }
        }

        // ========================================================
        // next frame
        // ========================================================

        if (GUILayout.Button(exEditorHelper.AnimationNextTexture(), EditorStyles.toolbarButton))
        {
            exSpriteAnimClip.FrameInfo fi = curEdit.GetFrameInfoBySeconds(curSeconds, WrapMode.Once);
            int i = curEdit.frameInfos.IndexOf(fi) + 1;
            if (i < curEdit.frameInfos.Count)
            {
                curSeconds = 0.0f;
                for (int j = 0; j < i; ++j)
                {
                    curSeconds += curEdit.frameInfos[j].length;
                }
                curSeconds += 0.1f / totalWidth * curEdit.length;
            }
        }

        // ========================================================
        // frames
        // ========================================================

        GUILayout.Space(5);
        EditorGUILayout.SelectableLabel(curEdit.SnapToFrames(curEdit.length) + " frames | "
                                        + curEdit.length.ToString("f3") + " secs",
                                        GUILayout.MinWidth(150), GUILayout.MaxHeight(18));

        // ========================================================
        // preview speed
        // ========================================================

        GUILayout.Space(10);
        curEdit.editorSpeed = EditorGUILayout.FloatField("Preview Speed",
                                                         curEdit.editorSpeed,
                                                         EditorStyles.toolbarTextField,
                                                         GUILayout.MinWidth(200));

        // ========================================================
        // preview length
        // ========================================================

        GUILayout.Space(5);
        EditorGUILayout.SelectableLabel((curEdit.length / curEdit.editorSpeed).ToString("f3") + " secs",
                                        GUILayout.MinWidth(80), GUILayout.MaxHeight(18));

        GUILayout.FlexibleSpace();

        // ========================================================
        // Select
        // ========================================================

        GUI.enabled = selectedFrameInfos.Count != 0;
        if (GUILayout.Button("Select In Project...", EditorStyles.toolbarButton))
        {
            List <Object> selects = new List <Object>(selectedFrameInfos.Count);
            foreach (exSpriteAnimClip.FrameInfo fi in selectedFrameInfos)
            {
                Texture2D texture
                    = exEditorHelper.LoadAssetFromGUID <Texture2D>(fi.textureGUID);
                selects.Add(texture);
            }

            if (selects.Count != 0)
            {
                selectIdx         = (selectIdx + 1) % selects.Count;
                Selection.objects = selects.ToArray();
                EditorGUIUtility.PingObject(Selection.objects[selectIdx]);
            }
        }
        GUI.enabled = true;

        // ========================================================
        // editor scale
        // ========================================================

        GUILayout.Label("Zoom");
        GUILayout.Space(5);
        curEdit.editorScale = GUILayout.HorizontalSlider(curEdit.editorScale,
                                                         0.01f,
                                                         10.0f,
                                                         GUILayout.MinWidth(150));
        GUILayout.Space(5);
        curEdit.editorScale = EditorGUILayout.FloatField(curEdit.editorScale,
                                                         EditorStyles.toolbarTextField,
                                                         GUILayout.Width(50));
        curEdit.editorScale = Mathf.Clamp(curEdit.editorScale, 0.01f, 10.0f);

        // ========================================================
        // Build
        // ========================================================

        GUI.enabled = curEdit.editorNeedRebuild;
        if (GUILayout.Button("Build", EditorStyles.toolbarButton, GUILayout.Width(80)))
        {
            curEdit.Build();
        }
        GUI.enabled = true;

        // ========================================================
        // Help
        // ========================================================

        if (GUILayout.Button(exEditorHelper.HelpTexture(), EditorStyles.toolbarButton))
        {
            Help.BrowseURL("http://www.ex-dev.com/ex2d/wiki/doku.php?id=manual:sprite_anim_editor");
        }

        GUILayout.EndHorizontal();

        // ========================================================
        // Scroll View
        // ========================================================

        float toolbarHeight = EditorStyles.toolbar.CalcHeight(new GUIContent(""), 0);

        scrollPos = EditorGUILayout.BeginScrollView(scrollPos,
                                                    GUILayout.Width(position.width),
                                                    GUILayout.Height(position.height - toolbarHeight));

        Rect lastRect = new Rect(10, 0, 1, 1);

        GUILayout.Space(5);

        // ========================================================
        // draw label
        // ========================================================

        GUILayout.BeginHorizontal();
        GUILayout.Space(20);
        GUILayout.BeginVertical(GUILayout.MaxWidth(500));

        // DISABLE {
        // // asset path
        // EditorGUILayout.LabelField ( "Path", AssetDatabase.GetAssetPath(curEdit) );
        // } DISABLE end

        // animclip field
        Object newClip = EditorGUILayout.ObjectField("Sprite Animation"
                                                     , curEdit
                                                     , typeof(exSpriteAnimClip)
                                                     , false
                                                     , GUILayout.Width(300)
                                                     );

        if (newClip != curEdit)
        {
            Selection.activeObject = newClip;
        }

        // DELME {
        // // length
        // float newLength = EditorGUILayout.FloatField( "Animation Length",
        //                                               curEdit.length,
        //                                               GUILayout.MaxWidth(200) );
        // if ( newLength != curEdit.length ) {
        //     float totalLength = 0.0f;
        //     float delta = newLength - curEdit.length;
        //     foreach ( exSpriteAnimClip.FrameInfo fi in curEdit.frameInfos) {
        //         float ratio = fi.length/curEdit.length;
        //         fi.length = Mathf.Max(1.0f/60.0f, fi.length + delta * ratio);
        //         totalLength += fi.length;
        //     }
        //     foreach ( exSpriteAnimClip.EventInfo ei in curEdit.eventInfos) {
        //         ei.time = ei.time/curEdit.length * totalLength;
        //     }
        //     curEdit.length = totalLength;
        //     GUI.changed = true;
        // }
        // } DELME end

        // speed and length
        GUILayout.BeginHorizontal();
        curEdit.speed = EditorGUILayout.FloatField("Speed",
                                                   curEdit.speed,
                                                   GUILayout.MaxWidth(200));
        GUILayout.Space(10);
        float curLength = curEdit.length / curEdit.speed;
        float newLength = EditorGUILayout.FloatField("Length",
                                                     curLength,
                                                     GUILayout.MaxWidth(200));

        if (curLength != newLength)
        {
            curEdit.speed = curEdit.length / newLength;
        }
        GUILayout.Label("secs");
        GUILayout.EndHorizontal();

        // sample rate
        curEdit.sampleRate = EditorGUILayout.FloatField("Sample Rate",
                                                        curEdit.sampleRate,
                                                        GUILayout.MaxWidth(200));

        // Wrap Mode enum popup
        curEdit.wrapMode = (WrapMode)EditorGUILayout.EnumPopup("Wrap Mode",
                                                               curEdit.wrapMode,
                                                               GUILayout.Width(200));

        // Anim Stop Action
        curEdit.stopAction = (exSpriteAnimClip.StopAction)EditorGUILayout.EnumPopup("Stop Action",
                                                                                    curEdit.stopAction,
                                                                                    GUILayout.Width(200));
        GUILayout.EndVertical();
        GUILayout.EndHorizontal();
        GUILayout.Space(20);

        // ========================================================
        // draw timeline editor
        // ========================================================

        lastRect = GUILayoutUtility.GetLastRect();
        int topHeight    = 20;
        int botHeight    = 20;
        int scalarHeight = 14; // 20 for scalar + label, 14 for scalar

        spriteAnimClipRect = new Rect(lastRect.x + 40.0f,
                                      lastRect.yMax,
                                      position.width - 80.0f,
                                      200.0f);
        SpriteAnimClipField(spriteAnimClipRect, topHeight, botHeight, scalarHeight, curEdit);

        // ========================================================
        // draw event info view
        // ========================================================

        Rect eventInfoViewRect2 = new Rect(spriteAnimClipRect.x + curEdit.editorOffset,
                                           spriteAnimClipRect.y + eventInfoViewRect.y,
                                           eventInfoViewRect.width,
                                           eventInfoViewRect.height);

        EventInfoViewField(eventInfoViewRect2, curEdit);

        // ========================================================
        // draw event info dragging
        // ========================================================

        if (inDraggingEventInfoState)
        {
            foreach (exSpriteAnimClip.EventInfo ei in selectedEventInfos)
            {
                float lineAt = spriteAnimClipRect.x + curEdit.editorOffset + (ei.time / curEdit.length) * totalWidth;
                float yStart = spriteAnimClipRect.y + frameInfoViewRect.y;
                float height = frameInfoViewRect.height;

                if (lineAt >= spriteAnimClipRect.x && lineAt <= spriteAnimClipRect.xMax)
                {
                    exEditorHelper.DrawLine(new Vector2(lineAt, yStart),
                                            new Vector2(lineAt, yStart + height),
                                            Color.yellow,
                                            1.0f);
                    GUI.Label(new Rect(lineAt - 15.0f, yStart + height, 30.0f, 20.0f),
                              exTimeHelper.ToString_Frames(ei.time, curEdit.sampleRate)
                              );
                }
            }
        }

        // ========================================================
        // Needle
        // ========================================================

        NeedleField(lastRect.yMax + topHeight,
                    lastRect.yMax + topHeight + spriteAnimClipRect.height - topHeight - botHeight);

        if (Event.current.type == EventType.MouseDown &&
            Event.current.button == 0 &&
            Event.current.clickCount == 1)
        {
            Rect needleRect = new Rect(spriteAnimClipRect.x,
                                       spriteAnimClipRect.y - 10.0f,
                                       spriteAnimClipRect.width,
                                       30.0f);
            if (needleRect.Contains(Event.current.mousePosition))
            {
                inDraggingNeedleState = true;
                MoveNeedle(Event.current.mousePosition);

                Event.current.Use();
                Repaint();
            }
        }

        // ========================================================
        // draw insert field
        // ========================================================

        if (inDraggingFrameInfoState)
        {
            InsertField(new Rect(spriteAnimClipRect.x,
                                 spriteAnimClipRect.y + frameInfoViewRect.y,
                                 7,
                                 frameInfoViewRect.height), curEdit);
        }

        GUILayout.BeginHorizontal();
        GUILayout.Space(spriteAnimClipRect.x);

        // ========================================================
        // left panel
        GUILayout.BeginVertical(GUILayout.MaxWidth(300));
        // ========================================================

        // ========================================================
        // preview Size
        // ========================================================

        float newPreviewSize = EditorGUILayout.Slider("Preview Size",
                                                      curEdit.editorPreviewSize,
                                                      32.0f,
                                                      512.0f,
                                                      GUILayout.Width(300));

        if (newPreviewSize != curEdit.editorPreviewSize)
        {
            curEdit.editorPreviewSize = newPreviewSize;
            CalculatePreviewScale();
        }

        // ========================================================
        // PreviewField
        // ========================================================

        GUILayout.Space(10);
        lastRect = GUILayoutUtility.GetLastRect();
        PreviewField(new Rect(spriteAnimClipRect.x,
                              lastRect.yMax,
                              curEdit.editorPreviewSize,
                              curEdit.editorPreviewSize));

        GUILayout.EndVertical();

        // ========================================================
        GUILayout.Space(40);
        // right panel
        GUILayout.BeginVertical(GUILayout.MaxWidth(600));
        // ========================================================

        EventInfoEditField();

        GUILayout.Space(5);
        lastRect = GUILayoutUtility.GetLastRect();
        exEditorHelper.DrawLine(new Vector2(lastRect.xMax, lastRect.yMax),
                                new Vector2(position.width - 40, lastRect.yMax),
                                Color.gray, 1.0f);
        exEditorHelper.DrawLine(new Vector2(lastRect.xMax, lastRect.yMax + 1),
                                new Vector2(position.width - 40, lastRect.yMax + 1),
                                Color.white, 1.0f);
        GUILayout.Space(5 + 2);

        FrameInfoEditField();

        GUILayout.EndVertical();
        GUILayout.EndHorizontal();

        // ========================================================
        // draw select rect
        // ========================================================

        if (selectRect.width != 0.0f || selectRect.height != 0.0f)
        {
            if (inRectSelectFrameState)
            {
                exEditorHelper.DrawRect(selectRect, new Color(0.0f, 0.5f, 1.0f, 0.2f), new Color(0.2f, 0.5f, 1.0f, 1.0f));
            }
            else if (inRectSelectEventState)
            {
                exEditorHelper.DrawRect(selectRect, new Color(1.0f, 0.0f, 0.0f, 0.2f), new Color(1.0f, 0.0f, 0.0f, 1.0f));
            }
        }

        // ========================================================
        Event e = Event.current;

        // ========================================================

        // mouse down
        if (e.type == EventType.MouseDown && e.button == 0 && e.clickCount == 1)
        {
            GUIUtility.keyboardControl = -1; // remove any keyboard control
            selectedEventInfos.Clear();

            mouseDownPos           = e.mousePosition;
            inRectSelectFrameState = true;
            UpdateSelectRect(e.mousePosition);
            ConfirmRectSelectFrameInfo();
            Repaint();

            e.Use();
        }

        // rect select frame state
        if (inRectSelectFrameState)
        {
            if (e.type == EventType.MouseDrag)
            {
                UpdateSelectRect(e.mousePosition);
                ConfirmRectSelectFrameInfo();

                Repaint();
                e.Use();
            }
            else if (e.type == EventType.MouseUp && e.button == 0)
            {
                ConfirmRectSelectFrameInfo();

                inRectSelectEventState   = false;
                inRectSelectFrameState   = false;
                inResizeFrameInfoState   = false;
                inDraggingNeedleState    = false;
                inDraggingFrameInfoState = false;
                inDraggingEventInfoState = false;
                insertAt = -1;

                Repaint();
                e.Use();
            }
        }

        // rect select event state
        if (inRectSelectEventState)
        {
            if (e.type == EventType.MouseDrag)
            {
                UpdateSelectRect(e.mousePosition);
                ConfirmRectSelectEventInfo();

                Repaint();
                e.Use();
            }
            else if (e.type == EventType.MouseUp && e.button == 0)
            {
                ConfirmRectSelectEventInfo();

                inRectSelectEventState   = false;
                inRectSelectFrameState   = false;
                inResizeFrameInfoState   = false;
                inDraggingNeedleState    = false;
                inDraggingFrameInfoState = false;
                inDraggingEventInfoState = false;
                insertAt = -1;

                Repaint();
                e.Use();
            }
        }

        // resize frame info state
        if (inResizeFrameInfoState)
        {
            if (e.type == EventType.MouseDrag)
            {
                ResizeSelectedFrames(e.mousePosition);

                Repaint();
                e.Use();
            }
            else if (e.type == EventType.MouseUp && e.button == 0)
            {
                inRectSelectEventState   = false;
                inRectSelectFrameState   = false;
                inResizeFrameInfoState   = false;
                inDraggingNeedleState    = false;
                inDraggingFrameInfoState = false;
                inDraggingEventInfoState = false;
                insertAt = -1;

                Repaint();
                e.Use();
            }
        }

        // dragging selected frame
        if (inDraggingFrameInfoState)
        {
            if (e.type == EventType.MouseDrag)
            {
                insertAt = FindInsertPlace();

                Repaint();
                e.Use();
            }
            else if (e.type == EventType.MouseUp && e.button == 0)
            {
                MoveSelectedFrameInfo();

                inRectSelectEventState   = false;
                inRectSelectFrameState   = false;
                inResizeFrameInfoState   = false;
                inDraggingNeedleState    = false;
                inDraggingFrameInfoState = false;
                inDraggingEventInfoState = false;
                insertAt = -1;

                Repaint();
                e.Use();
            }
        }

        // dragging selected event
        if (inDraggingEventInfoState)
        {
            if (e.type == EventType.MouseDrag)
            {
                MoveSelectedEventInfo(e.mousePosition);

                Repaint();
                e.Use();
            }
            else if (e.type == EventType.MouseUp && e.button == 0)
            {
                inRectSelectEventState   = false;
                inRectSelectFrameState   = false;
                inResizeFrameInfoState   = false;
                inDraggingNeedleState    = false;
                inDraggingFrameInfoState = false;
                inDraggingEventInfoState = false;
                insertAt = -1;

                Repaint();
                e.Use();
            }
        }

        // dragging needle
        if (inDraggingNeedleState)
        {
            if (e.type == EventType.MouseDrag)
            {
                MoveNeedle(e.mousePosition);

                Repaint();
                e.Use();
            }
            else if (e.type == EventType.MouseUp && e.button == 0)
            {
                inRectSelectEventState   = false;
                inRectSelectFrameState   = false;
                inResizeFrameInfoState   = false;
                inDraggingNeedleState    = false;
                inDraggingFrameInfoState = false;
                inDraggingEventInfoState = false;
                insertAt = -1;

                Repaint();
                e.Use();
            }
        }

        // key events
        if (e.isKey)
        {
            if (e.type == EventType.KeyDown)
            {
                if (e.keyCode == KeyCode.Backspace ||
                    e.keyCode == KeyCode.Delete)
                {
                    RemoveSelectedElements();
                    CalculatePreviewScale();
                    Repaint();
                    e.Use();
                }
            }
        }

        EditorGUILayout.EndScrollView();

        //
        if (GUI.changed)
        {
            EditorUtility.SetDirty(curEdit);
        }
    }