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; ; } } } } }