cvr-props/Assets/ABI.CCK/Scripts/Editor/CCK_CVR_VideoPlayerEditor.cs
2023-01-22 16:38:23 +01:00

246 lines
No EOL
9.4 KiB
C#
Executable file

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.BeginFoldoutHeaderGroup(_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();
}
EditorGUILayout.EndFoldoutHeaderGroup();
#endregion
#region Audio settings
_showAudio = EditorGUILayout.BeginFoldoutHeaderGroup(_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();
}
EditorGUILayout.EndFoldoutHeaderGroup();
#endregion
#region Playlists
_showPlaylists = EditorGUILayout.BeginFoldoutHeaderGroup(_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();
}
EditorGUILayout.EndFoldoutHeaderGroup();
#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();
}
EditorGUILayout.EndFoldoutHeaderGroup();
#endregion
}
}