using UnityEngine; using UnityEditor; using System.Collections.Generic; //----------------------------------------------------------------------------- // Copyright 2015-2020 RenderHeads Ltd. All rights reserved. //----------------------------------------------------------------------------- namespace RenderHeads.Media.AVProVideo.Editor { /// /// Editor for the MediaPlaylist.MediaItem class /// [CustomPropertyDrawer(typeof(MediaPlaylist))] public class MediaPlaylistDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // 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); } } for (int i = 0; i < propItems.arraySize; i++) { SerializedProperty propItem = propItems.GetArrayElementAtIndex(i); GUILayout.BeginVertical(GUI.skin.box); propItem.isExpanded = EditorGUILayout.ToggleLeft("Item " + i, propItem.isExpanded); if (propItem.isExpanded) { EditorGUILayout.PropertyField(propItem); GUILayout.BeginHorizontal(); if (GUILayout.Button("Insert")) { propItems.InsertArrayElementAtIndex(i); } if (GUILayout.Button("Delete")) { propItems.DeleteArrayElementAtIndex(i); } EditorGUI.BeginDisabledGroup((i - 1) < 0); if (GUILayout.Button("Up")) { propItems.MoveArrayElement(i, i - 1); } EditorGUI.EndDisabledGroup(); EditorGUI.BeginDisabledGroup((i + 1) >= propItems.arraySize); if (GUILayout.Button("Down")) { propItems.MoveArrayElement(i, i + 1); } EditorGUI.EndDisabledGroup(); GUILayout.EndHorizontal(); } GUILayout.EndVertical(); } EditorGUI.EndProperty(); } } /// /// Editor for the MediaPlaylist.MediaItem class /// [CustomPropertyDrawer(typeof(MediaPlaylist.MediaItem))] public class MediaPlaylistItemDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { //SerializedProperty propSourceType = property.FindPropertyRelative("sourceType"); SerializedProperty propIsOverrideTransition = property.FindPropertyRelative("isOverrideTransition"); //EditorGUILayout.PropertyField(propSourceType); //if (propSourceType.enumValueIndex == 0) { EditorGUILayout.PropertyField(property.FindPropertyRelative("fileLocation")); EditorGUILayout.PropertyField(property.FindPropertyRelative("filePath")); } /*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("autoPlay")); 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(); EditorGUILayout.PropertyField(propIsOverrideTransition, new GUIContent("Override Transition")); if (propIsOverrideTransition.boolValue) { EditorGUI.indentLevel++; SerializedProperty propTransitionMode = property.FindPropertyRelative("overrideTransition"); EditorGUILayout.PropertyField(propTransitionMode, new GUIContent("Transition")); if (propTransitionMode.enumValueIndex != (int)PlaylistMediaPlayer.Transition.None) { EditorGUILayout.PropertyField(property.FindPropertyRelative("overrideTransitionDuration"), new GUIContent("Duration")); EditorGUILayout.PropertyField(property.FindPropertyRelative("overrideTransitionEasing.preset"), new GUIContent("Easing")); } EditorGUI.indentLevel--; } } } /// /// Editor for the PlaylistMediaPlayer component /// [CanEditMultipleObjects] [CustomEditor(typeof(PlaylistMediaPlayer))] public class PlaylistMediaPlayerEditor : UnityEditor.Editor { private SerializedProperty _propPlayerA; private SerializedProperty _propPlayerB; private SerializedProperty _propNextTransition; private SerializedProperty _propPlaylist; private SerializedProperty _propPlaylistAutoProgress; private SerializedProperty _propAutoCloseVideo; private SerializedProperty _propPlaylistLoopMode; private SerializedProperty _propPausePreviousOnTransition; private SerializedProperty _propTransitionDuration; private SerializedProperty _propTransitionEasing; private static bool _expandPlaylistItems = false; private static GUIStyle _sectionBoxStyle = null; private const string SettingsPrefix = "AVProVideo-PlaylistMediaPlayerEditor-"; private void OnEnable() { _propPlayerA = serializedObject.FindProperty("_playerA"); _propPlayerB = serializedObject.FindProperty("_playerB"); _propNextTransition = serializedObject.FindProperty("_nextTransition"); _propTransitionDuration = serializedObject.FindProperty("_transitionDuration"); _propTransitionEasing = serializedObject.FindProperty("_transitionEasing.preset"); _propPausePreviousOnTransition = serializedObject.FindProperty("_pausePreviousOnTransition"); _propPlaylist = serializedObject.FindProperty("_playlist"); _propPlaylistAutoProgress = serializedObject.FindProperty("_playlistAutoProgress"); _propAutoCloseVideo = serializedObject.FindProperty("_autoCloseVideo"); _propPlaylistLoopMode = serializedObject.FindProperty("_playlistLoopMode"); _expandPlaylistItems = EditorPrefs.GetBool(SettingsPrefix + "ExpandPlaylistItems", false); } private void OnDisable() { EditorPrefs.SetBool(SettingsPrefix + "ExpandPlaylistItems", _expandPlaylistItems); } 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("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("Transition", EditorStyles.boldLabel); EditorGUILayout.PropertyField(_propNextTransition, new GUIContent("Next")); EditorGUILayout.PropertyField(_propTransitionEasing, new GUIContent("Easing")); EditorGUILayout.PropertyField(_propTransitionDuration, new GUIContent("Duration")); EditorGUILayout.PropertyField(_propPausePreviousOnTransition, new GUIContent("Pause Previous")); EditorGUILayout.Space(); EditorGUILayout.Space(); if (Application.isPlaying) { IMediaProducer 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; Rect alphaRect = new Rect(0f, 0f, 1f, 1f); 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 Matrix4x4 prevMatrix = GUI.matrix; if (textureSource != null && textureSource.RequiresVerticalFlip()) { GUIUtility.ScaleAroundPivot(new Vector2(1f, -1f), new Vector2(0, textureRect.y + (textureRect.height / 2))); } if (!GUI.enabled) { GUI.color = Color.grey; GUI.DrawTexture(textureRect, texture, ScaleMode.ScaleToFit, false); GUI.color = Color.white; } else { { GUI.DrawTexture(textureRect, texture, ScaleMode.ScaleToFit, false); EditorGUI.DrawTextureAlpha(alphaRect, texture, ScaleMode.ScaleToFit); } } GUI.matrix = prevMatrix; } EditorGUI.BeginDisabledGroup(!(media.Control != null && media.Control.CanPlay() && media.isActiveAndEnabled && !EditorApplication.isPaused)); OnInspectorGUI_PlayControls(media.Control, media.Info); 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(IMediaControl control, IMediaInfo info) { GUILayout.Space(8.0f); // Slider EditorGUILayout.BeginHorizontal(); bool isPlaying = false; if (control != null) { isPlaying = control.IsPlaying(); } float currentTime = 0f; if (control != null) { currentTime = control.GetCurrentTimeMs(); } float durationTime = 0f; if (info != null) { durationTime = info.GetDurationMs(); if (float.IsNaN(durationTime)) { durationTime = 0f; } } string timeUsed = Helper.GetTimeString(currentTime / 1000f, true); GUILayout.Label(timeUsed, GUILayout.ExpandWidth(false)); float newTime = GUILayout.HorizontalSlider(currentTime, 0f, durationTime, GUILayout.ExpandWidth(true)); if (newTime != currentTime) { control.Seek(newTime); } string timeTotal = "Infinity"; if (!float.IsInfinity(durationTime)) { timeTotal = Helper.GetTimeString(durationTime / 1000f, true); } GUILayout.Label(timeTotal, GUILayout.ExpandWidth(false)); EditorGUILayout.EndHorizontal(); // Buttons EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Rewind", GUILayout.ExpandWidth(false))) { control.Rewind(); } if (!isPlaying) { GUI.color = Color.green; if (GUILayout.Button("Play", GUILayout.ExpandWidth(true))) { control.Play(); } } else { GUI.color = Color.yellow; if (GUILayout.Button("Pause", GUILayout.ExpandWidth(true))) { control.Pause(); } } GUI.color = Color.white; EditorGUILayout.EndHorizontal(); } } }