Ei kuvausta
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.

MaskTests.cs 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using NUnit.Framework;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using UnityEngine.Rendering;
  8. using UnityEngine.TestTools;
  9. using UnityEngine.UI;
  10. namespace Graphics
  11. {
  12. class MaskTests : IPrebuildSetup
  13. {
  14. GameObject m_PrefabRoot;
  15. const string kPrefabPath = "Assets/Resources/MaskTestsPrefab.prefab";
  16. Mask m_mask;
  17. public void Setup()
  18. {
  19. #if UNITY_EDITOR
  20. var rootGO = new GameObject("rootGo");
  21. GameObject canvasGO = new GameObject("Canvas", typeof(RectTransform), typeof(Canvas));
  22. canvasGO.transform.SetParent(rootGO.transform);
  23. var canvas = canvasGO.GetComponent<Canvas>();
  24. canvas.referencePixelsPerUnit = 100;
  25. var gameObject = new GameObject("Mask", typeof(RectTransform), typeof(Mask), typeof(Image));
  26. gameObject.transform.SetParent(canvasGO.transform);
  27. if (!Directory.Exists("Assets/Resources/"))
  28. Directory.CreateDirectory("Assets/Resources/");
  29. PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath);
  30. GameObject.DestroyImmediate(rootGO);
  31. #endif
  32. }
  33. [SetUp]
  34. public void TestSetup()
  35. {
  36. m_PrefabRoot = Object.Instantiate(Resources.Load("MaskTestsPrefab")) as GameObject;
  37. m_mask = m_PrefabRoot.GetComponentInChildren<Mask>();
  38. }
  39. [TearDown]
  40. public void TearDown()
  41. {
  42. m_mask = null;
  43. Object.DestroyImmediate(m_PrefabRoot);
  44. }
  45. [OneTimeTearDown]
  46. public void OneTimeTearDown()
  47. {
  48. #if UNITY_EDITOR
  49. AssetDatabase.DeleteAsset(kPrefabPath);
  50. #endif
  51. }
  52. [UnityTest]
  53. public IEnumerator GetModifiedMaterialReturnsOriginalMaterialWhenNoGraphicComponentIsAttached()
  54. {
  55. Object.DestroyImmediate(m_mask.gameObject.GetComponent<Image>());
  56. yield return null;
  57. Material material = new Material(Graphic.defaultGraphicMaterial);
  58. Material modifiedMaterial = m_mask.GetModifiedMaterial(material);
  59. Assert.AreEqual(material, modifiedMaterial);
  60. }
  61. private Dictionary<string, GameObject> CreateMaskHierarchy(string suffix, int hierarchyDepth, out GameObject root)
  62. {
  63. var nameToObjectMapping = new Dictionary<string, GameObject>();
  64. root = new GameObject("root", typeof(RectTransform), typeof(Canvas));
  65. nameToObjectMapping["root"] = root;
  66. GameObject current = root;
  67. for (int i = 0; i < hierarchyDepth; i++)
  68. {
  69. string name = suffix + (i + 1);
  70. var gameObject = new GameObject(name, typeof(RectTransform), typeof(Mask), typeof(Image));
  71. gameObject.transform.SetParent(current.transform);
  72. nameToObjectMapping[name] = gameObject;
  73. current = gameObject;
  74. }
  75. return nameToObjectMapping;
  76. }
  77. [Test]
  78. public void GetModifiedMaterialReturnsOriginalMaterialWhenDepthIsEightOrMore()
  79. {
  80. GameObject root;
  81. var objectsMap = CreateMaskHierarchy("subMask", 9, out root);
  82. Mask mask = objectsMap["subMask" + 9].GetComponent<Mask>();
  83. Material material = new Material(Graphic.defaultGraphicMaterial);
  84. Material modifiedMaterial = mask.GetModifiedMaterial(material);
  85. Assert.AreEqual(material, modifiedMaterial);
  86. GameObject.DestroyImmediate(root);
  87. }
  88. [Test]
  89. public void GetModifiedMaterialReturnsDesiredMaterialWithSingleMask()
  90. {
  91. Material material = new Material(Graphic.defaultGraphicMaterial);
  92. Material modifiedMaterial = m_mask.GetModifiedMaterial(material);
  93. Assert.AreNotEqual(material, modifiedMaterial);
  94. Assert.AreEqual(1, modifiedMaterial.GetInt("_Stencil"));
  95. Assert.AreEqual(StencilOp.Replace, (StencilOp)modifiedMaterial.GetInt("_StencilOp"));
  96. Assert.AreEqual(CompareFunction.Always, (CompareFunction)modifiedMaterial.GetInt("_StencilComp"));
  97. Assert.AreEqual(255, modifiedMaterial.GetInt("_StencilReadMask"));
  98. Assert.AreEqual(255, modifiedMaterial.GetInt("_StencilWriteMask"));
  99. Assert.AreEqual(ColorWriteMask.All, (ColorWriteMask)modifiedMaterial.GetInt("_ColorMask"));
  100. Assert.AreEqual(1, modifiedMaterial.GetInt("_UseUIAlphaClip"));
  101. Assert.IsTrue(modifiedMaterial.IsKeywordEnabled("UNITY_UI_ALPHACLIP"));
  102. }
  103. [Test]
  104. public void GetModifiedMaterialReturnsDesiredMaterialWithMultipleMasks()
  105. {
  106. for (int i = 2; i < 8; i++)
  107. {
  108. GameObject root;
  109. var objectsMap = CreateMaskHierarchy("subMask", i, out root);
  110. Mask mask = objectsMap["subMask" + i].GetComponent<Mask>();
  111. int stencilDepth = MaskUtilities.GetStencilDepth(mask.transform, objectsMap["root"].transform);
  112. int desiredStencilBit = 1 << stencilDepth;
  113. Material material = new Material(Graphic.defaultGraphicMaterial);
  114. Material modifiedMaterial = mask.GetModifiedMaterial(material);
  115. int stencil = modifiedMaterial.GetInt("_Stencil");
  116. Assert.AreNotEqual(material, modifiedMaterial);
  117. Assert.AreEqual(desiredStencilBit | (desiredStencilBit - 1), stencil);
  118. Assert.AreEqual(StencilOp.Replace, (StencilOp)modifiedMaterial.GetInt("_StencilOp"));
  119. Assert.AreEqual(CompareFunction.Equal, (CompareFunction)modifiedMaterial.GetInt("_StencilComp"));
  120. Assert.AreEqual(desiredStencilBit - 1, modifiedMaterial.GetInt("_StencilReadMask"));
  121. Assert.AreEqual(desiredStencilBit | (desiredStencilBit - 1), modifiedMaterial.GetInt("_StencilWriteMask"));
  122. Assert.AreEqual(ColorWriteMask.All, (ColorWriteMask)modifiedMaterial.GetInt("_ColorMask"));
  123. Assert.AreEqual(1, modifiedMaterial.GetInt("_UseUIAlphaClip"));
  124. Assert.IsTrue(modifiedMaterial.IsKeywordEnabled("UNITY_UI_ALPHACLIP"));
  125. GameObject.DestroyImmediate(root);
  126. }
  127. }
  128. [Test]
  129. public void GraphicComponentWithMaskIsMarkedAsIsMaskingGraphicWhenEnabled()
  130. {
  131. var graphic = m_PrefabRoot.GetComponentInChildren<Image>();
  132. Assert.AreEqual(true, graphic.isMaskingGraphic);
  133. m_mask.enabled = false;
  134. Assert.AreEqual(false, graphic.isMaskingGraphic);
  135. }
  136. }
  137. }