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.
141 lines
6.1 KiB
141 lines
6.1 KiB
using System;
|
|
using UnityEngine;
|
|
using UnityEditor.ProjectWindowCallback;
|
|
using System.IO;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
namespace UnityEditor.Rendering
|
|
{
|
|
/// <summary>
|
|
/// A utility class to create Volume Profiles and components.
|
|
/// </summary>
|
|
public static class VolumeProfileFactory
|
|
{
|
|
[MenuItem("Assets/Create/Rendering/Volume Profile", priority = 201)]
|
|
static void CreateVolumeProfile()
|
|
{
|
|
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(
|
|
0,
|
|
ScriptableObject.CreateInstance<CreateVolumeProfileAction>(),
|
|
"New Volume Profile.asset",
|
|
null,
|
|
null
|
|
);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Asks for editor user input for the asset name, creates a <see cref="VolumeProfile"/> Asset, saves it at the
|
|
/// given path and invokes the callback.
|
|
/// </summary>
|
|
/// <param name="fullPath">The path to save the asset to.</param>
|
|
/// <param name="callback">Callback to invoke after the asset has been created.</param>
|
|
public static void CreateVolumeProfileWithCallback(string fullPath, Action<VolumeProfile> callback)
|
|
{
|
|
var assetCreator = ScriptableObject.CreateInstance<CreateVolumeProfileWithCallbackAction>();
|
|
assetCreator.callback = callback;
|
|
CoreUtils.EnsureFolderTreeInAssetFilePath(fullPath);
|
|
|
|
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(
|
|
assetCreator.GetInstanceID(),
|
|
assetCreator,
|
|
fullPath,
|
|
null,
|
|
null);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="VolumeProfile"/> Asset and saves it at the given path.
|
|
/// </summary>
|
|
/// <param name="path">The path to save the Asset to, relative to the Project folder.</param>
|
|
/// <returns>The newly created <see cref="VolumeProfile"/>.</returns>
|
|
public static VolumeProfile CreateVolumeProfileAtPath(string path) => CreateVolumeProfileAtPath(path, null);
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="VolumeProfile"/> Asset and saves it at the given path.
|
|
/// </summary>
|
|
/// <param name="path">The path to save the Asset to, relative to the Project folder.</param>
|
|
/// <param name="dataSource">Another `VolumeProfile` that Unity uses as a data source.</param>
|
|
/// <returns>The newly created <see cref="VolumeProfile"/>.</returns>
|
|
public static VolumeProfile CreateVolumeProfileAtPath(string path, VolumeProfile dataSource)
|
|
{
|
|
var profile = ScriptableObject.CreateInstance<VolumeProfile>();
|
|
profile.name = Path.GetFileName(path);
|
|
AssetDatabase.CreateAsset(profile, path);
|
|
|
|
if (dataSource != null)
|
|
{
|
|
foreach (var sourceComponent in dataSource.components)
|
|
{
|
|
var profileComponent = profile.Add(sourceComponent.GetType());
|
|
for (int i = 0; i < sourceComponent.parameters.Count; i++)
|
|
profileComponent.parameters[i].overrideState = sourceComponent.parameters[i].overrideState;
|
|
VolumeProfileUtils.CopyValuesToComponent(sourceComponent, profileComponent, true);
|
|
AssetDatabase.AddObjectToAsset(profileComponent, profile);
|
|
}
|
|
}
|
|
|
|
AssetDatabase.SaveAssets();
|
|
AssetDatabase.Refresh();
|
|
return profile;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="VolumeProfile"/> Asset and saves it in a folder next to the Scene.
|
|
/// </summary>
|
|
/// <param name="scene">The Scene to save the Profile next to.</param>
|
|
/// <param name="targetName">A name to use for the Asset filename.</param>
|
|
/// <returns>The newly created <see cref="VolumeProfile"/>.</returns>
|
|
public static VolumeProfile CreateVolumeProfile(Scene scene, string targetName)
|
|
{
|
|
return CoreEditorUtils.CreateAssetAt<VolumeProfile>(scene, targetName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="VolumeComponent"/> in an existing <see cref="VolumeProfile"/>.
|
|
/// </summary>
|
|
/// <typeparam name="T">A type of <see cref="VolumeComponent"/>.</typeparam>
|
|
/// <param name="profile">The profile to store the new component in.</param>
|
|
/// <param name="overrides">specifies whether to override the parameters in the component or not.</param>
|
|
/// <param name="saveAsset">Specifies whether to save the Profile Asset or not. This is useful when you need to
|
|
/// create several components in a row and only want to save the Profile Asset after adding the last one,
|
|
/// because saving Assets to disk can be slow.</param>
|
|
/// <returns>The newly created component of type <typeparamref name="T"/>.</returns>
|
|
public static T CreateVolumeComponent<T>(VolumeProfile profile, bool overrides = false, bool saveAsset = true)
|
|
where T : VolumeComponent
|
|
{
|
|
var comp = profile.Add<T>(overrides);
|
|
comp.hideFlags = HideFlags.HideInInspector | HideFlags.HideInHierarchy;
|
|
AssetDatabase.AddObjectToAsset(comp, profile);
|
|
|
|
if (saveAsset)
|
|
{
|
|
AssetDatabase.SaveAssets();
|
|
AssetDatabase.Refresh();
|
|
}
|
|
|
|
return comp;
|
|
}
|
|
}
|
|
|
|
class CreateVolumeProfileAction : EndNameEditAction
|
|
{
|
|
public override void Action(int instanceId, string pathName, string resourceFile)
|
|
{
|
|
var profile = VolumeProfileFactory.CreateVolumeProfileAtPath(pathName);
|
|
ProjectWindowUtil.ShowCreatedAsset(profile);
|
|
}
|
|
}
|
|
|
|
class CreateVolumeProfileWithCallbackAction : EndNameEditAction
|
|
{
|
|
public override void Action(int instanceId, string pathName, string resourceFile)
|
|
{
|
|
var profile = VolumeProfileFactory.CreateVolumeProfileAtPath(pathName);
|
|
ProjectWindowUtil.ShowCreatedAsset(profile);
|
|
callback?.Invoke(profile);
|
|
}
|
|
|
|
internal Action<VolumeProfile> callback { get; set; }
|
|
}
|
|
}
|