// ------------------------------------------------------------------ // 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); } }