105 lines
3.8 KiB
C#
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; ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|