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

105 lines
3.8 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Rendering;
using UnityEngine.Rendering;
using UnityEditorInternal;
using UnityEngine.Experimental.Rendering;
namespace UnityEditor.Experimental.Rendering
{
[CanEditMultipleObjects]
[CustomEditor(typeof(ProbeVolume))]
internal class ProbeVolumeEditor : Editor
{
SerializedProbeVolume m_SerializedProbeVolume;
internal const EditMode.SceneViewEditMode k_EditShape = EditMode.SceneViewEditMode.ReflectionProbeBox;
static HierarchicalBox _ShapeBox;
static HierarchicalBox s_ShapeBox
{
get
{
if (_ShapeBox == null)
_ShapeBox = new HierarchicalBox(ProbeVolumeUI.Styles.k_GizmoColorBase, ProbeVolumeUI.Styles.k_BaseHandlesColor);
return _ShapeBox;
}
}
protected void OnEnable()
{
m_SerializedProbeVolume = new SerializedProbeVolume(serializedObject);
}
public override void OnInspectorGUI()
{
ProbeVolume probeVolume = target as ProbeVolume;
bool hasChanges = false;
if (probeVolume.cachedTransform != probeVolume.gameObject.transform.worldToLocalMatrix)
{
hasChanges = true;
}
if (probeVolume.cachedHashCode != probeVolume.GetHashCode())
{
hasChanges = true;
}
probeVolume.mightNeedRebaking = hasChanges;
var renderPipelineAsset = GraphicsSettings.renderPipelineAsset;
if (renderPipelineAsset != null && renderPipelineAsset.GetType().Name == "HDRenderPipelineAsset")
{
serializedObject.Update();
ProbeVolumeUI.Inspector.Draw(m_SerializedProbeVolume, this);
}
else
{
EditorGUILayout.HelpBox("Probe Volume is not a supported feature by this SRP.", MessageType.Error, wide: true);
}
m_SerializedProbeVolume.Apply();
}
[DrawGizmo(GizmoType.InSelectionHierarchy)]
static void DrawGizmosSelected(ProbeVolume probeVolume, GizmoType gizmoType)
{
using (new Handles.DrawingScope(Matrix4x4.TRS(probeVolume.transform.position, probeVolume.transform.rotation, Vector3.one)))
{
// Bounding box.
s_ShapeBox.center = Vector3.zero;
s_ShapeBox.size = probeVolume.size;
s_ShapeBox.DrawHull(EditMode.editMode == k_EditShape);
}
}
protected void OnSceneGUI()
{
ProbeVolume probeVolume = target as ProbeVolume;
//important: if the origin of the handle's space move along the handle,
//handles displacement will appears as moving two time faster.
using (new Handles.DrawingScope(Matrix4x4.TRS(Vector3.zero, probeVolume.transform.rotation, Vector3.one)))
{
//contained must be initialized in all case
s_ShapeBox.center = Quaternion.Inverse(probeVolume.transform.rotation) * probeVolume.transform.position;
s_ShapeBox.size = probeVolume.size;
s_ShapeBox.monoHandle = false;
EditorGUI.BeginChangeCheck();
s_ShapeBox.DrawHandle();
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObjects(new Object[] { probeVolume, probeVolume.transform }, "Change Probe Volume Bounding Box");
probeVolume.size = s_ShapeBox.size;
Vector3 delta = probeVolume.transform.rotation * s_ShapeBox.center - probeVolume.transform.position;
probeVolume.transform.position += delta; ;
}
}
}
}
}