123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517 |
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- //-----------------------------------------------------------------------------
- // Copyright 2015-2022 RenderHeads Ltd. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace RenderHeads.Media.AVProVideo.Editor
- {
- /// <summary>
- /// Editor for the MediaPlaylist class
- /// </summary>
- [CustomPropertyDrawer(typeof(MediaPlaylist))]
- public class MediaPlaylistDrawer : PropertyDrawer
- {
- private static readonly GUIContent _guiTextInsert = new GUIContent("Clone");
- private static readonly GUIContent _guiTextDelete = new GUIContent("Delete");
- private static readonly GUIContent _guiTextUp = new GUIContent("↑");
- private static readonly GUIContent _guiTextDown = new GUIContent("↓");
- private static GUIStyle _styleButtonFoldout = null;
- private static GUIStyle _styleHelpBoxNoPad = null;
- public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
- {
- if (_styleButtonFoldout == null)
- {
- _styleButtonFoldout = new GUIStyle(EditorStyles.foldout);
- _styleButtonFoldout.margin = new RectOffset();
- _styleButtonFoldout.fontStyle = FontStyle.Bold;
- _styleButtonFoldout.alignment = TextAnchor.MiddleLeft;
- }
- if (_styleHelpBoxNoPad == null)
- {
- _styleHelpBoxNoPad = new GUIStyle(EditorStyles.helpBox);
- _styleHelpBoxNoPad.padding = new RectOffset();
- _styleHelpBoxNoPad.overflow = new RectOffset();
- _styleHelpBoxNoPad.margin = new RectOffset();
- _styleHelpBoxNoPad.margin = new RectOffset(0, 0, 0, 0);
- _styleHelpBoxNoPad.stretchWidth = false;
- _styleHelpBoxNoPad.stretchHeight = false;
- }
- // Using BeginProperty / EndProperty on the parent property means that
- // prefab override logic works on the entire property.
- EditorGUI.BeginProperty(position, label, property);
- SerializedProperty propItems = property.FindPropertyRelative("_items");
- if (propItems.arraySize == 0)
- {
- if (GUILayout.Button("Insert Item"))
- {
- propItems.InsertArrayElementAtIndex(0);
- }
- }
- int insertIndex = -1;
- int deleteIndex = -1;
- for (int i = 0; i < propItems.arraySize; i++)
- {
- SerializedProperty propItem = propItems.GetArrayElementAtIndex(i);
- GUILayout.BeginVertical(_styleHelpBoxNoPad);
-
- GUI.backgroundColor = propItem.isExpanded ? Color.yellow : Color.white;
- GUILayout.Box(GUIContent.none, EditorStyles.miniButton, GUILayout.ExpandWidth(true));
- Rect buttonRect = GUILayoutUtility.GetLastRect();
- GUI.backgroundColor = Color.white;
- if (Event.current.type != EventType.Layout)
- {
- EditorGUI.indentLevel++;
- SerializedProperty propName = propItem.FindPropertyRelative("name");
- propItem.isExpanded = EditorGUI.Foldout(buttonRect, propItem.isExpanded, "#" + i + ": " + propName.stringValue, true, _styleButtonFoldout);
- EditorGUI.indentLevel--;
- }
- GUILayout.BeginHorizontal();
- GUILayout.FlexibleSpace();
- if (GUILayout.Button(_guiTextInsert, GUILayout.ExpandWidth(false)))
- {
- insertIndex = i;
-
- }
- if (GUILayout.Button(_guiTextDelete, GUILayout.ExpandWidth(false)))
- {
- deleteIndex = i;
- }
- EditorGUI.BeginDisabledGroup((i - 1) < 0);
- if (GUILayout.Button(_guiTextUp, GUILayout.ExpandWidth(false)))
- {
- propItems.MoveArrayElement(i, i - 1);
- }
- EditorGUI.EndDisabledGroup();
- EditorGUI.BeginDisabledGroup((i + 1) >= propItems.arraySize);
- if (GUILayout.Button(_guiTextDown, GUILayout.ExpandWidth(false)))
- {
- propItems.MoveArrayElement(i, i + 1);
- }
- EditorGUI.EndDisabledGroup();
- GUILayout.EndHorizontal();
- if (propItem.isExpanded)
- {
- EditorGUILayout.PropertyField(propItem);
- }
- GUILayout.EndVertical();
- GUILayout.Space(8f);
- }
- if (insertIndex >= 0)
- {
- propItems.InsertArrayElementAtIndex(insertIndex);
- }
- else if (deleteIndex >= 0)
- {
- propItems.DeleteArrayElementAtIndex(deleteIndex);
- }
- EditorGUI.EndProperty();
- }
- }
- /// <summary>
- /// Editor for the MediaPlaylist.MediaItem class
- /// </summary>
- [CustomPropertyDrawer(typeof(MediaPlaylist.MediaItem))]
- public class MediaPlaylistItemDrawer : PropertyDrawer
- {
- private static readonly GUIContent _guiTextTransition = new GUIContent("Transition");
- private static readonly GUIContent _guiTextOverrideTransition = new GUIContent("Override Transition");
- private static readonly GUIContent _guiTextDuration = new GUIContent("Duration");
- private static readonly GUIContent _guiTextEasing = new GUIContent("Easing");
-
- public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
- {
- EditorGUILayout.PropertyField(property.FindPropertyRelative("name"));
- SerializedProperty propSourceType = property.FindPropertyRelative("sourceType");
- EditorGUILayout.PropertyField(propSourceType);
- if (propSourceType.enumValueIndex == 0)
- {
- EditorGUILayout.PropertyField(property.FindPropertyRelative("mediaPath"));
- MediaPathDrawer.ShowBrowseButton(property.FindPropertyRelative("mediaPath"));
- }
- else
- {
- //EditorGUILayout.PropertyField(property.FindPropertyRelative("texture"));
- //EditorGUILayout.PropertyField(property.FindPropertyRelative("textureDuration"));
- }
- EditorGUILayout.Space();
- //EditorGUILayout.PropertyField(property.FindPropertyRelative("stereoPacking"));
- //EditorGUILayout.PropertyField(property.FindPropertyRelative("alphaPacking"));
- EditorGUILayout.Space();
- EditorGUILayout.PropertyField(property.FindPropertyRelative("loop"));
- EditorGUILayout.PropertyField(property.FindPropertyRelative("startMode"));
- SerializedProperty propProgressMode = property.FindPropertyRelative("progressMode");
- EditorGUILayout.PropertyField(propProgressMode);
- if (propProgressMode.enumValueIndex == (int)PlaylistMediaPlayer.ProgressMode.BeforeFinish)
- {
- EditorGUILayout.PropertyField(property.FindPropertyRelative("progressTimeSeconds"));
- }
- EditorGUILayout.Space();
- SerializedProperty propIsOverrideTransition = property.FindPropertyRelative("isOverrideTransition");
- EditorGUILayout.PropertyField(propIsOverrideTransition, _guiTextOverrideTransition);
- if (propIsOverrideTransition.boolValue)
- {
- EditorGUI.indentLevel++;
- SerializedProperty propTransitionMode = property.FindPropertyRelative("overrideTransition");
- EditorGUILayout.PropertyField(propTransitionMode, _guiTextTransition);
- if (propTransitionMode.enumValueIndex != (int)PlaylistMediaPlayer.Transition.None)
- {
- EditorGUILayout.PropertyField(property.FindPropertyRelative("overrideTransitionDuration"), _guiTextDuration);
- EditorGUILayout.PropertyField(property.FindPropertyRelative("overrideTransitionEasing"), _guiTextEasing);
- }
- EditorGUI.indentLevel--;
- }
- }
- }
- /// <summary>
- /// Editor for the PlaylistMediaPlayer component
- /// </summary>
- [CanEditMultipleObjects]
- [CustomEditor(typeof(PlaylistMediaPlayer))]
- public class PlaylistMediaPlayerEditor : UnityEditor.Editor
- {
- private SerializedProperty _propPlayerA;
- private SerializedProperty _propPlayerB;
- private SerializedProperty _propPlaylist;
- private SerializedProperty _propPlaylistAutoProgress;
- private SerializedProperty _propAutoCloseVideo;
- private SerializedProperty _propPlaylistLoopMode;
- private SerializedProperty _propPausePreviousOnTransition;
- private SerializedProperty _propDefaultTransition;
- private SerializedProperty _propDefaultTransitionDuration;
- private SerializedProperty _propDefaultTransitionEasing;
- private SerializedProperty _propAudioVolume;
- private SerializedProperty _propAudioMuted;
-
- private static bool _expandPlaylistItems = false;
- private static Material _materialIMGUI = null;
- private static GUIStyle _sectionBoxStyle = null;
- private const string SettingsPrefix = "AVProVideo-PlaylistMediaPlayerEditor-";
- private void OnEnable()
- {
- _propPlayerA = this.CheckFindProperty("_playerA");
- _propPlayerB = this.CheckFindProperty("_playerB");
- _propDefaultTransition = this.CheckFindProperty("_defaultTransition");
- _propDefaultTransitionDuration = this.CheckFindProperty("_defaultTransitionDuration");
- _propDefaultTransitionEasing = this.CheckFindProperty("_defaultTransitionEasing");
- _propPausePreviousOnTransition = this.CheckFindProperty("_pausePreviousOnTransition");
- _propPlaylist = this.CheckFindProperty("_playlist");
- _propPlaylistAutoProgress = this.CheckFindProperty("_playlistAutoProgress");
- _propAutoCloseVideo = this.CheckFindProperty("_autoCloseVideo");
- _propPlaylistLoopMode = this.CheckFindProperty("_playlistLoopMode");
- _propAudioVolume = this.CheckFindProperty("_playlistAudioVolume");
- _propAudioMuted = this.CheckFindProperty("_playlistAudioMuted");
- _expandPlaylistItems = EditorPrefs.GetBool(SettingsPrefix + "ExpandPlaylistItems", false);
- }
- private void OnDisable()
- {
- EditorPrefs.SetBool(SettingsPrefix + "ExpandPlaylistItems", _expandPlaylistItems);
- if (_materialIMGUI)
- {
- DestroyImmediate(_materialIMGUI); _materialIMGUI = null;
- }
- }
- public override bool RequiresConstantRepaint()
- {
- PlaylistMediaPlayer media = (this.target) as PlaylistMediaPlayer;
- return (media.Control != null && media.isActiveAndEnabled);
- }
- public override void OnInspectorGUI()
- {
- PlaylistMediaPlayer media = (this.target) as PlaylistMediaPlayer;
- serializedObject.Update();
- if (media == null || _propPlayerA == null)
- {
- return;
- }
- if (_sectionBoxStyle == null)
- {
- _sectionBoxStyle = new GUIStyle(GUI.skin.box);
- _sectionBoxStyle.padding.top = 0;
- _sectionBoxStyle.padding.bottom = 0;
- }
- EditorGUILayout.PropertyField(_propPlayerA);
- EditorGUILayout.PropertyField(_propPlayerB);
- EditorGUILayout.Space();
- EditorGUILayout.Space();
- GUILayout.Label("Audio", EditorStyles.boldLabel);
- EditorGUI.BeginChangeCheck();
- EditorGUILayout.PropertyField(_propAudioVolume, new GUIContent("Volume"));
- if (EditorGUI.EndChangeCheck())
- {
- foreach (PlaylistMediaPlayer player in this.targets)
- {
- player.AudioVolume = _propAudioVolume.floatValue;
- }
- }
- EditorGUI.BeginChangeCheck();
- EditorGUILayout.PropertyField(_propAudioMuted, new GUIContent("Muted"));
- if (EditorGUI.EndChangeCheck())
- {
- foreach (PlaylistMediaPlayer player in this.targets)
- {
- player.AudioMuted = _propAudioMuted.boolValue;
- }
- }
- EditorGUILayout.Space();
- EditorGUILayout.Space();
- GUILayout.Label("Playlist", EditorStyles.boldLabel);
- EditorGUILayout.PropertyField(_propPlaylistAutoProgress, new GUIContent("Auto Progress"));
- EditorGUILayout.PropertyField(_propPlaylistLoopMode, new GUIContent("Loop Mode"));
- EditorGUILayout.PropertyField(_propAutoCloseVideo);
- {
- EditorGUILayout.Space();
- EditorGUILayout.Space();
- GUI.color = Color.white;
- GUI.backgroundColor = Color.clear;
- if (_expandPlaylistItems)
- {
- GUI.color = Color.white;
- GUI.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 0.1f);
- if (EditorGUIUtility.isProSkin)
- {
- GUI.backgroundColor = Color.black;
- }
- }
- GUILayout.BeginVertical(_sectionBoxStyle);
- GUI.backgroundColor = Color.white;
- if (GUILayout.Button("Playlist Items", EditorStyles.toolbarButton))
- {
- _expandPlaylistItems = !_expandPlaylistItems;
- }
- GUI.color = Color.white;
- if (_expandPlaylistItems)
- {
- EditorGUILayout.PropertyField(_propPlaylist);
- }
- GUILayout.EndVertical();
- }
- EditorGUILayout.Space();
- EditorGUILayout.Space();
- GUILayout.Label("Default Transition", EditorStyles.boldLabel);
- EditorGUILayout.PropertyField(_propDefaultTransition, new GUIContent("Transition"));
- EditorGUILayout.PropertyField(_propDefaultTransitionEasing, new GUIContent("Easing"));
- EditorGUILayout.PropertyField(_propDefaultTransitionDuration, new GUIContent("Duration"));
- EditorGUILayout.PropertyField(_propPausePreviousOnTransition, new GUIContent("Pause Previous"));
- EditorGUILayout.Space();
- EditorGUILayout.Space();
- if (Application.isPlaying)
- {
- ITextureProducer textureSource = media.TextureProducer;
- Texture texture = null;
- if (textureSource != null)
- {
- texture = textureSource.GetTexture();
- }
- if (texture == null)
- {
- texture = EditorGUIUtility.whiteTexture;
- }
- float ratio = 1f;// (float)texture.width / (float)texture.height;
- // Reserve rectangle for texture
- GUILayout.BeginHorizontal();
- GUILayout.FlexibleSpace();
- Rect textureRect;
- if (texture != EditorGUIUtility.whiteTexture)
- {
- textureRect = GUILayoutUtility.GetRect(Screen.width / 2, Screen.width / 2, (Screen.width / 2) / ratio, (Screen.width / 2) / ratio);
- }
- else
- {
- textureRect = GUILayoutUtility.GetRect(1920f / 40f, 1080f / 40f);
- }
- GUILayout.FlexibleSpace();
- GUILayout.EndHorizontal();
- string rateText = "0";
- string playerText = string.Empty;
- if (media.Info != null)
- {
- rateText = media.Info.GetVideoDisplayRate().ToString("F2");
- playerText = media.Info.GetPlayerDescription();
- }
- EditorGUILayout.LabelField("Display Rate", rateText);
- EditorGUILayout.LabelField("Using", playerText);
-
- // Draw the texture
- if (Event.current.type == EventType.Repaint)
- {
- Matrix4x4 prevMatrix = GUI.matrix;
- if (textureSource != null && textureSource.RequiresVerticalFlip())
- {
- GUIUtility.ScaleAroundPivot(new Vector2(1f, -1f), new Vector2(0f, textureRect.y + (textureRect.height / 2f)));
- }
- GUI.color = Color.gray;
- EditorGUI.DrawTextureTransparent(textureRect, Texture2D.blackTexture, ScaleMode.StretchToFill);
- GUI.color = Color.white;
- if (!GUI.enabled)
- {
- GUI.color = Color.grey;
- GUI.DrawTexture(textureRect, texture, ScaleMode.ScaleToFit, false);
- GUI.color = Color.white;
- }
- else
- {
- if (!_materialIMGUI)
- {
- _materialIMGUI = VideoRender.CreateResolveMaterial( false );
- VideoRender.SetupGammaMaterial(_materialIMGUI, true);
- }
- {
- EditorGUI.DrawPreviewTexture(textureRect, texture, _materialIMGUI, ScaleMode.ScaleToFit);
- }
- }
- GUI.matrix = prevMatrix;
- }
- }
- EditorGUI.BeginDisabledGroup(!(media.Control != null && media.Control.CanPlay() && media.isActiveAndEnabled && !EditorApplication.isPaused));
- OnInspectorGUI_PlayControls(media);
- EditorGUI.EndDisabledGroup();
- EditorGUILayout.Space();
- EditorGUILayout.Space();
- EditorGUI.BeginDisabledGroup(!Application.isPlaying);
- GUILayout.Label("Current Item: " + media.PlaylistIndex + " / " + Mathf.Max(0, media.Playlist.Items.Count - 1) );
- GUILayout.BeginHorizontal();
- EditorGUI.BeginDisabledGroup(!media.CanJumpToItem(media.PlaylistIndex - 1));
- if (GUILayout.Button("Prev"))
- {
- media.PrevItem();
- }
- EditorGUI.EndDisabledGroup();
- EditorGUI.BeginDisabledGroup(!media.CanJumpToItem(media.PlaylistIndex + 1));
- if (GUILayout.Button("Next"))
- {
- media.NextItem();
- }
- EditorGUI.EndDisabledGroup();
- GUILayout.EndHorizontal();
- EditorGUI.EndDisabledGroup();
- serializedObject.ApplyModifiedProperties();
- }
- private void OnInspectorGUI_PlayControls(PlaylistMediaPlayer player)
- {
- GUILayout.Space(8.0f);
- // Slider
- EditorGUILayout.BeginHorizontal();
- bool isPlaying = false;
- if (player.Control != null)
- {
- isPlaying = player.Control.IsPlaying();
- }
- float currentTime = 0f;
- if (player.Control != null)
- {
- currentTime = (float)player.Control.GetCurrentTime();
- }
- float durationTime = 0f;
- if (player.Info != null)
- {
- durationTime = (float)player.Info.GetDuration();
- if (float.IsNaN(durationTime))
- {
- durationTime = 0f;
- }
- }
- string timeUsed = Helper.GetTimeString(currentTime, true);
- GUILayout.Label(timeUsed, GUILayout.ExpandWidth(false));
- float newTime = GUILayout.HorizontalSlider(currentTime, 0f, durationTime, GUILayout.ExpandWidth(true));
- if (newTime != currentTime && player.Control != null)
- {
- player.Control.Seek(newTime);
- }
- string timeTotal = "Infinity";
- if (!float.IsInfinity(durationTime))
- {
- timeTotal = Helper.GetTimeString(durationTime, true);
- }
- GUILayout.Label(timeTotal, GUILayout.ExpandWidth(false));
- EditorGUILayout.EndHorizontal();
- // Buttons
- EditorGUILayout.BeginHorizontal();
- if (GUILayout.Button("Rewind", GUILayout.ExpandWidth(false)))
- {
- if (player.Control != null)
- {
- player.Control.Rewind();
- }
- }
- if (!isPlaying)
- {
- GUI.color = Color.green;
- if (GUILayout.Button("Play", GUILayout.ExpandWidth(true)))
- {
- player.Play();
- }
- }
- else
- {
- GUI.color = Color.yellow;
- if (GUILayout.Button("Pause", GUILayout.ExpandWidth(true)))
- {
- player.Pause();
- }
- }
- GUI.color = Color.white;
- EditorGUILayout.EndHorizontal();
- }
- }
- }
|