// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Utilities;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace Microsoft.MixedReality.Toolkit.Editor
{
///
/// An abstract editor component to improve the editor experience with ClippingPrimitives.
///
[CustomEditor(typeof(ClippingPrimitive))]
[CanEditMultipleObjects]
public abstract class ClippingPrimitiveEditor : UnityEditor.Editor
{
///
/// Notifies the Unity editor if this object has custom frame bounds.
///
/// True if custom frame bounds can be used from OnGetFrameBounds.
protected abstract bool HasFrameBounds();
///
/// Returns the bounds the editor should focus on.
///
/// The bounds of the clipping primitive.
protected abstract Bounds OnGetFrameBounds();
private ClippingPrimitive clippingPrimitive;
private void OnEnable()
{
clippingPrimitive = (ClippingPrimitive)target;
}
///
/// Looks for changes to the list of renderers and gracefully adds and removes them.
///
public override void OnInspectorGUI()
{
var previousRenderers = clippingPrimitive.GetRenderersCopy();
using (var check = new EditorGUI.ChangeCheckScope())
{
DrawDefaultInspector();
if (check.changed)
{
// Flagging changes other than renderers
clippingPrimitive.IsDirty = true;
}
}
var currentRenderers = clippingPrimitive.GetRenderersCopy();
// Add or remove and renderers that were added or removed via the inspector.
foreach (var renderer in previousRenderers.Except(currentRenderers))
{
clippingPrimitive.RemoveRenderer(renderer);
}
foreach (var renderer in currentRenderers.Except(previousRenderers))
{
clippingPrimitive.AddRenderer(renderer);
}
}
}
}