public void ProcessDraggingObjects(Vector2 mouseDelta, bool snap, float snapValue) { if (!ObjectPathTimeline) { return; } USUndoManager.PropertyChange(ObjectPathTimeline, "Drag Selection"); USUndoManager.PropertyChange(this, "Drag Selection"); foreach (var selectedObject in SelectedObjects) { var keyframe = selectedObject as SplineKeyframe; Vector3 newPosition = SourcePositions[keyframe] + mouseDelta; newPosition.x = newPosition.x + XScroll - DisplayArea.x; if (snap) { newPosition.x = Mathf.Round(newPosition.x / snapValue) * snapValue; } var newTime = ((newPosition.x / DisplayArea.width) * Duration) / XScale; newTime = Mathf.Clamp(newTime, 0.0f, Duration); if (ObjectPathTimeline.ObjectSpline.Nodes[0] == keyframe) { ObjectPathTimeline.StartTime = newTime; } if (ObjectPathTimeline.ObjectSpline.Nodes[ObjectPathTimeline.ObjectSpline.Nodes.Count - 1] == keyframe) { ObjectPathTimeline.EndTime = newTime; } } ObjectPathTimeline.Process(ObjectPathTimeline.Sequence.RunningTime, ObjectPathTimeline.Sequence.PlaybackRate); }
public override void Initialize(USTimelineBase timeline) { base.Initialize(timeline); ObjectPathTimeline.Build(); ObjectPathTimeline.SourcePosition = ObjectPathTimeline.AffectedObject.transform.position; ObjectPathTimeline.SourceRotation = ObjectPathTimeline.AffectedObject.transform.rotation; }
private void RemoveKeyframeAtIndex(int index) { if (index >= ObjectPathTimeline.Keyframes.Count || index < 0) { return; } var keyframe = ObjectPathTimeline.Keyframes[index]; ObjectPathTimeline.RemoveKeyframe(keyframe); GUI.changed = true; USUndoManager.DestroyImmediate(keyframe); }
public void OnCollapsedGUI() { if (Event.current.commandName == "UndoRedoPerformed") { ObjectPathTimeline.BuildCurveFromKeyframes(); return; } if (ObjectPathTimeline.ObjectSpline == null) { ObjectPathTimeline.BuildCurveFromKeyframes(); } cachedObjectPathRenderData[0].Keyframe = ObjectPathTimeline.FirstNode; cachedObjectPathRenderData[1].Keyframe = ObjectPathTimeline.LastNode; if (ObjectPathTimeline.ObjectSpline.SplineSolver == null) { ObjectPathTimeline.BuildCurveFromKeyframes(); } GUILayout.Box("", TimelineBackground, GUILayout.MaxHeight(17.0f), GUILayout.ExpandWidth(true)); if (Event.current.type == EventType.Repaint) { DisplayArea = GUILayoutUtility.GetLastRect(); } var startX = ConvertTimeToXPos(ObjectPathTimeline.StartTime); var endX = ConvertTimeToXPos(ObjectPathTimeline.EndTime); var splineAreaBox = new Rect(startX, DisplayArea.y, endX - startX, DisplayArea.height); GUI.Box(splineAreaBox, ""); var width = 2.0f; cachedObjectPathRenderData[0].RenderRect = new Rect(startX, DisplayArea.y, width * 2.0f, DisplayArea.height); cachedObjectPathRenderData[1].RenderRect = new Rect(endX - (width * 2.0f), DisplayArea.y, width * 2.0f, DisplayArea.height); cachedObjectPathRenderData[0].RenderPosition = new Vector2(startX, DisplayArea.y); cachedObjectPathRenderData[1].RenderPosition = new Vector2(endX, DisplayArea.y); using (new GUIChangeColor(SelectedObjects.Contains(cachedObjectPathRenderData[0].Keyframe) ? Color.yellow : GUI.color)) GUI.Box(cachedObjectPathRenderData[0].RenderRect, ""); using (new GUIChangeColor(SelectedObjects.Contains(cachedObjectPathRenderData[1].Keyframe) ? Color.yellow : GUI.color)) GUI.Box(cachedObjectPathRenderData[1].RenderRect, ""); GUI.Label(splineAreaBox, "Double Click on an existing keyframe in the Scene view to add a new one (backspace or delete to remove)."); }
public override void OnEnable() { base.OnEnable(); if (ObjectPathEditor == null) { ObjectPathEditor = CreateInstance <ObjectPathEditor>(); } if (ObjectPathTimeline) { ObjectPathTimeline.Build(); } ISelectableContainers = new List <ISelectableContainer>() { ObjectPathEditor, }; }
public void OnSceneGUI() { if (ObjectPathTimeline == null || ObjectPathTimeline.Keyframes == null) { return; } if (SelectedNodeIndex >= 0) { if (Event.current.isKey && (Event.current.keyCode == KeyCode.Delete || Event.current.keyCode == KeyCode.Backspace)) { USUndoManager.RegisterCompleteObjectUndo(this, "Remove Keyframe"); USUndoManager.RegisterCompleteObjectUndo(ObjectPathTimeline, "Remove Keyframe"); Event.current.Use(); RemoveKeyframeAtIndex(SelectedNodeIndex); SelectedNodeIndex = -1; } } if (Event.current.type == EventType.MouseDown) { var nearestIndex = GetNearestNodeForMousePosition(Event.current.mousePosition); if (nearestIndex != -1) { SelectedNodeIndex = nearestIndex; if (Event.current.clickCount > 1) { USUndoManager.PropertyChange(ObjectPathTimeline, "Add Keyframe"); var cameraTransform = SceneView.currentDrawingSceneView.camera.transform; var keyframe = GetKeyframeAtIndex(SelectedNodeIndex); var nextKeyframe = GetKeyframeAtIndex(SelectedNodeIndex + 1); var newKeyframePosition = Vector3.zero; if (keyframe == null) { newKeyframePosition = cameraTransform.position + (cameraTransform.forward * 1.0f); } else { if (SelectedNodeIndex == ObjectPathTimeline.Keyframes.Count - 1) { newKeyframePosition = keyframe.Position + (cameraTransform.up * Vector3.Magnitude(keyframe.Position - cameraTransform.position) * 0.1f); } else { var directionVector = nextKeyframe.Position - keyframe.Position; var halfDistance = Vector3.Magnitude(directionVector) * 0.5f; directionVector.Normalize(); newKeyframePosition = keyframe.Position + (directionVector * halfDistance); } } var translatedKeyframe = CreateInstance <SplineKeyframe>(); USUndoManager.RegisterCreatedObjectUndo(translatedKeyframe, "Add Keyframe"); translatedKeyframe.Position = newKeyframePosition; ObjectPathTimeline.AddAfterKeyframe(translatedKeyframe, SelectedNodeIndex); GUI.changed = true; } } } if (Vector3.Distance(ObjectPathTimeline.Keyframes[0].Position, ObjectPathTimeline.Keyframes[ObjectPathTimeline.Keyframes.Count - 1].Position) == 0) { Handles.Label(ObjectPathTimeline.Keyframes[0].Position, "Start and End"); } else { Handles.Label(ObjectPathTimeline.Keyframes[0].Position, "Start"); Handles.Label(ObjectPathTimeline.Keyframes[ObjectPathTimeline.Keyframes.Count - 1].Position, "End"); } for (var nodeIndex = 0; nodeIndex < ObjectPathTimeline.Keyframes.Count; nodeIndex++) { var node = ObjectPathTimeline.Keyframes[nodeIndex]; if (node && nodeIndex > 0 && nodeIndex < ObjectPathTimeline.Keyframes.Count - 1) { var handleSize = HandlesUtility.GetHandleSize(node.Position); Handles.Label(node.Position + new Vector3(0.25f * handleSize, 0.0f * handleSize, 0.0f * handleSize), nodeIndex.ToString()); } using (new HandlesChangeColor(ObjectPathTimeline.PathColor)) { USUndoManager.BeginChangeCheck(); var existingKeyframe = ObjectPathTimeline.Keyframes[nodeIndex]; var newPosition = HandlesUtility.PositionHandle(existingKeyframe.Position, Quaternion.identity); if (USUndoManager.EndChangeCheck()) { USUndoManager.PropertyChange(ObjectPathTimeline, "Modify Keyframe"); foreach (var keyframe in ObjectPathTimeline.Keyframes) { USUndoManager.PropertyChange(keyframe, "Modify Keyframe"); } ObjectPathTimeline.AlterKeyframe(newPosition, nodeIndex); EditorUtility.SetDirty(ObjectPathTimeline); } } } }