241 lines
8.9 KiB
C#
241 lines
8.9 KiB
C#
// Copyright (C) 2019-2021 Alexander Bogarsukov. All rights reserved.
|
|
// See the LICENSE.md file in the project root for more information.
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace UnityFx.Outline
|
|
{
|
|
[CustomEditor(typeof(OutlineSettings))]
|
|
public class OutlineSettingsEditor : Editor
|
|
{
|
|
private const string _filterModePropName = "_filterMode";
|
|
private const string _layerMaskPropName = "_layerMask";
|
|
private const string _renderingLayerMaskPropName = "_renderingLayerMask";
|
|
private const string _settingsPropName = "_outlineSettings";
|
|
private const string _colorPropName = "_outlineColor";
|
|
private const string _widthPropName = "_outlineWidth";
|
|
private const string _intensityPropName = "_outlineIntensity";
|
|
private const string _cutoffPropName = "_outlineAlphaCutoff";
|
|
private const string _renderModePropName = "_outlineMode";
|
|
|
|
private static readonly string[] _renderingLayerMaskNames = new string[]
|
|
{
|
|
"Layer1",
|
|
"Layer2",
|
|
"Layer3",
|
|
"Layer4",
|
|
"Layer5",
|
|
"Layer6",
|
|
"Layer7",
|
|
"Layer8",
|
|
"Layer9",
|
|
"Layer10",
|
|
"Layer11",
|
|
"Layer12",
|
|
"Layer13",
|
|
"Layer14",
|
|
"Layer15",
|
|
"Layer16",
|
|
"Layer17",
|
|
"Layer18",
|
|
"Layer19",
|
|
"Layer20",
|
|
"Layer21",
|
|
"Layer22",
|
|
"Layer23",
|
|
"Layer24",
|
|
"Layer25",
|
|
"Layer26",
|
|
"Layer27",
|
|
"Layer28",
|
|
"Layer29",
|
|
"Layer30",
|
|
"Layer31",
|
|
"Layer32",
|
|
};
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
base.OnInspectorGUI();
|
|
|
|
var colorProp = serializedObject.FindProperty(_colorPropName);
|
|
var widthProp = serializedObject.FindProperty(_widthPropName);
|
|
var intensityProp = serializedObject.FindProperty(_intensityPropName);
|
|
var cutoffProp = serializedObject.FindProperty(_cutoffPropName);
|
|
var renderModeProp = serializedObject.FindProperty(_renderModePropName);
|
|
var renderMode = (OutlineRenderFlags)renderModeProp.intValue;
|
|
|
|
//EditorGUILayout.PropertyField(colorProp, _colorContent);
|
|
colorProp.colorValue = EditorGUILayout.ColorField(OutlineEditorUtility.ColorContent, colorProp.colorValue, true, true, true);
|
|
|
|
EditorGUILayout.PropertyField(widthProp, OutlineEditorUtility.WidthContent);
|
|
|
|
//EditorGUILayout.PropertyField(renderModeProp, _renderModeContent);
|
|
renderModeProp.intValue = (int)(OutlineRenderFlags)EditorGUILayout.EnumFlagsField(OutlineEditorUtility.RenderFlagsContent, renderMode);
|
|
|
|
if ((renderMode & OutlineRenderFlags.Blurred) != 0)
|
|
{
|
|
EditorGUILayout.PropertyField(intensityProp, OutlineEditorUtility.BlurIntensityContent);
|
|
}
|
|
|
|
if ((renderMode & OutlineRenderFlags.EnableAlphaTesting) != 0)
|
|
{
|
|
EditorGUILayout.PropertyField(cutoffProp, OutlineEditorUtility.AlphaCutoffContent);
|
|
}
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
|
|
internal static float GetSettingsInstanceHeight(SerializedProperty property)
|
|
{
|
|
var lineCy = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
|
var renderModeProp = property.FindPropertyRelative(_renderModePropName);
|
|
var renderMode = (OutlineRenderFlags)renderModeProp.intValue;
|
|
var result = lineCy * 4;
|
|
|
|
if ((renderMode & OutlineRenderFlags.Blurred) != 0)
|
|
{
|
|
result += lineCy;
|
|
}
|
|
|
|
if ((renderMode & OutlineRenderFlags.EnableAlphaTesting) != 0)
|
|
{
|
|
result += lineCy;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
internal static float GetSettingsWithMaskHeight(SerializedProperty property)
|
|
{
|
|
var lineCy = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
|
var filterModeProp = property.FindPropertyRelative(_filterModePropName);
|
|
var renderOutlineSettings = false;
|
|
|
|
if (filterModeProp.intValue == (int)OutlineFilterMode.UseLayerMask)
|
|
{
|
|
var layerMaskProp = property.FindPropertyRelative(_layerMaskPropName);
|
|
renderOutlineSettings = true;
|
|
}
|
|
else if (filterModeProp.intValue == (int)OutlineFilterMode.UseRenderingLayerMask)
|
|
{
|
|
var renderingLayerMaskProp = property.FindPropertyRelative(_renderingLayerMaskPropName);
|
|
renderOutlineSettings = true;
|
|
}
|
|
|
|
if (renderOutlineSettings)
|
|
{
|
|
var renderModeProp = property.FindPropertyRelative(_renderModePropName);
|
|
var renderMode = (OutlineRenderFlags)renderModeProp.intValue;
|
|
var result = lineCy * 6;
|
|
|
|
if ((renderMode & OutlineRenderFlags.Blurred) != 0)
|
|
{
|
|
result += lineCy;
|
|
}
|
|
|
|
if ((renderMode & OutlineRenderFlags.EnableAlphaTesting) != 0)
|
|
{
|
|
result += lineCy;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
return lineCy;
|
|
}
|
|
|
|
internal static void DrawSettingsInstance(Rect rc, SerializedProperty property)
|
|
{
|
|
var settingsProp = property.FindPropertyRelative(_settingsPropName);
|
|
|
|
EditorGUI.PropertyField(new Rect(rc.x, rc.y, rc.width, EditorGUIUtility.singleLineHeight), settingsProp);
|
|
EditorGUI.indentLevel += 1;
|
|
|
|
if (settingsProp.objectReferenceValue)
|
|
{
|
|
var obj = new SerializedObject(settingsProp.objectReferenceValue);
|
|
var colorProp = obj.FindProperty(_colorPropName);
|
|
var widthProp = obj.FindProperty(_widthPropName);
|
|
var intensityProp = obj.FindProperty(_intensityPropName);
|
|
var cutoffProp = obj.FindProperty(_cutoffPropName);
|
|
var renderModeProp = obj.FindProperty(_renderModePropName);
|
|
|
|
EditorGUI.BeginDisabledGroup(true);
|
|
DrawSettingsInternal(rc, colorProp, widthProp, intensityProp, cutoffProp, renderModeProp);
|
|
EditorGUI.EndDisabledGroup();
|
|
}
|
|
else
|
|
{
|
|
var colorProp = property.FindPropertyRelative(_colorPropName);
|
|
var widthProp = property.FindPropertyRelative(_widthPropName);
|
|
var intensityProp = property.FindPropertyRelative(_intensityPropName);
|
|
var cutoffProp = property.FindPropertyRelative(_cutoffPropName);
|
|
var renderModeProp = property.FindPropertyRelative(_renderModePropName);
|
|
|
|
DrawSettingsInternal(rc, colorProp, widthProp, intensityProp, cutoffProp, renderModeProp);
|
|
}
|
|
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
|
|
internal static void DrawSettingsWithMask(Rect rc, SerializedProperty property)
|
|
{
|
|
var lineCy = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
|
var filterModeProp = property.FindPropertyRelative(_filterModePropName);
|
|
|
|
EditorGUI.PropertyField(new Rect(rc.x, rc.y, rc.width, EditorGUIUtility.singleLineHeight), filterModeProp, OutlineEditorUtility.FilterSettingsContent);
|
|
|
|
if (filterModeProp.intValue == (int)OutlineFilterMode.UseLayerMask)
|
|
{
|
|
var layerMaskProp = property.FindPropertyRelative(_layerMaskPropName);
|
|
|
|
EditorGUI.indentLevel += 1;
|
|
EditorGUI.PropertyField(new Rect(rc.x, rc.y + lineCy, rc.width, EditorGUIUtility.singleLineHeight), layerMaskProp, OutlineEditorUtility.LayerMaskContent);
|
|
EditorGUI.indentLevel -= 1;
|
|
|
|
DrawSettingsInstance(new Rect(rc.x, rc.y + lineCy * 2, rc.width, rc.height - lineCy), property);
|
|
}
|
|
else if (filterModeProp.intValue == (int)OutlineFilterMode.UseRenderingLayerMask)
|
|
{
|
|
var renderingLayerMaskProp = property.FindPropertyRelative(_renderingLayerMaskPropName);
|
|
|
|
EditorGUI.indentLevel += 1;
|
|
renderingLayerMaskProp.intValue = EditorGUI.MaskField(new Rect(rc.x, rc.y + lineCy, rc.width, EditorGUIUtility.singleLineHeight), OutlineEditorUtility.RenderingLayerMaskContent, renderingLayerMaskProp.intValue, _renderingLayerMaskNames);
|
|
EditorGUI.indentLevel -= 1;
|
|
|
|
DrawSettingsInstance(new Rect(rc.x, rc.y + lineCy * 2, rc.width, rc.height - lineCy), property);
|
|
}
|
|
}
|
|
|
|
private static void DrawSettingsInternal(Rect rc, SerializedProperty colorProp, SerializedProperty widthProp, SerializedProperty intensityProp, SerializedProperty cutoffProp, SerializedProperty renderModeProp)
|
|
{
|
|
var renderMode = (OutlineRenderFlags)renderModeProp.intValue;
|
|
var lineCy = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
|
var n = 4;
|
|
|
|
//EditorGUI.PropertyField(new Rect(rc.x, rc.y + 1 * lineCy, rc.width, EditorGUIUtility.singleLineHeight), colorProp, _colorContent);
|
|
colorProp.colorValue = EditorGUI.ColorField(new Rect(rc.x, rc.y + 1 * lineCy, rc.width, EditorGUIUtility.singleLineHeight), OutlineEditorUtility.ColorContent, colorProp.colorValue, true, true, true);
|
|
|
|
EditorGUI.PropertyField(new Rect(rc.x, rc.y + 2 * lineCy, rc.width, EditorGUIUtility.singleLineHeight), widthProp, OutlineEditorUtility.WidthContent);
|
|
|
|
// NOTE: EditorGUI.PropertyField doesn't allow multi-selection, have to use EnumFlagsField explixitly.
|
|
renderModeProp.intValue = (int)(OutlineRenderFlags)EditorGUI.EnumFlagsField(new Rect(rc.x, rc.y + 3 * lineCy, rc.width, EditorGUIUtility.singleLineHeight), OutlineEditorUtility.RenderFlagsContent, renderMode);
|
|
|
|
if ((renderMode & OutlineRenderFlags.Blurred) != 0)
|
|
{
|
|
EditorGUI.PropertyField(new Rect(rc.x, rc.y + n++ * lineCy, rc.width, EditorGUIUtility.singleLineHeight), intensityProp, OutlineEditorUtility.BlurIntensityContent);
|
|
}
|
|
|
|
if ((renderMode & OutlineRenderFlags.EnableAlphaTesting) != 0)
|
|
{
|
|
EditorGUI.PropertyField(new Rect(rc.x, rc.y + n * lineCy, rc.width, EditorGUIUtility.singleLineHeight), cutoffProp, OutlineEditorUtility.AlphaCutoffContent);
|
|
}
|
|
}
|
|
}
|
|
}
|