blob: 8ead5f3171e719aaa0b3e34c7ec1eec0ede27cdb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Poiyomi.ModularShaderSystem;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
using Button = UnityEngine.UIElements.Button;
using Toggle = UnityEngine.UIElements.Toggle;
namespace PoiyomiPatreon.Scripts.poi_tools.Editor
{
public class ModularShadersGeneratorElement : VisualElement
{
private bool _isSelected;
public bool IsSelected
{
get => _isSelected;
set
{
if (_isErrored) return;
_isSelected = value;
_toggle.SetValueWithoutNotify(_isSelected);
}
}
public ModularShader Shader { get; set; }
private readonly Toggle _toggle;
private readonly bool _isErrored;
public ModularShadersGeneratorElement(ModularShader shader)
{
Shader = shader;
style.flexDirection = FlexDirection.Row;
_toggle = new Toggle();
_toggle.RegisterValueChangedCallback(evt => IsSelected = evt.newValue);
Add(_toggle);
Add(new Label(Shader.Name));
var issues = ShaderGenerator.CheckShaderIssues(shader);
if (issues.Count > 0)
{
_isErrored = true;
_toggle.SetEnabled(false);
VisualElement element = new VisualElement();
element.AddToClassList("error");
element.tooltip = "Modular shader has the following errors: \n -" + string.Join("\n -", issues);
Add(element);
}
}
}
public class ModularShadersGeneratorWindow : EditorWindow
{
[MenuItem("Poi/Tools/Modular Shaders Generator")]
private static void ShowWindow()
{
var window = GetWindow<ModularShadersGeneratorWindow>();
window.titleContent = new GUIContent("Modular Shaders Generator");
window.Show();
}
private VisualElement _root;
private List<ModularShadersGeneratorElement> _elements;
private string _folderPath = "Assets/_poiyomiShaders/ModularShader";
private void CreateGUI()
{
_root = rootVisualElement;
try
{
Reload();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
private void Reload()
{
_root.Clear();
var styleSheet = Resources.Load<StyleSheet>("Poi/ModularShadersGeneratorStyle");
_root.styleSheets.Add(styleSheet);
var view = new ScrollView(ScrollViewMode.Vertical);
var selectButtons = new VisualElement();
selectButtons.AddToClassList("buttons-area");
var selectAll = new Button();
selectAll.text = "Select all";
selectAll.style.flexGrow = 1;
selectAll.clicked += () =>
{
foreach (var element in _elements)
element.IsSelected = true;
};
selectButtons.Add(selectAll);
var deselectAll = new Button();
deselectAll.text = "Deselect all";
deselectAll.style.flexGrow = 1;
deselectAll.clicked += () =>
{
foreach (var element in _elements)
element.IsSelected = false;
};
selectButtons.Add(deselectAll);
var toggleSelections = new Button();
toggleSelections.text = "Toggle selections";
toggleSelections.style.flexGrow = 1;
toggleSelections.clicked += () =>
{
foreach (var element in _elements)
element.IsSelected = !element.IsSelected;
};
selectButtons.Add(toggleSelections);
var reloadButton = new Button();
reloadButton.text = "Refresh";
reloadButton.style.flexGrow = 1;
reloadButton.clicked += () =>
{
Reload();
};
selectButtons.Add(reloadButton);
view.Add(selectButtons);
// Load all modular shaders
_elements = new List<ModularShadersGeneratorElement>();
foreach (var modularShader in FindAssetsByType<ModularShader>())
{
var element = new ModularShadersGeneratorElement(modularShader);
_elements.Add(element);
view.Add(element);
}
var fileSelector = new VisualElement();
fileSelector.AddToClassList("folder-selector");
var folder = new TextField();
folder.value = _folderPath;
folder.RegisterValueChangedCallback(evt => _folderPath = evt.newValue);
folder.style.flexShrink = 1;
folder.style.flexGrow = 1;
folder.SetEnabled(false);
var label = new Label("Destination ");
label.style.alignSelf = Align.Center;
fileSelector.Add(label);
fileSelector.Add(folder);
var fileButton = new Button();
fileButton.text = "Open";
fileButton.clicked += () =>
{
string path = EditorUtility.OpenFolderPanel("Select folder to use", "Assets", "");
if (path.Length == 0)
return;
if (!Directory.Exists(path))
{
EditorUtility.DisplayDialog("Error", "The folder does not exist", "Ok");
return;
}
folder.value = path;
};
fileSelector.Add(fileButton);
view.Add(fileSelector);
var button = new Button();
button.text = "Generate Shaders";
button.clicked += GenerateShaders;
view.Add(button);
_root.Add(view);
}
private void GenerateShaders()
{
if (!Directory.Exists(_folderPath))
{
EditorUtility.DisplayDialog("Error", "The destination folder does not exist", "Ok");
return;
}
foreach (ModularShadersGeneratorElement element in _elements.Where(x => x.IsSelected))
ShaderGenerator.GenerateShader(_folderPath, element.Shader);
}
private static T[] FindAssetsByType<T>() where T : UnityEngine.Object
{
List<T> assets = new List<T>();
AssetDatabase.Refresh();
string[] guids = AssetDatabase.FindAssets($"t:{typeof(T).ToString().Replace("UnityEngine.", "")}");
for (int i = 0; i < guids.Length; i++)
{
string assetPath = AssetDatabase.GUIDToAssetPath(guids[i]);
T asset = AssetDatabase.LoadAssetAtPath<T>(assetPath);
if (asset != null)
assets.Add(asset);
}
return assets.ToArray();
}
}
}
|