You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

119 lines
5.3 KiB

using System;
using System.IO;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.Rendering;
namespace UnityEditor.ShaderGraph
{
static class CreateShaderGraph
{
[MenuItem("Assets/Create/Shader Graph/Blank Shader Graph", priority = CoreUtils.Sections.section1 + CoreUtils.Priorities.assetsCreateShaderMenuPriority)]
public static void CreateBlankShaderGraph()
{
CreateFromTemplate(null, string.Empty);
}
[MenuItem("Assets/Create/Shader Graph/From Template...")]
public static void CreateFromTemplate()
{
CreateFromTemplate(null);
}
/// <summary>
/// Prompts the user to create a new Shader Graph from a Template.
/// /// The Template Browser opens if <paramref name="templateSourcePath"/> is null.
/// </summary>
/// <param name="callback">Callback to execute with the created shader graph asset.</param>
/// <param name="templateSourcePath">Shader Graph template file. Use string.Empty for Blank Shader Graph.</param>
/// <param name="filename">New Shader Graph filename.</param>
internal static void CreateFromTemplate(Action<string> callback = null, string templateSourcePath = null, string filename = null)
{
if (!string.IsNullOrEmpty(templateSourcePath))
{
if (!AssetDatabase.AssetPathExists(templateSourcePath))
{
Debug.LogError($"Shader Graph Template File missing at path: {templateSourcePath}.");
return;
}
if (Path.GetExtension(templateSourcePath) != $".{ShaderGraphImporter.Extension}")
{
Debug.LogError($"Shader Graph Template File {templateSourcePath} is not a Shader Graph asset.");
return;
}
}
bool projectWindowIsVisible = EditorWindow.HasOpenInstances<ProjectBrowser>();
NewGraphFromTemplateAction action = ScriptableObject.CreateInstance<NewGraphFromTemplateAction>();
if (callback != null)
action.Callback = callback;
if (!string.IsNullOrEmpty(filename))
action.Filename = filename;
ShaderGraphTemplateHelper shaderGraphTemplateHelper = new ShaderGraphTemplateHelper();
if (templateSourcePath == null)
{
GraphViewTemplateWindow.ShowCreateFromTemplate(shaderGraphTemplateHelper, action.CreateAndRenameGraphFromTemplate, showSaveDialog: !projectWindowIsVisible);
}
else
{
if (shaderGraphTemplateHelper.TryGetTemplate(templateSourcePath, out GraphViewTemplateDescriptor graphViewTemplate))
shaderGraphTemplateHelper.RaiseTemplateUsed(graphViewTemplate);
if (projectWindowIsVisible)
{
action.CreateAndRenameGraphFromTemplate(templateSourcePath, null);
}
else
{
string graphDestinationPath = shaderGraphTemplateHelper.saveFileDialogHelper.OpenSaveFileDialog();
if (!string.IsNullOrEmpty(graphDestinationPath))
action.CreateAndRenameGraphFromTemplate(templateSourcePath, graphDestinationPath);
}
}
}
/// <summary>
/// Prompts the user to create a new Shader Graph from a Template and associated Material.
/// The Template Browser opens if <paramref name="templateSourcePath"/> is null.
/// </summary>
/// <param name="callback">Callback to execute with the created material.</param>
/// <param name="templateSourcePath">Shader Graph template file. Use string.Empty for Blank Shader Graph.</param>
/// /// <param name="filename">New Shader Graph filename.</param>
internal static void CreateGraphAndMaterialFromTemplate(Action<Material> callback = null, string templateSourcePath = null, string filename = null)
{
CreateFromTemplate((template) =>
{
if (!string.IsNullOrEmpty(template))
{
Material material;
if (ShaderGraphPreferences.GetOrPromptGraphTemplateWorkflow() == ShaderGraphPreferences.GraphTemplateWorkflow.MaterialVariant)
{
var srcMaterial = AssetDatabase.LoadAssetAtPath<Material>(template);
material = new Material(srcMaterial);
material.parent = srcMaterial;
}
else
{
var shader = AssetDatabase.LoadAssetAtPath<Shader>(template);
material = new Material(shader);
}
var materialPath = Path.Combine(Path.GetDirectoryName(template), Path.GetFileNameWithoutExtension(template) + ".mat");
AssetDatabase.CreateAsset(material, materialPath);
AssetDatabase.SaveAssetIfDirty(material);
AssetDatabase.Refresh(ImportAssetOptions.Default);
callback?.Invoke(material);
}
},
templateSourcePath,
filename);
}
}
}