Skip to content

Commit 0c8a64b

Browse files
tyanalunasGitHub Enterprise
authored andcommitted
Added feature: User can specify a directory that holds their VFX template assets (#34)
Added feature: User can specify a directory that holds their VFX template assets Allow VFX artists to specify an asset directory that holds their own VFX templates aka Systems. This expands on the Systems functionality seen in the Node menu. ## How to use The user directory is set in the menu: Edit -> Preferences -> Visual Effects -> User Systems ![image (1)](https://github.cds.internal.unity3d.com/storage/user/2318/files/d738c680-a1bb-11ea-94d4-68711743821d) Open a VFX asset in the VFX Graph. Press spacebar to open the Node menu and note the new User Systems option. ![image (2)](https://github.cds.internal.unity3d.com/storage/user/2318/files/20891600-a1bc-11ea-8ab4-831989aef9df) This option points to the User Systems directory specified by the user. This option will only show up if the user has set the directory to a valid location. It supports nested folders. ![image (3)](https://github.cds.internal.unity3d.com/storage/user/2318/files/4d3d2d80-a1bc-11ea-954f-4c29da91253f) Compare this to the folder structure in Assets. Note that empty folders and folders not containing VFX assets are not displayed: ![image (4)](https://github.cds.internal.unity3d.com/storage/user/2318/files/7cec3580-a1bc-11ea-86e1-fa3154e108a2)
1 parent 9709d6d commit 0c8a64b

File tree

4 files changed

+54
-8
lines changed

4 files changed

+54
-8
lines changed

com.unity.visualeffectgraph/Editor/GraphView/VFXViewPreference.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,25 @@ public override void OnGUI(string searchContext)
110110
vfxAsset.GetResource().GetOrCreateGraph().SetCompilationMode(m_ForceEditionCompilation ? VFXCompilationMode.Edition : VFXCompilationMode.Runtime);
111111
}
112112

113+
var userTemplateDirectory = EditorGUILayout.DelayedTextField(new GUIContent("User Systems", "Directory for user-generated VFX templates (e.g. Assets/VFX/Templates)"), VFXResources.defaultResources.userTemplateDirectory);
114+
113115
if (GUI.changed)
114116
{
115117
EditorPrefs.SetBool(experimentalOperatorKey, m_DisplayExperimentalOperator);
116118
EditorPrefs.SetBool(extraDebugInfoKey, m_DisplayExtraDebugInfo);
117119
EditorPrefs.SetBool(forceEditionCompilationKey, m_ForceEditionCompilation);
118120
EditorPrefs.SetBool(advancedLogsKey, m_AdvancedLogs);
119121
EditorPrefs.SetBool(allowShaderExternalizationKey, m_AllowShaderExternalization);
122+
userTemplateDirectory = userTemplateDirectory.Replace('\\', '/');
123+
userTemplateDirectory = userTemplateDirectory.TrimEnd(new char[] { '/' });
124+
userTemplateDirectory = userTemplateDirectory.TrimStart(new char[] { '/' });
125+
VFXResources.defaultResources.userTemplateDirectory = userTemplateDirectory;
120126
}
121127
}
122128

129+
if ((VFXResources.defaultResources.userTemplateDirectory.Length > 0) && (!System.IO.Directory.Exists(VFXResources.defaultResources.userTemplateDirectory)))
130+
EditorGUILayout.HelpBox("The specified User Systems directory does not exist in the project.", MessageType.Warning);
131+
123132
base.OnGUI(searchContext);
124133
}
125134
}

com.unity.visualeffectgraph/Editor/GraphView/Views/VFXNodeProvider.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,10 @@ protected override IEnumerable<Descriptor> GetDescriptors()
223223
}
224224
if (m_AcceptedTypes == null)
225225
{
226-
var systemFiles = System.IO.Directory.GetFiles(VisualEffectAssetEditorUtility.templatePath).Where(t => Path.GetExtension(t) == VisualEffectResource.Extension).Select(t => t.Replace("\\", "/"));
226+
AddTemplatesFromDirectory(VisualEffectAssetEditorUtility.templatePath, "System", ref descs);
227227

228-
var systemDesc = systemFiles.Select(t => new Descriptor() { modelDescriptor = t.Replace(VisualEffectGraphPackageInfo.fileSystemPackagePath, VisualEffectGraphPackageInfo.assetPackagePath), category = "System", name = System.IO.Path.GetFileNameWithoutExtension(t) });
229-
230-
descs = descs.Concat(systemDesc);
228+
if ((VFXResources.defaultResources.userTemplateDirectory.Length > 0) && System.IO.Directory.Exists(VFXResources.defaultResources.userTemplateDirectory))
229+
AddTemplatesFromDirectory(VFXResources.defaultResources.userTemplateDirectory, "User Systems", ref descs);
231230
}
232231
var groupNodeDesc = new Descriptor()
233232
{
@@ -243,5 +242,21 @@ protected override IEnumerable<Descriptor> GetDescriptors()
243242
else
244243
return descs.Where(t => m_Filter(t));
245244
}
245+
246+
protected void AddTemplatesFromDirectory(string directory, string menuCategory, ref IEnumerable<Descriptor> descriptors)
247+
{
248+
var subDirectories = System.IO.Directory.GetDirectories(directory);
249+
250+
Array.Sort(subDirectories, (x, y) => String.Compare(x, y, true));
251+
252+
foreach (var subDirectory in subDirectories)
253+
AddTemplatesFromDirectory(subDirectory, subDirectory.Replace(directory,menuCategory), ref descriptors);
254+
255+
var discoveredTemplates = System.IO.Directory.GetFiles(directory).Where(t => Path.GetExtension(t) == VisualEffectResource.Extension).Select(t => t.Replace("\\", "/"));
256+
257+
var templateDescriptors = discoveredTemplates.Select(t => new Descriptor() { modelDescriptor = t, category = menuCategory.Replace("\\", "/"), name = System.IO.Path.GetFileNameWithoutExtension(t) });
258+
259+
descriptors = descriptors.Concat(templateDescriptors);
260+
}
246261
}
247262
}

com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,9 @@ public VFXNodeController AddNode(VFXNodeProvider.Descriptor d, Vector2 mPos)
225225
{
226226
string path = d.modelDescriptor as string;
227227

228-
if (!path.StartsWith(VisualEffectAssetEditorUtility.templatePath))
228+
if(path.StartsWith(VisualEffectAssetEditorUtility.templatePath) || ((VFXResources.defaultResources.userTemplateDirectory.Length > 0) && path.StartsWith(VFXResources.defaultResources.userTemplateDirectory)) )
229+
CreateTemplateSystem(path, mPos, groupNode);
230+
else
229231
{
230232
if (Path.GetExtension(path) == VisualEffectSubgraphOperator.Extension)
231233
{
@@ -243,8 +245,6 @@ public VFXNodeController AddNode(VFXNodeProvider.Descriptor d, Vector2 mPos)
243245
}
244246
}
245247
}
246-
else
247-
CreateTemplateSystem(path, mPos, groupNode);
248248
}
249249
else if (d.modelDescriptor is GroupNodeAdder)
250250
{
@@ -1154,7 +1154,6 @@ void OnCompile()
11541154
}
11551155
}
11561156

1157-
11581157
void OnSave()
11591158
{
11601159
OnCompile();

com.unity.visualeffectgraph/Editor/Utils/VFXResources.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,26 @@ public Mesh mesh
149149
return defaultMesh;
150150
}
151151
}
152+
153+
public string userTemplateDirectory
154+
{
155+
get
156+
{
157+
LoadUserResourcesIfNeeded();
158+
if (s_Instance != null)
159+
return s_Instance.userTemplateDirectory;
160+
161+
return "";
162+
}
163+
164+
set
165+
{
166+
if (s_Instance == null)
167+
s_Instance = FindObjectOfType<VFXResources>();
168+
if (s_Instance != null)
169+
s_Instance.userTemplateDirectory = value;
170+
}
171+
}
152172
}
153173

154174
private static string defaultPath { get { return VisualEffectGraphPackageInfo.assetPackagePath + "/"; } }
@@ -283,6 +303,9 @@ static public Mesh defaultMesh {
283303
[SerializeField]
284304
Mesh mesh = null;
285305

306+
[SerializeField]
307+
string userTemplateDirectory = "";
308+
286309
static AnimationCurve defaultAnimationCurve;
287310
static Gradient defaultGradient;
288311
static Gradient defaultGradientMapRamp;

0 commit comments

Comments
 (0)