You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
6.5 KiB
C#
164 lines
6.5 KiB
C#
1 year ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.IO;
|
||
|
using NUnit.Framework;
|
||
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Rendering;
|
||
|
using UnityEngine.TestTools;
|
||
|
using UnityEngine.UI;
|
||
|
|
||
|
namespace Graphics
|
||
|
{
|
||
|
class MaskTests : IPrebuildSetup
|
||
|
{
|
||
|
GameObject m_PrefabRoot;
|
||
|
const string kPrefabPath = "Assets/Resources/MaskTestsPrefab.prefab";
|
||
|
|
||
|
Mask m_mask;
|
||
|
|
||
|
public void Setup()
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
var rootGO = new GameObject("rootGo");
|
||
|
GameObject canvasGO = new GameObject("Canvas", typeof(RectTransform), typeof(Canvas));
|
||
|
canvasGO.transform.SetParent(rootGO.transform);
|
||
|
|
||
|
var canvas = canvasGO.GetComponent<Canvas>();
|
||
|
canvas.referencePixelsPerUnit = 100;
|
||
|
|
||
|
var gameObject = new GameObject("Mask", typeof(RectTransform), typeof(Mask), typeof(Image));
|
||
|
gameObject.transform.SetParent(canvasGO.transform);
|
||
|
|
||
|
if (!Directory.Exists("Assets/Resources/"))
|
||
|
Directory.CreateDirectory("Assets/Resources/");
|
||
|
|
||
|
PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath);
|
||
|
GameObject.DestroyImmediate(rootGO);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
[SetUp]
|
||
|
public void TestSetup()
|
||
|
{
|
||
|
m_PrefabRoot = Object.Instantiate(Resources.Load("MaskTestsPrefab")) as GameObject;
|
||
|
m_mask = m_PrefabRoot.GetComponentInChildren<Mask>();
|
||
|
}
|
||
|
|
||
|
[TearDown]
|
||
|
public void TearDown()
|
||
|
{
|
||
|
m_mask = null;
|
||
|
Object.DestroyImmediate(m_PrefabRoot);
|
||
|
}
|
||
|
|
||
|
[OneTimeTearDown]
|
||
|
public void OneTimeTearDown()
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
AssetDatabase.DeleteAsset(kPrefabPath);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
[UnityTest]
|
||
|
public IEnumerator GetModifiedMaterialReturnsOriginalMaterialWhenNoGraphicComponentIsAttached()
|
||
|
{
|
||
|
Object.DestroyImmediate(m_mask.gameObject.GetComponent<Image>());
|
||
|
yield return null;
|
||
|
Material material = new Material(Graphic.defaultGraphicMaterial);
|
||
|
Material modifiedMaterial = m_mask.GetModifiedMaterial(material);
|
||
|
Assert.AreEqual(material, modifiedMaterial);
|
||
|
}
|
||
|
|
||
|
private Dictionary<string, GameObject> CreateMaskHierarchy(string suffix, int hierarchyDepth, out GameObject root)
|
||
|
{
|
||
|
var nameToObjectMapping = new Dictionary<string, GameObject>();
|
||
|
|
||
|
root = new GameObject("root", typeof(RectTransform), typeof(Canvas));
|
||
|
nameToObjectMapping["root"] = root;
|
||
|
|
||
|
GameObject current = root;
|
||
|
|
||
|
for (int i = 0; i < hierarchyDepth; i++)
|
||
|
{
|
||
|
string name = suffix + (i + 1);
|
||
|
var gameObject = new GameObject(name, typeof(RectTransform), typeof(Mask), typeof(Image));
|
||
|
gameObject.transform.SetParent(current.transform);
|
||
|
nameToObjectMapping[name] = gameObject;
|
||
|
current = gameObject;
|
||
|
}
|
||
|
|
||
|
return nameToObjectMapping;
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void GetModifiedMaterialReturnsOriginalMaterialWhenDepthIsEightOrMore()
|
||
|
{
|
||
|
GameObject root;
|
||
|
var objectsMap = CreateMaskHierarchy("subMask", 9, out root);
|
||
|
Mask mask = objectsMap["subMask" + 9].GetComponent<Mask>();
|
||
|
Material material = new Material(Graphic.defaultGraphicMaterial);
|
||
|
Material modifiedMaterial = mask.GetModifiedMaterial(material);
|
||
|
Assert.AreEqual(material, modifiedMaterial);
|
||
|
GameObject.DestroyImmediate(root);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void GetModifiedMaterialReturnsDesiredMaterialWithSingleMask()
|
||
|
{
|
||
|
Material material = new Material(Graphic.defaultGraphicMaterial);
|
||
|
Material modifiedMaterial = m_mask.GetModifiedMaterial(material);
|
||
|
|
||
|
Assert.AreNotEqual(material, modifiedMaterial);
|
||
|
Assert.AreEqual(1, modifiedMaterial.GetInt("_Stencil"));
|
||
|
Assert.AreEqual(StencilOp.Replace, (StencilOp)modifiedMaterial.GetInt("_StencilOp"));
|
||
|
Assert.AreEqual(CompareFunction.Always, (CompareFunction)modifiedMaterial.GetInt("_StencilComp"));
|
||
|
Assert.AreEqual(255, modifiedMaterial.GetInt("_StencilReadMask"));
|
||
|
Assert.AreEqual(255, modifiedMaterial.GetInt("_StencilWriteMask"));
|
||
|
Assert.AreEqual(ColorWriteMask.All, (ColorWriteMask)modifiedMaterial.GetInt("_ColorMask"));
|
||
|
Assert.AreEqual(1, modifiedMaterial.GetInt("_UseUIAlphaClip"));
|
||
|
|
||
|
Assert.IsTrue(modifiedMaterial.IsKeywordEnabled("UNITY_UI_ALPHACLIP"));
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void GetModifiedMaterialReturnsDesiredMaterialWithMultipleMasks()
|
||
|
{
|
||
|
for (int i = 2; i < 8; i++)
|
||
|
{
|
||
|
GameObject root;
|
||
|
var objectsMap = CreateMaskHierarchy("subMask", i, out root);
|
||
|
Mask mask = objectsMap["subMask" + i].GetComponent<Mask>();
|
||
|
|
||
|
int stencilDepth = MaskUtilities.GetStencilDepth(mask.transform, objectsMap["root"].transform);
|
||
|
|
||
|
int desiredStencilBit = 1 << stencilDepth;
|
||
|
Material material = new Material(Graphic.defaultGraphicMaterial);
|
||
|
Material modifiedMaterial = mask.GetModifiedMaterial(material);
|
||
|
int stencil = modifiedMaterial.GetInt("_Stencil");
|
||
|
|
||
|
Assert.AreNotEqual(material, modifiedMaterial);
|
||
|
Assert.AreEqual(desiredStencilBit | (desiredStencilBit - 1), stencil);
|
||
|
Assert.AreEqual(StencilOp.Replace, (StencilOp)modifiedMaterial.GetInt("_StencilOp"));
|
||
|
Assert.AreEqual(CompareFunction.Equal, (CompareFunction)modifiedMaterial.GetInt("_StencilComp"));
|
||
|
Assert.AreEqual(desiredStencilBit - 1, modifiedMaterial.GetInt("_StencilReadMask"));
|
||
|
Assert.AreEqual(desiredStencilBit | (desiredStencilBit - 1), modifiedMaterial.GetInt("_StencilWriteMask"));
|
||
|
Assert.AreEqual(ColorWriteMask.All, (ColorWriteMask)modifiedMaterial.GetInt("_ColorMask"));
|
||
|
Assert.AreEqual(1, modifiedMaterial.GetInt("_UseUIAlphaClip"));
|
||
|
Assert.IsTrue(modifiedMaterial.IsKeywordEnabled("UNITY_UI_ALPHACLIP"));
|
||
|
|
||
|
GameObject.DestroyImmediate(root);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void GraphicComponentWithMaskIsMarkedAsIsMaskingGraphicWhenEnabled()
|
||
|
{
|
||
|
var graphic = m_PrefabRoot.GetComponentInChildren<Image>();
|
||
|
Assert.AreEqual(true, graphic.isMaskingGraphic);
|
||
|
m_mask.enabled = false;
|
||
|
Assert.AreEqual(false, graphic.isMaskingGraphic);
|
||
|
}
|
||
|
}
|
||
|
}
|