コード例 #1
0
        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;
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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,
            };
        }
コード例 #6
0
        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);
                    }
                }
            }
        }