/*
         * public void TimeRuler(Rect position, float frameRate)
         * {
         *  TimeRuler(position, frameRate, true, false, 1f, TimeFormat.TimeFrame);
         * }
         *
         * public void TimeRuler(Rect position, float frameRate, bool labels, bool useEntireHeight, float alpha)
         * {
         *  TimeRuler(position, frameRate, labels, useEntireHeight, alpha, TimeFormat.TimeFrame);
         * }
         *
         * public void TimeRuler(Rect position, float frameRate, bool labels, bool useEntireHeight, float alpha,
         *  TimeFormat timeFormat)
         */
        public void OnGUI(Rect rect)
        {
            if (float.IsNaN(rect.width) || float.IsNaN(rect.height))
            {
                return;
            }

            m_LastRect = rect;
            m_TimeAreaRect.SetValue(m_TimeArea, rect, null);
            m_BeginViewDel();
            m_DrawDel(rect, 60.0f);
            m_EndViewDel();

            if (GameDebuggerRecorder.IsRecording)
            {
                float maxTime = 0.0f;
                if (GameDebuggerDatabase.NumFrameRecords > 0)
                {
                    maxTime = GameDebuggerDatabase.GetRecords(GameDebuggerDatabase.NumFrameRecords - 1).time;
                }
                maxTime = Math.Max(5.0f, maxTime);
                m_SetShowRangeDel(maxTime - 10.0f, maxTime);
                m_RangeLock.SetValue(m_TimeArea, true, null);
            }
            else
            {
                m_RangeLock.SetValue(m_TimeArea, false, null);
            }
        }
    public static void StartRecording()
    {
        if (isPlaying)
        {
            StopReplay();
        }

        if (IsRecording)
        {
            return;
        }

        GameDebuggerDatabase.Clear();
        currentFrame = 0;

        // Create hidden GameObject for the LateUpdate callback.
        m_UpdaterGo            = new GameObject("GameDebugger");
        m_UpdaterGo.hideFlags |= HideFlags.DontSave | HideFlags.HideInHierarchy;
        m_UpdaterGo.AddComponent <GameDebuggerBehaviour>();


        EditorApplication.isPaused = false;

        IsRecording = true;
    }
 public AnimatorRecordableItem(RecordableInfo recordableInfo, int frame) : base(recordableInfo.instanceID)
 {
     m_LayerNames.Add(new LayerInfo
     {
         time = GameDebuggerDatabase.GetRecords(frame).time,
         name = GetStateNameForRecordable(recordableInfo.recordable)
     });
 }
 void DrawKeys(ITimeConverter converter)
 {
     foreach (var frameId in m_FrameIds)
     {
         var frameTime    = GameDebuggerDatabase.GetRecords(frameId).time;
         var keyPixelXPos = converter.TimeToPixel(frameTime);
         EditorGUI.DrawRect(new Rect(keyPixelXPos - 3, 22, 6, 6), m_KeyColor);
     }
 }
        static InputsForTime GetInputsForFrame(Recordable recordable, int frame)
        {
            var inputRec = recordable as InputRecordable;

            if (inputRec == null)
            {
                return(new InputsForTime());
            }
            return(new InputsForTime(GameDebuggerDatabase.GetRecords(frame).time, inputRec.inputs));
        }
    public static void ReplayFrame(int frame)
    {
        if (frame >= GameDebuggerDatabase.NumFrameRecords)
        {
            return;
        }

        EditorApplication.isPaused = true;
        GameDebuggerDatabase.ReplayFrame(frame);
    }
    public static void Update()
    {
        if (!IsRecording)
        {
            return;
        }

        GameDebuggerDatabase.RecordFrame(currentFrame);

        currentFrame++;
    }
        public override void Refresh(RecordableInfo recordableInfo, int frame)
        {
            var tr = recordableInfo.recordable as TransformRecordable;

            if (tr != null)
            {
                var lastRecords = GameDebuggerDatabase.GetRecords(m_FrameIds.Last());
                var info        = lastRecords.records.Find(otherRecInfo => m_InstanceId == otherRecInfo.instanceID);
                if (!tr.ApproximatelyEquals((TransformRecordable)info.recordable))
                {
                    m_FrameIds.Add(frame);
                }
            }
        }
Exemple #9
0
        public override void Refresh(RecordableInfo recordableInfo, int frame)
        {
            var rr = recordableInfo.recordable as RigidBodyRecordable;

            if (rr != null)
            {
                var lastRecords = GameDebuggerDatabase.GetRecords(m_FrameIds.Last());
                var info        = lastRecords.records.Find(otherRecInfo => m_InstanceId == otherRecInfo.instanceID);
                if (info.recordable != null && !rr.ApproximatelyEquals((RigidBodyRecordable)info.recordable))
                {
                    m_FrameIds.Add(frame);
                    m_Velocities.Add(rr.speed.magnitude);
                }
            }
        }
Exemple #10
0
        static ScreenshotForTime GetScreenshotForFrame(Recordable recordable, int frame)
        {
            var screenshotRec = recordable as ScreenShotRecordable;

            if (screenshotRec == null)
            {
                return(new ScreenshotForTime());
            }

            var screenShot = screenshotRec.tex;

            return(new ScreenshotForTime {
                time = GameDebuggerDatabase.GetRecords(frame).time, screenshot = screenShot
            });
        }
        public TimelineElement(RefreshScheduler scheduler, VisualElement extraViewer)
        {
            name = "timeline";

            var timeArea = new VisualElement();

            timeArea.name = "timeArea";
            Add(timeArea);

            var timeAreaGUI    = new TimeAreaGUI();
            var imguiContainer = new IMGUIContainer(() =>
            {
                timeAreaGUI.OnGUI(timeArea.layout);
            });

            imguiContainer.name = "timeAreaGUI";
            timeArea.Add(imguiContainer);
            imguiContainer.StretchToParentSize();

            var timeProvider = new TimeConverter(timeAreaGUI);
            var playhead     = new PlayheadElement(timeProvider);

            playhead.name = "playhead";
            Add(playhead);

            imguiContainer.AddManipulator(new PlayheadDragManipulator(playhead));
            playhead.AddManipulator(new PlayheadDragManipulator(playhead));
            imguiContainer.AddManipulator(new TimeAreaCallbackManipulator(timeAreaGUI, playhead));
            imguiContainer.AddManipulator(new TimeAreaResizeManipulator(playhead));

            var trackContainer = new TrackContainer(timeProvider, scheduler, extraViewer);

            Add(trackContainer);

            //playhead needs to be on top of the tracks
            playhead.BringToFront();

            scheduler.Refresh += () =>
            {
                if (!GameDebuggerRecorder.isPlaying)
                {
                    return;
                }
                var frame = GameDebuggerRecorder.currentFrame;
                var time  = GameDebuggerDatabase.GetRecords(frame).time;
                playhead.SetTime(time);
            };
        }
        public override void Refresh(RecordableInfo recordableInfo, int frame)
        {
            var ar = recordableInfo.recordable as AnimatorRecordable;

            if (ar != null)
            {
                var otherStateName   = GetStateNameForRecordable(ar);
                var currentStateName = m_LayerNames.Last().name;
                if (otherStateName != currentStateName)
                {
                    m_LayerNames.Add(new LayerInfo()
                    {
                        name = otherStateName,
                        time = GameDebuggerDatabase.GetRecords(frame).time
                    });
                }
            }
        }
Exemple #13
0
        void RefreshTracks(bool forceRefresh)
        {
            if (EditorApplication.isPaused && !forceRefresh)
            {
                return;
            }

            var newNumFrames = GameDebuggerDatabase.NumFrameRecords;

            if (newNumFrames == numFrames && !forceRefresh)
            {
                return;
            }

            // Get the new instance ID and the new keys.
            for (var f = numFrames; f < newNumFrames; ++f)
            {
                var records = GameDebuggerDatabase.GetRecords(f);
                foreach (var recordInfo in records.records)
                {
                    if (!m_TrackItemByInstance.ContainsKey(recordInfo.instanceID))
                    {
                        m_TrackItemByInstance[recordInfo.instanceID] = TrackItemFactory.Create(recordInfo, f);
                    }
                    else
                    {
                        var item = m_TrackItemByInstance[recordInfo.instanceID];
                        if (item != null)
                        {
                            item.Refresh(recordInfo, f);
                        }
                        else
                        {
                            Debug.LogError("Item is null for some reason");
                        }
                    }
                }
            }

            numFrames = newNumFrames;

            m_ListView.itemsSource = m_TrackItemByInstance.Keys.ToList();
            m_ListView.Refresh();
        }
Exemple #14
0
        void DrawKeys(Track track, ITimeConverter converter)
        {
            if (m_FrameIds.Count == 0)
            {
                return;
            }

            // Get max velocity.
            var maxVelocity = Mathf.Max(m_Velocities.Max(v => v), 0.1f);

            var height = track.contentRect.height;

            var prevVelocity       = m_Velocities[0];
            var prevVelocityHeight = 5.0f + (prevVelocity / maxVelocity) * 25.0f;
            var prevFrameTime      = GameDebuggerDatabase.GetRecords(m_FrameIds[0]).time;
            var prevFrameTimeXPos  = converter.TimeToPixel(prevFrameTime);
            var prevFrameTimeYPos  = (height - prevVelocityHeight) / 2.0f;
            var prevColor          = Color.Lerp(m_LowVelocityColor, m_HighVelocityColor, prevVelocity / maxVelocity);

            for (var f = 1; f < m_FrameIds.Count; ++f)
            {
                var frameId       = m_FrameIds[f];
                var frameTime     = GameDebuggerDatabase.GetRecords(frameId).time;
                var frameTimeXPos = converter.TimeToPixel(frameTime);
                EditorGUI.DrawRect(new Rect(prevFrameTimeXPos, prevFrameTimeYPos, frameTimeXPos - prevFrameTimeXPos, prevVelocityHeight), prevColor);

                prevVelocity       = m_Velocities[f];
                prevVelocityHeight = 5.0f + (prevVelocity / maxVelocity) * 25.0f;
                prevFrameTimeXPos  = frameTimeXPos;
                prevFrameTimeYPos  = (height - prevVelocityHeight) / 2.0f;
                prevColor          = Color.Lerp(m_LowVelocityColor, m_HighVelocityColor, prevVelocity / maxVelocity);
            }

            var currentTimeXPos = converter.TimeToPixel(Time.unscaledTime - GameDebuggerDatabase.StartRecordingTime);

            EditorGUI.DrawRect(new Rect(prevFrameTimeXPos, prevFrameTimeYPos, currentTimeXPos - prevFrameTimeXPos, prevVelocityHeight), prevColor);
        }
 public static int ReplayTime(double time)
 {
     EditorApplication.isPaused = true;
     return(GameDebuggerDatabase.ReplayTime(time));
 }
    static GameDebuggerRecorder()
    {
        EditorApplication.update += EditorUpdate;

        GameDebuggerDatabase.Init();
    }