Singularity/Library/PackageCache/com.unity.render-pipelines..../Editor/Lighting/ProbeVolume/ProbeVolumeBakingProcessSet...
2024-05-06 11:45:45 -07:00

93 lines
6.3 KiB
C#

using UnityEditor;
using UnityEngine;
namespace UnityEngine.Experimental.Rendering
{
[CustomPropertyDrawer(typeof(ProbeVolumeBakingProcessSettings))]
class ProbeVolumeBakingProcessSettingsDrawer : PropertyDrawer
{
static class Styles
{
public static readonly GUIContent enableDilation = new GUIContent("Enable Dilation", "Whether to enable dilation after the baking. Dilation will dilate valid probes data into invalid probes.");
public static readonly GUIContent dilationDistance = new GUIContent("Dilation Distance", "The distance used to pick neighbouring probes to dilate into the invalid probe.");
public static readonly GUIContent dilationValidity = new GUIContent("Dilation Validity Threshold", "The validity threshold used to identify invalid probes.");
public static readonly GUIContent dilationIterationCount = new GUIContent("Dilation Iteration Count", "The number of times the dilation process takes place.");
public static readonly GUIContent dilationSquaredDistanceWeighting = new GUIContent("Squared Distance Weighting", "Whether to weight neighbouring probe contribution using squared distance rather than linear distance.");
public static readonly GUIContent useVirtualOffset = EditorGUIUtility.TrTextContent("Use Virtual Offset", "Push invalid probes out of geometry. Please note, this feature is currently a proof of concept, it is fairly slow and not optimal in quality.");
public static readonly GUIContent virtualOffsetSearchMultiplier = EditorGUIUtility.TrTextContent("Search multiplier", "A multiplier to be applied on the distance between two probes to derive the search distance out of geometry.");
public static readonly GUIContent virtualOffsetBiasOutGeometry = EditorGUIUtility.TrTextContent("Bias out geometry", "Determines how much a probe is pushed out of the geometry on top of the distance to closest hit.");
public static readonly string dilationSettingsTitle = "Dilation Settings";
public static readonly string advancedTitle = "Advanced";
public static readonly string virtualOffsetSettingsTitle = "Virtual Offset Settings";
}
// Draw the property inside the given rect
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var dilationSettings = property.FindPropertyRelative("dilationSettings");
var virtualOffsetSettings = property.FindPropertyRelative("virtualOffsetSettings");
// Using BeginProperty / EndProperty on the parent property means that
// prefab override logic works on the entire property.
EditorGUI.BeginProperty(position, label, property);
property.serializedObject.Update();
DrawDilationSettings(dilationSettings);
EditorGUILayout.Space();
EditorGUILayout.Space();
DrawVirtualOffsetSettings(virtualOffsetSettings);
EditorGUI.EndProperty();
property.serializedObject.ApplyModifiedProperties();
}
void DrawDilationSettings(SerializedProperty dilationSettings)
{
var enableDilation = dilationSettings.FindPropertyRelative("enableDilation");
var maxDilationSampleDistance = dilationSettings.FindPropertyRelative("dilationDistance");
var dilationValidityThreshold = dilationSettings.FindPropertyRelative("dilationValidityThreshold");
float dilationValidityThresholdInverted = 1f - dilationValidityThreshold.floatValue;
var dilationIterations = dilationSettings.FindPropertyRelative("dilationIterations");
var dilationInvSquaredWeight = dilationSettings.FindPropertyRelative("squaredDistWeighting");
EditorGUILayout.LabelField(Styles.dilationSettingsTitle, EditorStyles.boldLabel);
EditorGUI.indentLevel++;
enableDilation.boolValue = EditorGUILayout.Toggle(Styles.enableDilation, enableDilation.boolValue);
EditorGUI.BeginDisabledGroup(!enableDilation.boolValue);
maxDilationSampleDistance.floatValue = Mathf.Max(EditorGUILayout.FloatField(Styles.dilationDistance, maxDilationSampleDistance.floatValue), 0);
dilationValidityThresholdInverted = EditorGUILayout.Slider(Styles.dilationValidity, dilationValidityThresholdInverted, 0f, 0.95f);
dilationValidityThreshold.floatValue = Mathf.Max(0.05f, 1.0f - dilationValidityThresholdInverted);
dilationIterations.intValue = EditorGUILayout.IntSlider(Styles.dilationIterationCount, dilationIterations.intValue, 1, 5);
dilationInvSquaredWeight.boolValue = EditorGUILayout.Toggle(Styles.dilationSquaredDistanceWeighting, dilationInvSquaredWeight.boolValue);
EditorGUI.indentLevel--;
EditorGUI.EndDisabledGroup();
// if (GUILayout.Button(EditorGUIUtility.TrTextContent("Refresh dilation"), EditorStyles.miniButton))
// {
// ProbeGIBaking.RevertDilation();
// ProbeGIBaking.PerformDilation();
// }
}
void DrawVirtualOffsetSettings(SerializedProperty virtualOffsetSettings)
{
var m_EnableVirtualOffset = virtualOffsetSettings.FindPropertyRelative("useVirtualOffset");
var m_VirtualOffsetGeometrySearchMultiplier = virtualOffsetSettings.FindPropertyRelative("searchMultiplier");
var m_VirtualOffsetBiasOutOfGeometry = virtualOffsetSettings.FindPropertyRelative("outOfGeoOffset");
EditorGUILayout.LabelField(Styles.virtualOffsetSettingsTitle, EditorStyles.boldLabel);
EditorGUI.indentLevel++;
m_EnableVirtualOffset.boolValue = EditorGUILayout.Toggle(Styles.useVirtualOffset, m_EnableVirtualOffset.boolValue);
EditorGUI.BeginDisabledGroup(!m_EnableVirtualOffset.boolValue);
m_VirtualOffsetGeometrySearchMultiplier.floatValue = Mathf.Clamp01(EditorGUILayout.FloatField(Styles.virtualOffsetSearchMultiplier, m_VirtualOffsetGeometrySearchMultiplier.floatValue));
m_VirtualOffsetBiasOutOfGeometry.floatValue = EditorGUILayout.FloatField(Styles.virtualOffsetBiasOutGeometry, m_VirtualOffsetBiasOutOfGeometry.floatValue);
EditorGUI.indentLevel--;
EditorGUI.EndDisabledGroup();
}
}
}