5a570b2e52
Ring lights TBA
278 lines
12 KiB
C#
278 lines
12 KiB
C#
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();
|
|
}
|
|
}
|
|
} |