#if ENABLE_VR && ENABLE_XR_MODULE
using System;
using UnityEngine.Experimental.Rendering;
namespace UnityEngine.Rendering.Universal
{
///
/// Draw the XR occlusion mesh into the current depth buffer when XR is enabled.
///
public class XROcclusionMeshPass : ScriptableRenderPass
{
bool isDepth;
public XROcclusionMeshPass(RenderPassEvent evt)
{
base.profilingSampler = new ProfilingSampler(nameof(XROcclusionMeshPass));
renderPassEvent = evt;
}
public void Setup(bool isDepth)
{
this.isDepth = isDepth;
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
if (isDepth)
{
RenderTextureDescriptor desc = renderingData.cameraData.cameraTargetDescriptor;
// When depth priming is in use the camera target should not be overridden so the Camera's MSAA depth attachment is used.
if (renderingData.cameraData.renderer.useDepthPriming && (renderingData.cameraData.renderType == CameraRenderType.Base || renderingData.cameraData.clearDepth))
{
ConfigureTarget(renderingData.cameraData.renderer.cameraDepthTarget, desc.depthStencilFormat, desc.width, desc.height, 1, true);
ConfigureClear(ClearFlag.Depth, Color.black);
}
}
else
{
ConfigureClear(ClearFlag.None, Color.black);
}
}
///
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (!renderingData.cameraData.xr.enabled)
return;
CommandBuffer cmd = CommandBufferPool.Get();
renderingData.cameraData.xr.RenderOcclusionMesh(cmd);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
if (cmd == null)
throw new ArgumentNullException("cmd");
}
}
}
#endif