Skip to content

Commit b284061

Browse files
committed
Added possibility to set default textures
Modified inspector for template asset Added option to a template graph node right click
1 parent aada99c commit b284061

File tree

5 files changed

+97
-44
lines changed

5 files changed

+97
-44
lines changed

Editor/Editors/Components/TemplateGraph.cs

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using UnityEditor;
45
using UnityEditor.Experimental.GraphView;
56
using UnityEngine;
67
using UnityEngine.UIElements;
@@ -32,31 +33,9 @@ public void UpdateTab(ModularShader shader)
3233
{
3334
TabContainer.Clear();
3435
if (shader == null) return;
35-
_graph = new TemplateGraphView();
36+
_graph = new TemplateGraphView(shader);
3637

37-
_graph.AddBaseTemplateNode("Shader", shader.ShaderTemplate);
38-
39-
if (shader.UseTemplatesForProperties)
40-
{
41-
var keywords = new []{"#K#" + MSSConstants.TEMPLATE_PROPERTIES_KEYWORD};
42-
_graph.AddBaseTemplateNode("ShaderPropertiesRoot", new TemplateAsset{ Template = "", Keywords = keywords, name = "Properties Template Root"});
43-
if (shader.ShaderPropertiesTemplate != null) _graph.AddTemplateNode("ShaderPropertiesTemplate", shader.ShaderTemplate, keywords);
44-
45-
}
4638

47-
var moduleByTemplate = new Dictionary<ModuleTemplate, ShaderModule>();
48-
foreach (var module in shader.BaseModules.Concat(shader.AdditionalModules))
49-
foreach (var template in module.Templates)
50-
moduleByTemplate.Add(template, module);
51-
52-
foreach (var template in shader.BaseModules.Concat(shader.AdditionalModules).SelectMany(x => x.Templates).OrderBy(x => x.Queue))
53-
{
54-
if (template.Template == null) continue;
55-
var module = moduleByTemplate[template];
56-
_graph.AddTemplateNode(module.Id, template);
57-
}
58-
59-
_graph.ScheduleNodesPositionReset();
6039

6140
TabContainer.Add(_graph);
6241
}
@@ -67,21 +46,50 @@ internal class TemplateGraphView : GraphView
6746
public List<TemplateNode> Nodes;
6847
public List<TemplateNode> BaseNodes;
6948

49+
private List<ShaderModule> _modules;
50+
private ModularShader _shader;
51+
7052
private static TextPopup _popup;
7153

72-
public TemplateGraphView()
54+
public TemplateGraphView(ModularShader shader)
7355
{
7456
Nodes = new List<TemplateNode>();
7557
BaseNodes = new List<TemplateNode>();
58+
59+
_modules = shader.BaseModules.Concat(shader.AdditionalModules).ToList();
60+
_shader = shader;
7661

7762
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
7863
this.AddManipulator(new ContentDragger());
7964
var grid = new GridBackground();
8065

8166
Insert(0, grid);
8267
grid.StretchToParentSize();
83-
8468
this.StretchToParentSize();
69+
70+
AddBaseTemplateNode("Shader", _shader.ShaderTemplate);
71+
72+
if (_shader.UseTemplatesForProperties)
73+
{
74+
var keywords = new []{"#K#" + MSSConstants.TEMPLATE_PROPERTIES_KEYWORD};
75+
AddBaseTemplateNode("ShaderPropertiesRoot", new TemplateAsset{ Template = "", Keywords = keywords, name = "Properties Template Root"});
76+
if (_shader.ShaderPropertiesTemplate != null) AddTemplateNode("ShaderPropertiesTemplate", _shader.ShaderTemplate, keywords);
77+
78+
}
79+
80+
var moduleByTemplate = new Dictionary<ModuleTemplate, ShaderModule>();
81+
foreach (var module in _shader.BaseModules.Concat(_shader.AdditionalModules))
82+
foreach (var template in module.Templates)
83+
moduleByTemplate.Add(template, module);
84+
85+
foreach (var template in _shader.BaseModules.Concat(_shader.AdditionalModules).SelectMany(x => x.Templates).OrderBy(x => x.Queue))
86+
{
87+
if (template.Template == null) continue;
88+
var module = moduleByTemplate[template];
89+
AddTemplateNode(module.Id, template);
90+
}
91+
92+
ScheduleNodesPositionReset();
8593
}
8694

8795
public void AddBaseTemplateNode(string moduleId, TemplateAsset template)
@@ -142,6 +150,23 @@ public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
142150
int lineCount = _popup.Text == null ? 5 : _popup.Text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None).Length;
143151
_popup.ShowAsDropDown(position, new Vector2(600, Math.Min(lineCount * 16, 800)));
144152
});
153+
if (node.ModuleId.Equals("Shader") || node.ModuleId.Equals("ShaderPropertiesRoot"))
154+
{
155+
evt.menu.InsertAction(1, "Select relative modular shader asset", action =>
156+
{
157+
Selection.SetActiveObjectWithContext(_shader, _shader);
158+
});
159+
}
160+
else
161+
{
162+
evt.menu.InsertAction(1, "Select relative module asset", action =>
163+
{
164+
var module = _modules.Find(x => x.Id.Equals(node.ModuleId));
165+
if(module != null)
166+
Selection.SetActiveObjectWithContext(module, module);
167+
});
168+
}
169+
145170
}
146171
}
147172

Editor/Editors/Drawers/ShaderPropertyDrawer.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ public override VisualElement CreatePropertyGUI(SerializedProperty property)
5656
{
5757
SetPropType(type, (PropertyType)e.newValue);
5858
SetPropDefaultValue(defaultValue,"");
59-
UpdateValueContainer(defaultValue, type, (PropertyType)e.newValue, type.stringValue, defaultValue.stringValue, valueContainer);
59+
UpdateValueContainer(property, defaultValue, type, (PropertyType)e.newValue, type.stringValue, defaultValue.stringValue, valueContainer);
6060
});
6161

62-
UpdateValueContainer(defaultValue, type, propType, type.stringValue, defaultValue.stringValue, valueContainer);
62+
UpdateValueContainer(property, defaultValue, type, propType, type.stringValue, defaultValue.stringValue, valueContainer);
6363

6464
foldout.Add(template);
6565
_root.Add(foldout);
@@ -99,7 +99,7 @@ private void SetPropType(SerializedProperty propType, PropertyType type)
9999
propType.serializedObject.ApplyModifiedProperties();
100100
}
101101

102-
private void UpdateValueContainer(SerializedProperty defaultValue, SerializedProperty type, PropertyType propType, string propTypeString, string propValue, VisualElement element)
102+
private void UpdateValueContainer(SerializedProperty property, SerializedProperty defaultValue, SerializedProperty type, PropertyType propType, string propTypeString, string propValue, VisualElement element)
103103
{
104104
VisualElement field = null;
105105
switch (propType)
@@ -250,15 +250,25 @@ private void UpdateValueContainer(SerializedProperty defaultValue, SerializedPro
250250
SetPropDefaultValue(defaultValue,$"\"{Enum.GetName(typeof(DefaultTextureValue), texValue)?.ToLower()}\" {{}}");
251251
var txfield = new EnumField { label = "Default value" };
252252
txfield.Init(texValue);
253-
field = txfield;
253+
var textureAsset = new PropertyField(property.FindPropertyRelative("DefaultTextureAsset"), "Texture Override");
254+
textureAsset.Bind(property.serializedObject);
255+
var vl = new VisualElement();
256+
vl.Add(txfield);
257+
vl.Add(textureAsset);
258+
field = vl;
254259
txfield.RegisterValueChangedCallback(e => SetPropDefaultValue(defaultValue,$"\"{Enum.GetName(typeof(DefaultTextureValue), e.newValue)?.ToLower()}\" {{}}"));
255260
break;
256261
case PropertyType.Texture2DArray:
257-
case PropertyType.Cube:
258262
case PropertyType.CubeArray:
259263
case PropertyType.Texture3D:
260264
SetPropDefaultValue(defaultValue,"\"\"{}");
261265
break;
266+
case PropertyType.Cube:
267+
SetPropDefaultValue(defaultValue,"\"\"{}");
268+
var textureCubeAsset = new PropertyField(property.FindPropertyRelative("DefaultTextureAsset"), "Texture Override");
269+
textureCubeAsset.Bind(property.serializedObject);
270+
field = textureCubeAsset;
271+
break;
262272
}
263273

264274
element.Clear();
Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using UnityEditor;
33
using UnityEngine;
4+
using UnityEngine.UIElements;
45

56
namespace VRLabs.ModularShaderSystem.UI
67
{
@@ -10,19 +11,13 @@ namespace VRLabs.ModularShaderSystem.UI
1011
[CustomEditor(typeof(TemplateAsset))]
1112
public class TemplateAssetEditor : Editor
1213
{
13-
private string _templateText;
14-
private GUIStyle _style;
15-
16-
public void OnEnable()
17-
{
18-
_templateText = serializedObject.FindProperty("Template").stringValue;
19-
_style = new GUIStyle(EditorStyles.label);
20-
_style.wordWrap = true;
21-
}
22-
23-
public override void OnInspectorGUI()
14+
public override VisualElement CreateInspectorGUI()
2415
{
25-
GUILayout.Label(_templateText, _style);
16+
CodeViewElement element = new CodeViewElement();
17+
element.Text = serializedObject.FindProperty("Template").stringValue;
18+
element.style.minHeight = 600;
19+
return element;
2620
}
21+
2722
}
2823
}

Editor/Scriptables/Property.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public class Property : IEquatable<Property>
4646
/// Default value of the shader property.
4747
/// </summary>
4848
public string DefaultValue;
49+
50+
/// <summary>
51+
/// Default texture asset assigned to the property if it's a Texture2D or Texture3D;
52+
/// </summary>
53+
public Texture DefaultTextureAsset;
4954

5055
/// <summary>
5156
/// List of attributes for the shader property.

Editor/ShaderGenerator.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,16 @@ public static void GenerateShader(string path, ModularShader shader, Action<Stri
7878
}
7979

8080
AssetDatabase.Refresh();
81+
ApplyDefaultTextures(contexts);
82+
8183
shader.LastGeneratedShaders = new List<Shader>();
8284
foreach (var context in contexts)
8385
shader.LastGeneratedShaders.Add(AssetDatabase.LoadAssetAtPath<Shader>($"{path}/" + context.VariantFileName));
86+
AssetDatabase.Refresh();
8487
}
8588

8689
/// <summary>
87-
/// Generates a shader with all shader variants
90+
/// Generates a shader for selected materials
8891
/// </summary>
8992
/// <param name="path">path for the shader files</param>
9093
/// <param name="shader">Modular shader to use</param>
@@ -95,7 +98,7 @@ public static void GenerateMinimalShader(string path, ModularShader shader, IEnu
9598
}
9699

97100
/// <summary>
98-
/// Generates a shader with all shader variants
101+
/// Generates a shader for selected materials
99102
/// </summary>
100103
/// <param name="path">path for the shader files</param>
101104
/// <param name="shader">Modular shader to use</param>
@@ -222,6 +225,8 @@ public static void GenerateMinimalShaders(this List<ShaderContext> contexts)
222225
AssetDatabase.StopAssetEditing();
223226
AssetDatabase.Refresh();
224227
}
228+
229+
ApplyDefaultTextures(contexts);
225230

226231
EditorUtility.DisplayProgressBar("Generating Optimized Shaders", "applying shaders to materials", contexts.Count - 1 / (contexts.Count + 3));
227232
foreach (var context in contexts)
@@ -367,6 +372,8 @@ public class ShaderContext
367372
private Dictionary<ShaderFunction, ShaderModule> _modulesByFunctions;
368373
public string Guid;
369374

375+
public List<ShaderModule> Modules => _modules;
376+
370377
public void GenerateShader()
371378
{
372379
_modules = FindActiveModules(Shader, ActiveEnablers);
@@ -808,6 +815,17 @@ private static string GetPropertiesBlock(ModularShader shader, List<ShaderModule
808815
return block.ToString();
809816
}
810817

818+
private static void ApplyDefaultTextures(List<ShaderContext> contexts)
819+
{
820+
foreach (var context in contexts)
821+
{
822+
var importedShader = AssetImporter.GetAtPath($"{context.FilePath}/" + context.VariantFileName) as ShaderImporter;
823+
var customTextures = context.Modules.SelectMany(x => x.Properties).Where(x => x.DefaultTextureAsset != null).ToList();
824+
if (importedShader != null) importedShader.SetDefaultTextures(customTextures.Select(x => x.Name).ToArray(), customTextures.Select(x => x.DefaultTextureAsset).ToArray());
825+
AssetDatabase.ImportAsset($"{context.FilePath}/" + context.VariantFileName);
826+
}
827+
}
828+
811829
/// <summary>
812830
/// Find all modules inside a specified shader.
813831
/// </summary>

0 commit comments

Comments
 (0)