You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
11 KiB
243 lines
11 KiB
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
|
|
namespace UnityEditor.Rendering.HighDefinition
|
|
{
|
|
[CanEditMultipleObjects]
|
|
[CustomEditor(typeof(DiffusionProfileSettings))]
|
|
partial class DiffusionProfileSettingsEditor : Editor
|
|
{
|
|
Material m_ProfileMaterial;
|
|
Material m_TransmittanceMaterial;
|
|
|
|
List<DiffusionProfileSettings> m_DiffusionProfileSettingsTargets;
|
|
SerializedDiffusionProfileSettings m_SerializedDiffusionProfileSettings;
|
|
bool m_MultipleObjectSelected;
|
|
|
|
void OnEnable()
|
|
{
|
|
// These shaders don't need to be reference by RenderPipelineResource as they are not use at runtime
|
|
m_ProfileMaterial = CoreUtils.CreateEngineMaterial("Hidden/HDRP/DrawDiffusionProfile");
|
|
m_TransmittanceMaterial = CoreUtils.CreateEngineMaterial("Hidden/HDRP/DrawTransmittanceGraph");
|
|
|
|
m_DiffusionProfileSettingsTargets = targets.Cast<DiffusionProfileSettings>().ToList();
|
|
m_SerializedDiffusionProfileSettings = new SerializedDiffusionProfileSettings((DiffusionProfileSettings)target, serializedObject);
|
|
m_MultipleObjectSelected = targets.Length > 1;
|
|
|
|
Undo.undoRedoPerformed += UpdateProfile;
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
CoreUtils.Destroy(m_ProfileMaterial);
|
|
CoreUtils.Destroy(m_TransmittanceMaterial);
|
|
|
|
m_SerializedDiffusionProfileSettings.Dispose();
|
|
|
|
Undo.undoRedoPerformed -= UpdateProfile;
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
serializedObject.Update();
|
|
|
|
DrawScattering(m_MultipleObjectSelected);
|
|
DrawIORAndScale();
|
|
DrawSSS();
|
|
DrawTransmission();
|
|
|
|
//NOTE: We manually apply changes and update all properties every time to fix a case when User click Reset on Component.
|
|
//Unfortunately there is no way to receive callback from that Reset so only way to have correct Preview is to update target every time.
|
|
foreach (var settings in m_DiffusionProfileSettingsTargets)
|
|
{
|
|
UpdateProfile(settings);
|
|
}
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
if (!m_MultipleObjectSelected)
|
|
RenderPreview();
|
|
}
|
|
|
|
void DrawScattering(bool multipleObjectSelected)
|
|
{
|
|
EditorGUILayout.LabelField(Styles.scatteringLabel, EditorStyles.boldLabel);
|
|
using (new EditorGUI.IndentLevelScope())
|
|
{
|
|
using (new EditorGUI.MixedValueScope(m_SerializedDiffusionProfileSettings.scatteringDistance.hasMultipleDifferentValues))
|
|
using (var changeCheckScope = new EditorGUI.ChangeCheckScope())
|
|
{
|
|
// For some reason the HDR picker is in gamma space, so convert to maintain same visual
|
|
var color = EditorGUILayout.ColorField(Styles.profileScatteringColor,
|
|
m_SerializedDiffusionProfileSettings.scatteringDistance.colorValue.gamma, true, false, false);
|
|
if (changeCheckScope.changed)
|
|
m_SerializedDiffusionProfileSettings.scatteringDistance.colorValue = color.linear;
|
|
}
|
|
|
|
using (new EditorGUI.IndentLevelScope())
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.scatteringDistanceMultiplier,
|
|
Styles.profileScatteringDistanceMultiplier);
|
|
|
|
if (!multipleObjectSelected)
|
|
{
|
|
using (new EditorGUI.DisabledScope(true))
|
|
EditorGUILayout.FloatField(Styles.profileMaxRadius, m_SerializedDiffusionProfileSettings.objReference.filterRadius);
|
|
}
|
|
}
|
|
|
|
EditorGUILayout.Space();
|
|
}
|
|
|
|
void DrawIORAndScale()
|
|
{
|
|
EditorGUILayout.Slider(m_SerializedDiffusionProfileSettings.ior, 1.0f, 2.0f, Styles.profileIor);
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.worldScale, Styles.profileWorldScale);
|
|
EditorGUILayout.Space();
|
|
}
|
|
|
|
internal void DualSliderWithFields(GUIContent label, SerializedProperty values, float minLimit, float maxLimit)
|
|
{
|
|
const float fieldWidth = 65, padding = 4;
|
|
var rect = EditorGUILayout.GetControlRect();
|
|
rect = EditorGUI.PrefixLabel(rect, label);
|
|
|
|
float slider;
|
|
Vector2 value = values.vector2Value;
|
|
float midLevel = (minLimit + maxLimit) * 0.5f;
|
|
|
|
EditorGUI.showMixedValue = values.hasMultipleDifferentValues;
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
if (rect.width >= 3 * fieldWidth + 2 * padding)
|
|
{
|
|
rect.xMin -= 15 * EditorGUI.indentLevel;
|
|
var tmpRect = new Rect(rect);
|
|
tmpRect.width = fieldWidth;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
slider = EditorGUI.FloatField(tmpRect, value.x);
|
|
if (EditorGUI.EndChangeCheck())
|
|
value.x = Mathf.Clamp(slider, minLimit, midLevel);
|
|
|
|
tmpRect.x = rect.xMax - fieldWidth;
|
|
EditorGUI.BeginChangeCheck();
|
|
slider = EditorGUI.FloatField(tmpRect, value.y);
|
|
if (EditorGUI.EndChangeCheck())
|
|
value.y = Mathf.Clamp(slider, midLevel, maxLimit);
|
|
|
|
tmpRect.xMin = rect.xMin + (fieldWidth + padding);
|
|
tmpRect.xMax = rect.xMax - (EditorGUIUtility.fieldWidth + padding);
|
|
rect = tmpRect;
|
|
}
|
|
|
|
rect.width = (rect.width - padding) * 0.5f;
|
|
EditorGUI.BeginChangeCheck();
|
|
slider = GUI.HorizontalSlider(rect, value.x, minLimit, midLevel);
|
|
if (EditorGUI.EndChangeCheck())
|
|
value.x = slider;
|
|
|
|
rect.x += rect.width + padding - 1;
|
|
EditorGUI.BeginChangeCheck();
|
|
slider = GUI.HorizontalSlider(rect, value.y, midLevel, maxLimit);
|
|
if (EditorGUI.EndChangeCheck())
|
|
value.y = slider;
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
values.vector2Value = value;
|
|
EditorGUI.showMixedValue = false;
|
|
}
|
|
|
|
void DrawSSS()
|
|
{
|
|
EditorGUILayout.LabelField(Styles.subsurfaceScatteringLabel, EditorStyles.boldLabel);
|
|
|
|
using (new EditorGUI.IndentLevelScope())
|
|
{
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.texturingMode);
|
|
DualSliderWithFields(Styles.smoothnessMultipliers, m_SerializedDiffusionProfileSettings.smoothnessMultipliers, 0.0f, 2.0f);
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.lobeMix);
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.diffusePower);
|
|
if (HDRenderPipeline.currentAsset == null || HDRenderPipeline.currentAsset.currentPlatformRenderPipelineSettings.subsurfaceScatteringAttenuation)
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.borderAttenuationColor);
|
|
}
|
|
|
|
EditorGUILayout.Space();
|
|
}
|
|
|
|
void DrawTransmission()
|
|
{
|
|
EditorGUILayout.LabelField(Styles.transmissionLabel, EditorStyles.boldLabel);
|
|
using (new EditorGUI.IndentLevelScope())
|
|
{
|
|
var transmissionModeMixedValues = m_SerializedDiffusionProfileSettings.transmissionMode.hasMultipleDifferentValues;
|
|
using (new EditorGUI.MixedValueScope(transmissionModeMixedValues))
|
|
using (var changeCheckScope = new EditorGUI.ChangeCheckScope())
|
|
{
|
|
var previousTransmissionMode = transmissionModeMixedValues ? int.MinValue : m_SerializedDiffusionProfileSettings.transmissionMode.intValue;
|
|
var newTransmissionMode = EditorGUILayout.EnumPopup(Styles.profileTransmissionMode, (DiffusionProfile.TransmissionMode)previousTransmissionMode);
|
|
if (changeCheckScope.changed)
|
|
m_SerializedDiffusionProfileSettings.transmissionMode.intValue = (int)(DiffusionProfile.TransmissionMode)newTransmissionMode;
|
|
}
|
|
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.transmissionTint, Styles.profileTransmissionTint);
|
|
EditorGUILayout.PropertyField(m_SerializedDiffusionProfileSettings.thicknessRemap, Styles.profileMinMaxThickness);
|
|
|
|
if (!m_SerializedDiffusionProfileSettings.thicknessRemap.hasMultipleDifferentValues)
|
|
{
|
|
using (var changeCheckScope = new EditorGUI.ChangeCheckScope())
|
|
{
|
|
var thicknessRemap = m_SerializedDiffusionProfileSettings.thicknessRemap.vector2Value;
|
|
EditorGUILayout.MinMaxSlider(Styles.profileThicknessRemap, ref thicknessRemap.x, ref thicknessRemap.y, 0f, 50f);
|
|
if (changeCheckScope.changed)
|
|
m_SerializedDiffusionProfileSettings.thicknessRemap.vector2Value = thicknessRemap;
|
|
}
|
|
}
|
|
}
|
|
|
|
EditorGUILayout.Space();
|
|
}
|
|
|
|
void RenderPreview()
|
|
{
|
|
EditorGUILayout.LabelField(Styles.profilePreview0, Styles.miniBoldButton);
|
|
EditorGUILayout.LabelField(Styles.profilePreview1, EditorStyles.centeredGreyMiniLabel);
|
|
EditorGUILayout.Space();
|
|
|
|
var obj = m_SerializedDiffusionProfileSettings.objReference;
|
|
var radius = obj.filterRadius;
|
|
var shape = obj.shapeParam;
|
|
|
|
m_ProfileMaterial.SetFloat(HDShaderIDs._MaxRadius, radius);
|
|
m_ProfileMaterial.SetVector(HDShaderIDs._ShapeParam, shape);
|
|
|
|
// Draw the profile.
|
|
EditorGUI.DrawPreviewTexture(GUILayoutUtility.GetRect(256f, 256f), m_SerializedDiffusionProfileSettings.profileRT, m_ProfileMaterial, ScaleMode.ScaleToFit, 1f);
|
|
|
|
EditorGUILayout.Space();
|
|
EditorGUILayout.LabelField(Styles.transmittancePreview0, Styles.miniBoldButton);
|
|
EditorGUILayout.LabelField(Styles.transmittancePreview1, EditorStyles.centeredGreyMiniLabel);
|
|
EditorGUILayout.Space();
|
|
|
|
m_TransmittanceMaterial.SetVector(HDShaderIDs._ShapeParam, shape);
|
|
m_TransmittanceMaterial.SetVector(HDShaderIDs._TransmissionTint, obj.transmissionTint);
|
|
m_TransmittanceMaterial.SetVector(HDShaderIDs._ThicknessRemap, obj.thicknessRemap);
|
|
|
|
// Draw the transmittance graph.
|
|
EditorGUI.DrawPreviewTexture(GUILayoutUtility.GetRect(16f, 16f), m_SerializedDiffusionProfileSettings.transmittanceRT, m_TransmittanceMaterial, ScaleMode.ScaleToFit, 16f);
|
|
}
|
|
|
|
void UpdateProfile()
|
|
{
|
|
UpdateProfile(m_SerializedDiffusionProfileSettings.settings);
|
|
}
|
|
|
|
void UpdateProfile(DiffusionProfileSettings settings)
|
|
{
|
|
settings.profile.Validate();
|
|
settings.UpdateCache();
|
|
}
|
|
}
|
|
}
|