1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
2
3
using System . IO ;
3
4
using System . Linq ;
4
5
using System . Text ;
@@ -17,6 +18,18 @@ public static class ShaderGenerator
17
18
/// <param name="shader">Modular shader to use</param>
18
19
/// <param name="hideVariants">Hide variants from the shader selector on the material, showing only the shader with all variants disabled from the menu</param>
19
20
public static void GenerateShader ( string path , ModularShader shader , bool hideVariants = false )
21
+ {
22
+ GenerateShader ( path , shader , null , hideVariants ) ;
23
+ }
24
+
25
+ /// <summary>
26
+ /// Generates a shader with all shader variants, you can give a custom PostGeneration action to handle the shader result for some custom modifications (build keywords are still available at this stage)
27
+ /// </summary>
28
+ /// <param name="path">path for the shader files</param>
29
+ /// <param name="shader">Modular shader to use</param>
30
+ /// <param name="postGeneration">Actions to performs post generation and before cleanup </param>
31
+ /// <param name="hideVariants">Hide variants from the shader selector on the material, showing only the shader with all variants disabled from the menu</param>
32
+ public static void GenerateShader ( string path , ModularShader shader , Action < StringBuilder , ShaderContext > postGeneration , bool hideVariants = true )
20
33
{
21
34
var modules = FindAllModules ( shader ) ;
22
35
@@ -42,6 +55,7 @@ public static void GenerateShader(string path, ModularShader shader, bool hideVa
42
55
contexts . Add ( new ShaderContext
43
56
{
44
57
Shader = shader ,
58
+ PostGeneration = postGeneration ,
45
59
ActiveEnablers = variant ,
46
60
FreshAssets = freshAssets ,
47
61
FilePath = path ,
@@ -68,14 +82,26 @@ public static void GenerateShader(string path, ModularShader shader, bool hideVa
68
82
foreach ( var context in contexts )
69
83
shader . LastGeneratedShaders . Add ( AssetDatabase . LoadAssetAtPath < Shader > ( $ "{ path } /" + context . VariantFileName ) ) ;
70
84
}
71
-
85
+
72
86
/// <summary>
73
87
/// Generates a shader with all shader variants
74
88
/// </summary>
75
89
/// <param name="path">path for the shader files</param>
76
90
/// <param name="shader">Modular shader to use</param>
77
91
/// <param name="materials">List of materials given</param>
78
92
public static void GenerateMinimalShader ( string path , ModularShader shader , IEnumerable < Material > materials )
93
+ {
94
+ GenerateMinimalShader ( path , shader , materials , null ) ;
95
+ }
96
+
97
+ /// <summary>
98
+ /// Generates a shader with all shader variants
99
+ /// </summary>
100
+ /// <param name="path">path for the shader files</param>
101
+ /// <param name="shader">Modular shader to use</param>
102
+ /// <param name="materials">List of materials given</param>
103
+ /// <param name="postGeneration">Actions to performs post generation and before cleanup </param>
104
+ public static void GenerateMinimalShader ( string path , ModularShader shader , IEnumerable < Material > materials , Action < StringBuilder , ShaderContext > postGeneration )
79
105
{
80
106
var modules = FindAllModules ( shader ) ;
81
107
var possibleVariants = GetMinimalVariants ( modules , materials ) ;
@@ -87,6 +113,7 @@ public static void GenerateMinimalShader(string path, ModularShader shader, IEnu
87
113
contexts . Add ( new ShaderContext
88
114
{
89
115
Shader = shader ,
116
+ PostGeneration = postGeneration ,
90
117
ActiveEnablers = variant ,
91
118
FilePath = path ,
92
119
OptimizedShader = true ,
@@ -97,7 +124,7 @@ public static void GenerateMinimalShader(string path, ModularShader shader, IEnu
97
124
98
125
contexts . GenerateMinimalShaders ( ) ;
99
126
}
100
-
127
+
101
128
/// <summary>
102
129
/// Enqueues shaders to generate
103
130
/// </summary>
@@ -106,6 +133,19 @@ public static void GenerateMinimalShader(string path, ModularShader shader, IEnu
106
133
/// <param name="materials">List of materials given</param>
107
134
/// <returns>A list of the shaderContexts</returns>
108
135
public static List < ShaderContext > EnqueueShadersToGenerate ( string path , ModularShader shader , IEnumerable < Material > materials )
136
+ {
137
+ return EnqueueShadersToGenerate ( path , shader , materials , null ) ;
138
+ }
139
+
140
+ /// <summary>
141
+ /// Enqueues shaders to generate
142
+ /// </summary>
143
+ /// <param name="path">path for the shader files</param>
144
+ /// <param name="shader">Modular shader to use</param>
145
+ /// <param name="materials">List of materials given</param>
146
+ /// <returns>A list of the shaderContexts</returns>
147
+ /// <param name="postGeneration">Actions to performs post generation and before cleanup </param>
148
+ public static List < ShaderContext > EnqueueShadersToGenerate ( string path , ModularShader shader , IEnumerable < Material > materials , Action < StringBuilder , ShaderContext > postGeneration )
109
149
{
110
150
var modules = FindAllModules ( shader ) ;
111
151
var possibleVariants = GetMinimalVariants ( modules , materials ) ;
@@ -117,6 +157,7 @@ public static List<ShaderContext> EnqueueShadersToGenerate(string path, ModularS
117
157
contexts . Add ( new ShaderContext
118
158
{
119
159
Shader = shader ,
160
+ PostGeneration = postGeneration ,
120
161
ActiveEnablers = variant ,
121
162
FilePath = path ,
122
163
OptimizedShader = true ,
@@ -297,6 +338,7 @@ public class ShaderContext
297
338
public ModularShader Shader ;
298
339
public Dictionary < string , int > ActiveEnablers ;
299
340
public Dictionary < TemplateAsset , TemplateAsset > FreshAssets ;
341
+ public Action < StringBuilder , ShaderContext > PostGeneration ;
300
342
private List < EnableProperty > _liveUpdateEnablers ;
301
343
public string FilePath ;
302
344
public string VariantFileName ;
@@ -370,6 +412,7 @@ public void GenerateShader()
370
412
ShaderFile . AppendLine ( $ "CustomEditor \" { Shader . CustomEditor } \" ") ;
371
413
ShaderFile . AppendLine ( "}" ) ;
372
414
415
+ PostGeneration ? . Invoke ( ShaderFile , this ) ;
373
416
374
417
MatchCollection m = Regex . Matches ( ShaderFile . ToString ( ) , @"#K#.*$" , RegexOptions . Multiline ) ;
375
418
for ( int i = m . Count - 1 ; i >= 0 ; i -- )
@@ -545,15 +588,15 @@ private void WriteFunctionsToKeywords()
545
588
if ( ! keywordedCode . ContainsKey ( keyword ) )
546
589
keywordedCode . Add ( keyword , new StringBuilder ( ) ) ;
547
590
548
- keywordedCode [ keyword ] . AppendLine ( freshAsset . Template ) ;
591
+ if ( freshAsset != null ) keywordedCode [ keyword ] . AppendLine ( freshAsset . Template ) ;
549
592
}
550
593
}
551
594
else
552
595
{
553
596
if ( ! keywordedCode . ContainsKey ( MSSConstants . DEFAULT_CODE_KEYWORD ) )
554
597
keywordedCode . Add ( MSSConstants . DEFAULT_CODE_KEYWORD , new StringBuilder ( ) ) ;
555
598
556
- keywordedCode [ MSSConstants . DEFAULT_CODE_KEYWORD ] . AppendLine ( freshAsset . Template ) ;
599
+ if ( freshAsset != null ) keywordedCode [ MSSConstants . DEFAULT_CODE_KEYWORD ] . AppendLine ( freshAsset . Template ) ;
557
600
}
558
601
}
559
602
0 commit comments