1
0
mirror of synced 2024-12-15 15:51:17 +01:00
WACVR/Assets/LIV/Scripts/Editor/LIVEditor.cs

278 lines
12 KiB
C#
Raw Normal View History

using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
namespace LIV.SDK.Unity
{
[CustomEditor(typeof(LIV))]
public class LIVEditor : Editor
{
const string EXCLUDE_BEHAVIOURS_FOLDOUT_KEY = "liv_excludeBehavioursfoldout";
const string STAGE_PROPERTY = "_stage";
const string STAGE_TRANSFORM_PROPERTY = "_stageTransform";
const string HMD_CAMERA_PROPERTY = "_HMDCamera";
const string MR_CAMERA_PREFAB_PROPERTY = "_MRCameraPrefab";
const string DISABLE_STANDARD_ASSETS_PROPERTY = "_disableStandardAssets";
const string SPECTATOR_LAYER_MASK_PROPERTY = "_spectatorLayerMask";
const string EXCLUDE_BEHAVIOURS_PROPERTY = "_excludeBehaviours";
const string FIX_POST_EFFECTS_ALPHA_PROPERTY = "_fixPostEffectsAlpha";
static GUIContent REQUIRED_FOLDOUT_GUICONTENT = new GUIContent("Required");
static GUIContent OPTIONAL_FOLDOUT_GUICONTENT = new GUIContent("Optional");
static GUIContent STAGE_GUICONTENT = new GUIContent("Stage");
static GUIContent STAGE_INFO_GUICONTENT = new GUIContent(
"The origin of tracked space.\n" +
"This is the object that you use to move the player around."
);
static GUIContent STAGE_TRANSFORM_GUICONTENT = new GUIContent("Stage Transform");
static GUIContent STAGE_TRANSFORM_INFO_GUICONTENT = new GUIContent(
"This transform defines the stage transform."
);
static GUIContent HMD_CAMERA_GUICONTENT = new GUIContent("HMD Camera");
static GUIContent HMD_CAMERA_INFO_GUICONTENT = new GUIContent(
"Set this to the camera used to render the HMD's point of view."
);
static GUIContent MR_CAMERA_PREFAB_GUICONTENT = new GUIContent("MR Camera Prefab");
static GUIContent MR_CAMERA_PREFAB_INFO_GUICONTENT = new GUIContent(
"Set custom camera prefab."
);
static GUIContent DISABLE_STANDARD_ASSETS_GUICONTENT = new GUIContent("Disable Standard Assets");
static GUIContent DISABLE_STANDARD_INFO_ASSETS_GUICONTENT = new GUIContent(
"If you're using Unity's standard effects and they're interfering with MR rendering, check this box."
);
static GUIContent SPECTATOR_LAYER_MASK_GUICONTENT = new GUIContent("Spectator Layer Mask");
static GUIContent SPECTATOR_LAYER_MASK_INFO_GUICONTENT = new GUIContent(
"By default, we'll show everything on the spectator camera. If you want to disable certain objects from showing, update this mask property."
);
static GUIContent FIX_POST_EFFECTS_ALPHA_GUICONTENT = new GUIContent("Fix Post-Effects alpha channel");
static GUIContent FIX_POST_EFFECTS_ALPHA_INFO_GUICONTENT = new GUIContent(
"Some post-effects corrupt the alpha channel, this fix tries to recover it."
);
static GUIContent EXCLUDE_BEHAVIOURS_GUICONTENT = new GUIContent("Exclude Behaviours");
static GUIStyle VERSION_STYLE {
get {
GUIStyle g = new GUIStyle(EditorStyles.label);
g.alignment = TextAnchor.LowerLeft;
g.normal.textColor = Color.white;
g.fontStyle = FontStyle.Bold;
return g;
}
}
static GUIStyle LIV_BUTTON_STYLE {
get {
GUIStyle g = new GUIStyle();
return g;
}
}
static Color darkBGColor {
get {
if (EditorGUIUtility.isProSkin)
{
return new Color(0f, 0f, 0f, 0.5f);
} else
{
return new Color(1f, 1f, 1f, 0.5f);
}
}
}
static Color lightRedBGColor {
get {
return new Color(1f, 0.5f, 0.5f, 1f);
}
}
static Color lightBGColor {
get {
return new Color(1f, 1, 1, 1f);
}
}
ReorderableList excludeBehavioursList;
static bool excludeBehavioursFoldoutValue {
get {
if (!EditorPrefs.HasKey(EXCLUDE_BEHAVIOURS_FOLDOUT_KEY)) return false;
return EditorPrefs.GetBool(EXCLUDE_BEHAVIOURS_FOLDOUT_KEY);
}
set {
EditorPrefs.SetBool(EXCLUDE_BEHAVIOURS_FOLDOUT_KEY, value);
}
}
SerializedProperty stageProperty = null;
SerializedProperty stageTransformProperty = null;
SerializedProperty hmdCameraProperty = null;
SerializedProperty mrCameraPrefabProperty = null;
SerializedProperty disableStandardAssetsProperty = null;
SerializedProperty SpectatorLayerMaskProperty = null;
SerializedProperty ExcludeBehavioursProperty = null;
SerializedProperty FixPostEffectsAlphaProperty = null;
static Texture2D _livLogo;
void OnEnable()
{
string[] livLogoGUID = AssetDatabase.FindAssets("LIVLogo t:texture2D");
if (livLogoGUID.Length > 0)
{
_livLogo = AssetDatabase.LoadAssetAtPath<Texture2D>(AssetDatabase.GUIDToAssetPath(livLogoGUID[0]));
}
stageProperty = serializedObject.FindProperty(STAGE_PROPERTY);
stageTransformProperty = serializedObject.FindProperty(STAGE_TRANSFORM_PROPERTY);
hmdCameraProperty = serializedObject.FindProperty(HMD_CAMERA_PROPERTY);
mrCameraPrefabProperty = serializedObject.FindProperty(MR_CAMERA_PREFAB_PROPERTY);
disableStandardAssetsProperty = serializedObject.FindProperty(DISABLE_STANDARD_ASSETS_PROPERTY);
SpectatorLayerMaskProperty = serializedObject.FindProperty(SPECTATOR_LAYER_MASK_PROPERTY);
ExcludeBehavioursProperty = serializedObject.FindProperty(EXCLUDE_BEHAVIOURS_PROPERTY);
FixPostEffectsAlphaProperty = serializedObject.FindProperty(FIX_POST_EFFECTS_ALPHA_PROPERTY);
excludeBehavioursList = new ReorderableList(serializedObject, ExcludeBehavioursProperty, true, true, true, true);
excludeBehavioursList.drawElementCallback = DrawListItems;
excludeBehavioursList.headerHeight = 2;
}
void DrawListItems(Rect rect, int index, bool isActive, bool isFocused)
{
EditorGUI.PropertyField(rect, excludeBehavioursList.serializedProperty.GetArrayElementAtIndex(index), new GUIContent(""), false);
}
void DrawList(SerializedProperty property, GUIContent guiContent)
{
EditorGUILayout.PropertyField(property, guiContent);
while (true)
{
if(!property.Next(true))
{
break;
}
EditorGUILayout.PropertyField(property);
}
}
void DrawProperty(SerializedProperty property, GUIContent label, GUIContent content, Color color)
{
Color lastAccentColor = GUI.color;
GUI.color = darkBGColor;
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
GUI.color = lastAccentColor;
GUILayout.Space(2);
EditorGUILayout.PropertyField(property, label);
Color lastBackgroundColor = GUI.backgroundColor;
GUI.backgroundColor = color;
EditorGUILayout.LabelField(content, EditorStyles.helpBox);
GUI.backgroundColor = lastBackgroundColor;
EditorGUILayout.EndVertical();
}
void RenderStageField()
{
Color color = lightBGColor;
GUIContent content = new GUIContent(STAGE_INFO_GUICONTENT);
if (stageProperty.objectReferenceValue == null)
{
color = lightRedBGColor;
content.text += "\nThe stage has to be set!";
content.image = EditorGUIUtility.IconContent("console.erroricon").image;
}
DrawProperty(stageProperty, STAGE_GUICONTENT, content, color);
}
void RenderHMDField()
{
Color color = lightBGColor;
GUIContent content = new GUIContent(HMD_CAMERA_INFO_GUICONTENT);
if (hmdCameraProperty.objectReferenceValue == null)
{
color = lightRedBGColor;
content.text += "\nThe camera has to be set!";
content.image = EditorGUIUtility.IconContent("console.erroricon").image;
}
DrawProperty(hmdCameraProperty, HMD_CAMERA_GUICONTENT, content, color);
}
void RenderSpectatorLayerMaskField()
{
Color color = lightBGColor;
GUIContent content = new GUIContent(SPECTATOR_LAYER_MASK_INFO_GUICONTENT);
if (SpectatorLayerMaskProperty.intValue == 0)
{
color = lightRedBGColor;
content.text += "\nAre you sure you want to render nothing?";
content.image = EditorGUIUtility.IconContent("console.warnicon").image;
}
DrawProperty(SpectatorLayerMaskProperty, SPECTATOR_LAYER_MASK_GUICONTENT, content, color);
}
public override void OnInspectorGUI()
{
serializedObject.Update();
if (_livLogo != null)
{
Color lastBackgroundColor = GUI.color;
GUI.color = new Color(0f, 0f, 0f, 0.5f);
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
GUI.color = lastBackgroundColor;
Rect originalRect = EditorGUILayout.GetControlRect(GUILayout.Height(_livLogo.height));
Rect imageRect = originalRect;
imageRect.x = (originalRect.width - _livLogo.width);
imageRect.width = _livLogo.width;
GUI.DrawTexture(imageRect, _livLogo);
GUI.Label(originalRect, "v" + SDKConstants.SDK_VERSION, VERSION_STYLE);
if(GUI.Button(originalRect, new GUIContent(), LIV_BUTTON_STYLE)) {
Application.OpenURL("https://liv.tv/");
}
EditorGUILayout.EndVertical();
}
EditorGUILayout.LabelField(REQUIRED_FOLDOUT_GUICONTENT, EditorStyles.boldLabel);
RenderStageField();
RenderHMDField();
DrawProperty(disableStandardAssetsProperty, DISABLE_STANDARD_ASSETS_GUICONTENT, DISABLE_STANDARD_INFO_ASSETS_GUICONTENT, lightBGColor);
RenderSpectatorLayerMaskField();
Color lastAccentColor = GUI.color;
GUI.color = darkBGColor;
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
GUI.color = lastAccentColor;
EditorGUI.indentLevel++;
excludeBehavioursFoldoutValue = EditorGUILayout.Foldout(excludeBehavioursFoldoutValue, EXCLUDE_BEHAVIOURS_GUICONTENT);
EditorGUI.indentLevel--;
if (excludeBehavioursFoldoutValue)
{
excludeBehavioursList.DoLayoutList();
}
EditorGUILayout.EndVertical();
EditorGUILayout.LabelField(OPTIONAL_FOLDOUT_GUICONTENT, EditorStyles.boldLabel);
DrawProperty(stageTransformProperty, STAGE_TRANSFORM_GUICONTENT, STAGE_TRANSFORM_INFO_GUICONTENT, lightBGColor);
DrawProperty(mrCameraPrefabProperty, MR_CAMERA_PREFAB_GUICONTENT, MR_CAMERA_PREFAB_INFO_GUICONTENT, lightBGColor);
DrawProperty(FixPostEffectsAlphaProperty, FIX_POST_EFFECTS_ALPHA_GUICONTENT, FIX_POST_EFFECTS_ALPHA_INFO_GUICONTENT, lightBGColor);
serializedObject.ApplyModifiedProperties();
GUIContent helpContent = new GUIContent(EditorGUIUtility.IconContent("_Help"));
helpContent.text = "Help";
if (GUILayout.Button(helpContent))
{
Application.OpenURL(@"https://liv.tv/sdk-unity-docs");
}
EditorGUILayout.Space();
}
}
}