Files
2026-02-23 22:01:07 +07:00

65 lines
1.9 KiB
C#

using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;
namespace AllIn13DShader
{
public static class EffectProfileCreatorFromShaderVariant
{
private const string REGEX_EFFECTS_ENABLED_IN_SHADER_VARIANT = @"\/\/<ALLIN1_EFFECTS>((?:\s+#define\s\w+)*\s+)\/\/<\/ALLIN1_EFFECTS>";
public static EffectsProfile Create(Shader shaderVariant, string shaderVariantPath, PropertiesConfig propertiesConfig, EffectsProfileCollection effectsProfileCollection)
{
EffectsProfile res = effectsProfileCollection.CreateNewProfile(shaderVariant.name);
res.InitFromOtherProfile(effectsProfileCollection.generalProfile);
res.shaderGUID = AssetDatabase.AssetPathToGUID(shaderVariantPath);
string shaderText = File.ReadAllText(shaderVariantPath);
MatchCollection matchCollection = Regex.Matches(shaderText, REGEX_EFFECTS_ENABLED_IN_SHADER_VARIANT);
List<string> enabledKeywordsList = new List<string>();
if(matchCollection.Count > 0)
{
string matchText = matchCollection[0].Groups[1].Value;
string[] linesSplitted = matchText.Split("\n");
for (int i = 0; i < linesSplitted.Length; i++)
{
string lineProcessed = linesSplitted[i];
lineProcessed = lineProcessed.Replace("#define", string.Empty);
lineProcessed = lineProcessed.Trim();
if (!string.IsNullOrEmpty(lineProcessed))
{
enabledKeywordsList.Add(lineProcessed);
}
}
}
string[] enabledKeywordsArray = enabledKeywordsList.ToArray();
List<AllIn13DEffectConfig> allEffects = propertiesConfig.GetAllEffects();
for(int i = 0; i < allEffects.Count; i++)
{
AllIn13DEffectConfig effect = allEffects[i];
if (effect.ContainsSomeKeywordFromList(enabledKeywordsArray))
{
res.EnableEffect(effect, enabledKeywordsArray);
}
else
{
res.DisableEffect(effect);
}
}
return res;
}
}
}