using System; using UnityEngine.Rendering.HighDefinition.Attributes; namespace UnityEngine.Rendering.HighDefinition { /// Engine lighting property. public enum LightingProperty { /// No debug output. None = 0, /// Render only diffuse. DiffuseOnly, /// Render only specular. SpecularOnly, /// Render only direct diffuse. DirectDiffuseOnly, /// Render only direct specular. DirectSpecularOnly, /// Render only indirect diffuse. IndirectDiffuseOnly, /// Render only reflection. ReflectionOnly, /// Render only refraction. RefractionOnly, /// Render only emissive. EmissiveOnly } /// Output a specific debug mode. public enum DebugFullScreen { /// No debug output. None, /// Depth buffer. Depth, /// Screen space ambient occlusion buffer. ScreenSpaceAmbientOcclusion, /// Motion vectors buffer. MotionVectors } /// Use this request to define how to render an AOV. public unsafe struct AOVRequest { /// Default settings. [Obsolete("Since 2019.3, use AOVRequest.NewDefault() instead.")] public static readonly AOVRequest @default = default; /// Default settings. /// public static AOVRequest NewDefault() => new AOVRequest { m_MaterialProperty = MaterialSharedProperty.None, m_LightingProperty = LightingProperty.None, m_DebugFullScreen = DebugFullScreen.None, m_LightFilterProperty = DebugLightFilterMode.None }; MaterialSharedProperty m_MaterialProperty; LightingProperty m_LightingProperty; DebugLightFilterMode m_LightFilterProperty; DebugFullScreen m_DebugFullScreen; AOVRequest* thisPtr { get { fixed(AOVRequest* pThis = &this) return pThis; } } /// Create a new instance by copying values from . /// public AOVRequest(AOVRequest other) { m_MaterialProperty = other.m_MaterialProperty; m_LightingProperty = other.m_LightingProperty; m_DebugFullScreen = other.m_DebugFullScreen; m_LightFilterProperty = other.m_LightFilterProperty; } /// State the property to render. In case of several SetFullscreenOutput chained call, only last will be used. /// The property to render. /// A ref return to chain calls. public ref AOVRequest SetFullscreenOutput(MaterialSharedProperty materialProperty) { m_MaterialProperty = materialProperty; return ref *thisPtr; } /// State the property to render. In case of several SetFullscreenOutput chained call, only last will be used. /// The property to render. /// A ref return to chain calls. public ref AOVRequest SetFullscreenOutput(LightingProperty lightingProperty) { m_LightingProperty = lightingProperty; return ref *thisPtr; } /// State the property to render. In case of several SetFullscreenOutput chained call, only last will be used. /// The property to render. /// A ref return to chain calls. public ref AOVRequest SetFullscreenOutput(DebugFullScreen debugFullScreen) { m_DebugFullScreen = debugFullScreen; return ref *thisPtr; } /// Set the light filter to use. /// The light filter to use /// A ref return to chain calls. public ref AOVRequest SetLightFilter(DebugLightFilterMode filter) { m_LightFilterProperty = filter; return ref *thisPtr; } /// /// Populate the debug display settings with the AOV data. /// /// The debug display settings to fill. public void FillDebugData(DebugDisplaySettings debug) { debug.SetDebugViewCommonMaterialProperty(m_MaterialProperty); switch (m_LightingProperty) { case LightingProperty.DiffuseOnly: debug.SetDebugLightingMode(DebugLightingMode.DiffuseLighting); break; case LightingProperty.SpecularOnly: debug.SetDebugLightingMode(DebugLightingMode.SpecularLighting); break; case LightingProperty.DirectDiffuseOnly: debug.SetDebugLightingMode(DebugLightingMode.DirectDiffuseLighting); break; case LightingProperty.DirectSpecularOnly: debug.SetDebugLightingMode(DebugLightingMode.DirectSpecularLighting); break; case LightingProperty.IndirectDiffuseOnly: debug.SetDebugLightingMode(DebugLightingMode.IndirectDiffuseLighting); break; case LightingProperty.ReflectionOnly: debug.SetDebugLightingMode(DebugLightingMode.ReflectionLighting); break; case LightingProperty.RefractionOnly: debug.SetDebugLightingMode(DebugLightingMode.RefractionLighting); break; case LightingProperty.EmissiveOnly: debug.SetDebugLightingMode(DebugLightingMode.EmissiveLighting); break; default: { debug.SetDebugLightingMode(DebugLightingMode.None); break; } } debug.SetDebugLightFilterMode(m_LightFilterProperty); switch (m_DebugFullScreen) { case DebugFullScreen.None: debug.SetFullScreenDebugMode(FullScreenDebugMode.None); break; case DebugFullScreen.Depth: debug.SetFullScreenDebugMode(FullScreenDebugMode.DepthPyramid); break; case DebugFullScreen.ScreenSpaceAmbientOcclusion: debug.SetFullScreenDebugMode(FullScreenDebugMode.ScreenSpaceAmbientOcclusion); break; case DebugFullScreen.MotionVectors: debug.SetFullScreenDebugMode(FullScreenDebugMode.MotionVectors); break; default: throw new ArgumentException("Unknown DebugFullScreen"); } } /// /// Equality operator. /// /// The AOV request to compare to. /// True if the provided AOV request is equal to this. public override bool Equals(object obj) { return obj is AOVRequest && ((AOVRequest)obj) == this; } /// /// Compares if two AOV requests have the same settings. /// /// The first AOVRequest to compare. /// The second AOVRequest to compare. /// True if the two AOV requests have the same settings. public static bool operator==(AOVRequest a, AOVRequest b) { return a.m_DebugFullScreen == b.m_DebugFullScreen && a.m_LightFilterProperty == b.m_LightFilterProperty && a.m_LightingProperty == b.m_LightingProperty && a.m_MaterialProperty == b.m_MaterialProperty; } /// /// Compares if two AOV requests have the same settings. /// /// The first AOVRequest to compare. /// The second AOVRequest to compare. /// True if the two AOV requests have not the same settings. public static bool operator!=(AOVRequest a, AOVRequest b) { return !(a == b); } /// /// Computes a hash code for the AOV Request. /// /// A hash code for the AOV Request. public override int GetHashCode() { int hash = 17; hash = hash * 23 + (int)m_DebugFullScreen; hash = hash * 23 + (int)m_LightFilterProperty; hash = hash * 23 + (int)m_LightingProperty; hash = hash * 23 + (int)m_MaterialProperty; return hash; } } }