123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- using System;
- using System.Globalization;
- using System.Linq;
- using System.Text;
- using JetBrains.Annotations;
- using UnityEditor;
- using UnityEditor.Timeline;
- using UnityEngine.Playables;
- namespace UnityEngine.Timeline
- {
- [CustomEditor(typeof(AudioTrack))]
- [CanEditMultipleObjects]
- class AudioTrackInspector : TrackAssetInspector
- {
- [UsedImplicitly] // Also used by tests
- internal static class Styles
- {
- public const string VolumeControl = "AudioTrackInspector.volume";
- public const string StereoPanControl = "AudioTrackInspector.stereoPan";
- public const string SpatialBlendControl = "AudioTrackInspector.spatialBlend";
- const string k_Indent = " ";
- public const string valuesFormatter = "0.###";
- public const string mixInfoSectionSeparator = "\n\n";
- public static string mixedPropertiesInfo = L10n.Tr("The final {3} is {0}\n" +
- "Calculated from:\n" +
- k_Indent + "Track: {1}\n" +
- k_Indent + "AudioSource: {2}");
- }
- static StringBuilder s_MixInfoBuilder = new StringBuilder();
- SerializedProperty m_VolumeProperty;
- SerializedProperty m_StereoPanProperty;
- SerializedProperty m_SpatialBlendProperty;
- PlayableDirector m_Director;
- public override void OnEnable()
- {
- base.OnEnable();
- if (((AudioTrack)target).timelineAsset == TimelineEditor.inspectedAsset)
- m_Director = TimelineEditor.inspectedDirector;
- m_VolumeProperty = serializedObject.FindProperty("m_TrackProperties.volume");
- m_StereoPanProperty = serializedObject.FindProperty("m_TrackProperties.stereoPan");
- m_SpatialBlendProperty = serializedObject.FindProperty("m_TrackProperties.spatialBlend");
- }
- protected override void DrawTrackProperties()
- {
- // Volume
- GUI.SetNextControlName(Styles.VolumeControl);
- EditorGUILayout.Slider(m_VolumeProperty, 0.0f, 1.0f, AudioSourceInspector.Styles.volumeLabel);
- EditorGUILayout.Space();
- // Stereo Pan
- GUI.SetNextControlName(Styles.StereoPanControl);
- EditorGUIUtility.sliderLabels.SetLabels(AudioSourceInspector.Styles.panLeftLabel, AudioSourceInspector.Styles.panRightLabel);
- EditorGUILayout.Slider(m_StereoPanProperty, -1.0f, 1.0f, AudioSourceInspector.Styles.panStereoLabel);
- EditorGUIUtility.sliderLabels.SetLabels(null, null);
- EditorGUILayout.Space();
- // Spatial Blend
- using (new EditorGUI.DisabledScope(ShouldDisableSpatialBlend()))
- {
- GUI.SetNextControlName(Styles.SpatialBlendControl);
- EditorGUIUtility.sliderLabels.SetLabels(AudioSourceInspector.Styles.spatialLeftLabel, AudioSourceInspector.Styles.spatialRightLabel);
- EditorGUILayout.Slider(m_SpatialBlendProperty, 0.0f, 1.0f, AudioSourceInspector.Styles.spatialBlendLabel);
- EditorGUIUtility.sliderLabels.SetLabels(null, null);
- }
- DrawMixInfoSection();
- }
- void DrawMixInfoSection()
- {
- if (m_Director == null || targets.Length > 1)
- return;
- var binding = m_Director.GetGenericBinding(target) as AudioSource;
- if (binding == null)
- return;
- var audioSourceVolume = binding.volume;
- var audioSourcePan = binding.panStereo;
- var audioSourceBlend = binding.spatialBlend;
- var trackVolume = m_VolumeProperty.floatValue;
- var trackPan = m_StereoPanProperty.floatValue;
- var trackBlend = m_SpatialBlendProperty.floatValue;
- // Skip sections when result is obvious
- var skipVolumeInfo = Math.Abs(audioSourceVolume) < float.Epsilon && Math.Abs(trackVolume) < float.Epsilon || // All muted
- Math.Abs(audioSourceVolume - 1) < float.Epsilon && Math.Abs(trackVolume - 1) < float.Epsilon; // All max volume
- var skipPanInfo = Math.Abs(audioSourcePan) < float.Epsilon && Math.Abs(trackPan) < float.Epsilon || // All centered
- Math.Abs(audioSourcePan - 1) < float.Epsilon && Math.Abs(trackPan - 1) < float.Epsilon || // All right
- Math.Abs(audioSourcePan - (-1.0f)) < float.Epsilon && Math.Abs(trackPan - (-1.0f)) < float.Epsilon; // All left
- var skipBlendInfo = Math.Abs(audioSourceBlend) < float.Epsilon && Math.Abs(trackBlend) < float.Epsilon || // All 2D
- Math.Abs(audioSourceBlend - 1) < float.Epsilon && Math.Abs(trackBlend - 1) < float.Epsilon; // All 3D
- if (skipVolumeInfo && skipPanInfo && skipBlendInfo)
- return;
- s_MixInfoBuilder.Length = 0;
- if (!skipVolumeInfo)
- s_MixInfoBuilder.AppendFormat(
- Styles.mixedPropertiesInfo,
- (audioSourceVolume * trackVolume).ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- trackVolume.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- audioSourceVolume.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- AudioSourceInspector.Styles.volumeLabel.text);
- if (!skipVolumeInfo && !skipPanInfo)
- s_MixInfoBuilder.Append(Styles.mixInfoSectionSeparator);
- if (!skipPanInfo)
- s_MixInfoBuilder.AppendFormat(
- Styles.mixedPropertiesInfo,
- Mathf.Clamp(audioSourcePan + trackPan, -1.0f, 1.0f).ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- trackPan.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- audioSourcePan.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- AudioSourceInspector.Styles.panStereoLabel.text);
- if ((!skipVolumeInfo || !skipPanInfo) && !skipBlendInfo)
- s_MixInfoBuilder.Append(Styles.mixInfoSectionSeparator);
- if (!skipBlendInfo)
- s_MixInfoBuilder.AppendFormat(
- Styles.mixedPropertiesInfo,
- Mathf.Clamp01(audioSourceBlend + trackBlend).ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- trackBlend.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- audioSourceBlend.ToString(Styles.valuesFormatter, CultureInfo.InvariantCulture),
- AudioSourceInspector.Styles.spatialBlendLabel.text);
- EditorGUILayout.Space();
- EditorGUILayout.HelpBox(new GUIContent(s_MixInfoBuilder.ToString()));
- }
- protected override void ApplyChanges()
- {
- var track = (AudioTrack)target;
- if (TimelineEditor.inspectedAsset != track.timelineAsset || TimelineEditor.inspectedDirector == null)
- return;
- if (TimelineEditor.inspectedDirector.state == PlayState.Playing)
- track.LiveLink();
- else
- TimelineEditor.Refresh(RefreshReason.ContentsModified);
- }
- bool ShouldDisableSpatialBlend()
- {
- return m_Director == null ||
- targets.Any(selectedTrack => m_Director.GetGenericBinding(selectedTrack) == null);
- }
- }
- }
|