2021-09-09 20:42:29 -04:00

128 lines
6.1 KiB
C#

using UnityEngine.Rendering.HighDefinition;
using System;
using Object = UnityEngine.Object;
namespace UnityEditor.Rendering.HighDefinition
{
class SerializedFrameSettings
{
SerializedProperty m_RootData;
SerializedProperty m_RootOverrides;
SerializedBitArray128 m_BitDatas;
SerializedBitArray128 m_BitOverrides;
public SerializedProperty sssQualityMode;
public SerializedProperty sssQualityLevel;
public SerializedProperty sssCustomSampleBudget;
public SerializedProperty lodBias;
public SerializedProperty lodBiasMode;
public SerializedProperty lodBiasQualityLevel;
public SerializedProperty maximumLODLevel;
public SerializedProperty maximumLODLevelMode;
public SerializedProperty maximumLODLevelQualityLevel;
public SerializedProperty materialQuality;
public SerializedObject serializedObject => m_RootData.serializedObject;
public LitShaderMode? litShaderMode
{
get
{
bool? val = IsEnabled(FrameSettingsField.LitShaderMode);
return val == null
? (LitShaderMode?)null
: val.Value == true
? LitShaderMode.Deferred
: LitShaderMode.Forward;
}
set => SetEnabled(FrameSettingsField.LitShaderMode, value == LitShaderMode.Deferred);
}
public bool? IsEnabled(FrameSettingsField field)
=> HaveMultipleValue(field) ? (bool?)null : m_BitDatas.GetBitAt((uint)field);
public void SetEnabled(FrameSettingsField field, bool value)
=> m_BitDatas.SetBitAt((uint)field, value);
public bool HaveMultipleValue(FrameSettingsField field)
=> m_BitDatas.HasBitMultipleDifferentValue((uint)field);
public bool GetOverrides(FrameSettingsField field)
=> m_BitOverrides?.GetBitAt((uint)field) ?? false; //rootOverride can be null in case of hdrpAsset defaults
public void SetOverrides(FrameSettingsField field, bool value)
=> m_BitOverrides?.SetBitAt((uint)field, value); //rootOverride can be null in case of hdrpAsset defaults
public bool HaveMultipleOverride(FrameSettingsField field)
=> m_BitOverrides?.HasBitMultipleDifferentValue((uint)field) ?? false;
ref FrameSettings GetData(Object obj)
{
if (obj is HDAdditionalCameraData)
return ref (obj as HDAdditionalCameraData).renderingPathCustomFrameSettings;
if (obj is HDProbe)
return ref (obj as HDProbe).frameSettings;
if (obj is HDRenderPipelineAsset)
switch (HDRenderPipelineUI.selectedFrameSettings)
{
case HDRenderPipelineUI.SelectedFrameSettings.Camera:
return ref (obj as HDRenderPipelineAsset).GetDefaultFrameSettings(FrameSettingsRenderType.Camera);
case HDRenderPipelineUI.SelectedFrameSettings.BakedOrCustomReflection:
return ref (obj as HDRenderPipelineAsset).GetDefaultFrameSettings(FrameSettingsRenderType.CustomOrBakedReflection);
case HDRenderPipelineUI.SelectedFrameSettings.RealtimeReflection:
return ref (obj as HDRenderPipelineAsset).GetDefaultFrameSettings(FrameSettingsRenderType.RealtimeReflection);
default:
throw new System.ArgumentException("Unknown kind of HDRenderPipelineUI.SelectedFrameSettings");
}
throw new System.ArgumentException("Unknown kind of object");
}
FrameSettingsOverrideMask? GetMask(Object obj)
{
if (obj is HDAdditionalCameraData)
return (obj as HDAdditionalCameraData).renderingPathCustomFrameSettingsOverrideMask;
if (obj is HDProbe)
return (obj as HDProbe).frameSettingsOverrideMask;
if (obj is HDRenderPipelineAsset)
return null;
throw new System.ArgumentException("Unknown kind of object");
}
public SerializedFrameSettings(SerializedProperty rootData, SerializedProperty rootOverrides)
{
m_RootData = rootData;
m_RootOverrides = rootOverrides;
m_BitDatas = rootData.FindPropertyRelative("bitDatas").ToSerializeBitArray128();
m_BitOverrides = rootOverrides?.FindPropertyRelative("mask").ToSerializeBitArray128(); //rootOverride can be null in case of hdrpAsset defaults
sssQualityMode = rootData.FindPropertyRelative("sssQualityMode");
sssQualityLevel = rootData.FindPropertyRelative("sssQualityLevel");
sssCustomSampleBudget = rootData.FindPropertyRelative("sssCustomSampleBudget");
lodBias = rootData.FindPropertyRelative("lodBias");
lodBiasMode = rootData.FindPropertyRelative("lodBiasMode");
lodBiasQualityLevel = rootData.FindPropertyRelative("lodBiasQualityLevel");
maximumLODLevel = rootData.FindPropertyRelative("maximumLODLevel");
maximumLODLevelMode = rootData.FindPropertyRelative("maximumLODLevelMode");
maximumLODLevelQualityLevel = rootData.FindPropertyRelative("maximumLODLevelQualityLevel");
materialQuality = rootData.Find((FrameSettings s) => s.materialQuality);
}
public struct TitleDrawingScope : IDisposable
{
bool hasOverride;
public TitleDrawingScope(UnityEngine.Rect rect, UnityEngine.GUIContent label, SerializedFrameSettings serialized)
{
EditorGUI.BeginProperty(rect, label, serialized.m_RootData);
hasOverride = serialized.m_BitOverrides != null;
if (hasOverride)
EditorGUI.BeginProperty(rect, label, serialized.m_RootOverrides);
}
void IDisposable.Dispose()
{
EditorGUI.EndProperty();
if (hasOverride)
EditorGUI.EndProperty();
}
}
}
}