12using System.Text.RegularExpressions;
13using System.Collections.Generic;
17public static class VariantEnabler {
18 public const string EARLY_OUT_KEYWORD =
"#pragma";
20 public static Regex isSurfaceShaderRegex =
new Regex(
@"#pragma\s+surface\s+surf");
21 public static Regex disabledVariantRegex =
new Regex(
@"/{2,}\s*#pragma\s+shader_feature\s+_\s+GRAPHIC_RENDERER");
22 public static Regex enabledVariantRegex =
new Regex(
@"^\s*#pragma\s+shader_feature\s+_\s+GRAPHIC_RENDERER");
24 public static bool IsSurfaceShader(Shader shader) {
26 if (tryGetShaderInfo(shader, out info)) {
27 return info.isSurfaceShader;
33 public static bool DoesShaderHaveVariantsDisabled(Shader shader) {
35 if (tryGetShaderInfo(shader, out info)) {
36 return info.doesHaveShaderVariantsDisabled;
42 public static void SetShaderVariantsEnabled(Shader shader,
bool enable) {
43 string path = AssetDatabase.GetAssetPath(shader);
44 if (
string.IsNullOrEmpty(path)) {
48 _infoCache.Remove(path);
50 string[] lines =
File.ReadAllLines(path);
51 using (var writer =
File.CreateText(path)) {
52 foreach (var line
in lines) {
53 if (enable && disabledVariantRegex.IsMatch(line)) {
54 writer.WriteLine(line.Replace(
"/",
" "));
55 }
else if (!enable && enabledVariantRegex.IsMatch(line)) {
56 var startEnum = line.TakeWhile(c =>
char.IsWhiteSpace(c));
57 int count = Mathf.Max(0, startEnum.Count() - 2);
58 var start =
new string(startEnum.Take(count).ToArray());
59 writer.WriteLine(start +
"//" + line.TrimStart());
61 writer.WriteLine(line);
67 private static Dictionary<string, ShaderInfo> _infoCache =
new Dictionary<string, ShaderInfo>();
68 private static bool tryGetShaderInfo(Shader shader, out ShaderInfo info) {
69 string path = AssetDatabase.GetAssetPath(shader);
70 if (
string.IsNullOrEmpty(path)) {
71 info =
default(ShaderInfo);
75 DateTime modifiedTime =
File.GetLastWriteTime(path);
77 if (_infoCache.TryGetValue(path, out info)) {
79 if (modifiedTime < info.checkTime) {
84 info.isSurfaceShader =
false;
85 info.doesHaveShaderVariantsDisabled =
false;
86 info.checkTime = modifiedTime;
88 string[] lines =
File.ReadAllLines(path);
89 foreach (var line
in lines) {
90 if (!line.Contains(EARLY_OUT_KEYWORD)) {
94 if (disabledVariantRegex.IsMatch(line)) {
95 info.doesHaveShaderVariantsDisabled =
true;
98 if (isSurfaceShaderRegex.IsMatch(line)) {
99 info.isSurfaceShader =
true;
103 _infoCache[path] = info;
107 private struct ShaderInfo {
108 public bool doesHaveShaderVariantsDisabled;
109 public bool isSurfaceShader;
110 public DateTime checkTime;