Skip to content

Commit 266e95e

Browse files
committed
Final fix for the Templates issues on generation
1 parent e0a7c74 commit 266e95e

File tree

4 files changed

+84
-14
lines changed

4 files changed

+84
-14
lines changed

Editor/Scriptables/TemplateAsset.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ namespace VRLabs.ModularShaderSystem
1111
public class TemplateAsset : ScriptableObject
1212
{
1313
public string Template;
14+
public string TemplateInstanceID;
1415

1516
public TemplateAsset(string template)
1617
{
1718
Template = template;
1819
}
1920
public TemplateAsset() : this("") { }
2021

21-
public override string ToString() => Template;
22+
public override string ToString() => TemplateInstanceID;
2223

2324
//TODO: add preview icon
2425
[MenuItem("Assets/Create/" + MSSConstants.CREATE_PATH + "/Template", priority = 9)]

Editor/Scriptables/TemplateAssetImporter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66
namespace VRLabs.ModularShaderSystem
77
{
8-
[ScriptedImporter(1, MSSConstants.TEMPLATE_EXTENSION, -1000)]
8+
[ScriptedImporter(1, MSSConstants.TEMPLATE_EXTENSION)]
99
public class TemplateAssetImporter : ScriptedImporter
1010
{
1111
//TODO: add icon
1212
public override void OnImportAsset(AssetImportContext ctx)
1313
{
1414
var subAsset = ScriptableObject.CreateInstance<TemplateAsset>();
15+
subAsset.TemplateInstanceID = Guid.NewGuid().ToString();
1516
subAsset.Template = File.ReadAllText(ctx.assetPath);
1617
//Texture2D icon = Resources.Load<Texture2D>("Editor/Icons/Icon");
1718
ctx.AddObjectToAsset("Template", subAsset/*, icon*/);

Editor/Scriptables/TemplateCollectionAssetImporter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace VRLabs.ModularShaderSystem
88
{
9-
[ScriptedImporter(1, MSSConstants.TEMPLATE_COLLECTION_EXTENSION, -1000)]
9+
[ScriptedImporter(1, MSSConstants.TEMPLATE_COLLECTION_EXTENSION)]
1010
public class TemplateColletionAssetImporter : ScriptedImporter
1111
{
1212
public override void OnImportAsset(AssetImportContext ctx)
@@ -61,6 +61,7 @@ public override void OnImportAsset(AssetImportContext ctx)
6161
private static void SaveSubAsset(AssetImportContext ctx, TemplateCollectionAsset asset, StringBuilder builder, string name)
6262
{
6363
var templateAsset = ScriptableObject.CreateInstance<TemplateAsset>();
64+
templateAsset.TemplateInstanceID = Guid.NewGuid().ToString();
6465
templateAsset.Template = builder.ToString();
6566
templateAsset.name = name;
6667
ctx.AddObjectToAsset(name, templateAsset /*, icon*/); //TODO: add asset icon here

Editor/ShaderGenerator.cs

Lines changed: 78 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,31 @@ public static class ShaderGenerator
1919
public static void GenerateShader(string path, ModularShader shader, bool hideVariants = false)
2020
{
2121
var modules = FindAllModules(shader);
22+
23+
// Countermeasure for unity dogshit scriptedImporter assets reimport/update system
24+
var freshAssets = new Dictionary<TemplateAsset, TemplateAsset>();
25+
26+
freshAssets.AddFreshShaderToList(shader.ShaderTemplate);
27+
freshAssets.AddFreshShaderToList(shader.ShaderPropertiesTemplate);
28+
29+
foreach (var template in modules.SelectMany(x => x.Templates))
30+
freshAssets.AddFreshShaderToList(template.Template);
31+
32+
foreach (var function in modules.SelectMany(x => x.Functions))
33+
freshAssets.AddFreshShaderToList(function.ShaderFunctionCode);
34+
35+
2236
var possibleVariants = GetShaderVariants(modules);
2337
var contexts = new List<ShaderContext>();
24-
var completePropertiesBlock = GetPropertiesBlock(shader, modules);
38+
var completePropertiesBlock = GetPropertiesBlock(shader, modules, freshAssets);
2539

2640
foreach (var variant in possibleVariants)
2741
{
2842
contexts.Add(new ShaderContext
2943
{
3044
Shader = shader,
3145
ActiveEnablers = variant,
46+
FreshAssets = freshAssets,
3247
FilePath = path,
3348
PropertiesBlock = completePropertiesBlock,
3449
AreVariantsHidden = true
@@ -120,6 +135,39 @@ public static List<ShaderContext> EnqueueShadersToGenerate(string path, ModularS
120135
public static void GenerateMinimalShaders(this List<ShaderContext> contexts)
121136
{
122137
if (contexts == null || contexts.Count == 0) return;
138+
139+
// Still Countermeasure for unity dogshit scriptedImporter assets reimport/update system
140+
var alreadyDoneShaders = new List<ModularShader>();
141+
142+
var freshAssets = new Dictionary<TemplateAsset, TemplateAsset>();
143+
144+
foreach (var context in contexts)
145+
{
146+
context.FreshAssets = freshAssets;
147+
if (alreadyDoneShaders.Contains(context.Shader)) continue;
148+
149+
var shader = context.Shader;
150+
var modules = FindAllModules(shader);
151+
152+
string assetPath = AssetDatabase.GetAssetPath(shader.ShaderTemplate);
153+
freshAssets.Add(shader.ShaderTemplate, AssetDatabase.LoadAssetAtPath<TemplateAsset>(assetPath));
154+
assetPath = AssetDatabase.GetAssetPath(shader.ShaderPropertiesTemplate);
155+
freshAssets.Add(shader.ShaderPropertiesTemplate, AssetDatabase.LoadAssetAtPath<TemplateAsset>(assetPath));
156+
157+
foreach (var template in modules.SelectMany(x => x.Templates))
158+
{
159+
assetPath = AssetDatabase.GetAssetPath(template.Template);
160+
freshAssets.Add(template.Template, AssetDatabase.LoadAssetAtPath<TemplateAsset>(assetPath));
161+
}
162+
163+
foreach (var function in modules.SelectMany(x => x.Functions))
164+
{
165+
assetPath = AssetDatabase.GetAssetPath(function.ShaderFunctionCode);
166+
freshAssets.Add(function.ShaderFunctionCode, AssetDatabase.LoadAssetAtPath<TemplateAsset>(assetPath));
167+
}
168+
169+
alreadyDoneShaders.Add(shader);
170+
}
123171

124172
EditorUtility.DisplayProgressBar("Generating Optimized Shaders", "generating shader files", 1 / (contexts.Count + 3));
125173
contexts.AsParallel().ForAll(x => x.GenerateShader());
@@ -236,11 +284,27 @@ public static string GetVariantCode(Dictionary<string, int> activeEnablers)
236284

237285
return isAllZeroes ? "" : b.ToString();
238286
}
287+
288+
// Loads A new version of the asset into the dictionary if not already available
289+
private static void AddFreshShaderToList(this Dictionary<TemplateAsset, TemplateAsset> dictionary, TemplateAsset asset)
290+
{
291+
if ((object)asset == null) return;
292+
if (dictionary.ContainsKey(asset)) return;
293+
string assetPath = AssetDatabase.GetAssetPath(asset);
294+
dictionary.Add(asset, AssetDatabase.LoadAssetAtPath<TemplateAsset>(assetPath));
295+
}
296+
297+
// Retrieves the new version of the asset from the dictionary if available
298+
private static TemplateAsset GetTemplate(this Dictionary<TemplateAsset, TemplateAsset> dictionary, TemplateAsset asset)
299+
{
300+
return dictionary.TryGetValue(asset, out TemplateAsset result) ? result : null;
301+
}
239302

240303
public class ShaderContext
241304
{
242305
public ModularShader Shader;
243306
public Dictionary<string, int> ActiveEnablers;
307+
public Dictionary<TemplateAsset, TemplateAsset> FreshAssets;
244308
private List<EnableProperty> _liveUpdateEnablers;
245309
public string FilePath;
246310
public string VariantFileName;
@@ -287,7 +351,7 @@ public void GenerateShader()
287351

288352
// If the properties block value is empty, assume that the context is generating an optimised shader.
289353
if (string.IsNullOrEmpty(PropertiesBlock))
290-
ShaderFile.Append(GetPropertiesBlock(Shader, _modules, false));
354+
ShaderFile.Append(GetPropertiesBlock(Shader, _modules, FreshAssets, false));
291355
else
292356
ShaderFile.Append(PropertiesBlock);
293357

@@ -363,7 +427,7 @@ private void WriteShaderSkeleton()
363427
ShaderFile.AppendLine("SubShader");
364428
ShaderFile.AppendLine("{");
365429

366-
ShaderFile.AppendLine(Shader.ShaderTemplate.Template);
430+
ShaderFile.AppendLine(FreshAssets.GetTemplate(Shader.ShaderTemplate).Template);
367431

368432
Dictionary<ModuleTemplate, ShaderModule> moduleByTemplate = new Dictionary<ModuleTemplate, ShaderModule>();
369433
Dictionary<(string, string), string> convertedKeyword = new Dictionary<(string, string), string>();
@@ -377,23 +441,24 @@ private void WriteShaderSkeleton()
377441
//{
378442
foreach (var template in _modules.SelectMany(x => x.Templates).OrderBy(x => x.Queue))
379443
{
444+
var freshTemplate = FreshAssets.GetTemplate(template.Template);
380445
var module = moduleByTemplate[template];
381-
if (template.Template is null) continue;
446+
if (freshTemplate == null) continue;
382447
bool hasEnabler = module.Enabled != null && !string.IsNullOrEmpty(module.Enabled.Name);
383448
bool isFilteredIn = hasEnabler && ActiveEnablers.TryGetValue(module.Enabled.Name, out _);
384449
bool needsIf = hasEnabler && !isFilteredIn && !template.NeedsVariant;
385450
var tmp = new StringBuilder();
386451

387452
if (!needsIf)
388453
{
389-
tmp.AppendLine(template.Template.ToString());
454+
tmp.AppendLine(freshTemplate.Template);
390455
}
391456

392457
else
393458
{
394459
tmp.AppendLine($"if({module.Enabled.Name} == {module.Enabled.EnableValue})");
395460
tmp.AppendLine("{");
396-
tmp.AppendLine(template.Template.ToString());
461+
tmp.AppendLine(freshTemplate.Template);
397462
tmp.AppendLine("}");
398463
}
399464

@@ -480,22 +545,23 @@ private void WriteFunctionsToKeywords()
480545

481546
foreach (ShaderFunction function in _reorderedFunctions)
482547
{
548+
var freshAsset = FreshAssets.GetTemplate(function.ShaderFunctionCode);
483549
if (function.CodeKeywords.Count > 0)
484550
{
485551
foreach (string keyword in function.CodeKeywords)
486552
{
487553
if (!keywordedCode.ContainsKey(keyword))
488554
keywordedCode.Add(keyword, new StringBuilder());
489555

490-
keywordedCode[keyword].AppendLine(function.ShaderFunctionCode.Template);
556+
keywordedCode[keyword].AppendLine(freshAsset.Template);
491557
}
492558
}
493559
else
494560
{
495561
if (!keywordedCode.ContainsKey(MSSConstants.DEFAULT_CODE_KEYWORD))
496562
keywordedCode.Add(MSSConstants.DEFAULT_CODE_KEYWORD, new StringBuilder());
497563

498-
keywordedCode[MSSConstants.DEFAULT_CODE_KEYWORD].AppendLine(function.ShaderFunctionCode.Template);
564+
keywordedCode[MSSConstants.DEFAULT_CODE_KEYWORD].AppendLine(freshAsset.Template);
499565
}
500566
}
501567

@@ -614,16 +680,17 @@ private static StringBuilder CleanupShaderFile(StringBuilder shaderVariant)
614680
}
615681

616682
// Retrieves properties block based on given modules
617-
private static string GetPropertiesBlock(ModularShader shader, List<ShaderModule> modules, bool includeEnablers = true)
683+
private static string GetPropertiesBlock(ModularShader shader, List<ShaderModule> modules, Dictionary<TemplateAsset, TemplateAsset> freshAssets, bool includeEnablers = true)
618684
{
619685
var block = new StringBuilder();
620686
block.AppendLine("Properties");
621687
block.AppendLine("{");
622688

623689
if (shader.UseTemplatesForProperties)
624690
{
625-
if (shader.ShaderPropertiesTemplate != null)
626-
block.AppendLine(shader.ShaderPropertiesTemplate.Template);
691+
var freshTemplate = freshAssets.GetTemplate(shader.ShaderPropertiesTemplate);
692+
if (freshTemplate != null)
693+
block.AppendLine(freshTemplate.Template);
627694

628695
block.AppendLine($"#K#{MSSConstants.TEMPLATE_PROPERTIES_KEYWORD}");
629696
}

0 commit comments

Comments
 (0)