105 lines
4.1 KiB
C#
105 lines
4.1 KiB
C#
using System.Collections.Generic;
|
|
using JetBrains.Annotations;
|
|
using UnityEngine;
|
|
using UnityEngine.Timeline;
|
|
|
|
namespace UnityEditor.Timeline
|
|
{
|
|
[CustomTimelineEditor(typeof(AudioPlayableAsset)), UsedImplicitly]
|
|
class AudioPlayableAssetEditor : ClipEditor
|
|
{
|
|
readonly string k_NoClipAssignedError = L10n.Tr("No audio clip assigned");
|
|
readonly Dictionary<TimelineClip, WaveformPreview> m_PersistentPreviews = new Dictionary<TimelineClip, WaveformPreview>();
|
|
ColorSpace m_ColorSpace = ColorSpace.Uninitialized;
|
|
|
|
public override ClipDrawOptions GetClipOptions(TimelineClip clip)
|
|
{
|
|
var clipOptions = base.GetClipOptions(clip);
|
|
var audioAsset = clip.asset as AudioPlayableAsset;
|
|
if (audioAsset != null && audioAsset.clip == null)
|
|
clipOptions.errorText = k_NoClipAssignedError;
|
|
return clipOptions;
|
|
}
|
|
|
|
public override void DrawBackground(TimelineClip clip, ClipBackgroundRegion region)
|
|
{
|
|
if (!TimelineWindow.instance.state.showAudioWaveform)
|
|
return;
|
|
|
|
var rect = region.position;
|
|
if (rect.width <= 0)
|
|
return;
|
|
|
|
var audioClip = clip.asset as AudioClip;
|
|
if (audioClip == null)
|
|
{
|
|
var audioPlayableAsset = clip.asset as AudioPlayableAsset;
|
|
if (audioPlayableAsset != null)
|
|
audioClip = audioPlayableAsset.clip;
|
|
}
|
|
|
|
if (audioClip == null)
|
|
return;
|
|
|
|
var quantizedRect = new Rect(Mathf.Ceil(rect.x), Mathf.Ceil(rect.y), Mathf.Ceil(rect.width), Mathf.Ceil(rect.height));
|
|
|
|
WaveformPreview preview = GetOrCreateWaveformPreview(clip, audioClip, quantizedRect, region.startTime, region.endTime);
|
|
if (Event.current.type == EventType.Repaint)
|
|
DrawWaveformPreview(preview, quantizedRect);
|
|
}
|
|
|
|
public WaveformPreview GetOrCreateWaveformPreview(TimelineClip clip, AudioClip audioClip, Rect rect, double startTime, double endTime)
|
|
{
|
|
if (QualitySettings.activeColorSpace != m_ColorSpace)
|
|
{
|
|
m_ColorSpace = QualitySettings.activeColorSpace;
|
|
m_PersistentPreviews.Clear();
|
|
}
|
|
|
|
bool previewExists = m_PersistentPreviews.TryGetValue(clip, out WaveformPreview preview);
|
|
bool audioClipHasChanged = preview != null && audioClip != preview.presentedObject;
|
|
if (!previewExists || audioClipHasChanged)
|
|
{
|
|
if (AssetDatabase.Contains(audioClip))
|
|
preview = CreateWaveformPreview(audioClip, rect);
|
|
m_PersistentPreviews[clip] = preview;
|
|
}
|
|
|
|
if (preview == null)
|
|
return null;
|
|
|
|
preview.looping = clip.SupportsLooping();
|
|
preview.SetTimeInfo(startTime, endTime - startTime);
|
|
preview.OptimizeForSize(rect.size);
|
|
return preview;
|
|
}
|
|
|
|
public static void DrawWaveformPreview(WaveformPreview preview, Rect rect)
|
|
{
|
|
if (preview != null)
|
|
{
|
|
preview.ApplyModifications();
|
|
preview.Render(rect);
|
|
}
|
|
}
|
|
|
|
static WaveformPreview CreateWaveformPreview(AudioClip audioClip, Rect quantizedRect)
|
|
{
|
|
WaveformPreview preview = WaveformPreviewFactory.Create((int)quantizedRect.width, audioClip);
|
|
Color waveColour = GammaCorrect(DirectorStyles.Instance.customSkin.colorAudioWaveform);
|
|
Color transparent = waveColour;
|
|
transparent.a = 0;
|
|
preview.backgroundColor = transparent;
|
|
preview.waveColor = waveColour;
|
|
preview.SetChannelMode(WaveformPreview.ChannelMode.MonoSum);
|
|
preview.updated += () => TimelineEditor.Refresh(RefreshReason.WindowNeedsRedraw);
|
|
return preview;
|
|
}
|
|
|
|
static Color GammaCorrect(Color color)
|
|
{
|
|
return (QualitySettings.activeColorSpace == ColorSpace.Linear) ? color.gamma : color;
|
|
}
|
|
}
|
|
}
|