Brak opisu
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.

AudioPlayableAssetEditor.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System.Collections.Generic;
  2. using JetBrains.Annotations;
  3. using UnityEngine;
  4. using UnityEngine.Timeline;
  5. namespace UnityEditor.Timeline
  6. {
  7. [CustomTimelineEditor(typeof(AudioPlayableAsset)), UsedImplicitly]
  8. class AudioPlayableAssetEditor : ClipEditor
  9. {
  10. readonly string k_NoClipAssignedError = L10n.Tr("No audio clip assigned");
  11. readonly Dictionary<TimelineClip, WaveformPreview> m_PersistentPreviews = new Dictionary<TimelineClip, WaveformPreview>();
  12. ColorSpace m_ColorSpace = ColorSpace.Uninitialized;
  13. public override ClipDrawOptions GetClipOptions(TimelineClip clip)
  14. {
  15. var clipOptions = base.GetClipOptions(clip);
  16. var audioAsset = clip.asset as AudioPlayableAsset;
  17. if (audioAsset != null && audioAsset.clip == null)
  18. clipOptions.errorText = k_NoClipAssignedError;
  19. return clipOptions;
  20. }
  21. public override void DrawBackground(TimelineClip clip, ClipBackgroundRegion region)
  22. {
  23. if (!TimelineWindow.instance.state.showAudioWaveform)
  24. return;
  25. var rect = region.position;
  26. if (rect.width <= 0)
  27. return;
  28. var audioClip = clip.asset as AudioClip;
  29. if (audioClip == null)
  30. {
  31. var audioPlayableAsset = clip.asset as AudioPlayableAsset;
  32. if (audioPlayableAsset != null)
  33. audioClip = audioPlayableAsset.clip;
  34. }
  35. if (audioClip == null)
  36. return;
  37. var quantizedRect = new Rect(Mathf.Ceil(rect.x), Mathf.Ceil(rect.y), Mathf.Ceil(rect.width), Mathf.Ceil(rect.height));
  38. WaveformPreview preview = GetOrCreateWaveformPreview(clip, audioClip, quantizedRect, region.startTime, region.endTime);
  39. if (Event.current.type == EventType.Repaint)
  40. DrawWaveformPreview(preview, quantizedRect);
  41. }
  42. public WaveformPreview GetOrCreateWaveformPreview(TimelineClip clip, AudioClip audioClip, Rect rect, double startTime, double endTime)
  43. {
  44. if (QualitySettings.activeColorSpace != m_ColorSpace)
  45. {
  46. m_ColorSpace = QualitySettings.activeColorSpace;
  47. m_PersistentPreviews.Clear();
  48. }
  49. bool previewExists = m_PersistentPreviews.TryGetValue(clip, out WaveformPreview preview);
  50. bool audioClipHasChanged = preview != null && audioClip != preview.presentedObject;
  51. if (!previewExists || audioClipHasChanged)
  52. {
  53. if (AssetDatabase.Contains(audioClip))
  54. preview = CreateWaveformPreview(audioClip, rect);
  55. m_PersistentPreviews[clip] = preview;
  56. }
  57. if (preview == null)
  58. return null;
  59. preview.looping = clip.SupportsLooping();
  60. preview.SetTimeInfo(startTime, endTime - startTime);
  61. preview.OptimizeForSize(rect.size);
  62. return preview;
  63. }
  64. public static void DrawWaveformPreview(WaveformPreview preview, Rect rect)
  65. {
  66. if (preview != null)
  67. {
  68. preview.ApplyModifications();
  69. preview.Render(rect);
  70. }
  71. }
  72. static WaveformPreview CreateWaveformPreview(AudioClip audioClip, Rect quantizedRect)
  73. {
  74. WaveformPreview preview = WaveformPreviewFactory.Create((int)quantizedRect.width, audioClip);
  75. Color waveColour = GammaCorrect(DirectorStyles.Instance.customSkin.colorAudioWaveform);
  76. Color transparent = waveColour;
  77. transparent.a = 0;
  78. preview.backgroundColor = transparent;
  79. preview.waveColor = waveColour;
  80. preview.SetChannelMode(WaveformPreview.ChannelMode.MonoSum);
  81. preview.updated += () => TimelineEditor.Refresh(RefreshReason.WindowNeedsRedraw);
  82. return preview;
  83. }
  84. static Color GammaCorrect(Color color)
  85. {
  86. return (QualitySettings.activeColorSpace == ColorSpace.Linear) ? color.gamma : color;
  87. }
  88. }
  89. }