Skip to content

Commit 45bd6c7

Browse files
committed
Added variables view in functions timeline
Updated optimized generator to group materials by enablers
1 parent 8569223 commit 45bd6c7

File tree

3 files changed

+119
-15
lines changed

3 files changed

+119
-15
lines changed

Editor/Editors/Components/FunctionTimeline.cs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,48 @@ public void ResetSelectedClass()
263263
}
264264
}
265265
}
266+
267+
internal class VariablesViewer : VisualElement
268+
{
269+
public Action<Variable> OnVariableSelected { get; set; }
270+
271+
private List<VariableField> _variables;
272+
273+
public VariablesViewer(ModularShader shader)
274+
{
275+
var variables = shader.BaseModules.Concat(shader.AdditionalModules).SelectMany(x => x.Functions).SelectMany(x => x.UsedVariables).Distinct().OrderBy(x => x.Type).ThenBy(x => x.Name);
276+
277+
var title = new Label("Variables List");
278+
title.AddToClassList("area-title");
279+
var content = new ScrollView(ScrollViewMode.Vertical);
280+
content.AddToClassList("area-content");
281+
282+
_variables = new List<VariableField>();
283+
284+
foreach (Variable variable in variables)
285+
{
286+
var element = new VariableField(variable);
287+
_variables.Add(element);
288+
content.Add(element);
289+
290+
element.RegisterCallback<MouseUpEvent>(evt =>
291+
{
292+
if (evt.button != 0) return;
293+
foreach (VariableField field in _variables)
294+
{
295+
if (field.ClassListContains("selected-variable-global"))
296+
field.RemoveFromClassList("selected-variable-global");
297+
}
298+
299+
element.AddToClassList("selected-variable-global");
300+
OnVariableSelected?.Invoke(element.Variable);
301+
});
302+
}
303+
304+
Add(title);
305+
Add(content);
306+
}
307+
}
266308

267309
internal class FunctionViewer : VisualElement
268310
{
@@ -326,7 +368,6 @@ public ShaderFunction SelectedItem
326368
private ShaderFunction _selectedItem;
327369
private Foldout _variablesFoldout;
328370
private List<VariableField> _variables;
329-
private VariableField _selectedVariable;
330371
private readonly Foldout _variableKeywordsFoldout;
331372
private readonly Foldout _codeKeywordsFoldout;
332373

@@ -470,6 +511,7 @@ public TimelineContainer(ModularShader shader)
470511
var right = new VisualElement();
471512
var bot = new VisualElement();
472513
var templateViewer = new FunctionTemplateViewer();
514+
var variablesViewer = new VariablesViewer(shader);
473515
var functionViewer = new FunctionViewer();
474516
var moduleViewer = new ModuleViewer();
475517

@@ -516,6 +558,19 @@ public TimelineContainer(ModularShader shader)
516558
moduleViewer.SelectedItem = item.Row.Module;
517559
templateViewer.SelectedItem = item.Function.ShaderFunctionCode == null ? null : item.Function.ShaderFunctionCode.Template;
518560

561+
variablesViewer.OnVariableSelected = variable =>
562+
{
563+
foreach (FunctionItem f in root.Functions)
564+
{
565+
bool toHighlight = f.Function.UsedVariables.Any(x => x == variable);
566+
567+
if(toHighlight && !f.ClassListContains("contains-variable-global"))
568+
f.AddToClassList("contains-variable-global");
569+
if(!toHighlight && f.ClassListContains("contains-variable-global"))
570+
f.RemoveFromClassList("contains-variable-global");
571+
}
572+
};
573+
519574
functionViewer.OnVariableSelected = variable =>
520575
{
521576
foreach (FunctionItem f in root.Functions)
@@ -551,6 +606,19 @@ public TimelineContainer(ModularShader shader)
551606
}
552607
timelineContent.Add(_roots[0]);
553608

609+
variablesViewer.OnVariableSelected = variable =>
610+
{
611+
foreach (FunctionItem f in _roots[0].Functions)
612+
{
613+
bool toHighlight = f.Function.UsedVariables.Any(x => x == variable);
614+
615+
if(toHighlight && !f.ClassListContains("contains-variable-global"))
616+
f.AddToClassList("contains-variable-global");
617+
if(!toHighlight && f.ClassListContains("contains-variable-global"))
618+
f.RemoveFromClassList("contains-variable-global");
619+
}
620+
};
621+
554622
var timelineScroll = new ScrollView(ScrollViewMode.Vertical);
555623
timelineScroll.AddToClassList("timeline");
556624
timelineScroll.style.flexGrow = 1;
@@ -578,6 +646,7 @@ public TimelineContainer(ModularShader shader)
578646
left.Add(scroller);
579647
left.Add(bot);
580648
right.Add(templateViewer);
649+
bot.Add(variablesViewer);
581650
bot.Add(functionViewer);
582651
bot.Add(moduleViewer);
583652
}

Editor/Resources/MSS/MSSUIElements/FunctionTimelineStyle.uss

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ FunctionItem
2323
{
2424
border-color: black;
2525
border-width: 1px;
26-
border-radius: 5px;
26+
border-radius: 7px;
2727
margin: 4px;
2828
background-color: darkslategrey;
2929
position: absolute;
@@ -79,9 +79,17 @@ CodeViewElement
7979
flex-direction: row;
8080
}
8181

82+
VariablesViewer
83+
{
84+
width: 30%;
85+
border-width: 2px;
86+
border-color: #282828;
87+
margin: 2px;
88+
}
89+
8290
FunctionViewer
8391
{
84-
width: 50%;
92+
width: 35%;
8593
border-width: 2px;
8694
border-color: #282828;
8795
margin: 2px;
@@ -97,7 +105,7 @@ FunctionTemplateViewer
97105

98106
ModuleViewer
99107
{
100-
width: 50%;
108+
width: 35%;
101109
border-width: 2px;
102110
border-color: #282828;
103111
margin: 2px;
@@ -108,6 +116,11 @@ ModuleViewer
108116
border-color: yellow;
109117
}
110118

119+
.contains-variable-global
120+
{
121+
border-color: #ff002f;
122+
}
123+
111124
.selected-function
112125
{
113126
border-color: aqua;
@@ -148,6 +161,11 @@ Foldout > Toggle
148161
background-color: rgba(255,255,0,0.2);
149162
}
150163

164+
.selected-variable-global
165+
{
166+
background-color: rgba(255, 0, 0, 0.2);
167+
}
168+
151169
.label-field-value
152170
{
153171
white-space: normal;

Editor/ShaderGenerator.cs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,17 +127,17 @@ public static void GenerateMinimalShader(string path, ModularShader shader, IEnu
127127
var possibleVariants = GetMinimalVariants(modules, materials);
128128
var contexts = new List<ShaderContext>();
129129

130-
foreach (var (variant, material) in possibleVariants)
130+
foreach (var (variant, variantMaterials) in possibleVariants)
131131
{
132-
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(material, out string guid, out long _);
132+
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(variantMaterials[0], out string guid, out long _);
133133
contexts.Add(new ShaderContext
134134
{
135135
Shader = shader,
136136
PostGeneration = postGeneration,
137137
ActiveEnablers = variant,
138138
FilePath = path,
139139
OptimizedShader = true,
140-
Material = material,
140+
Materials = variantMaterials,
141141
Guid = guid
142142
});
143143
}
@@ -161,17 +161,17 @@ public static List<ShaderContext> EnqueueShadersToGenerate(string path, ModularS
161161
var possibleVariants = GetMinimalVariants(modules, materials);
162162
var contexts = new List<ShaderContext>();
163163

164-
foreach (var (variant, material) in possibleVariants)
164+
foreach (var (variant, variantMaterials) in possibleVariants)
165165
{
166-
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(material, out string guid, out long _);
166+
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(variantMaterials[0], out string guid, out long _);
167167
contexts.Add(new ShaderContext
168168
{
169169
Shader = shader,
170170
PostGeneration = postGeneration,
171171
ActiveEnablers = variant,
172172
FilePath = path,
173173
OptimizedShader = true,
174-
Material = material,
174+
Materials = variantMaterials,
175175
Guid = guid
176176
});
177177
}
@@ -239,7 +239,11 @@ public static void GenerateMinimalShaders(this List<ShaderContext> contexts)
239239
EditorUtility.DisplayProgressBar("Generating Optimized Shaders", "applying shaders to materials", contexts.Count - 1 / (contexts.Count + 3));
240240
foreach (var context in contexts)
241241
{
242-
context.Material.shader = Shader.Find(context.ShaderName);
242+
var shader = Shader.Find(context.ShaderName);
243+
foreach (var material in context.Materials)
244+
{
245+
material.shader = shader;
246+
}
243247
}
244248

245249
EditorUtility.ClearProgressBar();
@@ -276,7 +280,7 @@ private static List<Dictionary<string, int>> GetShaderVariants(List<ShaderModule
276280
return states;
277281
}
278282

279-
private static List<(Dictionary<string, int>, Material)> GetMinimalVariants(List<ShaderModule> modules, IEnumerable<Material> materials)
283+
private static List<(Dictionary<string, int>, List<Material>)> GetMinimalVariants(List<ShaderModule> modules, IEnumerable<Material> materials)
280284
{
281285
var enablers = new List<string>();
282286
foreach (ShaderModule module in modules)
@@ -292,14 +296,27 @@ private static List<Dictionary<string, int>> GetShaderVariants(List<ShaderModule
292296

293297
enablers = enablers.Distinct().ToList();
294298

295-
var states = new List<(Dictionary<string, int>, Material)>();
299+
var states = new List<(Dictionary<string, int>, List<Material>)>();
296300
foreach (Material material in materials)
297301
{
298302
var state = new Dictionary<string, int>();
299303
foreach (string enabler in enablers)
300304
state.Add(enabler, (int)material.GetFloat(enabler));
305+
306+
var equalState = states.Where(x =>
307+
{
308+
var keys = state.Keys;
309+
foreach (string key in keys)
310+
if (x.Item1[key] != state[key])
311+
return false;
312+
313+
return true;
314+
}).FirstOrDefault();
301315

302-
states.Add((state, material));
316+
if(equalState == (null, null))
317+
states.Add((state, new List<Material>(new [] {material})));
318+
else
319+
equalState.Item2.Add(material);
303320
}
304321

305322
return states;
@@ -377,7 +394,7 @@ public class ShaderContext
377394
public string PropertiesBlock;
378395
public bool AreVariantsHidden;
379396
public bool OptimizedShader;
380-
public Material Material;
397+
public List<Material> Materials;
381398
public StringBuilder ShaderFile;
382399
private List<ShaderModule> _modules;
383400
private List<ShaderFunction> _functions;

0 commit comments

Comments
 (0)