Sin descripción
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.

VolumeManagerTests.cs 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using NUnit.Framework;
  5. namespace UnityEngine.Rendering.Tests
  6. {
  7. [TestFixture("Local")]
  8. [TestFixture("Global")]
  9. class VolumeManagerTests
  10. {
  11. readonly LayerMask k_defaultLayer = 1;
  12. VolumeProfile m_VolumeProfile;
  13. readonly List<GameObject> m_Objects = new();
  14. readonly bool m_IsGlobal;
  15. VolumeManager volumeManager { get; set; }
  16. VolumeStack stack => volumeManager.stack;
  17. GameObject camera { get; set; }
  18. public VolumeManagerTests(string volumeType)
  19. {
  20. m_IsGlobal = volumeType switch
  21. {
  22. "Global" => true,
  23. "Local" => false,
  24. _ => throw new ArgumentException(volumeType)
  25. };
  26. }
  27. [SetUp]
  28. public void Setup()
  29. {
  30. m_VolumeProfile = ScriptableObject.CreateInstance<VolumeProfile>();
  31. var volumeComponent = m_VolumeProfile.Add<TestVolume>();
  32. volumeComponent.param.Override(TestVolume.k_OverrideValue);
  33. volumeManager = new VolumeManager();
  34. volumeManager.Initialize();
  35. camera = new GameObject("Camera", typeof(Camera));
  36. m_Objects.Add(camera);
  37. }
  38. [TearDown]
  39. public void TearDown()
  40. {
  41. CoreUtils.Destroy(m_VolumeProfile);
  42. foreach (var go in m_Objects)
  43. CoreUtils.Destroy(go);
  44. volumeManager.Deinitialize();
  45. }
  46. static IEnumerable TestCaseSources()
  47. {
  48. yield return new TestCaseData(
  49. new Action<VolumeManager, Volume>((vm, v) => vm.Unregister(v, v.gameObject.layer)),
  50. new Action<VolumeManager, Volume>((vm, v) => vm.Register(v, v.gameObject.layer)))
  51. .SetName("Parameter evaluation is correct when volume is unregistered and registered");
  52. yield return new TestCaseData(
  53. new Action<VolumeManager, Volume>((vm, v) => v.enabled = false),
  54. new Action<VolumeManager, Volume>((vm, v) => v.enabled = true))
  55. .SetName("Parameter evaluation is correct when volume is disabled and enabled");
  56. yield return new TestCaseData(
  57. new Action<VolumeManager, Volume>((vm, v) => v.profileRef.components[0].SetAllOverridesTo(false)),
  58. new Action<VolumeManager, Volume>((vm, v) => v.profileRef.components[0].SetAllOverridesTo(true)))
  59. .SetName("Parameter evaluation is correct when overrides are disabled and enabled");
  60. }
  61. Volume CreateVolume(string name)
  62. {
  63. var volumeGameObject = new GameObject(name, typeof(Volume));
  64. if (!m_IsGlobal)
  65. volumeGameObject.AddComponent<BoxCollider>();
  66. var volume = volumeGameObject.GetComponent<Volume>();
  67. volume.isGlobal = m_IsGlobal;
  68. m_Objects.Add(volume.gameObject);
  69. return volume;
  70. }
  71. [TestCaseSource(nameof(TestCaseSources))]
  72. public void ParameterEvaluationTest(Action<VolumeManager, Volume> disableAction, Action<VolumeManager, Volume> enableAction)
  73. {
  74. var volume = CreateVolume("Volume");
  75. volume.sharedProfile = m_VolumeProfile;
  76. volumeManager.Register(volume, volume.gameObject.layer);
  77. volumeManager.Update(camera.transform, k_defaultLayer);
  78. Assert.AreEqual(true, stack.requiresReset); // Local volume present - stack reset needed
  79. Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value);
  80. disableAction.Invoke(volumeManager, volume);
  81. volumeManager.Update(camera.transform, k_defaultLayer);
  82. Assert.AreEqual(TestVolume.k_DefaultValue, stack.GetComponent<TestVolume>().param.value); // Value still resets to default
  83. enableAction.Invoke(volumeManager, volume);
  84. volumeManager.Update(camera.transform, k_defaultLayer);
  85. Assert.AreEqual(true, stack.requiresReset); // Local volume is back - stack reset needed
  86. Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value); // Value overridden again
  87. }
  88. [Test]
  89. public void ParameterOverrideTest()
  90. {
  91. var volume = CreateVolume("Volume");
  92. volume.priority = 0f;
  93. volume.sharedProfile = m_VolumeProfile;
  94. volumeManager.Register(volume, volume.gameObject.layer);
  95. volumeManager.Update(camera.transform, k_defaultLayer);
  96. Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value);
  97. const float PriorityOverrideValue = 999.0f;
  98. var priorityVolumeProfile = ScriptableObject.CreateInstance<VolumeProfile>();
  99. var priorityVolumeComponent = priorityVolumeProfile.Add<TestVolume>();
  100. priorityVolumeComponent.param.Override(PriorityOverrideValue);
  101. var volume1 = CreateVolume("Volume Priority 1");
  102. volume1.priority = 1f;
  103. volume1.sharedProfile = priorityVolumeProfile;
  104. volumeManager.Register(volume1, volume1.gameObject.layer);
  105. volumeManager.Update(camera.transform, k_defaultLayer);
  106. Assert.AreEqual(PriorityOverrideValue, stack.GetComponent<TestVolume>().param.value);
  107. volume.priority = 2f; // Raise priority of the original volume to be higher
  108. volumeManager.SetLayerDirty(volume.gameObject.layer); // Mark dirty to apply new priority (normally done by Volume.Update())
  109. volumeManager.Update(camera.transform, k_defaultLayer);
  110. Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value);
  111. CoreUtils.Destroy(priorityVolumeProfile);
  112. }
  113. }
  114. class VolumeManagerDefaultProfileTests
  115. {
  116. VolumeProfile m_VolumeProfile1;
  117. VolumeProfile m_VolumeProfile2;
  118. VolumeProfile m_VolumeProfile3;
  119. VolumeManager volumeManager { get; set; }
  120. VolumeStack stack => volumeManager.stack;
  121. TestVolume GetDefaultState() => volumeManager.GetVolumeComponentDefaultState(typeof(TestVolume)) as TestVolume;
  122. [SetUp]
  123. public void Setup()
  124. {
  125. m_VolumeProfile1 = ScriptableObject.CreateInstance<VolumeProfile>();
  126. m_VolumeProfile1.Add<TestVolume>().param.Override(TestVolume.k_OverrideValue);
  127. m_VolumeProfile2 = ScriptableObject.CreateInstance<VolumeProfile>();
  128. m_VolumeProfile2.Add<TestVolume>().param.Override(TestVolume.k_OverrideValue2);
  129. m_VolumeProfile3 = ScriptableObject.CreateInstance<VolumeProfile>();
  130. m_VolumeProfile3.Add<TestVolume>().param.Override(TestVolume.k_OverrideValue3);
  131. }
  132. [TearDown]
  133. public void TearDown()
  134. {
  135. CoreUtils.Destroy(m_VolumeProfile1);
  136. CoreUtils.Destroy(m_VolumeProfile2);
  137. CoreUtils.Destroy(m_VolumeProfile3);
  138. volumeManager.Deinitialize();
  139. }
  140. [Test]
  141. public void ParameterIsCorrectByDefault()
  142. {
  143. volumeManager = new VolumeManager();
  144. volumeManager.Initialize();
  145. LayerMask defaultLayer = 1;
  146. var camera = new GameObject("Camera", typeof(Camera));
  147. Assert.AreEqual(true, stack.requiresReset); // Initially, reset is required
  148. Assert.AreEqual(TestVolume.k_DefaultValue, stack.GetComponent<TestVolume>().param.value); // Default value retrievable without calling Update()
  149. volumeManager.Update(camera.transform, defaultLayer);
  150. Assert.AreEqual(false, stack.requiresReset); // No volumes - no stack reset needed
  151. Assert.AreEqual(TestVolume.k_DefaultValue, stack.GetComponent<TestVolume>().param.value);
  152. }
  153. [Test]
  154. public void DefaultProfilesAreAppliedToDefaultState()
  155. {
  156. volumeManager = new VolumeManager();
  157. volumeManager.Initialize(m_VolumeProfile1, null);
  158. Assert.AreEqual(TestVolume.k_OverrideValue, GetDefaultState().param.value);
  159. volumeManager.SetQualityDefaultProfile(m_VolumeProfile2);
  160. Assert.AreEqual(TestVolume.k_OverrideValue2, GetDefaultState().param.value);
  161. volumeManager.SetCustomDefaultProfiles(new List<VolumeProfile> { m_VolumeProfile3 });
  162. Assert.AreEqual(TestVolume.k_OverrideValue3, GetDefaultState().param.value);
  163. volumeManager.SetGlobalDefaultProfile(null);
  164. Assert.AreEqual(TestVolume.k_OverrideValue3, GetDefaultState().param.value);
  165. volumeManager.SetQualityDefaultProfile(null);
  166. Assert.AreEqual(TestVolume.k_OverrideValue3, GetDefaultState().param.value);
  167. volumeManager.SetCustomDefaultProfiles(null);
  168. Assert.AreEqual(TestVolume.k_DefaultValue, GetDefaultState().param.value);
  169. }
  170. [Test]
  171. public void CustomDefaultProfilesAreAppliedInOrder()
  172. {
  173. volumeManager = new VolumeManager();
  174. volumeManager.Initialize();
  175. volumeManager.SetCustomDefaultProfiles(new List<VolumeProfile> { m_VolumeProfile1, m_VolumeProfile2 });
  176. Assert.AreEqual(TestVolume.k_OverrideValue2, GetDefaultState().param.value);
  177. volumeManager.SetCustomDefaultProfiles(new List<VolumeProfile> { m_VolumeProfile2, m_VolumeProfile1 });
  178. Assert.AreEqual(TestVolume.k_OverrideValue, GetDefaultState().param.value);
  179. }
  180. }
  181. }