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

104 lines
3.8 KiB
C#

using UnityEditor.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEditorInternal;
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Rendering;
using System.Linq;
using System;
using Object = UnityEngine.Object;
namespace UnityEditor.Rendering.HighDefinition
{
[VolumeComponentEditor(typeof(DiffusionProfileOverride))]
sealed class DiffusionProfileOverrideEditor : VolumeComponentEditor
{
SerializedDataParameter m_DiffusionProfiles;
Volume m_Volume;
DiffusionProfileSettingsListUI listUI = new DiffusionProfileSettingsListUI();
static GUIContent m_DiffusionProfileLabel = new GUIContent("Diffusion Profile List", "Diffusion Profile List from current HDRenderPipeline Asset");
public override void OnEnable()
{
var o = new PropertyFetcher<DiffusionProfileOverride>(serializedObject);
m_Volume = (m_Inspector.target as Volume);
m_DiffusionProfiles = Unpack(o.Find(x => x.diffusionProfiles));
}
public override void OnInspectorGUI()
{
listUI.drawElement = DrawDiffusionProfileElement;
listUI.OnGUI(m_DiffusionProfiles.value);
// If the volume is null it means that we're editing the component from the asset
// So we can't access the bounds of the volume to fill diffusion profiles used in the volume
if (m_Volume != null && !m_Volume.isGlobal)
{
if (GUILayout.Button("Fill Profile List With Scene Materials"))
FillProfileListWithScene();
}
}
void DrawDiffusionProfileElement(SerializedProperty element, Rect rect, int index)
{
EditorGUI.BeginDisabledGroup(!m_DiffusionProfiles.overrideState.boolValue);
EditorGUI.ObjectField(rect, element, new GUIContent("Profile " + index));
EditorGUI.EndDisabledGroup();
}
void FillProfileListWithScene()
{
var profiles = new HashSet<DiffusionProfileSettings>();
if (m_Volume.isGlobal)
return;
var volumeCollider = m_Volume.GetComponent<Collider>();
// Get all mesh renderers that are within the current volume
var diffusionProfiles = new List<DiffusionProfileSettings>();
foreach (var meshRenderer in Object.FindObjectsOfType<MeshRenderer>())
{
var colliders = Physics.OverlapBox(meshRenderer.bounds.center, meshRenderer.bounds.size / 2);
if (colliders.Contains(volumeCollider))
{
foreach (var mat in meshRenderer.sharedMaterials)
{
var profile = GetMaterialDiffusionProfile(mat);
if (profiles.Count == DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT - 1)
break;
if (profile != null)
profiles.Add(profile);
}
}
}
m_DiffusionProfiles.value.arraySize = profiles.Count;
int i = 0;
foreach (var profile in profiles)
{
m_DiffusionProfiles.value.GetArrayElementAtIndex(i).objectReferenceValue = profile;
i++;
}
}
DiffusionProfileSettings GetMaterialDiffusionProfile(Material mat)
{
if (!mat.HasProperty(HDShaderIDs._DiffusionProfileAsset))
return null;
string guid = HDUtils.ConvertVector4ToGUID(mat.GetVector(HDShaderIDs._DiffusionProfileAsset));
if (String.IsNullOrEmpty(guid))
return null;
return AssetDatabase.LoadAssetAtPath<DiffusionProfileSettings>(AssetDatabase.GUIDToAssetPath(guid));
}
}
}