설명 없음
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TimelineWindow_PlayRange.cs 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System;
  2. using System.Linq;
  3. using UnityEngine;
  4. namespace UnityEditor.Timeline
  5. {
  6. partial class TimelineWindow
  7. {
  8. TimeAreaItem m_PlayRangeEnd;
  9. TimeAreaItem m_PlayRangeStart;
  10. void PlayRangeGUI(TimelineItemArea area)
  11. {
  12. if (!currentMode.ShouldShowPlayRange(state) || treeView == null)
  13. return;
  14. if (state.masterSequence.asset != null && !state.masterSequence.asset.GetRootTracks().Any())
  15. return;
  16. // left Time Cursor
  17. if (m_PlayRangeStart == null || m_PlayRangeStart.style != styles.playTimeRangeStart)
  18. {
  19. m_PlayRangeStart = new TimeAreaItem(styles.playTimeRangeStart, OnTrackHeadMinSelectDrag);
  20. Vector2 offset = new Vector2(-2.0f, 0);
  21. m_PlayRangeStart.boundOffset = offset;
  22. }
  23. // right Time Cursor
  24. if (m_PlayRangeEnd == null || m_PlayRangeEnd.style != styles.playTimeRangeEnd)
  25. {
  26. m_PlayRangeEnd = new TimeAreaItem(styles.playTimeRangeEnd, OnTrackHeadMaxSelectDrag);
  27. Vector2 offset = new Vector2(2.0f, 0);
  28. m_PlayRangeEnd.boundOffset = offset;
  29. }
  30. if (area == TimelineItemArea.Header)
  31. DrawPlayRange(true, false);
  32. else if (area == TimelineItemArea.Lines)
  33. DrawPlayRange(false, true);
  34. }
  35. void DrawPlayRange(bool drawHeads, bool drawLines)
  36. {
  37. Rect timeCursorRect = state.timeAreaRect;
  38. timeCursorRect.height = clientArea.height;
  39. m_PlayRangeEnd.HandleManipulatorsEvents(state);
  40. m_PlayRangeStart.HandleManipulatorsEvents(state);
  41. // The first time a user enable the play range, we put the play range 75% around the current time...
  42. if (state.playRange == TimelineAssetViewModel.NoPlayRangeSet)
  43. {
  44. double minimumPlayRangeTime = 0.01;
  45. double t0 = Math.Max(0.0f, state.PixelToTime(state.timeAreaRect.xMin));
  46. double t1 = Math.Min(state.masterSequence.duration, state.PixelToTime(state.timeAreaRect.xMax));
  47. if (Math.Abs(t1 - t0) <= minimumPlayRangeTime)
  48. {
  49. state.playRange = new PlayRange(t0, t1);
  50. return;
  51. }
  52. double deltaT = (t1 - t0) * 0.25 / 2.0;
  53. t0 += deltaT;
  54. t1 -= deltaT;
  55. if (t1 < t0)
  56. {
  57. double temp = t0;
  58. t0 = t1;
  59. t1 = temp;
  60. }
  61. if (Math.Abs(t1 - t0) < minimumPlayRangeTime)
  62. {
  63. if (t0 - minimumPlayRangeTime > 0.0f)
  64. t0 -= minimumPlayRangeTime;
  65. else if (t1 + minimumPlayRangeTime < state.masterSequence.duration)
  66. t1 += minimumPlayRangeTime;
  67. }
  68. state.playRange = new PlayRange(t0, t1);
  69. }
  70. // Draw the head or the lines according to the parameters..
  71. m_PlayRangeStart.drawHead = drawHeads;
  72. m_PlayRangeStart.drawLine = drawLines;
  73. m_PlayRangeEnd.drawHead = drawHeads;
  74. m_PlayRangeEnd.drawLine = drawLines;
  75. var playRangeTime = state.playRange;
  76. m_PlayRangeStart.Draw(sequenceContentRect, state, playRangeTime.start);
  77. m_PlayRangeEnd.Draw(sequenceContentRect, state, playRangeTime.end);
  78. // Draw Time Range Box from Start to End...
  79. if (state.playRangeEnabled && m_PlayHead != null)
  80. {
  81. Rect rect =
  82. Rect.MinMaxRect(
  83. Mathf.Clamp(state.TimeToPixel(playRangeTime.start), state.timeAreaRect.xMin, state.timeAreaRect.xMax),
  84. m_PlayHead.bounds.yMax,
  85. Mathf.Clamp(state.TimeToPixel(playRangeTime.end), state.timeAreaRect.xMin, state.timeAreaRect.xMax),
  86. sequenceContentRect.height + state.timeAreaRect.height + timeCursorRect.y
  87. );
  88. EditorGUI.DrawRect(rect, DirectorStyles.Instance.customSkin.colorRange);
  89. rect.height = 3f;
  90. EditorGUI.DrawRect(rect, Color.white);
  91. }
  92. }
  93. void OnTrackHeadMinSelectDrag(double newTime)
  94. {
  95. PlayRange range = state.playRange;
  96. range.start = newTime;
  97. state.playRange = range;
  98. m_PlayRangeStart.showTooltip = true;
  99. }
  100. void OnTrackHeadMaxSelectDrag(double newTime)
  101. {
  102. PlayRange range = state.playRange;
  103. range.end = newTime;
  104. state.playRange = range;
  105. m_PlayRangeEnd.showTooltip = true;
  106. }
  107. }
  108. }