AudioPlayableAssetEditor.cs 3.3 KB

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