using ABI.CCK.Components; using UnityEditor; using UnityEditorInternal; using UnityEngine; [CustomEditor(typeof(CVRVideoPlayer))] public class CCK_CVR_VideoPlayerEditor : Editor { private ReorderableList _reorderableList; private CVRVideoPlayer _player; private static bool _showGeneral = true; private static bool _showAudio = true; private static bool _showPlaylists = true; private static bool _showEvents = true; private const string TypeLabel = "Playlists"; private void OnEnable() { if (_player == null) _player = (CVRVideoPlayer)target; _reorderableList = new ReorderableList(_player.entities, typeof(CVRVideoPlayerPlaylist), true, true, true, true); _reorderableList.drawHeaderCallback = OnDrawHeader; _reorderableList.drawElementCallback = OnDrawElement; _reorderableList.elementHeightCallback = OnHeightElement; _reorderableList.onAddCallback = OnAdd; _reorderableList.onChangedCallback = OnChanged; } private float OnHeightElement(int index) { var height = 0f; if (!_player.entities[index].isCollapsed) return EditorGUIUtility.singleLineHeight * 1.25f; height += EditorGUIUtility.singleLineHeight * (3f + 2.5f); if (_player.entities[index].playlistVideos.Count == 0) height += 1.25f * EditorGUIUtility.singleLineHeight; foreach (var entry in _player.entities[index].playlistVideos) { if (entry == null) { height += 1.25f * EditorGUIUtility.singleLineHeight; } else { height += (entry.isCollapsed ? 7.5f : 1.25f) * EditorGUIUtility.singleLineHeight; } } return height; } private void OnDrawHeader(Rect rect) { Rect rectA = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight); GUI.Label(rectA, TypeLabel); } private void OnDrawElement(Rect rect, int index, bool isActive, bool isFocused) { if (index > _player.entities.Count) return; rect.y += 2; rect.x += 12; rect.width -= 12; Rect rectA = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); EditorGUI.BeginChangeCheck(); bool collapse = EditorGUI.Foldout(rectA, _player.entities[index].isCollapsed, "Playlist Title", true); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Playlist Expand"); _player.entities[index].isCollapsed = collapse; } rectA.x += 80; rectA.width = rect.width - 80; EditorGUI.BeginChangeCheck(); string playlistTitle = EditorGUI.TextField(rectA, _player.entities[index].playlistTitle); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Playlist Title"); _player.entities[index].playlistTitle = playlistTitle; } if (!_player.entities[index].isCollapsed) return; rect.y += EditorGUIUtility.singleLineHeight * 1.25f; rectA = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); EditorGUI.LabelField(rectA, "Thumbnail Url"); rectA.x += 80; rectA.width = rect.width - 80; EditorGUI.BeginChangeCheck(); string playlistThumbnailUrl = EditorGUI.TextField(rectA, _player.entities[index].playlistThumbnailUrl); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Playlist Thumbnail Url"); _player.entities[index].playlistThumbnailUrl = playlistThumbnailUrl; } rect.y += EditorGUIUtility.singleLineHeight * 1.25f; //_rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); var videoList = _player.entities[index].GetReorderableList(_player); videoList.DoList(new Rect(rect.x, rect.y, rect.width, 20f)); } private void OnAdd(ReorderableList list) { Undo.RecordObject(target, "Add Playlist Entry"); _player.entities.Add(null); } private void OnChanged(ReorderableList list) { Undo.RecordObject(target, "Playlist List changed"); } public override void OnInspectorGUI() { #region General settings _showGeneral = EditorGUILayout.Foldout(_showGeneral, "General"); if (_showGeneral) { _player.syncEnabled = EditorGUILayout.Toggle("Network Sync", _player.syncEnabled); _player.autoplay = EditorGUILayout.Toggle("Play On Awake", _player.autoplay); _player.interactiveUI = EditorGUILayout.Toggle("Use Interactive Library UI", _player.interactiveUI); _player.videoPlayerUIPosition = (Transform)EditorGUILayout.ObjectField("UI Position/Parent", _player.videoPlayerUIPosition, typeof(Transform), true); _player.localPlaybackSpeed = EditorGUILayout.Slider("Playback Speed", _player.localPlaybackSpeed, 0.5f, 2.0f); EditorGUILayout.Space(); EditorGUILayout.Space(); _player.ProjectionTexture = (RenderTexture)EditorGUILayout.ObjectField("Projection Texture", _player.ProjectionTexture, typeof(RenderTexture), true); EditorGUILayout.Space(); if (_player.ProjectionTexture == null) { EditorGUILayout.HelpBox("The video player output texture is empty, please fill it or no video will be drawn.", MessageType.Warning); if (GUILayout.Button("Create Sample Render Texture")) { RenderTexture tex = new RenderTexture(1920, 1080, 24); if (!AssetDatabase.IsValidFolder("Assets/ABI.Generated")) AssetDatabase.CreateFolder("Assets", "ABI.Generated"); if (!AssetDatabase.IsValidFolder("Assets/ABI.Generated/VideoPlayer")) AssetDatabase.CreateFolder("Assets/ABI.Generated", "VideoPlayer"); if (!AssetDatabase.IsValidFolder("Assets/ABI.Generated/VideoPlayer/RenderTextures")) AssetDatabase.CreateFolder("Assets/ABI.Generated/VideoPlayer", "RenderTextures"); AssetDatabase.CreateAsset(tex, "Assets/ABI.Generated/VideoPlayer/RenderTextures/" + _player.gameObject.GetInstanceID() + ".renderTexture"); _player.ProjectionTexture = tex; } } EditorGUILayout.Space(); } #endregion #region Audio settings _showAudio = EditorGUILayout.Foldout(_showAudio, "Audio"); if (_showAudio) { _player.playbackVolume = EditorGUILayout.Slider("Playback Volume", _player.playbackVolume, 0.0f, 1.0f); _player.audioPlaybackMode = (CVRVideoPlayer.AudioMode)EditorGUILayout.EnumPopup("Audio Playback Mode ", _player.audioPlaybackMode); _player.customAudioSource = (AudioSource)EditorGUILayout.ObjectField("Custom Audio Source", _player.customAudioSource, typeof(AudioSource), true); var list = serializedObject.FindProperty("roomScaleAudioSources"); EditorGUILayout.PropertyField(list, new GUIContent("Room Scale Audio Sources"), true); serializedObject.ApplyModifiedProperties(); EditorGUILayout.Space(); } #endregion #region Playlists _showPlaylists = EditorGUILayout.Foldout(_showPlaylists, "Playlists"); if (_showPlaylists) { EditorGUILayout.LabelField(new GUIContent("Play On Awake Object", "Default video to play on start/awake"), new GUIContent(_player.playOnAwakeObject?.videoTitle)); if (GUILayout.Button("Remove Play on Awake Object")) _player.playOnAwakeObject = null; EditorGUILayout.Space(); EditorGUILayout.Space(); _reorderableList.DoLayoutList(); EditorGUILayout.Space(); } #endregion #region Events _showEvents = EditorGUILayout.BeginFoldoutHeaderGroup(_showEvents, "Events"); if (_showEvents) { serializedObject.Update(); EditorGUILayout.PropertyField(serializedObject.FindProperty("startedPlayback"), true); serializedObject.ApplyModifiedProperties(); serializedObject.Update(); EditorGUILayout.PropertyField(serializedObject.FindProperty("finishedPlayback"), true); serializedObject.ApplyModifiedProperties(); serializedObject.Update(); EditorGUILayout.PropertyField(serializedObject.FindProperty("pausedPlayback"), true); serializedObject.ApplyModifiedProperties(); serializedObject.Update(); EditorGUILayout.PropertyField(serializedObject.FindProperty("setUrl"), true); serializedObject.ApplyModifiedProperties(); EditorGUILayout.Space(); } #endregion } }