Files
ichni_Official/Packages/NB_FX/XuanXuanRenderUtility/Editor/ShaderGUIItems/ShaderGUIPopUpItem.cs
SoulliesOfficial 40fa80cd70 NB_FX
2026-07-17 17:46:16 -04:00

159 lines
4.9 KiB
C#

using System;
using UnityEditor;
using UnityEngine;
namespace NBShaderEditor
{
public class ShaderGUIPopUpItem:ShaderGUIItem
{
private readonly Func<GUIContent> _contentProvider;
private readonly Func<string[]> _popupNamesProvider;
private readonly Action<MaterialProperty> _onValueChanged;
private readonly Func<bool> _isVisible;
public ShaderGUIPopUpItem(ShaderGUIRootItem rootItem, ShaderGUIItem parentItem) :
base(rootItem, parentItem: parentItem)
{
// base.InitTriggerByChild();
}
public ShaderGUIPopUpItem(
ShaderGUIRootItem rootItem,
ShaderGUIItem parentItem,
string propertyName,
Func<GUIContent> contentProvider,
Func<string[]> popupNamesProvider,
Action<MaterialProperty> onValueChanged = null,
Func<bool> isVisible = null) : base(rootItem, parentItem)
{
PropertyName = propertyName;
_contentProvider = contentProvider ?? (() => GUIContent.none);
_popupNamesProvider = popupNamesProvider;
_onValueChanged = onValueChanged;
_isVisible = isVisible;
GuiContent = _contentProvider();
PopUpNames = _popupNamesProvider?.Invoke();
InitTriggerByChild();
}
public string[] PopUpNames;
public override void OnGUI()
{
if (_isVisible != null && !_isVisible())
{
return;
}
base.OnGUI();
}
public override void DrawController()
{
int value = EditorGUI.Popup(ControlRect, (int)PropertyInfo.Property.floatValue, PopUpNames);
SetFloatIfDifferent(PropertyInfo.Property, value);
}
public override void OnEndChange()
{
base.OnEndChange();
_onValueChanged?.Invoke(PropertyInfo.Property);
}
public override void ExecuteReset(bool isCallByParent = false)
{
base.ExecuteReset(isCallByParent);
OnEndChange();
}
}
public class ShaderGUIBitMaskItem : ShaderGUIItem
{
private static readonly string[] EmptyMaskNames = new string[0];
private readonly Func<GUIContent> _contentProvider;
private readonly Func<string[]> _maskNamesProvider;
private readonly Action<MaterialProperty> _onValueChanged;
private readonly Func<bool> _isVisible;
public ShaderGUIBitMaskItem(ShaderGUIRootItem rootItem, ShaderGUIItem parentItem)
: base(rootItem, parentItem: parentItem)
{
}
public ShaderGUIBitMaskItem(
ShaderGUIRootItem rootItem,
ShaderGUIItem parentItem,
string propertyName,
Func<GUIContent> contentProvider,
Func<string[]> maskNamesProvider,
Action<MaterialProperty> onValueChanged = null,
Func<bool> isVisible = null) : base(rootItem, parentItem)
{
PropertyName = propertyName;
_contentProvider = contentProvider ?? (() => GUIContent.none);
_maskNamesProvider = maskNamesProvider;
_onValueChanged = onValueChanged;
_isVisible = isVisible;
GuiContent = _contentProvider();
MaskNames = _maskNamesProvider?.Invoke();
InitTriggerByChild();
}
public string[] MaskNames;
public int ValidMask = -1;
public override void OnGUI()
{
if (_isVisible != null && !_isVisible())
{
return;
}
if (_contentProvider != null)
{
GuiContent = _contentProvider();
}
if (_maskNamesProvider != null)
{
MaskNames = _maskNamesProvider();
}
base.OnGUI();
}
public override void DrawController()
{
string[] maskNames = MaskNames ?? EmptyMaskNames;
int validMask = GetValidMask(maskNames);
int mask = Mathf.RoundToInt(PropertyInfo.Property.floatValue) & validMask;
int value = EditorGUI.MaskField(ControlRect, mask, maskNames) & validMask;
SetFloatIfDifferent(PropertyInfo.Property, value);
}
public override void OnEndChange()
{
base.OnEndChange();
_onValueChanged?.Invoke(PropertyInfo.Property);
}
public override void ExecuteReset(bool isCallByParent = false)
{
base.ExecuteReset(isCallByParent);
OnEndChange();
}
private int GetValidMask(string[] maskNames)
{
if (ValidMask >= 0)
{
return ValidMask;
}
int optionCount = Mathf.Clamp(maskNames.Length, 0, 30);
return optionCount == 0 ? 0 : (1 << optionCount) - 1;
}
}
}