public override void Close()
        {
            Nodes.RemoveAt(0);
            Nodes.RemoveAt(Nodes.Count - 1);

            if (Nodes[0] != Nodes[Nodes.Count - 1])
            {
                Nodes.Add(Nodes[0]);
            }

            var distanceToFirstNode = Vector3.Distance(Nodes[0].Position, Nodes[1].Position);
            var distanceToLastNode  = Vector3.Distance(Nodes[0].Position, Nodes[Nodes.Count - 2].Position);

            var distanceToFirstTarget = distanceToLastNode / Vector3.Distance(Nodes[1].Position, Nodes[0].Position);
            var lastControlNode       = (Nodes[0].Position + (Nodes[1].Position - Nodes[0].Position) * distanceToFirstTarget);

            var distanceToLastTarget = distanceToFirstNode / Vector3.Distance(Nodes[Nodes.Count - 2].Position, Nodes[0].Position);
            var firstControlNode     = (Nodes[0].Position + (Nodes[Nodes.Count - 2].Position - Nodes[0].Position) * distanceToLastTarget);

            var firstControlKeyframe = new JSplineKeyframe();

            firstControlKeyframe.Position = firstControlNode;

            var lastControlKeyframe = new JSplineKeyframe();

            lastControlKeyframe.Position = lastControlNode;

            Nodes.Insert(0, firstControlKeyframe);
            Nodes.Add(lastControlKeyframe);
        }
Beispiel #2
0
 private void AddRenderDataForTransform(JTimelineBase timeline)
 {
     if (timeline is JTimelineTransform)
     {
         JTimelineTransform tline = (JTimelineTransform)timeline;
         for (int k = 0; k < tline.Tracks.Count; k++)
         {
             List <JClipRenderData> list  = new List <JClipRenderData>();
             JTransformTrack        track = tline.Tracks[k];
             for (int l = 0; l < track.Keyframes.Count; l++)
             {
                 JSplineKeyframe key        = track.Keyframes[l];
                 var             cachedData = ScriptableObject.CreateInstance <JClipRenderData>();
                 cachedData.ClipData = key;
                 list.Add(cachedData);
             }
             if (!timelineClipRenderDataMap.ContainsKey(track))
             {
                 timelineClipRenderDataMap.Add(track, list);
             }
             else
             {
                 timelineClipRenderDataMap[track] = list;
             }
         }
     }
 }
Beispiel #3
0
 //拖动
 private void ProcessDraggingTransformClip(JClipRenderData clip, Vector2 mouseDelta)
 {
     if (SourcePositions.ContainsKey(clip))
     {
         ScriptableObject selected = clip.ClipData;
         if (selected is JSplineKeyframe)
         {
             JSplineKeyframe Keyframe           = selected as JSplineKeyframe;
             float           mousePosOnTimeline = ContentXToTime(mouseDelta.x + FloatingWidth);
             float           newTime            = SourcePositions[clip] + mousePosOnTimeline;
             newTime = Mathf.Clamp(newTime, 0.0f, CurrentSequence.Duration);
             int index = Keyframe.Track.Keyframes.IndexOf(Keyframe);
             if (index == 0)
             {
                 Keyframe.StartTime       = newTime;
                 Keyframe.Track.StartTime = newTime;
             }
             else if (index == Keyframe.Track.Keyframes.Count - 1)
             {
                 Keyframe.StartTime     = newTime;
                 Keyframe.Track.EndTime = newTime;
             }
             else
             {
                 newTime            = Mathf.Clamp(newTime, Keyframe.Track.Keyframes[index - 1].StartTime, Keyframe.Track.Keyframes[index + 1].StartTime);
                 Keyframe.StartTime = newTime;
             }
             if (SelectedObjects.Count == 1)
             {
                 Selection.activeObject = Keyframe;
             }
         }
     }
 }
        public void InsertKeyframe(JSplineKeyframe keyframe, int index)
        {
            int before = Mathf.Max(index - 1, 0);
            int after  = index == 0 ? 1 : Mathf.Min(index, keyframes.Count - 1);

            keyframe.Position = Vector3.Lerp(keyframes[before].Position, keyframes[after].Position, 0.5f);
            Quaternion a = Quaternion.Euler(keyframes[before].Rotation);
            Quaternion b = Quaternion.Euler(keyframes[after].Rotation);

            keyframe.Rotation = Quaternion.Lerp(a, b, 0.5f).eulerAngles;
            keyframe.Scale    = Vector3.Lerp(keyframes[before].Scale, keyframes[after].Scale, 0.5f);
            keyframes.Add(keyframe);
            SortKeyframes();
        }
Beispiel #5
0
        /// <summary>
        /// 重置这条轨道的渲染数据和关键帧数据的关联
        /// </summary>
        /// <param name="track"></param>
        public void ResetTimeLineTrack(JTransformTrack track)
        {
            if (timelineClipRenderDataMap.ContainsKey(track))
            {
                timelineClipRenderDataMap.Remove(track);
            }
            List <JClipRenderData> cliplist = new List <JClipRenderData>();

            for (int i = 0; i < track.ObjectSpline.Nodes.Count; i++)
            {
                JSplineKeyframe frame      = track.ObjectSpline.Nodes[i];
                var             cachedData = ScriptableObject.CreateInstance <JClipRenderData>();
                cachedData.ClipData = frame;
                frame.StartTime     = track.StartTime + i * (track.EndTime - track.StartTime) / (track.ObjectSpline.Nodes.Count - 1);
                cliplist.Add(cachedData);
            }
            timelineClipRenderDataMap.Add(track, cliplist);
        }
Beispiel #6
0
        private void RemoveKeyFrame(JClipRenderData renderdata)
        {
            var keyframe = renderdata.ClipData;

            if (keyframe is JSplineKeyframe)
            {
                JSplineKeyframe key   = (JSplineKeyframe)keyframe;
                JTransformTrack track = key.Track;
                if (timelineClipRenderDataMap.ContainsKey(track))
                {
                    if (timelineClipRenderDataMap[track].Contains(renderdata))
                    {
                        timelineClipRenderDataMap[track].Remove(renderdata);
                    }
                }
                track.RemoveKeyframe(key);
            }
        }
Beispiel #7
0
 private void RemoveKeyFrameWithKeyframe(int index)
 {
     if ((Selection.objects.Length == 1) && (Selection.objects[0] is JSplineKeyframe))
     {
         JSplineKeyframe keyframe = (JSplineKeyframe)Selection.objects[0];
         JTransformTrack track    = keyframe.Track;
         if (timelineClipRenderDataMap.ContainsKey(track))
         {
             int remvindex = -1;
             for (int i = 0; i < timelineClipRenderDataMap[track].Count; i++)
             {
                 JSplineKeyframe key = (JSplineKeyframe)timelineClipRenderDataMap[track][i].ClipData;
                 if (key == keyframe)
                 {
                     remvindex = i;
                     break;
                 }
             }
             timelineClipRenderDataMap[track].RemoveAt(remvindex);
         }
         track.RemoveKeyframe(keyframe);
     }
 }
Beispiel #8
0
        private void TransformGUI(JTimelineBase timeline, JTransformTrack track, JClipRenderData[] renderDataList)
        {
            GenericMenu contextMenu = new GenericMenu();
            ///event 右键点击
            bool isContext = UnityEngine.Event.current.type == EventType.MouseDown && UnityEngine.Event.current.button == 1 && UnityEngine.Event.current.clickCount == 1;
            bool isChoose  = UnityEngine.Event.current.type == EventType.MouseDown && UnityEngine.Event.current.button == 0 && UnityEngine.Event.current.clickCount == 1;
            bool isDouble  = UnityEngine.Event.current.type == EventType.MouseDown && UnityEngine.Event.current.button == 0 && UnityEngine.Event.current.clickCount == 2;
            bool hasBox    = false;

            Rect DisplayAreaTemp = DisplayArea;

            DisplayAreaTemp.x = 0;
            DisplayAreaTemp.y = 0;

            var linestartX = ConvertTimeToXPos(track.StartTime);
            var lineendX   = ConvertTimeToXPos(track.EndTime);

            Rect linerenderRect     = new Rect(linestartX, DisplayArea.y, lineendX - linestartX, DisplayArea.height);
            Rect linerenderRectTemp = linerenderRect;

            linerenderRectTemp.x -= DisplayArea.x;
            linerenderRectTemp.y  = 0;

            GUI.color = new Color(85 / 255.0f, 47 / 255.0f, 176 / 255.0f, 1f);
            GUI.Box(linerenderRectTemp, "", USEditorUtility.NormalWhiteOutLineBG);
            GUI.color = Color.white;

            for (int j = 0; j < renderDataList.Length; j++)
            {
                JClipRenderData renderdata  = renderDataList[j];
                JSplineKeyframe key         = (JSplineKeyframe)renderdata.ClipData;
                var             startX      = ConvertTimeToXPos(key.StartTime);
                var             handleWidth = 5.0f;

                Rect renderRect     = new Rect(startX - handleWidth, DisplayArea.y, handleWidth * 2, DisplayArea.height);
                Rect renderRectTemp = renderRect;
                renderRectTemp.x -= DisplayArea.x;
                renderRectTemp.y  = 0;

                Rect labelRect = new Rect();

                GUI.color = new Color(255 / 255.0f, 122 / 255.0f, 105 / 255.0f, 1);
                if (SelectedObjects.Contains(renderdata))
                {
                    GUI.color = ColorTools.SelectColor;
                }
                GUI.Box(renderRectTemp, "", USEditorUtility.NormalWhiteOutLineBG);
                labelRect                 = renderRectTemp;
                renderdata.renderRect     = renderRect;
                renderdata.labelRect      = renderRect;
                renderdata.renderPosition = new Vector2(startX - handleWidth, DisplayArea.y);
                renderdata.ClipData       = key;
                GUI.color                 = Color.black;
                GUI.Label(labelRect, "" + track.Keyframes.IndexOf(key), USEditorUtility.USeqSkin.label);
                GUI.color = Color.white;

                if (isContext && renderRectTemp.Contains(UnityEngine.Event.current.mousePosition))
                {
                    hasBox = true;
                    contextMenu.AddItem(new GUIContent("DeleteKeyFrame"),
                                        false, (obj) => RemoveKeyFrame(((JClipRenderData)((object[])obj)[0])),
                                        new object[] { renderdata });
                }
                if (hasBox && isContext && renderRectTemp.Contains(UnityEngine.Event.current.mousePosition))
                {
                    UnityEngine.Event.current.Use();
                    contextMenu.ShowAsContext();
                }
            }

            if (!hasBox && isChoose && linerenderRectTemp.Contains(UnityEngine.Event.current.mousePosition) && (UnityEngine.Event.current.control || UnityEngine.Event.current.command))
            {
                //代码选中hierarchy中的对象 显示inspector 按住Ctrl or command
                //GameObject go = GameObject.Find(tline.gameObject.name);
                Selection.activeObject = track;
                EditorGUIUtility.PingObject(track);
            }

            if (!hasBox && isContext && linerenderRectTemp.Contains(UnityEngine.Event.current.mousePosition))
            {
                contextMenu = MenuForTransformTimeLine(timeline, track);
            }
            if (!hasBox && isContext && linerenderRectTemp.Contains(UnityEngine.Event.current.mousePosition))
            {
                UnityEngine.Event.current.Use();
                contextMenu.ShowAsContext();
            }
            if (!hasBox && isDouble && linerenderRectTemp.Contains(UnityEngine.Event.current.mousePosition))
            {
                int   index   = 1;
                float newTime = (((UnityEngine.Event.current.mousePosition.x + XScroll) / DisplayArea.width) * timeline.Sequence.Duration) / XScale;
                for (int i = 1; i < track.Keyframes.Count; i++)
                {
                    if (newTime <= track.Keyframes[i].StartTime)
                    {
                        index = i;
                        break;
                    }
                }
                AddNewKeyFrame(track, newTime, index);
            }
        }
 public void RemoveKeyframe(JSplineKeyframe keyframe)
 {
     keyframes.Remove(keyframe);
     BuildCurveFromKeyframes();
 }
 public void AddKeyframe(JSplineKeyframe keyframe)
 {
     keyframes.Add(keyframe);
     BuildCurveFromKeyframes();
 }
Beispiel #11
0
 public static int Comparer(JSplineKeyframe a, JSplineKeyframe b)
 {
     return(a.StartTime.CompareTo(b.StartTime));
 }