/* * 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); } } }
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); } } }
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 }); } } }
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(); }
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(); }