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;
 | |
|         }
 | |
|     }
 | |
| }
 |