369 lines
17 KiB
C#
369 lines
17 KiB
C#
|
using UnityEngine;
|
||
|
using NameAndTooltip = UnityEngine.Rendering.DebugUI.Widget.NameAndTooltip;
|
||
|
|
||
|
namespace UnityEngine.Rendering.Universal
|
||
|
{
|
||
|
class DebugDisplaySettingsMaterial : IDebugDisplaySettingsData
|
||
|
{
|
||
|
#region Material validation
|
||
|
internal enum AlbedoDebugValidationPreset
|
||
|
{
|
||
|
DefaultLuminance,
|
||
|
BlackAcrylicPaint,
|
||
|
DarkSoil,
|
||
|
WornAsphalt,
|
||
|
DryClaySoil,
|
||
|
GreenGrass,
|
||
|
OldConcrete,
|
||
|
RedClayTile,
|
||
|
DrySand,
|
||
|
NewConcrete,
|
||
|
WhiteAcrylicPaint,
|
||
|
FreshSnow,
|
||
|
BlueSky,
|
||
|
Foliage,
|
||
|
}
|
||
|
|
||
|
struct AlbedoDebugValidationPresetData
|
||
|
{
|
||
|
public string name;
|
||
|
public Color color;
|
||
|
public float minLuminance;
|
||
|
public float maxLuminance;
|
||
|
}
|
||
|
|
||
|
AlbedoDebugValidationPresetData[] m_AlbedoDebugValidationPresetData =
|
||
|
{
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Default Luminance",
|
||
|
color = new Color(127f / 255f, 127f / 255f, 127f / 255f),
|
||
|
minLuminance = 0.01f,
|
||
|
maxLuminance = 0.90f
|
||
|
},
|
||
|
// colors taken from http://www.babelcolor.com/index_htm_files/ColorChecker_RGB_and_spectra.xls
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Black Acrylic Paint",
|
||
|
color = new Color(56f / 255f, 56f / 255f, 56f / 255f),
|
||
|
minLuminance = 0.03f,
|
||
|
maxLuminance = 0.07f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Dark Soil",
|
||
|
color = new Color(85f / 255f, 61f / 255f, 49f / 255f),
|
||
|
minLuminance = 0.05f,
|
||
|
maxLuminance = 0.14f
|
||
|
},
|
||
|
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Worn Asphalt",
|
||
|
color = new Color(91f / 255f, 91f / 255f, 91f / 255f),
|
||
|
minLuminance = 0.10f,
|
||
|
maxLuminance = 0.15f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Dry Clay Soil",
|
||
|
color = new Color(137f / 255f, 120f / 255f, 102f / 255f),
|
||
|
minLuminance = 0.15f,
|
||
|
maxLuminance = 0.35f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Green Grass",
|
||
|
color = new Color(123f / 255f, 131f / 255f, 74f / 255f),
|
||
|
minLuminance = 0.16f,
|
||
|
maxLuminance = 0.26f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Old Concrete",
|
||
|
color = new Color(135f / 255f, 136f / 255f, 131f / 255f),
|
||
|
minLuminance = 0.17f,
|
||
|
maxLuminance = 0.30f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Red Clay Tile",
|
||
|
color = new Color(197f / 255f, 125f / 255f, 100f / 255f),
|
||
|
minLuminance = 0.23f,
|
||
|
maxLuminance = 0.33f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Dry Sand",
|
||
|
color = new Color(177f / 255f, 167f / 255f, 132f / 255f),
|
||
|
minLuminance = 0.20f,
|
||
|
maxLuminance = 0.45f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "New Concrete",
|
||
|
color = new Color(185f / 255f, 182f / 255f, 175f / 255f),
|
||
|
minLuminance = 0.32f,
|
||
|
maxLuminance = 0.55f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "White Acrylic Paint",
|
||
|
color = new Color(227f / 255f, 227f / 255f, 227f / 255f),
|
||
|
minLuminance = 0.75f,
|
||
|
maxLuminance = 0.85f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Fresh Snow",
|
||
|
color = new Color(243f / 255f, 243f / 255f, 243f / 255f),
|
||
|
minLuminance = 0.85f,
|
||
|
maxLuminance = 0.95f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Blue Sky",
|
||
|
color = new Color(93f / 255f, 123f / 255f, 157f / 255f),
|
||
|
minLuminance = new Color(93f / 255f, 123f / 255f, 157f / 255f).linear.maxColorComponent - 0.05f,
|
||
|
maxLuminance = new Color(93f / 255f, 123f / 255f, 157f / 255f).linear.maxColorComponent + 0.05f
|
||
|
},
|
||
|
new AlbedoDebugValidationPresetData()
|
||
|
{
|
||
|
name = "Foliage",
|
||
|
color = new Color(91f / 255f, 108f / 255f, 65f / 255f),
|
||
|
minLuminance = new Color(91f / 255f, 108f / 255f, 65f / 255f).linear.maxColorComponent - 0.05f,
|
||
|
maxLuminance = new Color(91f / 255f, 108f / 255f, 65f / 255f).linear.maxColorComponent + 0.05f
|
||
|
},
|
||
|
};
|
||
|
|
||
|
AlbedoDebugValidationPreset m_AlbedoDebugValidationPreset;
|
||
|
internal AlbedoDebugValidationPreset albedoDebugValidationPreset
|
||
|
{
|
||
|
get => m_AlbedoDebugValidationPreset;
|
||
|
set
|
||
|
{
|
||
|
m_AlbedoDebugValidationPreset = value;
|
||
|
AlbedoDebugValidationPresetData presetData = m_AlbedoDebugValidationPresetData[(int)value];
|
||
|
AlbedoMinLuminance = presetData.minLuminance;
|
||
|
AlbedoMaxLuminance = presetData.maxLuminance;
|
||
|
AlbedoCompareColor = presetData.color;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal float AlbedoMinLuminance = 0.01f;
|
||
|
internal float AlbedoMaxLuminance = 0.90f;
|
||
|
|
||
|
float m_AlbedoHueTolerance = 0.104f;
|
||
|
internal float AlbedoHueTolerance
|
||
|
{
|
||
|
get => m_AlbedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance ? 1.0f : m_AlbedoHueTolerance;
|
||
|
private set => m_AlbedoHueTolerance = value;
|
||
|
}
|
||
|
|
||
|
float m_AlbedoSaturationTolerance = 0.214f;
|
||
|
internal float AlbedoSaturationTolerance
|
||
|
{
|
||
|
get => m_AlbedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance ? 1.0f : m_AlbedoSaturationTolerance;
|
||
|
private set => m_AlbedoSaturationTolerance = value;
|
||
|
}
|
||
|
|
||
|
internal Color AlbedoCompareColor = new Color(127f / 255f, 127f / 255f, 127f / 255f, 255f / 255f);
|
||
|
|
||
|
internal float MetallicMinValue = 0.0f;
|
||
|
internal float MetallicMaxValue = 0.9f;
|
||
|
|
||
|
internal DebugMaterialValidationMode MaterialValidationMode;
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
internal DebugMaterialMode DebugMaterialModeData { get; private set; }
|
||
|
internal DebugVertexAttributeMode DebugVertexAttributeIndexData { get; private set; }
|
||
|
|
||
|
static class Strings
|
||
|
{
|
||
|
public const string AlbedoSettingsContainerName = "Albedo Settings";
|
||
|
public const string MetallicSettingsContainerName = "Metallic Settings";
|
||
|
|
||
|
public static readonly NameAndTooltip MaterialOverride = new() { name = "Material Override", tooltip = "Use the drop-down to select a Material property to visualize on every GameObject on screen." };
|
||
|
public static readonly NameAndTooltip VertexAttribute = new() { name = "Vertex Attribute", tooltip = "Use the drop-down to select a 3D GameObject attribute, like Texture Coordinates or Vertex Color, to visualize on screen." };
|
||
|
public static readonly NameAndTooltip MaterialValidationMode = new() { name = "Material Validation Mode", tooltip = "Debug and validate material properties." };
|
||
|
public static readonly NameAndTooltip ValidationPreset = new() { name = "Validation Preset", tooltip = "Validate using a list of preset surfaces and inputs based on real-world surfaces." };
|
||
|
public static readonly NameAndTooltip AlbedoMinLuminance = new() { name = "Min Luminance", tooltip = "Any values set below this field are invalid and appear red on screen." };
|
||
|
public static readonly NameAndTooltip AlbedoMaxLuminance = new() { name = "Max Luminance", tooltip = "Any values set above this field are invalid and appear blue on screen." };
|
||
|
public static readonly NameAndTooltip AlbedoHueTolerance = new() { name = "Hue Tolerance", tooltip = "Validate a material based on a specific hue." };
|
||
|
public static readonly NameAndTooltip AlbedoSaturationTolerance = new() { name = "Saturation Tolerance", tooltip = "Validate a material based on a specific Saturation." };
|
||
|
public static readonly NameAndTooltip MetallicMinValue = new() { name = "Min Value", tooltip = "Any values set below this field are invalid and appear red on screen." };
|
||
|
public static readonly NameAndTooltip MetallicMaxValue = new() { name = "Max Value", tooltip = "Any values set above this field are invalid and appear blue on screen." };
|
||
|
}
|
||
|
|
||
|
internal static class WidgetFactory
|
||
|
{
|
||
|
internal static DebugUI.Widget CreateMaterialOverride(DebugDisplaySettingsMaterial data) => new DebugUI.EnumField
|
||
|
{
|
||
|
nameAndTooltip = Strings.MaterialOverride,
|
||
|
autoEnum = typeof(DebugMaterialMode),
|
||
|
getter = () => (int)data.DebugMaterialModeData,
|
||
|
setter = (value) => { },
|
||
|
getIndex = () => (int)data.DebugMaterialModeData,
|
||
|
setIndex = (value) => data.DebugMaterialModeData = (DebugMaterialMode)value
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateVertexAttribute(DebugDisplaySettingsMaterial data) => new DebugUI.EnumField
|
||
|
{
|
||
|
nameAndTooltip = Strings.VertexAttribute,
|
||
|
autoEnum = typeof(DebugVertexAttributeMode),
|
||
|
getter = () => (int)data.DebugVertexAttributeIndexData,
|
||
|
setter = (value) => { },
|
||
|
getIndex = () => (int)data.DebugVertexAttributeIndexData,
|
||
|
setIndex = (value) => data.DebugVertexAttributeIndexData = (DebugVertexAttributeMode)value
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateMaterialValidationMode(DebugDisplaySettingsMaterial data) => new DebugUI.EnumField
|
||
|
{
|
||
|
nameAndTooltip = Strings.MaterialValidationMode,
|
||
|
autoEnum = typeof(DebugMaterialValidationMode),
|
||
|
getter = () => (int)data.MaterialValidationMode,
|
||
|
setter = (value) => { },
|
||
|
getIndex = () => (int)data.MaterialValidationMode,
|
||
|
setIndex = (value) => data.MaterialValidationMode = (DebugMaterialValidationMode)value,
|
||
|
onValueChanged = (_, _) => DebugManager.instance.ReDrawOnScreenDebug()
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateAlbedoPreset(DebugDisplaySettingsMaterial data) => new DebugUI.EnumField
|
||
|
{
|
||
|
nameAndTooltip = Strings.ValidationPreset,
|
||
|
autoEnum = typeof(AlbedoDebugValidationPreset),
|
||
|
getter = () => (int)data.albedoDebugValidationPreset,
|
||
|
setter = (value) => { },
|
||
|
getIndex = () => (int)data.albedoDebugValidationPreset,
|
||
|
setIndex = (value) => data.albedoDebugValidationPreset = (AlbedoDebugValidationPreset)value,
|
||
|
onValueChanged = (_, _) => DebugManager.instance.ReDrawOnScreenDebug()
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateAlbedoMinLuminance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField
|
||
|
{
|
||
|
nameAndTooltip = Strings.AlbedoMinLuminance,
|
||
|
getter = () => data.AlbedoMinLuminance,
|
||
|
setter = (value) => data.AlbedoMinLuminance = value,
|
||
|
incStep = 0.01f
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateAlbedoMaxLuminance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField
|
||
|
{
|
||
|
nameAndTooltip = Strings.AlbedoMaxLuminance,
|
||
|
getter = () => data.AlbedoMaxLuminance,
|
||
|
setter = (value) => data.AlbedoMaxLuminance = value,
|
||
|
incStep = 0.01f
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateAlbedoHueTolerance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField
|
||
|
{
|
||
|
nameAndTooltip = Strings.AlbedoHueTolerance,
|
||
|
getter = () => data.AlbedoHueTolerance,
|
||
|
setter = (value) => data.AlbedoHueTolerance = value,
|
||
|
incStep = 0.01f,
|
||
|
isHiddenCallback = () => data.albedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateAlbedoSaturationTolerance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField
|
||
|
{
|
||
|
nameAndTooltip = Strings.AlbedoSaturationTolerance,
|
||
|
getter = () => data.AlbedoSaturationTolerance,
|
||
|
setter = (value) => data.AlbedoSaturationTolerance = value,
|
||
|
incStep = 0.01f,
|
||
|
isHiddenCallback = () => data.albedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateMetallicMinValue(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField
|
||
|
{
|
||
|
nameAndTooltip = Strings.MetallicMinValue,
|
||
|
getter = () => data.MetallicMinValue,
|
||
|
setter = (value) => data.MetallicMinValue = value,
|
||
|
incStep = 0.01f
|
||
|
};
|
||
|
|
||
|
internal static DebugUI.Widget CreateMetallicMaxValue(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField
|
||
|
{
|
||
|
nameAndTooltip = Strings.MetallicMaxValue,
|
||
|
getter = () => data.MetallicMaxValue,
|
||
|
setter = (value) => data.MetallicMaxValue = value,
|
||
|
incStep = 0.01f
|
||
|
};
|
||
|
}
|
||
|
|
||
|
private class SettingsPanel : DebugDisplaySettingsPanel
|
||
|
{
|
||
|
public override string PanelName => "Material";
|
||
|
public SettingsPanel(DebugDisplaySettingsMaterial data)
|
||
|
{
|
||
|
AddWidget(DebugDisplaySettingsCommon.WidgetFactory.CreateMissingDebugShadersWarning());
|
||
|
|
||
|
AddWidget(new DebugUI.Foldout
|
||
|
{
|
||
|
displayName = "Material Filters",
|
||
|
isHeader = true,
|
||
|
opened = true,
|
||
|
children =
|
||
|
{
|
||
|
WidgetFactory.CreateMaterialOverride(data),
|
||
|
WidgetFactory.CreateVertexAttribute(data)
|
||
|
}
|
||
|
});
|
||
|
AddWidget(new DebugUI.Foldout
|
||
|
{
|
||
|
displayName = "Material Validation",
|
||
|
isHeader = true,
|
||
|
opened = true,
|
||
|
children =
|
||
|
{
|
||
|
WidgetFactory.CreateMaterialValidationMode(data),
|
||
|
new DebugUI.Container()
|
||
|
{
|
||
|
displayName = Strings.AlbedoSettingsContainerName,
|
||
|
isHiddenCallback = () => data.MaterialValidationMode != DebugMaterialValidationMode.Albedo,
|
||
|
children =
|
||
|
{
|
||
|
WidgetFactory.CreateAlbedoPreset(data),
|
||
|
WidgetFactory.CreateAlbedoMinLuminance(data),
|
||
|
WidgetFactory.CreateAlbedoMaxLuminance(data),
|
||
|
WidgetFactory.CreateAlbedoHueTolerance(data),
|
||
|
WidgetFactory.CreateAlbedoSaturationTolerance(data)
|
||
|
}
|
||
|
},
|
||
|
new DebugUI.Container()
|
||
|
{
|
||
|
displayName = Strings.MetallicSettingsContainerName,
|
||
|
isHiddenCallback = () => data.MaterialValidationMode != DebugMaterialValidationMode.Metallic,
|
||
|
children =
|
||
|
{
|
||
|
WidgetFactory.CreateMetallicMinValue(data),
|
||
|
WidgetFactory.CreateMetallicMaxValue(data)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#region IDebugDisplaySettingsData
|
||
|
public bool AreAnySettingsActive =>
|
||
|
(DebugMaterialModeData != DebugMaterialMode.None) ||
|
||
|
(DebugVertexAttributeIndexData != DebugVertexAttributeMode.None) ||
|
||
|
(MaterialValidationMode != DebugMaterialValidationMode.None);
|
||
|
public bool IsPostProcessingAllowed => !AreAnySettingsActive;
|
||
|
public bool IsLightingActive => !AreAnySettingsActive;
|
||
|
|
||
|
public bool TryGetScreenClearColor(ref Color color)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public IDebugDisplaySettingsPanelDisposable CreatePanel()
|
||
|
{
|
||
|
return new SettingsPanel(this);
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
}
|
||
|
}
|