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.
178 lines
8.6 KiB
178 lines
8.6 KiB
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace UnityEditor.Rendering
|
|
{
|
|
using CED = CoreEditorDrawer<SerializedProbeVolume>;
|
|
|
|
static partial class ProbeVolumeUI
|
|
{
|
|
internal static readonly CED.IDrawer Inspector = CED.Group(
|
|
CED.Group(
|
|
Drawer_VolumeContent,
|
|
Drawer_RebakeWarning // This needs to be last to avoid popping in the UI
|
|
)
|
|
);
|
|
|
|
static void Drawer_BakeToolBar(SerializedProbeVolume serialized, Editor owner)
|
|
{
|
|
if (!ProbeReferenceVolume.instance.isInitialized) return;
|
|
|
|
ProbeVolume pv = (serialized.serializedObject.targetObject as ProbeVolume);
|
|
|
|
GIContributors.ContributorFilter? filter = null;
|
|
|
|
if (GUILayout.Button(EditorGUIUtility.TrTextContent("Fit to All Scenes", "Fit this Adaptive Probe Volume to cover all loaded Scenes. "), EditorStyles.miniButton))
|
|
filter = GIContributors.ContributorFilter.All;
|
|
if (GUILayout.Button(EditorGUIUtility.TrTextContent("Fit to Scene", "Fit this Adaptive Probe Volume to the renderers in the same Scene."), EditorStyles.miniButton))
|
|
filter = GIContributors.ContributorFilter.Scene;
|
|
if (GUILayout.Button(EditorGUIUtility.TrTextContent("Fit to Selection", "Fits this Adaptive Probe Volume to the selected renderer(s). Lock the Inspector to make additional selections."), EditorStyles.miniButton))
|
|
filter = GIContributors.ContributorFilter.Selection;
|
|
|
|
if (filter.HasValue)
|
|
{
|
|
Undo.RecordObject(pv.transform, "Fitting Adaptive Probe Volume");
|
|
|
|
// Get minBrickSize from scene profile if available
|
|
float minBrickSize = ProbeReferenceVolume.instance.MinBrickSize();
|
|
if (ProbeReferenceVolume.instance.TryGetBakingSetForLoadedScene(pv.gameObject.scene, out var profile))
|
|
minBrickSize = profile.minBrickSize;
|
|
|
|
var bounds = pv.ComputeBounds(filter.Value, pv.gameObject.scene);
|
|
pv.transform.position = bounds.center;
|
|
serialized.size.vector3Value = Vector3.Max(bounds.size + new Vector3(minBrickSize, minBrickSize, minBrickSize), Vector3.zero);
|
|
}
|
|
}
|
|
|
|
static int s_SubdivisionRangeID = "SubdivisionRange".GetHashCode();
|
|
|
|
static void SubdivisionRange(SerializedProbeVolume serialized, int maxSimplicationLevel, float minDistance)
|
|
{
|
|
var rect = EditorGUILayout.GetControlRect();
|
|
EditorGUI.BeginProperty(rect, Styles.s_DistanceBetweenProbes, serialized.minSubdivisionLevel);
|
|
EditorGUI.BeginProperty(rect, Styles.s_DistanceBetweenProbes, serialized.maxSubdivisionLevel);
|
|
EditorGUI.BeginProperty(rect, Styles.s_DistanceBetweenProbes, serialized.overridesSubdivision);
|
|
|
|
var checkbox = new Rect(rect) { width = 14 + 9, x = rect.x + 2 };
|
|
serialized.overridesSubdivision.boolValue = EditorGUI.Toggle(checkbox, serialized.overridesSubdivision.boolValue);
|
|
|
|
using (new EditorGUI.DisabledScope(!serialized.overridesSubdivision.boolValue))
|
|
{
|
|
EditorGUIUtility.labelWidth -= checkbox.width;
|
|
rect.xMin = checkbox.xMax - 4;
|
|
int id = GUIUtility.GetControlID(s_SubdivisionRangeID, FocusType.Keyboard, rect);
|
|
rect = EditorGUI.PrefixLabel(rect, id, Styles.s_DistanceBetweenProbes);
|
|
EditorGUIUtility.labelWidth += checkbox.width;
|
|
|
|
// Make sure data is valid
|
|
float maxLevelOverride = Mathf.Min(serialized.maxSubdivisionLevel.intValue, maxSimplicationLevel);
|
|
float minLevelOverride = Mathf.Min(serialized.minSubdivisionLevel.intValue, maxLevelOverride);
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
EditorGUI.MinMaxSlider(rect, ref minLevelOverride, ref maxLevelOverride, 0, maxSimplicationLevel);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
GUIUtility.keyboardControl = id;
|
|
|
|
serialized.minSubdivisionLevel.intValue = Mathf.RoundToInt(minLevelOverride);
|
|
serialized.maxSubdivisionLevel.intValue = Mathf.RoundToInt(maxLevelOverride);
|
|
}
|
|
|
|
ProbeVolumeLightingTab.DrawSimplificationLevelsMarkers(rect, minDistance, 0, maxSimplicationLevel,
|
|
serialized.minSubdivisionLevel.intValue, serialized.maxSubdivisionLevel.intValue);
|
|
}
|
|
|
|
EditorGUI.EndProperty();
|
|
EditorGUI.EndProperty();
|
|
EditorGUI.EndProperty();
|
|
}
|
|
|
|
static void Drawer_VolumeContent(SerializedProbeVolume serialized, Editor owner)
|
|
{
|
|
ProbeVolume pv = (serialized.serializedObject.targetObject as ProbeVolume);
|
|
|
|
ProbeReferenceVolume.instance.TryGetBakingSetForLoadedScene(pv.gameObject.scene, out var bakingSet);
|
|
if (bakingSet == null)
|
|
bakingSet = ProbeVolumeLightingTab.GetSingleSceneSet(pv.gameObject.scene);
|
|
|
|
EditorGUILayout.PropertyField(serialized.mode);
|
|
if (serialized.mode.intValue == (int)ProbeVolume.Mode.Local)
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
EditorGUILayout.PropertyField(serialized.size, Styles.s_Size);
|
|
if (EditorGUI.EndChangeCheck())
|
|
serialized.size.vector3Value = Vector3.Max(serialized.size.vector3Value, Vector3.zero);
|
|
|
|
Drawer_BakeToolBar(serialized, owner);
|
|
}
|
|
|
|
EditorGUILayout.Space();
|
|
|
|
EditorGUILayout.LabelField("Subdivision Override", EditorStyles.boldLabel);
|
|
bool isFreezingPlacement = bakingSet != null && bakingSet.freezePlacement && AdaptiveProbeVolumes.CanFreezePlacement();
|
|
using (new EditorGUI.DisabledScope(isFreezingPlacement))
|
|
{
|
|
// Get settings from scene profile if available
|
|
int simplificationLevels = ProbeReferenceVolume.instance.GetMaxSubdivision() - 1;
|
|
float minDistance = ProbeReferenceVolume.instance.MinDistanceBetweenProbes();
|
|
if (bakingSet != null)
|
|
{
|
|
simplificationLevels = bakingSet.simplificationLevels;
|
|
minDistance = bakingSet.minDistanceBetweenProbes;
|
|
}
|
|
if (simplificationLevels < 0)
|
|
{
|
|
simplificationLevels = 5;
|
|
minDistance = 1;
|
|
}
|
|
|
|
SubdivisionRange(serialized, simplificationLevels, minDistance);
|
|
}
|
|
|
|
if (isFreezingPlacement)
|
|
{
|
|
CoreEditorUtils.DrawFixMeBox("The placement is frozen in the baking settings. To change these values uncheck the Freeze Placement in the Adaptive Probe Volumes tab of the Lighting Window.", MessageType.Info, "Open", () =>
|
|
{
|
|
ProbeVolumeLightingTab.OpenBakingSet(bakingSet);
|
|
});
|
|
}
|
|
|
|
EditorGUILayout.LabelField("Geometry Settings", EditorStyles.boldLabel);
|
|
|
|
EditorGUILayout.PropertyField(serialized.overrideRendererFilters, Styles.s_OverrideRendererFilters);
|
|
if (serialized.overrideRendererFilters.boolValue)
|
|
{
|
|
EditorGUI.indentLevel++;
|
|
EditorGUILayout.PropertyField(serialized.objectLayerMask, Styles.s_ObjectLayerMask);
|
|
EditorGUILayout.PropertyField(serialized.minRendererVolumeSize, Styles.s_MinRendererVolumeSize);
|
|
EditorGUI.indentLevel--;
|
|
}
|
|
|
|
EditorGUILayout.PropertyField(serialized.fillEmptySpaces);
|
|
|
|
if (bakingSet == null)
|
|
{
|
|
EditorGUILayout.Space();
|
|
EditorGUILayout.HelpBox("The scene this Adaptive Probe Volume is part of does not belong to any Baking Set.", MessageType.Warning);
|
|
}
|
|
|
|
EditorGUILayout.Space();
|
|
using (new EditorGUI.DisabledScope(bakingSet == null))
|
|
{
|
|
ProbeVolumeLightingTab.BakeAPVButton();
|
|
}
|
|
}
|
|
|
|
static void Drawer_RebakeWarning(SerializedProbeVolume serialized, Editor owner)
|
|
{
|
|
ProbeVolume pv = (serialized.serializedObject.targetObject as ProbeVolume);
|
|
|
|
if (pv.mightNeedRebaking)
|
|
{
|
|
EditorGUILayout.Space();
|
|
var helpBoxRect = GUILayoutUtility.GetRect(new GUIContent(Styles.s_ProbeVolumeChangedMessage, EditorGUIUtility.IconContent("Warning@2x").image), EditorStyles.helpBox);
|
|
EditorGUI.HelpBox(helpBoxRect, Styles.s_ProbeVolumeChangedMessage, MessageType.Warning);
|
|
}
|
|
}
|
|
}
|
|
}
|