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

221 lines
7.9 KiB
C#

using System;
using System.Collections.Generic;
using NBShader;
using NBShaders2.Editor.FeatureLevel;
using UnityEditor;
using UnityEngine;
namespace NBShaderEditor
{
public class NBShaderGUIContext
{
private const string FeatureTierPropertyName = "_NBShaderFeatureTier";
private readonly NBShaderRootItem _rootItem;
private HashSet<string> _currentTierAllowedKeywords;
public NBShaderGUIContext(NBShaderRootItem rootItem)
{
_rootItem = rootItem;
}
public MeshSourceMode MeshSourceMode { get; private set; } = MeshSourceMode.UnKnowOrMixed;
public TransparentMode TransparentMode { get; private set; } = TransparentMode.UnKnowOrMixed;
public MixedBool UIEffectEnabled { get; private set; } = MixedBool.Mixed;
public MixedBool UseGraphicMainTex { get; private set; } = MixedBool.Mixed;
public MixedBool ParticleMode { get; private set; } = MixedBool.Mixed;
public MixedBool NoiseEnabled { get; private set; } = MixedBool.Mixed;
public MixedBool ProgramNoiseEnabled { get; private set; } = MixedBool.Mixed;
public MixedBool VatEnabled { get; private set; } = MixedBool.Mixed;
public MixedBool FlipbookEnabled { get; private set; } = MixedBool.Mixed;
public FxLightMode FxLightMode { get; private set; } = FxLightMode.UnKnownOrMixedValue;
public NBShaderFeatureTier CurrentTier { get; private set; } = NBShaderFeatureTier.Ultra;
public bool CurrentTierMixed { get; private set; }
public bool IsKeywordAllowed(string keyword)
{
if (!NBShaderFeatureCatalog.IsManagedKeyword(keyword))
{
return true;
}
if (CurrentTierMixed)
{
return true;
}
return _currentTierAllowedKeywords != null && _currentTierAllowedKeywords.Contains(keyword);
}
public bool AreKeywordsAllowed(params string[] keywords)
{
if (keywords == null)
{
return true;
}
for (int i = 0; i < keywords.Length; i++)
{
if (!IsKeywordAllowed(keywords[i]))
{
return false;
}
}
return true;
}
public bool IsAnyKeywordAllowed(params string[] keywords)
{
if (keywords == null || keywords.Length == 0)
{
return true;
}
for (int i = 0; i < keywords.Length; i++)
{
if (IsKeywordAllowed(keywords[i]))
{
return true;
}
}
return false;
}
public bool IsAnyKeywordAllowed(string keyword0, string keyword1)
{
return IsKeywordAllowed(keyword0) || IsKeywordAllowed(keyword1);
}
public bool IsAnyKeywordAllowed(
string keyword0,
string keyword1,
string keyword2,
string keyword3,
string keyword4)
{
return IsKeywordAllowed(keyword0) ||
IsKeywordAllowed(keyword1) ||
IsKeywordAllowed(keyword2) ||
IsKeywordAllowed(keyword3) ||
IsKeywordAllowed(keyword4);
}
public static bool IsCatalogKeyword(string keyword)
{
return NBShaderFeatureCatalog.IsManagedKeyword(keyword);
}
public bool HasProperty(string propertyName)
{
return _rootItem.PropertyInfoDic.ContainsKey(propertyName);
}
public MaterialProperty GetProperty(string propertyName)
{
return _rootItem.PropertyInfoDic[propertyName].Property;
}
public void Refresh()
{
RefreshFeatureTier();
if (HasProperty("_MeshSourceMode"))
{
MaterialProperty meshSourceModeProperty = GetProperty("_MeshSourceMode");
MeshSourceMode = meshSourceModeProperty.hasMixedValue
? MeshSourceMode.UnKnowOrMixed
: (MeshSourceMode)meshSourceModeProperty.floatValue;
}
if (HasProperty("_TransparentMode"))
{
MaterialProperty transparentModeProperty = GetProperty("_TransparentMode");
TransparentMode = transparentModeProperty.hasMixedValue
? TransparentMode.UnKnowOrMixed
: (TransparentMode)transparentModeProperty.floatValue;
}
if (MeshSourceMode == MeshSourceMode.UnKnowOrMixed)
{
UIEffectEnabled = MixedBool.Mixed;
UseGraphicMainTex = MixedBool.Mixed;
ParticleMode = MixedBool.Mixed;
}
else
{
UIEffectEnabled = (int)MeshSourceMode >= 2 ? MixedBool.True : MixedBool.False;
UseGraphicMainTex = MeshSourceMode == MeshSourceMode.UIEffectRawImage || MeshSourceMode == MeshSourceMode.UIEffectSprite
? MixedBool.True
: MixedBool.False;
ParticleMode = MeshSourceMode == MeshSourceMode.Particle || MeshSourceMode == MeshSourceMode.UIParticle
? MixedBool.True
: MixedBool.False;
}
if (HasProperty("_FxLightMode"))
{
MaterialProperty lightModeProperty = GetProperty("_FxLightMode");
FxLightMode = lightModeProperty.hasMixedValue
? FxLightMode.UnKnownOrMixedValue
: (FxLightMode)lightModeProperty.floatValue;
}
NoiseEnabled = IsKeywordAllowed("_NOISEMAP") ? GetToggleState("_noisemapEnabled") : MixedBool.False;
ProgramNoiseEnabled = IsKeywordAllowed("_PROGRAM_NOISE") ? GetToggleState("_ProgramNoise_Toggle") : MixedBool.False;
VatEnabled = IsKeywordAllowed("_VAT") ? GetToggleState("_VAT_Toggle") : MixedBool.False;
FlipbookEnabled = IsKeywordAllowed("_FLIPBOOKBLENDING_ON") ? GetToggleState("_FlipbookBlending") : MixedBool.False;
}
private void RefreshFeatureTier()
{
if (!HasProperty(FeatureTierPropertyName))
{
CurrentTier = NBShaderFeatureTier.Ultra;
CurrentTierMixed = false;
_currentTierAllowedKeywords =
NBShaderFeatureLevelProjectSettings.instance.GetAllowedKeywordSetForReadOnlyUse(CurrentTier);
return;
}
MaterialProperty tierProperty = GetProperty(FeatureTierPropertyName);
CurrentTierMixed = tierProperty.hasMixedValue;
CurrentTier = CurrentTierMixed
? NBShaderFeatureTier.Ultra
: ToFeatureTier(Mathf.RoundToInt(tierProperty.floatValue));
_currentTierAllowedKeywords = CurrentTierMixed
? null
: NBShaderFeatureLevelProjectSettings.instance.GetAllowedKeywordSetForReadOnlyUse(CurrentTier);
}
private static NBShaderFeatureTier ToFeatureTier(int value)
{
return Enum.IsDefined(typeof(NBShaderFeatureTier), value) && value >= 0
? (NBShaderFeatureTier)value
: NBShaderFeatureTier.Ultra;
}
public MixedBool GetToggleState(string propertyName)
{
if (!HasProperty(propertyName))
{
return MixedBool.False;
}
MaterialProperty property = GetProperty(propertyName);
if (property.hasMixedValue)
{
return MixedBool.Mixed;
}
return property.floatValue > 0.5f ? MixedBool.True : MixedBool.False;
}
public bool IsToggleOn(string propertyName)
{
return GetToggleState(propertyName) == MixedBool.True;
}
}
}