using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
using UnityEditor.UIElements;
namespace Unity.Cinemachine.Editor
{
///
/// Inspector for CinemachineBrain
///
[CustomEditor(typeof(CinemachineBrain))]
[CanEditMultipleObjects]
class CinemachineBrainEditor : UnityEditor.Editor
{
CinemachineBrain Target => target as CinemachineBrain;
public override VisualElement CreateInspectorGUI()
{
var ux = new VisualElement();
// Show the active camera and blend
var row = ux.AddChild(new InspectorUtility.LeftRightRow());
row.Left.Add(new Label("Live Camera")
{ tooltip = "The Cm Camera that is currently active", style = { alignSelf = Align.Center, flexGrow = 1 }});
var liveCamera = row.Right.AddChild(new ObjectField("")
{ objectType = typeof(CinemachineVirtualCameraBase), style = { flexGrow = 1 }});
row.SetEnabled(false);
row = ux.AddChild(new InspectorUtility.LeftRightRow());
row.Left.Add(new Label("Live Blend")
{ tooltip = "The state of currently active blend, if any", style = { alignSelf = Align.Center, flexGrow = 1 }});
var liveBlend = row.Right.AddChild(new TextField("") { style = { flexGrow = 1 }});
row.SetEnabled(false);
var prop = serializedObject.GetIterator();
if (prop.NextVisible(true))
InspectorUtility.AddRemainingProperties(ux, prop);
ux.ContinuousUpdate(() =>
{
if (target == null || liveCamera == null)
return;
liveCamera.value = Target.ActiveVirtualCamera as CinemachineVirtualCameraBase;
liveBlend.value = Target.ActiveBlend != null ? Target.ActiveBlend.Description : string.Empty;
});
return ux;
}
[DrawGizmo(GizmoType.Selected | GizmoType.NonSelected, typeof(CinemachineBrain))]
static void DrawBrainGizmos(CinemachineBrain brain, GizmoType drawType)
{
if (brain.OutputCamera != null && brain.ShowCameraFrustum && brain.isActiveAndEnabled)
{
DrawCameraFrustumGizmo(
LensSettings.FromCamera(brain.OutputCamera),
brain.transform.localToWorldMatrix,
Color.white); // GML why is this color hardcoded?
}
}
/// Draw the gizmo for a virtual camera in the scene view
/// The virtual camera
/// How the object is selected
[DrawGizmo(GizmoType.Active | GizmoType.InSelectionHierarchy | GizmoType.Pickable, typeof(CinemachineVirtualCameraBase))]
public static void DrawVirtualCameraBaseGizmos(CinemachineVirtualCameraBase vcam, GizmoType selectionType)
{
const string kGizmoFileName = CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmCamera@256.png";
// Don't draw gizmos on hidden stuff
if ((vcam.gameObject.hideFlags & (HideFlags.HideInHierarchy | HideFlags.HideInInspector)) != 0)
return;
if (vcam.ParentCamera != null && (selectionType & GizmoType.Active) == 0)
return;
var state = vcam.State;
Gizmos.DrawIcon(state.GetFinalPosition(), kGizmoFileName, true);
DrawCameraFrustumGizmo(
state.Lens,
Matrix4x4.TRS(state.GetFinalPosition(), state.GetFinalOrientation().normalized, Vector3.one),
CinemachineCore.IsLive(vcam)
? CinemachineCorePrefs.ActiveGizmoColour.Value
: CinemachineCorePrefs.InactiveGizmoColour.Value);
}
public static void DrawCameraFrustumGizmo(LensSettings lens, Matrix4x4 transform, Color color)
{
var aspect = lens.Aspect;
var ortho = lens.Orthographic;
var originalMatrix = Gizmos.matrix;
var originalGizmoColour = Gizmos.color;
Gizmos.color = color;
Gizmos.matrix = transform;
if (ortho)
{
var size = new Vector3(
aspect * lens.OrthographicSize * 2,
lens.OrthographicSize * 2,
lens.FarClipPlane - lens.NearClipPlane);
Gizmos.DrawWireCube(new Vector3(0, 0, (size.z / 2) + lens.NearClipPlane), size);
}
else
{
Gizmos.DrawFrustum(
Vector3.zero, lens.FieldOfView,
lens.FarClipPlane, lens.NearClipPlane, aspect);
}
Gizmos.matrix = originalMatrix;
Gizmos.color = originalGizmoColour;
}
}
}