231 lines
9.2 KiB
C#
231 lines
9.2 KiB
C#
using System;
|
|
using UnityEngine.Rendering.HighDefinition.Attributes;
|
|
|
|
namespace UnityEngine.Rendering.HighDefinition
|
|
{
|
|
/// <summary>Engine lighting property.</summary>
|
|
public enum LightingProperty
|
|
{
|
|
/// <summary>No debug output.</summary>
|
|
None = 0,
|
|
/// <summary>Render only diffuse.</summary>
|
|
DiffuseOnly,
|
|
/// <summary>Render only specular.</summary>
|
|
SpecularOnly,
|
|
/// <summary>Render only direct diffuse.</summary>
|
|
DirectDiffuseOnly,
|
|
/// <summary>Render only direct specular.</summary>
|
|
DirectSpecularOnly,
|
|
/// <summary>Render only indirect diffuse.</summary>
|
|
IndirectDiffuseOnly,
|
|
/// <summary>Render only reflection.</summary>
|
|
ReflectionOnly,
|
|
/// <summary>Render only refraction.</summary>
|
|
RefractionOnly,
|
|
/// <summary>Render only emissive.</summary>
|
|
EmissiveOnly
|
|
}
|
|
|
|
/// <summary>Output a specific debug mode.</summary>
|
|
public enum DebugFullScreen
|
|
{
|
|
/// <summary>No debug output.</summary>
|
|
None,
|
|
/// <summary>Depth buffer.</summary>
|
|
Depth,
|
|
/// <summary>Screen space ambient occlusion buffer.</summary>
|
|
ScreenSpaceAmbientOcclusion,
|
|
/// <summary>Motion vectors buffer.</summary>
|
|
MotionVectors
|
|
}
|
|
|
|
/// <summary>Use this request to define how to render an AOV.</summary>
|
|
public unsafe struct AOVRequest
|
|
{
|
|
/// <summary>Default settings.</summary>
|
|
[Obsolete("Since 2019.3, use AOVRequest.NewDefault() instead.")]
|
|
public static readonly AOVRequest @default = default;
|
|
/// <summary>Default settings.</summary>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
}
|
|
|
|
/// <summary>Create a new instance by copying values from <paramref name="other"/>.</summary>
|
|
/// <param name="other"></param>
|
|
public AOVRequest(AOVRequest other)
|
|
{
|
|
m_MaterialProperty = other.m_MaterialProperty;
|
|
m_LightingProperty = other.m_LightingProperty;
|
|
m_DebugFullScreen = other.m_DebugFullScreen;
|
|
m_LightFilterProperty = other.m_LightFilterProperty;
|
|
}
|
|
|
|
/// <summary>State the property to render. In case of several SetFullscreenOutput chained call, only last will be used.</summary>
|
|
/// <param name="materialProperty">The property to render.</param>
|
|
/// <returns>A ref return to chain calls.</returns>
|
|
public ref AOVRequest SetFullscreenOutput(MaterialSharedProperty materialProperty)
|
|
{
|
|
m_MaterialProperty = materialProperty;
|
|
return ref *thisPtr;
|
|
}
|
|
|
|
/// <summary>State the property to render. In case of several SetFullscreenOutput chained call, only last will be used.</summary>
|
|
/// <param name="lightingProperty">The property to render.</param>
|
|
/// <returns>A ref return to chain calls.</returns>
|
|
public ref AOVRequest SetFullscreenOutput(LightingProperty lightingProperty)
|
|
{
|
|
m_LightingProperty = lightingProperty;
|
|
return ref *thisPtr;
|
|
}
|
|
|
|
/// <summary>State the property to render. In case of several SetFullscreenOutput chained call, only last will be used.</summary>
|
|
/// <param name="debugFullScreen">The property to render.</param>
|
|
/// <returns>A ref return to chain calls.</returns>
|
|
public ref AOVRequest SetFullscreenOutput(DebugFullScreen debugFullScreen)
|
|
{
|
|
m_DebugFullScreen = debugFullScreen;
|
|
return ref *thisPtr;
|
|
}
|
|
|
|
/// <summary>Set the light filter to use.</summary>
|
|
/// <param name="filter">The light filter to use</param>
|
|
/// <returns>A ref return to chain calls.</returns>
|
|
public ref AOVRequest SetLightFilter(DebugLightFilterMode filter)
|
|
{
|
|
m_LightFilterProperty = filter;
|
|
return ref *thisPtr;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Populate the debug display settings with the AOV data.
|
|
/// </summary>
|
|
/// <param name="debug">The debug display settings to fill.</param>
|
|
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");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Equality operator.
|
|
/// </summary>
|
|
/// <param name="obj">The AOV request to compare to.</param>
|
|
/// <returns>True if the provided AOV request is equal to this.</returns>
|
|
public override bool Equals(object obj)
|
|
{
|
|
return obj is AOVRequest && ((AOVRequest)obj) == this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Compares if two AOV requests have the same settings.
|
|
/// </summary>
|
|
/// <param name="a">The first AOVRequest to compare.</param>
|
|
/// <param name="b">The second AOVRequest to compare.</param>
|
|
/// <returns>True if the two AOV requests have the same settings.</returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Compares if two AOV requests have the same settings.
|
|
/// </summary>
|
|
/// <param name="a">The first AOVRequest to compare.</param>
|
|
/// <param name="b">The second AOVRequest to compare.</param>
|
|
/// <returns>True if the two AOV requests have not the same settings.</returns>
|
|
public static bool operator!=(AOVRequest a, AOVRequest b)
|
|
{
|
|
return !(a == b);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Computes a hash code for the AOV Request.
|
|
/// </summary>
|
|
/// <returns>A hash code for the AOV Request.</returns>
|
|
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;
|
|
}
|
|
}
|
|
}
|