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); }
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; } } } }
//拖动 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(); }
/// <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); }
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); } }
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); } }
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(); }
public static int Comparer(JSplineKeyframe a, JSplineKeyframe b) { return(a.StartTime.CompareTo(b.StartTime)); }