Nenhuma descrição
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

ItemsLayer.cs 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Timeline;
  5. namespace UnityEditor.Timeline
  6. {
  7. enum Layer : byte
  8. {
  9. Clips,
  10. ClipHandles,
  11. Markers,
  12. MarkerHeaderTrack,
  13. MarkersOnHeader
  14. }
  15. struct LayerZOrder : IComparable<LayerZOrder>
  16. {
  17. Layer m_Layer;
  18. int m_ZOrder;
  19. public LayerZOrder(Layer layer, int zOrder)
  20. {
  21. m_Layer = layer;
  22. m_ZOrder = zOrder;
  23. }
  24. public int CompareTo(LayerZOrder other)
  25. {
  26. if (m_Layer == other.m_Layer)
  27. return m_ZOrder.CompareTo(other.m_ZOrder);
  28. return m_Layer.CompareTo(other.m_Layer);
  29. }
  30. public static LayerZOrder operator ++(LayerZOrder x)
  31. {
  32. return new LayerZOrder(x.m_Layer, x.m_ZOrder + 1);
  33. }
  34. public LayerZOrder ChangeLayer(Layer layer)
  35. {
  36. return new LayerZOrder(layer, m_ZOrder);
  37. }
  38. }
  39. interface ILayerable
  40. {
  41. LayerZOrder zOrder { get; }
  42. }
  43. interface IZOrderProvider
  44. {
  45. LayerZOrder Next();
  46. }
  47. interface ILayer : IZOrderProvider
  48. {
  49. void Draw(Rect rect, WindowState state);
  50. }
  51. abstract class ItemsLayer<T> : ILayer where T : TimelineItemGUI
  52. {
  53. // provide a buffer for time-based culling to allow for UI that extends slightly beyond the time (e.g. markers)
  54. // prevents popping of marker visibility.
  55. const int kVisibilityBufferInPixels = 10;
  56. int m_PreviousLayerStateHash = -1;
  57. LayerZOrder m_LastZOrder;
  58. public LayerZOrder Next()
  59. {
  60. m_NeedSort = true;
  61. return m_LastZOrder++;
  62. }
  63. readonly List<T> m_Items = new List<T>();
  64. bool m_NeedSort = true;
  65. public virtual void Draw(Rect rect, WindowState state)
  66. {
  67. if (m_Items.Count <= 0) return;
  68. Sort();
  69. // buffer to prevent flickering of markers at boundaries
  70. var onePixelTime = state.PixelDeltaToDeltaTime(kVisibilityBufferInPixels);
  71. var visibleTime = state.timeAreaShownRange + new Vector2(-onePixelTime, onePixelTime);
  72. var layerViewStateHasChanged = GetLayerViewStateChanged(rect, state);
  73. foreach (var item in m_Items)
  74. {
  75. item.visible = item.end > visibleTime.x && item.start < visibleTime.y;
  76. if (!item.visible)
  77. continue;
  78. item.Draw(rect, layerViewStateHasChanged, state);
  79. }
  80. }
  81. public List<T> items => m_Items;
  82. protected void AddItem(T item)
  83. {
  84. m_Items.Add(item);
  85. m_NeedSort = true;
  86. }
  87. protected ItemsLayer(Layer layerOrder)
  88. {
  89. m_LastZOrder = new LayerZOrder(layerOrder, 0);
  90. }
  91. void Sort()
  92. {
  93. if (!m_NeedSort)
  94. return;
  95. m_Items.Sort((a, b) => a.zOrder.CompareTo(b.zOrder));
  96. m_NeedSort = false;
  97. }
  98. bool GetLayerViewStateChanged(Rect rect, WindowState state)
  99. {
  100. var layerStateHash = rect.GetHashCode().CombineHash(state.viewStateHash);
  101. var layerViewStateHasChanged = layerStateHash != m_PreviousLayerStateHash;
  102. if (Event.current.type == EventType.Layout && layerViewStateHasChanged)
  103. m_PreviousLayerStateHash = layerStateHash;
  104. return layerViewStateHasChanged;
  105. }
  106. }
  107. }