using System;
using System.Collections.Generic;
using UnityEngine.Experimental.Rendering;
namespace UnityEngine.Rendering
{
///
/// Utility class to connect SRP to automated test framework.
///
public static class XRGraphicsAutomatedTests
{
// XR tests can be enabled from the command line. Cache result to avoid GC.
static bool activatedFromCommandLine
{
#if UNITY_EDITOR
get => Array.Exists(Environment.GetCommandLineArgs(), arg => arg == "-xr-reuse-tests");
#elif XR_REUSE_TESTS_STANDALONE
get => true;
#else
get => false;
#endif
}
///
/// Used by render pipelines to initialize XR tests.
///
public static bool enabled { get; } = activatedFromCommandLine;
///
/// Set by automated test framework and read by render pipelines.
///
public static bool running = false;
// Helper function to override the XR default layout using settings of new camera
internal static void OverrideLayout(XRLayout layout, Camera camera)
{
#if ENABLE_VR && ENABLE_XR_MODULE
if (enabled && running)
{
var camProjMatrix = camera.projectionMatrix;
var camViewMatrix = camera.worldToCameraMatrix;
if (camera.TryGetCullingParameters(false, out var cullingParams))
{
cullingParams.stereoProjectionMatrix = camProjMatrix;
cullingParams.stereoViewMatrix = camViewMatrix;
cullingParams.stereoSeparationDistance = 0.0f;
List<(Camera, XRPass)> xrPasses = layout.GetActivePasses();
for (int passId = 0; passId < xrPasses.Count; passId++)
{
var xrPass = xrPasses[passId].Item2;
xrPass.AssignCullingParams(xrPass.cullingPassId, cullingParams);
for (int viewId = 0; viewId < xrPass.viewCount; viewId++)
{
var projMatrix = camProjMatrix;
var viewMatrix = camViewMatrix;
bool isFirstViewMultiPass = xrPasses.Count == 2 && passId == 0;
bool isFirstViewSinglePass = xrPasses.Count == 1 && viewId == 0;
if (isFirstViewMultiPass || isFirstViewSinglePass)
{
// Modify the render viewpoint and frustum of the first view in order to
// distinguish it from the final view used for image comparison.
// This is a trick to help detect issues related to view indexing.
var planes = projMatrix.decomposeProjection;
planes.left *= 0.44f;
planes.right *= 0.88f;
planes.top *= 0.11f;
planes.bottom *= 0.33f;
projMatrix = Matrix4x4.Frustum(planes);
viewMatrix *= Matrix4x4.Translate(new Vector3(.34f, 0.25f, -0.08f));
}
XRView xrView = new XRView(projMatrix, viewMatrix, xrPass.GetViewport(viewId), null, xrPass.GetTextureArraySlice(viewId));
xrPass.AssignView(viewId, xrView);
}
}
}
}
#endif
}
}
}