A game about forced loneliness, made by TACStudios
1#if ENABLE_VR && ENABLE_XR_MODULE
2using System;
3using System.Collections;
4using System.Collections.Generic;
5using NUnit.Framework;
6using UnityEngine;
7using UnityEngine.TestTools;
8using UnityEngine.Experimental.Rendering;
9using UnityEngine.XR;
10
11namespace UnityEngine.Rendering.Tests
12{
13 class XRDisplaySubsystemCoreTests
14 {
15 // Utils
16 protected IEnumerator WaitOneFrame()
17 {
18 yield return null;
19 }
20
21 Camera m_Camera;
22 XRDisplaySubsystem m_XRDisplay;
23 private RenderPipelineAsset m_RenderPipelineAsset;
24
25 [SetUp]
26 public void Setup()
27 {
28 var camObj = new GameObject();
29 camObj.AddComponent<Camera>();
30 m_Camera = camObj.GetComponent<Camera>();
31 camObj.tag = "MainCamera";
32
33 var displays = new List<XRDisplaySubsystem>();
34 SubsystemManager.GetSubsystems(displays);
35
36 // Skip tests
37 if (displays.Count == 0)
38 Assert.Ignore("No active XR provider found, skipping XRSystem core tests.");
39
40 m_XRDisplay = displays[0];
41 }
42
43 [TearDown]
44 public void TearDown()
45 {
46 if (m_Camera)
47 {
48 Object.Destroy(m_Camera.gameObject);
49 }
50 }
51
52 [UnityTest]
53 public IEnumerator SetOcclusionMeshScaleTest()
54 {
55 XRSRPSettings.occlusionMeshScale = 1.0f;
56 yield return WaitOneFrame();
57
58 // Set scale
59 float targetScale = 0.5f;
60 XRSRPSettings.occlusionMeshScale = targetScale;
61 yield return WaitOneFrame();
62
63 // Examine XRPass
64 float occlusionScale = 0;
65 var xrLayout = XRSystem.NewLayout();
66 xrLayout.AddCamera(m_Camera, true);
67 if (xrLayout.GetActivePasses().Count > 0)
68 {
69 (Camera _, XRPass xrPass) = xrLayout.GetActivePasses()[0];
70 {
71 occlusionScale = xrPass.occlusionMeshScale;
72 }
73 }
74 Assert.AreEqual(targetScale, occlusionScale);
75 yield return WaitOneFrame();
76
77 // Reset to default 1.0f
78 XRSRPSettings.occlusionMeshScale = 1.0f;
79 yield return WaitOneFrame();
80 }
81
82 [UnityTest]
83 public IEnumerator SetMirrorViewModeTest()
84 {
85 XRSRPSettings.mirrorViewMode = XRMirrorViewBlitMode.SideBySide;
86 yield return WaitOneFrame();
87 // Check XRDisplay mirror blit mode
88 int mirrorBlitMode = m_XRDisplay.GetPreferredMirrorBlitMode();
89 Assert.AreEqual(mirrorBlitMode, XRMirrorViewBlitMode.SideBySide);
90
91 // Repeat for Left mode
92 XRSRPSettings.mirrorViewMode = XRMirrorViewBlitMode.LeftEye;
93 yield return WaitOneFrame();
94 // Check XRDisplay mirror blit mode
95 mirrorBlitMode = m_XRDisplay.GetPreferredMirrorBlitMode();
96 Assert.AreEqual(mirrorBlitMode, XRMirrorViewBlitMode.LeftEye);
97 }
98
99 [UnityTest]
100 public IEnumerator CalculateViewCornersTest()
101 {
102 yield return WaitOneFrame();
103
104 // Retrieve XRPass
105 var xrLayout = XRSystem.NewLayout();
106 xrLayout.AddCamera(m_Camera, true);
107 XRPass firstPass = XRSystem.emptyPass;
108 if (xrLayout.GetActivePasses().Count > 0)
109 {
110 (Camera _, XRPass xrPass) = xrLayout.GetActivePasses()[0];
111 {
112 firstPass = xrPass;
113 }
114 }
115
116 // z 0 case: all corners should be zero
117 float z0 = 0;
118 Vector3[] corners = CoreUtils.CalculateViewSpaceCorners(firstPass.GetProjMatrix(0), z0);
119 Assert.AreEqual(Vector3.zero, corners[0]);
120 Assert.AreEqual(Vector3.zero, corners[1]);
121 Assert.AreEqual(Vector3.zero, corners[2]);
122 Assert.AreEqual(Vector3.zero, corners[3]);
123
124 // z2 corners = z1 corners * z2/z1
125 float z1 = 1;
126 float z2 = 2;
127 Vector3[] cornersZ1 = CoreUtils.CalculateViewSpaceCorners(firstPass.GetProjMatrix(0), z1 /*z*/);
128 Vector3[] cornersZ2 = CoreUtils.CalculateViewSpaceCorners(firstPass.GetProjMatrix(0), z2 /*z*/);
129 Assert.AreEqual(cornersZ1[0] * z2 / z1, cornersZ2[0]);
130 Assert.AreEqual(cornersZ1[1] * z2 / z1, cornersZ2[1]);
131 Assert.AreEqual(cornersZ1[2] * z2 / z1, cornersZ2[2]);
132 Assert.AreEqual(cornersZ1[3] * z2 / z1, cornersZ2[3]);
133 }
134 }
135}
136#endif