CapersProject/Assets/StylizedWater2/Editor/DynamicEffects/DynamicEffectInspector.cs
2024-08-06 16:37:03 +09:00

128 lines
5.3 KiB
C#

using System;
using UnityEditor;
using UnityEngine;
#if URP
using UnityEngine.Rendering.Universal;
#endif
namespace StylizedWater2.DynamicEffects
{
[CustomEditor(typeof(DynamicEffect))]
[CanEditMultipleObjects]
public class DynamicEffectInspector : Editor
{
private SerializedProperty renderer;
private SerializedProperty sortingLayer;
private SerializedProperty displacementScale;
private SerializedProperty foamAmount;
private SerializedProperty normalStrength;
#if URP
private bool renderFeaturePresent;
private bool renderFeatureEnabled;
private WaterDynamicEffectsRenderFeature renderFeature;
private Editor renderFeatureEditor;
#endif
private void OnEnable()
{
renderer = serializedObject.FindProperty("renderer");
sortingLayer = serializedObject.FindProperty("sortingLayer");
displacementScale = serializedObject.FindProperty("displacementScale");
foamAmount = serializedObject.FindProperty("foamAmount");
normalStrength = serializedObject.FindProperty("normalStrength");
#if URP
renderFeaturePresent = PipelineUtilities.RenderFeatureAdded<WaterDynamicEffectsRenderFeature>();
renderFeatureEnabled = PipelineUtilities.IsRenderFeatureEnabled<WaterDynamicEffectsRenderFeature>();
renderFeature = PipelineUtilities.GetRenderFeature<WaterDynamicEffectsRenderFeature>() as WaterDynamicEffectsRenderFeature;
#endif
}
private void DrawNotifications()
{
#if URP
UI.DrawNotification( !AssetInfo.MeetsMinimumVersion(WaterDynamicEffectsRenderFeature.MinBaseVersion), "Version mismatch, requires Stylized Water 2 v" + WaterDynamicEffectsRenderFeature.MinBaseVersion +".\n\nUpdate to avoid any issues or resolve (shader) errors", "Update", () => AssetInfo.OpenInPackageManager(), MessageType.Error);
UI.DrawNotification(UniversalRenderPipeline.asset == null, "The Universal Render Pipeline is not active", MessageType.Error);
using (new EditorGUI.DisabledGroupScope(Application.isPlaying))
{
UI.DrawNotification(!renderFeaturePresent, "The Dynamic Effects render feature hasn't be added to the default renderer", "Add", () =>
{
PipelineUtilities.AddRenderFeature<WaterDynamicEffectsRenderFeature>();
renderFeaturePresent = true;
renderFeature = PipelineUtilities.GetRenderFeature<WaterDynamicEffectsRenderFeature>() as WaterDynamicEffectsRenderFeature;
}, MessageType.Error);
}
if(Application.isPlaying && !renderFeaturePresent) EditorGUILayout.HelpBox("Exit play mode to perform this action", MessageType.Warning);
UI.DrawNotification(renderFeaturePresent && !renderFeatureEnabled, "The Dynamic Effects render feature is disabled", "Enable", () =>
{
PipelineUtilities.ToggleRenderFeature<WaterDynamicEffectsRenderFeature>(true);
renderFeatureEnabled = true;
}, MessageType.Warning);
#else
UI.DrawNotification("The Universal Render Pipeline package is not installed!", MessageType.Error);
#endif
}
public override void OnInspectorGUI()
{
EditorGUILayout.LabelField($"{AssetInfo.ASSET_NAME }: Dynamic Effects v{WaterDynamicEffectsRenderFeature.Version}", EditorStyles.centeredGreyMiniLabel);
EditorGUILayout.Space();
DrawNotifications();
serializedObject.Update();
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(renderer);
if (renderer.objectReferenceValue)
{
EditorGUILayout.BeginHorizontal();
{
EditorGUILayout.PrefixLabel(new GUIContent(sortingLayer.displayName, sortingLayer.tooltip));
if (GUILayout.Button("-", EditorStyles.miniButtonLeft, GUILayout.Width(20)))
{
sortingLayer.intValue--;
}
EditorGUILayout.PropertyField(sortingLayer, GUIContent.none, GUILayout.MaxWidth(32));
if (GUILayout.Button("+", EditorStyles.miniButtonRight, GUILayout.Width(20)))
{
sortingLayer.intValue++;
}
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.PropertyField(displacementScale);
EditorGUILayout.PropertyField(foamAmount);
EditorGUILayout.PropertyField(normalStrength);
}
else
{
UI.DrawNotification("A renderer must be assigned", MessageType.Error);
}
if (EditorGUI.EndChangeCheck())
{
serializedObject.ApplyModifiedProperties();
DynamicEffect script = (DynamicEffect)target;
script.UpdateProperties();
}
UI.DrawFooter();
}
}
}