Files
2026-11-01 23:39:55 +02:00

180 lines
10 KiB
C#

using System.Collections.Generic;
using NUnit.Framework;
using UnityEditor.Rendering.Converter;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace UnityEditor.Rendering.Universal.Tools
{
[TestFixture]
[Category("Graphics Tools")]
class RenderSettingsConverterTests
{
[OneTimeSetUp]
public void OneTimeSetup()
{
if (QualitySettings.names.Length == 0)
Assert.Ignore("Project without quality settings. Skipping test");
}
RenderPipelineAsset m_RenderPipelineAsset;
int m_QualityLevel = -1;
string m_DefaultFolder = string.Empty;
string m_QualityLevelName = string.Empty;
[SetUp]
public void Setup()
{
m_RenderPipelineAsset = QualitySettings.renderPipeline;
QualitySettings.renderPipeline = null;
m_QualityLevel = QualitySettings.GetQualityLevel();
m_QualityLevelName = QualitySettings.names[m_QualityLevel];
m_DefaultFolder = UniversalProjectSettings.projectSettingsFolderPath;
UniversalProjectSettings.projectSettingsFolderPath = nameof(RenderSettingsConverterTests);
}
[TearDown]
public void TearDown()
{
var path = $"Assets/{UniversalProjectSettings.projectSettingsFolderPath}";
if (AssetDatabase.AssetPathExists(path))
{
AssetDatabase.DeleteAsset(path);
AssetDatabase.Refresh();
}
QualitySettings.renderPipeline = m_RenderPipelineAsset;
UniversalProjectSettings.projectSettingsFolderPath = m_DefaultFolder;
}
[Test]
public void WhenRunningBuiltInToURP3DRenderSettingsConverter_TheCurrent_QualityLevel_IsNowURP_AndHasEverythingProperlyAssigned()
{
var renderSettingsConverter = new BuiltInToURP3DRenderSettingsConverter();
var expectedEntry = $"[{m_QualityLevel}] {m_QualityLevelName}";
void OnScanFinished(List<IRenderPipelineConverterItem> scanItems)
{
Assert.IsTrue(scanItems.Count > 0, "Initialization did not found the item to convert");
// Find the Quality folder (RenderSettingsConverter returns Graphics and Quality folders)
IFolderRenderPipelineConverterItem qualityFolder = null;
foreach (var item in scanItems)
{
if (item is IFolderRenderPipelineConverterItem folder && folder.name == "Quality")
{
qualityFolder = folder;
break;
}
}
Assert.IsNotNull(qualityFolder, "Quality folder not found in scan results");
Assert.IsTrue(qualityFolder.children.Count > m_QualityLevel, $"Quality level {m_QualityLevel} out of range for {qualityFolder.children.Count} quality levels");
Assert.AreEqual(m_QualityLevel, QualitySettings.GetQualityLevel(), "Initialization did not rollback quality level");
var status = renderSettingsConverter.Convert(qualityFolder.children[m_QualityLevel], out string msg);
Assert.IsTrue(status != Status.Error, msg);
Assert.AreEqual(m_QualityLevel, QualitySettings.GetQualityLevel(), "Run did not rollback quality level");
// ---------- ASSET REFERENCE CHECK ----------
var urpAsset = QualitySettings.renderPipeline as UniversalRenderPipelineAsset;
Assert.IsNotNull(urpAsset, "URP asset is not assigned");
Assert.AreEqual($"Assets/{UniversalProjectSettings.projectSettingsFolderPath}/{m_QualityLevelName}.asset", AssetDatabase.GetAssetPath(urpAsset));
// ---------- RENDERER REFERENCE CHECK ----------
Assert.IsNotNull(urpAsset.m_RendererDataList);
Assert.AreEqual(1, urpAsset.m_RendererDataList.Length);
Assert.AreEqual($"Assets/{UniversalProjectSettings.projectSettingsFolderPath}/Default_Forward_Renderer.asset", AssetDatabase.GetAssetPath(urpAsset.m_RendererDataList[0]));
// ---------- SETTINGS FORWARDING CHECK ----------
var targetGrp = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
var tier = EditorGraphicsSettings.GetTierSettings(targetGrp, GraphicsTier.Tier3);
Assert.AreEqual(QualitySettings.softParticles, urpAsset.supportsCameraDepthTexture, "supportsCameraDepthTexture mismatch");
Assert.AreEqual(tier.hdr, urpAsset.supportsHDR, "supportsHDR mismatch");
Assert.AreEqual(QualitySettings.antiAliasing == 0 ? 1 : QualitySettings.antiAliasing, urpAsset.msaaSampleCount, "msaaSampleCount mismatch");
var expectedMainLightMode = QualitySettings.pixelLightCount == 0 ? LightRenderingMode.Disabled : LightRenderingMode.PerPixel;
Assert.AreEqual(expectedMainLightMode, urpAsset.mainLightRenderingMode, "mainLightRenderingMode mismatch");
Assert.AreEqual(QualitySettings.shadows != UnityEngine.ShadowQuality.Disable, urpAsset.supportsMainLightShadows, "supportsMainLightShadows mismatch");
Assert.AreEqual(BuiltInToURP3DRenderSettingsConverter.GetEquivalentMainlightShadowResolution((int)QualitySettings.shadowResolution), urpAsset.mainLightShadowmapResolution, "mainLightShadowmapResolution mismatch");
var expectedAdditionalLightsMode = QualitySettings.pixelLightCount == 0 ? LightRenderingMode.PerVertex : LightRenderingMode.PerPixel;
Assert.AreEqual(expectedAdditionalLightsMode, urpAsset.additionalLightsRenderingMode, "additionalLightsRenderingMode mismatch");
Assert.AreEqual(QualitySettings.pixelLightCount != 0 ? Mathf.Max(0, QualitySettings.pixelLightCount) : 4, urpAsset.maxAdditionalLightsCount, "maxAdditionalLightsCount mismatch");
Assert.AreEqual(QualitySettings.shadows != UnityEngine.ShadowQuality.Disable, urpAsset.supportsAdditionalLightShadows, "supportsAdditionalLightShadows mismatch");
Assert.AreEqual(BuiltInToURP3DRenderSettingsConverter.GetEquivalentAdditionalLightAtlasShadowResolution((int)QualitySettings.shadowResolution), urpAsset.additionalLightsShadowmapResolution, "additionalLightsShadowmapResolution mismatch");
Assert.AreEqual(tier.reflectionProbeBlending, urpAsset.reflectionProbeBlending, "reflectionProbeBlending mismatch");
Assert.AreEqual(tier.reflectionProbeBoxProjection, urpAsset.reflectionProbeBoxProjection, "reflectionProbeBoxProjection mismatch");
Assert.AreEqual(QualitySettings.shadowDistance, urpAsset.shadowDistance, "shadowDistance mismatch");
var expectedCascadeCount = tier.cascadedShadowMaps ? QualitySettings.shadowCascades : 1;
Assert.AreEqual(expectedCascadeCount, urpAsset.shadowCascadeCount, "shadowCascadeCount mismatch");
Assert.AreEqual(QualitySettings.shadowCascade2Split, urpAsset.cascade2Split, "cascade2Split mismatch");
Assert.AreEqual(QualitySettings.shadowCascade4Split, urpAsset.cascade4Split, "cascade4Split mismatch");
Assert.AreEqual(QualitySettings.shadows == UnityEngine.ShadowQuality.All, urpAsset.supportsSoftShadows, "supportsSoftShadows mismatch");
// ---------- RENDERER FORWARDING CHECK ----------
Assert.AreEqual(1, urpAsset.m_RendererDataList.Length);
Assert.IsNotNull(urpAsset.m_RendererDataList[0]);
}
renderSettingsConverter.Scan(OnScanFinished);
}
[Test]
public void WhenRunningBuiltInToURP2DRenderSettingsConverter_TheCurrent_QualityLevel_IsNowURP_AndHasEverythingProperlyAssigned()
{
var renderSettingsConverter = new BuiltInToURP2DRenderSettingsConverter();
var expectedEntry = $"[{m_QualityLevel}] {m_QualityLevelName}";
void OnScanFinished(List<IRenderPipelineConverterItem> scanItems)
{
Assert.IsTrue(scanItems.Count > 0, "Initialization did not found the item to convert");
// Find the Quality folder (RenderSettingsConverter returns Graphics and Quality folders)
IFolderRenderPipelineConverterItem qualityFolder = null;
foreach (var item in scanItems)
{
if (item is IFolderRenderPipelineConverterItem folder && folder.name == "Quality")
{
qualityFolder = folder;
break;
}
}
Assert.IsNotNull(qualityFolder, "Quality folder not found in scan results");
Assert.IsTrue(qualityFolder.children.Count > m_QualityLevel, $"Quality level {m_QualityLevel} out of range for {qualityFolder.children.Count} quality levels");
Assert.AreEqual(m_QualityLevel, QualitySettings.GetQualityLevel(), "Initialization did not rollback quality level");
var status = renderSettingsConverter.Convert(qualityFolder.children[m_QualityLevel], out string msg);
Assert.IsTrue(status != Status.Error, msg);
Assert.AreEqual(m_QualityLevel, QualitySettings.GetQualityLevel(), "Run did not rollback quality level");
// ---------- ASSET REFERENCE CHECK ----------
var urpAsset = QualitySettings.renderPipeline as UniversalRenderPipelineAsset;
Assert.IsNotNull(urpAsset, "URP asset is not assigned");
Assert.AreEqual($"Assets/{UniversalProjectSettings.projectSettingsFolderPath}/{m_QualityLevelName}.asset", AssetDatabase.GetAssetPath(urpAsset));
// ---------- RENDERER REFERENCE CHECK ----------
Assert.IsNotNull(urpAsset.m_RendererDataList);
Assert.AreEqual(1, urpAsset.m_RendererDataList.Length);
Assert.AreEqual($"Assets/{UniversalProjectSettings.projectSettingsFolderPath}/Default_2D_Renderer.asset", AssetDatabase.GetAssetPath(urpAsset.m_RendererDataList[0]));
}
renderSettingsConverter.Scan(OnScanFinished);
}
}
}