Пример #1
0
    static void Init()
    {
        // Get existing open window or if none, make a new one:
        SequenceEditor window = (SequenceEditor)GetWindow(typeof(SequenceEditor));

        window.Show();
    }
Пример #2
0
        protected virtual void OnBodyContextClick()
        {
            int t = SequenceEditor.GetFrameForX(Event.current.mousePosition.x - _headerWidth);

            GUIContent selectAllEvents = new GUIContent("Select All Events");
            GUIContent addEventAtFrame = new GUIContent("Add Event At Frame");
            GUIContent addEventFillGap = new GUIContent("Add Event Fill Gap");

            GenericMenu menu = new GenericMenu();

            menu.AddItem(selectAllEvents, false, SelectAllEvents);
            if (Track.CanAddAt(t))
            {
                menu.AddItem(addEventAtFrame, false, AddEventAtPoint, t);
                menu.AddItem(addEventFillGap, false, AddEventFillGap, t);
            }
            else
            {
                menu.AddDisabledItem(addEventAtFrame);
                menu.AddDisabledItem(addEventFillGap);
            }

            menu.ShowAsContext();
            Event.current.Use();
        }
Пример #3
0
        private void Delete()
        {
            List <FEventEditor> eventEditors = new List <FEventEditor>();

            eventEditors.Add(this);
            SequenceEditor.DestroyEvents(eventEditors);
        }
Пример #4
0
    public static void ShowWindow()
    {
        SequenceEditor window = EditorWindow.GetWindow <SequenceEditor>(false, "Tweener");

        window.wantsMouseMove = true;
        UnityEngine.Object.DontDestroyOnLoad(window);
    }
Пример #5
0
    public void Init(SequenceHolder _sequenceHolder)
    {
        if (_sequenceHolder == null || editorWindow != null)
        {
            Destroy(gameObject);
        }
        else
        {
            editorWindow = this;
        }

        sequenceHolder = _sequenceHolder;

        sequence = sequenceHolder.GetSequence();

        sequenceVisualization = new List <Image>();

        foreach (bool slot in sequence)
        {
            GameObject t = new GameObject("slot", typeof(RectTransform));
            Image      i = t.AddComponent <Image>();
            i.sprite = slot ? on : off;
            t.transform.SetParent(sequenceParent);
            if (i != null)
            {
                sequenceVisualization.Add(i);
            }
        }

        highlightTargetPos = sequenceParent.position;

        Time.timeScale = 0;
    }
Пример #6
0
        void AddTrackMenu(object param)
        {
            KeyValuePair <Type, FEventAttribute> kvp = (KeyValuePair <Type, FEventAttribute>)param;

            Undo.RecordObjects(new UnityEngine.Object[] { Container, this }, "add Track");

            FTrack track = (FTrack)typeof(FContainer).GetMethod("Add", new Type[] { typeof(FrameRange) }).MakeGenericMethod(kvp.Key).Invoke(Container, new object[] { SequenceEditor.ViewRange });

            string evtName = track.gameObject.name;

            int nameStart = 0;
            int nameEnd   = evtName.Length;

            if (nameEnd > 2 && evtName[0] == 'F' && char.IsUpper(evtName[1]))
            {
                nameStart = 1;
            }
            if (evtName.EndsWith("Event"))
            {
                nameEnd = evtName.Length - "Event".Length;
            }
            evtName = evtName.Substring(nameStart, nameEnd - nameStart);

            track.gameObject.name = ObjectNames.NicifyVariableName(evtName);

            SequenceEditor.Refresh();

            Undo.RegisterCreatedObjectUndo(track.gameObject, string.Empty);

            SequenceEditor.SelectExclusive(SequenceEditor.GetEditor <FEventEditor>(track.GetEvent(0)));
        }
Пример #7
0
 protected virtual void OnHeaderInput(Rect labelRect, Rect iconRect)
 {
     if (Event.current.type == EventType.MouseDown && Event.current.clickCount > 1 && labelRect.Contains(Event.current.mousePosition))
     {
         Selection.activeTransform = this.Obj.transform;
         Event.current.Use();
     }
     else if (Event.current.type == EventType.MouseDown && labelRect.Contains(Event.current.mousePosition))
     {
         if (Event.current.button == 0)
         {
             if (Event.current.shift)
             {
                 SequenceEditor.Select(this);
             }
             else
             {
                 SequenceEditor.SelectExclusive(this);
             }
         }
         else if (Event.current.button == 1)
         {
             ShowHeaderContextMenu();
         }
         Event.current.Use();
     }
 }
Пример #8
0
        public virtual void OnToggle(bool on)
        {
            Undo.RecordObject(Track, on ? "enable" : "disable");
            Track.enabled = on;
            EditorUtility.SetDirty(Track);

            if (Track.RequiresEditorCache)
            {
                if (on)
                {
                    Track.CreateCache();
                }
                else
                {
                    Track.ClearCache();
                }
            }

            if (!SequenceEditor.Sequence.IsStopped)
            {
                int currentFrame = SequenceEditor.Sequence.CurrentFrame;
                SequenceEditor.Stop();
                SequenceEditor.SetCurrentFrame(currentFrame);
            }

            SequenceEditor.SetDirty(this);
            SequenceEditor.NotifyDirtyTracks();
        }
Пример #9
0
 public virtual void DrawCurves()
 {
     foreach (EventNode previousNode in previousNodes)
     {
         SequenceEditor.DrawNodeCurve(previousNode.windowRect, windowRect);
     }
 }
Пример #10
0
//		public override void OnTogglePreview ()
//		{
////			int currentFrame = Track.Sequence.GetCurrentFrame();
//
//			base.OnTogglePreview();
//
////			if( currentFrame >= 0 )
////				SequenceEditor.SetCurrentFrame( currentFrame );
//		}

        public override void Render(Rect rect, float headerWidth)
        {
//			bool isPreviewing = _track.IsPreviewing;

            base.Render(rect, headerWidth);

//			if( isPreviewing != _track.IsPreviewing )
//			{
//				if( Event.current.alt )
//					SyncWithAnimationWindow = true;
//			}

            switch (Event.current.type)
            {
            case EventType.DragUpdated:
                if (rect.Contains(Event.current.mousePosition))
                {
                    int numAnimationsDragged = FAnimationEventInspector.NumAnimationsDragAndDrop(Track.Sequence.FrameRate);
                    int frame = SequenceEditor.GetFrameForX(Event.current.mousePosition.x);

                    DragAndDrop.visualMode = numAnimationsDragged > 0 && Track.CanAddAt(frame) ? DragAndDropVisualMode.Copy : DragAndDropVisualMode.Rejected;
                    Event.current.Use();
                }
                break;

            case EventType.DragPerform:
                if (rect.Contains(Event.current.mousePosition))
                {
                    AnimationClip animClip = FAnimationEventInspector.GetAnimationClipDragAndDrop(Track.Sequence.FrameRate);

                    if (animClip && Mathf.Approximately(animClip.frameRate, Track.Sequence.FrameRate))
                    {
                        int frame = SequenceEditor.GetFrameForX(Event.current.mousePosition.x);
                        int maxLength;

                        if (Track.CanAddAt(frame, out maxLength))
                        {
                            FPlayAnimationEvent animEvt = FEvent.Create <FPlayAnimationEvent>(new FrameRange(frame, frame + Mathf.Min(maxLength, Mathf.RoundToInt(animClip.length * animClip.frameRate))));
                            Track.Add(animEvt);
                            FAnimationEventInspector.SetAnimationClip(animEvt, animClip);
                            DragAndDrop.AcceptDrag();
                        }
                    }

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

//			if( _wasPreviewing != _track.IsPreviewing )
//			{
//				if( _wasPreviewing )
//					SequenceEditor.OnUpdateEvent.RemoveListener( OnUpdate );
//				else
//					SequenceEditor.OnUpdateEvent.AddListener( OnUpdate );
//
//				_wasPreviewing = _track.IsPreviewing;
//			}
        }
Пример #11
0
        public virtual void OnToggle(bool on)
        {
            Undo.RecordObject(Track, on ? "enable" : "disable");
            Track.enabled = on;
            EditorUtility.SetDirty(Track);

            SequenceEditor.SetDirty(this);
        }
Пример #12
0
 void DeleteTimeline()
 {
     UnityEngine.Object[] objsToSave = new UnityEngine.Object[] { SequenceEditor.GetSequence(), _timeline };
     Undo.RegisterCompleteObjectUndo(objsToSave, string.Empty);
     Undo.SetTransformParent(_timeline.transform, null, string.Empty);
     SequenceEditor.GetSequence().Remove(_timeline);
     Undo.DestroyObjectImmediate(_timeline.gameObject);
 }
Пример #13
0
        private void Duplicate()
        {
            GameObject go = GameObject.Instantiate(Obj.gameObject);

            go.transform.parent = Obj.transform.parent;
            go.name             = SequenceEditor.GetUniqueContainerName(Obj.gameObject.name);
            Undo.RegisterCreatedObjectUndo(go, "duplicate " + Obj.gameObject.name);
        }
Пример #14
0
        private void StopDragSelecting(Vector2 mousePos)
        {
            if (!_isDragSelecting)
            {
                return;
            }

            _isDragSelecting = false;

            FrameRange selectedRange = new FrameRange();
            bool       isSelectingTimelines;

            Rect selectionRect = GetDragSelectionRect(_dragSelectingStartPos, mousePos, out selectedRange, out isSelectingTimelines);

            if (!Event.current.shift && !Event.current.control)
            {
                SequenceEditor.DeselectAll();
            }

            for (int i = 0; i != Editors.Count; ++i)
            {
                Rect timelineRect = Editors[i].Rect;
                if (timelineRect.yMin >= selectionRect.yMax)
                {
                    break;
                }

                if (timelineRect.yMax <= selectionRect.yMin)
                {
                    continue;
                }

                for (int j = 0; j != Editors[i].Editors.Count; ++j)
                {
                    Rect trackRect = Editors[i].Editors[j].Rect;

                    if (trackRect.yMin >= selectionRect.yMax)
                    {
                        break;
                    }

                    if (trackRect.yMax <= selectionRect.yMin)
                    {
                        continue;
                    }

                    if (Event.current.control)
                    {
                        Editors[i].Editors[j].DeselectEvents(selectedRange);
                    }
                    else
                    {
                        Editors[i].Editors[j].SelectEvents(selectedRange);
                    }
                }
            }
        }
Пример #15
0
        protected virtual void OnBodyContextClick()
        {
            int t = SequenceEditor.GetFrameForX(Event.current.mousePosition.x - HeaderWidth);

            GUIContent selectAllEvents = new GUIContent("选择所有事件");
            GUIContent addEventAtFrame = new GUIContent("在当前帧添加事件");
            GUIContent addEventFillGap = new GUIContent("添加事件填充剩余空隙");

            GUIContent pasteEvent = new GUIContent("粘贴事件");

            GenericMenu menu = new GenericMenu();

            menu.AddItem(selectAllEvents, false, SelectAllEvents);
            if (Track.CanAddAt(t))
            {
                menu.AddItem(addEventAtFrame, false, AddEventAtPoint, t);
                menu.AddItem(addEventFillGap, false, AddEventFillGap, t);
            }
            else
            {
                menu.AddDisabledItem(addEventAtFrame);
                menu.AddDisabledItem(addEventFillGap);
            }

            if (FSequenceEditor.CopyObject != null)
            {
                FEvent copyEvt = FSequenceEditor.CopyObject as FEvent;

                if (copyEvt != null)
                {
                    if (FSequenceEditor.CopyObject.GetType() != Track.GetEventType())
                    {
                        menu.AddDisabledItem(pasteEvent);
                    }
                    else
                    {
                        FEvent eventBefore = Track.GetEventBefore(t);
                        FEvent eventAfter  = Track.GetEventAfter(t);

                        FrameRange validRange = new FrameRange(eventBefore == null ? 0 : eventBefore.End, eventAfter == null ? SequenceEditor.Sequence.Length : eventAfter.Start);

                        if (validRange.Length >= copyEvt.Length)
                        {
                            menu.AddItem(pasteEvent, false, PasteEvent, t);
                        }
                        else
                        {
                            menu.AddDisabledItem(pasteEvent);
                        }
                    }
                }
            }

            menu.ShowAsContext();
            Event.current.Use();
        }
Пример #16
0
    public static void ShowEditor(int sequenceIndex)
    {
        seqIndex = sequenceIndex;

        Load();

        SequenceEditor editor = EditorWindow.GetWindow <SequenceEditor>(false, sequence.id);

        editor.Init();
    }
Пример #17
0
        void ChangeOwner()
        {
            Undo.RecordObject(_timeline, "Change Timeline Owner");
            _timeline.SetOwner(Selection.activeTransform);
            _timeline.name = Selection.activeTransform.name;

            if (!SequenceEditor.GetSequence().IsStopped)
            {
                _timeline.Init();
            }
        }
Пример #18
0
        public override void Render(Rect rect, float headerWidth)
        {
            Rect = rect;

            Rect headerRect = rect;

            headerRect.height = HeaderHeight;
            RenderHeader(headerRect, headerWidth);

            Rect headerTimelineRect = rect;

            headerTimelineRect.xMin += headerWidth;
            if (headerTimelineRect.Contains(Event.current.mousePosition))
            {
                SequenceEditor.SetMouseHover(Event.current.mousePosition.x - headerWidth, this);
            }

            headerRect.width = headerWidth;
            HeaderRect       = headerRect;

            Rect listRect = rect;

            listRect.yMin += HeaderHeight;

            _contentOffset.y = listRect.y;

            if (_showPercentage.value > 0)
            {
                listRect.height *= _showPercentage.value;
                RenderList(listRect, headerWidth);
            }

            if (IsSelected && Event.current.type == EventType.Repaint)
            {
                float lineWidth     = 3;
                float halfLineWidth = lineWidth * 0.33f;
                Color c             = Handles.selectedColor;    //FGUI.GetTextColor();//Color.white;//new Color(0.5f, 0.7f, 0.1f, 1f);//FGUI.GetSelectionColor();
                c.a           = 1f;
                Handles.color = c;
                Vector3 pt0 = new Vector3(rect.xMin + halfLineWidth, rect.yMin + halfLineWidth);
                Vector3 pt1 = new Vector3(rect.xMin + halfLineWidth, rect.yMax - halfLineWidth);
                Vector3 pt2 = new Vector3(rect.xMax - halfLineWidth, rect.yMax - halfLineWidth);
                Vector3 pt3 = new Vector3(rect.xMax - halfLineWidth, rect.yMin + halfLineWidth);
//				Handles.DrawAAPolyLine( lineWidth, pt0, pt1, pt2, pt3, pt0 );
                Handles.DrawSolidRectangleWithOutline(new Vector3[] { pt0, pt1, pt2, pt3 }, new Color(0, 0, 0, 0), c);
                //				Handles.DrawPolyLine( pt0, pt1, pt2, pt3, pt0 );
            }

            Handles.color = FGUI.GetLineColor();
            Handles.DrawLine(Rect.min, Rect.min + new Vector2(Rect.width, 0));
            Handles.DrawLine(Rect.max - new Vector2(Rect.width, 0), Rect.max);
        }
Пример #19
0
 public void DeselectEvents(FrameRange range)
 {
     for (int i = 0; i != _eventEditors.Count; ++i)
     {
         if (range.Overlaps(_eventEditors[i]._evt.FrameRange))
         {
             SequenceEditor.Deselect(_eventEditors[i]);
         }
         else if (_eventEditors[i]._evt.Start > range.End)
         {
             break;
         }
     }
 }
Пример #20
0
        void DuplicateTrack()
        {
            Undo.RecordObjects(new UnityEngine.Object[] { _timelineEditor, _track.GetTimeline() }, string.Empty);
            GameObject duplicateTrack = (GameObject)Instantiate(_track.gameObject);

            duplicateTrack.name = _track.gameObject.name;
            Undo.SetTransformParent(duplicateTrack.transform, _track.GetTimeline().transform, string.Empty);
            Undo.RegisterCreatedObjectUndo(duplicateTrack, "duplicate Track");

            if (!SequenceEditor.GetSequence().IsStopped)
            {
                duplicateTrack.GetComponent <FTrack>().Init();
            }
        }
Пример #21
0
        void DuplicateTimeline()
        {
            UnityEngine.Object[] objsToSave = new UnityEngine.Object[] { SequenceEditor, SequenceEditor.GetSequence() };
            Undo.RecordObjects(objsToSave, string.Empty);
            GameObject duplicateTimeline = (GameObject)Instantiate(_timeline.gameObject);

            duplicateTimeline.name = _timeline.gameObject.name;
            Undo.SetTransformParent(duplicateTimeline.transform, _timeline.Sequence.TimelineContainer, string.Empty);
            Undo.RegisterCreatedObjectUndo(duplicateTimeline, "duplicate Timeline");

            if (!SequenceEditor.GetSequence().IsStopped)
            {
                duplicateTimeline.GetComponent <FTimeline>().Init();
            }
        }
Пример #22
0
        private void OnUpdate()
        {
            if (!_syncWithAnimationWindow)
            {
                return;
            }

            if (Selection.activeTransform != Track.Owner)
            {
                Selection.activeTransform = Track.Owner;
            }

            if (!AnimationMode.InAnimationMode())
            {
//				AnimationMode.StartAnimationMode();
                AnimationWindowProxy.StartAnimationMode();
            }

//			if( _track.IsPreviewing )
            {
                int animWindowFrame = AnimationWindowProxy.GetCurrentFrame();

                FEvent[] evts    = new FEvent[2];
                int      numEvts = Track.GetEventsAt(SequenceEditor.Sequence.CurrentFrame, ref evts);

                if (numEvts > 0)
                {
                    FPlayAnimationEvent animEvt = (FPlayAnimationEvent)evts[numEvts - 1];
                    if (animEvt.ControlsAnimation)
                    {
                        int normCurrentFrame = SequenceEditor.Sequence.CurrentFrame - animEvt.Start;

                        if (animWindowFrame > animEvt.Length)
                        {
                            animWindowFrame = animEvt.Length;
                            AnimationWindowProxy.SetCurrentFrame(animWindowFrame, animEvt.LengthTime);
                        }

                        if (animWindowFrame >= 0 && animWindowFrame != normCurrentFrame)
                        {
                            SequenceEditor.SetCurrentFrame(animEvt.Start + animWindowFrame);
                            SequenceEditor.Repaint();
                            //						Debug.Log( "AnimWindow->Flux: " + (animEvt.Start + animWindowFrame) );
                        }
                    }
                }
            }
        }
Пример #23
0
        protected override void Init(FObject obj)
        {
            _track = (FTrack)obj;

            _eventEditors.Clear();

            List <FEvent> events = _track.GetEvents();

            for (int i = 0; i < events.Count; ++i)
            {
                FEvent       evt       = events[i];
                FEventEditor evtEditor = SequenceEditor.GetEditor <FEventEditor>(evt);
                evtEditor.Init(evt, this);
                _eventEditors.Add(evtEditor);
            }
        }
Пример #24
0
        void AddTimeline()
        {
            Undo.IncrementCurrentGroup();
            UnityEngine.Object[] objsToSave = new UnityEngine.Object[] { SequenceEditor, SequenceEditor.GetSequence() };
            Undo.RecordObjects(objsToSave, string.Empty);

            GameObject timelineGO = new GameObject("TimeLine");
            FTimeline  timeline   = timelineGO.AddComponent <Flux.FTimeline>();

            //timeline.SetOwner(((GameObject)obj).transform);
            SequenceEditor.GetSequence().Add(timeline);

            Undo.RegisterCompleteObjectUndo(objsToSave, string.Empty);
            Undo.RegisterCreatedObjectUndo(timeline.gameObject, "create Timeline");
            Undo.CollapseUndoOperations(Undo.GetCurrentGroup());
        }
Пример #25
0
        public override void Init(FObject obj, FEditor owner)
        {
            base.Init(obj, owner);

            _eventEditors.Clear();

            List <FEvent> events = Track.Events;

            for (int i = 0; i < events.Count; ++i)
            {
                FEvent       evt       = events[i];
                FEventEditor evtEditor = SequenceEditor.GetEditor <FEventEditor>(evt);
                evtEditor.Init(evt, this);
                _eventEditors.Add(evtEditor);
            }
        }
Пример #26
0
        public override void Init(FObject obj, FEditor owner)
        {
            base.Init(obj, owner);

            Editors.Clear();

            List <FTrack> tracks = Container.Tracks;

            for (int i = 0; i < tracks.Count; ++i)
            {
                FTrack       track       = tracks[i];
                FTrackEditor trackEditor = SequenceEditor.GetEditor <FTrackEditor>(track);
                trackEditor.Init(track, this);
                Editors.Add(trackEditor);
            }

            _icon = new GUIContent(FUtility.GetFluxTexture("Plus.png"));
        }
Пример #27
0
        // pixelsPerFrame can be calculated from rect and viewRange, but being cached on a higher level
        public void Render(Rect rect, FrameRange viewRange, float pixelsPerFrame, FrameRange validKeyframeRange)
        {
            Rect = rect;

            _eventRect = rect;

            int eventStartFrame = Mathf.Max(Evt.Start, viewRange.Start);
            int eventEndFrame   = Mathf.Min(Evt.End, viewRange.End);

            _eventRect.xMin += (eventStartFrame - viewRange.Start) * pixelsPerFrame;                               // first set the start
            _eventRect.xMax  = _eventRect.xMin + Mathf.Max(4, (eventEndFrame - eventStartFrame) * pixelsPerFrame); // then width

            if (_eventRect.Contains(Event.current.mousePosition))
            {
                SequenceEditor.SetMouseHover(Event.current.mousePosition.x - rect.x, this);
            }

            RenderEvent(viewRange, validKeyframeRange);
        }
Пример #28
0
        public override void Init(FObject obj, FEditor owner)
        {
            base.Init(obj, owner);

            Editors.Clear();

            List <FTimeline> timelines = Container.Timelines;

            for (int i = 0; i < timelines.Count; ++i)
            {
                FTimeline       timeline       = timelines[i];
                FTimelineEditor timelineEditor = SequenceEditor.GetEditor <FTimelineEditor>(timeline);
                timelineEditor.Init(timeline, this);
                Editors.Add(timelineEditor);
            }

            _icon = new GUIContent(FUtility.GetFluxTexture("Folder.png"));

//			_contentOffset = new Vector2(8, HeaderHeight);
        }
Пример #29
0
        // pixelsPerFrame can be calculated from rect and viewRange, but being cached on a higher level
        public void Render(Rect rect, FrameRange viewRange, float pixelsPerFrame, FrameRange validKeyframeRange)
        {
            Rect = rect;

            _eventRect = rect;

            int eventStartFrame = Mathf.Max(Evt.Start, viewRange.Start);
            int eventEndFrame   = Mathf.Min(Evt.End, viewRange.End);

            _eventRect.xMin = SequenceEditor.GetXForFrame(eventStartFrame);
            _eventRect.xMax = SequenceEditor.GetXForFrame(eventEndFrame);


            if (_eventRect.Contains(Event.current.mousePosition))
            {
                SequenceEditor.SetMouseHover(Event.current.mousePosition.x, this);
            }

            RenderEvent(viewRange, validKeyframeRange);
        }
Пример #30
0
        public override void Render(Rect rect, float headerWidth)
        {
            base.Render(rect, headerWidth);

            switch (Event.current.type)
            {
            case EventType.DragUpdated:
                if (rect.Contains(Event.current.mousePosition))
                {
                    int numAnimationsDragged = FAnimationEventInspector.NumAnimationsDragAndDrop(Track.Sequence.FrameRate);
                    int frame = SequenceEditor.GetFrameForX(Event.current.mousePosition.x);

                    DragAndDrop.visualMode = numAnimationsDragged > 0 && Track.CanAddAt(frame) ? DragAndDropVisualMode.Copy : DragAndDropVisualMode.Rejected;
                    Event.current.Use();
                }
                break;

            case EventType.DragPerform:
                if (rect.Contains(Event.current.mousePosition))
                {
                    AnimationClip animClip = FAnimationEventInspector.GetAnimationClipDragAndDrop(Track.Sequence.FrameRate);

                    if (animClip && Mathf.Approximately(animClip.frameRate, Track.Sequence.FrameRate))
                    {
                        int frame = SequenceEditor.GetFrameForX(Event.current.mousePosition.x);
                        int maxLength;

                        if (Track.CanAddAt(frame, out maxLength))
                        {
                            FPlayAnimationEvent animEvt = FEvent.Create <FPlayAnimationEvent>(new FrameRange(frame, frame + Mathf.Min(maxLength, Mathf.RoundToInt(animClip.length * animClip.frameRate))));
                            Track.Add(animEvt);
                            FAnimationEventInspector.SetAnimationClip(animEvt, animClip);
                            DragAndDrop.AcceptDrag();
                        }
                    }

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