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.
168 lines
7.2 KiB
168 lines
7.2 KiB
using NUnit.Framework;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using UnityEditor.Rendering;
|
|
|
|
namespace UnityEngine.Rendering.HighDefinition.Tests
|
|
{
|
|
public class DiffusionProfileTests : MonoBehaviour
|
|
{
|
|
static readonly string k_ProfilePath = $"Assets/Temp/{nameof(DiffusionProfileTests)}/{nameof(DiffusionProfile_AutoRegister)}/DiffusionProfile.asset";
|
|
|
|
private DiffusionProfileSettings m_Profile;
|
|
private bool m_AutoRegister = false;
|
|
private DiffusionProfileSettings[] m_RollBackProfiles;
|
|
private DiffusionProfileList m_List;
|
|
|
|
static DiffusionProfileSettings CreateValidDiffusionProfile()
|
|
{
|
|
// Some profile guids cannot be saved when float serializes to nan, recreate an asset if that's the case to avoid instabitities
|
|
while (true)
|
|
{
|
|
var profile = ScriptableObject.CreateInstance<DiffusionProfileSettings>();
|
|
var path = AssetDatabase.GenerateUniqueAssetPath(k_ProfilePath);
|
|
AssetDatabase.CreateAsset(profile, path);
|
|
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(path);
|
|
if (guid == HDUtils.ConvertVector4ToGUID(HDUtils.ConvertGUIDToVector4(guid)))
|
|
return profile;
|
|
}
|
|
}
|
|
|
|
[OneTimeSetUp]
|
|
public void OneTimeSetup()
|
|
{
|
|
if (GraphicsSettings.currentRenderPipeline is not HDRenderPipelineAsset)
|
|
{
|
|
Assert.Ignore("This test is only available when HDRP is the current pipeline.");
|
|
return;
|
|
}
|
|
|
|
CoreUtils.EnsureFolderTreeInAssetFilePath(k_ProfilePath);
|
|
m_Profile = CreateValidDiffusionProfile();
|
|
|
|
Assert.IsTrue(GraphicsSettings.TryGetRenderPipelineSettings<DiffusionProfileDefaultSettings>(out var diffusionProfileDefaultSettings));
|
|
Assert.IsInstanceOf<DiffusionProfileDefaultSettings>(diffusionProfileDefaultSettings);
|
|
|
|
Assert.IsTrue(GraphicsSettings.TryGetRenderPipelineSettings<HDRPDefaultVolumeProfileSettings>(out var defaultVolumeProfileSettings));
|
|
Assert.IsInstanceOf<HDRPDefaultVolumeProfileSettings>(defaultVolumeProfileSettings);
|
|
|
|
m_AutoRegister = diffusionProfileDefaultSettings.autoRegister;
|
|
m_List = VolumeUtils.GetOrCreateDiffusionProfileList(defaultVolumeProfileSettings.volumeProfile);
|
|
m_RollBackProfiles = m_List.ToArray();
|
|
}
|
|
|
|
[OneTimeTearDown]
|
|
public void OneTimeTearDown()
|
|
{
|
|
if (m_Profile != null) // If it is null, no setup has been done
|
|
{
|
|
GraphicsSettings.GetRenderPipelineSettings<DiffusionProfileDefaultSettings>().autoRegister = m_AutoRegister;
|
|
m_List.ReplaceWithArray(m_RollBackProfiles);
|
|
|
|
AssetDatabase.DeleteAsset($"Assets/Temp/{nameof(DiffusionProfileTests)}");
|
|
AssetDatabase.SaveAssets();
|
|
}
|
|
}
|
|
|
|
private static void CreateMaterialAndSetProfile(string materialPath, DiffusionProfileSettings profile)
|
|
{
|
|
materialPath = AssetDatabase.GenerateUniqueAssetPath(materialPath);
|
|
var material = new Material(Shader.Find("HDRP/Lit"));
|
|
|
|
AssetDatabase.CreateAsset(material, materialPath);
|
|
HDMaterial.SetDiffusionProfile(material, profile);
|
|
}
|
|
|
|
[Test]
|
|
public void DiffusionProfile_AutoRegister()
|
|
{
|
|
m_List.ReplaceWithArray(Array.Empty<DiffusionProfileSettings>());
|
|
GraphicsSettings.GetRenderPipelineSettings<DiffusionProfileDefaultSettings>().autoRegister = true;
|
|
|
|
var profile1 = CreateValidDiffusionProfile();
|
|
|
|
var materialPath = $"Assets/Temp/{nameof(DiffusionProfileTests)}/{nameof(DiffusionProfile_AutoRegister)}/Material.mat";
|
|
|
|
CreateMaterialAndSetProfile(materialPath, m_Profile);
|
|
CreateMaterialAndSetProfile(materialPath, profile1);
|
|
|
|
AssetDatabase.SaveAssets(); // Trigger OnPostProcessAllAssets where the registration is being performed
|
|
|
|
var profiles = m_List.ToArray();
|
|
bool bothAreRegistered = VolumeUtils.IsDiffusionProfileRegistered(m_Profile, profiles) &&
|
|
VolumeUtils.IsDiffusionProfileRegistered(profile1, profiles);
|
|
|
|
Assert.IsTrue(bothAreRegistered);
|
|
}
|
|
|
|
[Test]
|
|
public void IsDiffusionProfileRegistered()
|
|
{
|
|
Assert.IsTrue(VolumeUtils.IsDiffusionProfileRegistered(m_Profile, new DiffusionProfileSettings[]{ m_Profile }));
|
|
Assert.IsFalse(VolumeUtils.IsDiffusionProfileRegistered(m_Profile, Array.Empty<DiffusionProfileSettings>()));
|
|
}
|
|
|
|
[Test]
|
|
public void TryAddSingleDiffusionProfile()
|
|
{
|
|
var volumeProfile = ScriptableObject.CreateInstance<VolumeProfile>();
|
|
|
|
Assert.IsTrue(VolumeUtils.TryAddSingleDiffusionProfile(volumeProfile, m_Profile));
|
|
Assert.IsFalse(VolumeUtils.TryAddSingleDiffusionProfile(volumeProfile, m_Profile));
|
|
|
|
ScriptableObject.DestroyImmediate(volumeProfile);
|
|
}
|
|
|
|
[Test]
|
|
public void NullDiffusionProfileSettingsAreRemovedWhenAddingANewDiffusionProfileSettings()
|
|
{
|
|
var volumeProfile = ScriptableObject.CreateInstance<VolumeProfile>();
|
|
var list = VolumeUtils.GetOrCreateDiffusionProfileList(volumeProfile);
|
|
list.ReplaceWithArray(new DiffusionProfileSettings[] {null, null});
|
|
|
|
Assert.IsTrue(VolumeUtils.TryAddSingleDiffusionProfile(volumeProfile, m_Profile));
|
|
Assert.AreEqual(1, list.ToArray().Length);
|
|
|
|
ScriptableObject.DestroyImmediate(volumeProfile);
|
|
}
|
|
|
|
[Test]
|
|
public void RegisterReferencedDiffusionProfiles()
|
|
{
|
|
GraphicsSettings.GetRenderPipelineSettings<DiffusionProfileDefaultSettings>().autoRegister = true;
|
|
m_List.ReplaceWithArray(Array.Empty<DiffusionProfileSettings>());
|
|
|
|
var materialPath = $"Assets/Temp/{nameof(DiffusionProfileTests)}/{nameof(DiffusionProfile_AutoRegister)}/Material.mat";
|
|
|
|
CreateMaterialAndSetProfile(materialPath, m_Profile);
|
|
|
|
var material = AssetDatabase.LoadAssetAtPath<Material>(materialPath);
|
|
|
|
using (var registerer = new VolumeUtils.DiffusionProfileRegisterScope())
|
|
{
|
|
for (int i = 0; i < 4; ++i)
|
|
registerer.RegisterReferencedDiffusionProfilesFromMaterial(material);
|
|
}
|
|
|
|
var profiles = m_List.ToArray();
|
|
Assert.IsTrue(VolumeUtils.IsDiffusionProfileRegistered(m_Profile, profiles));
|
|
Assert.AreEqual(1, m_List.Length);
|
|
}
|
|
|
|
[Test]
|
|
public void ReplaceWithArrayExceedsLimitThrowsException()
|
|
{
|
|
using (ListPool<DiffusionProfileSettings>.Get(out var tmp))
|
|
{
|
|
for (int i = 0; i < DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT; ++i)
|
|
tmp.Add(ScriptableObject.CreateInstance<DiffusionProfileSettings>());
|
|
|
|
Assert.That(() => m_List.ReplaceWithArray(tmp.ToArray()), Throws.Exception);
|
|
|
|
foreach (var p in tmp)
|
|
ScriptableObject.DestroyImmediate(p);
|
|
}
|
|
}
|
|
}
|
|
}
|