Rasagar/Library/PackageCache/com.unity.cinemachine/Editor/Editors/CinemachineGroupComposerEditor.cs
2024-08-26 23:07:20 +03:00

96 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using UnityEditor;
using UnityEngine;
using Cinemachine.Utility;
namespace Cinemachine.Editor
{
[CustomEditor(typeof(CinemachineGroupComposer))]
internal class CinemachineGroupComposerEditor : CinemachineComposerEditor
{
// Specialization
private CinemachineGroupComposer MyTarget { get { return target as CinemachineGroupComposer; } }
protected string FieldPath<TValue>(Expression<Func<CinemachineGroupComposer, TValue>> expr)
{
return ReflectionHelpers.GetFieldPath(expr);
}
/// <summary>Get the property names to exclude in the inspector.</summary>
/// <param name="excluded">Add the names to this list</param>
protected override void GetExcludedPropertiesInInspector(List<string> excluded)
{
base.GetExcludedPropertiesInInspector(excluded);
CinemachineBrain brain = CinemachineCore.Instance.FindPotentialTargetBrain(MyTarget.VirtualCamera);
bool ortho = brain != null ? brain.OutputCamera.orthographic : false;
if (ortho)
{
excluded.Add(FieldPath(x => x.m_AdjustmentMode));
excluded.Add(FieldPath(x => x.m_MinimumFOV));
excluded.Add(FieldPath(x => x.m_MaximumFOV));
excluded.Add(FieldPath(x => x.m_MaxDollyIn));
excluded.Add(FieldPath(x => x.m_MaxDollyOut));
excluded.Add(FieldPath(x => x.m_MinimumDistance));
excluded.Add(FieldPath(x => x.m_MaximumDistance));
}
else
{
excluded.Add(FieldPath(x => x.m_MinimumOrthoSize));
excluded.Add(FieldPath(x => x.m_MaximumOrthoSize));
switch (MyTarget.m_AdjustmentMode)
{
case CinemachineGroupComposer.AdjustmentMode.DollyOnly:
excluded.Add(FieldPath(x => x.m_MinimumFOV));
excluded.Add(FieldPath(x => x.m_MaximumFOV));
break;
case CinemachineGroupComposer.AdjustmentMode.ZoomOnly:
excluded.Add(FieldPath(x => x.m_MaxDollyIn));
excluded.Add(FieldPath(x => x.m_MaxDollyOut));
excluded.Add(FieldPath(x => x.m_MinimumDistance));
excluded.Add(FieldPath(x => x.m_MaximumDistance));
break;
default:
break;
}
}
}
public override void OnInspectorGUI()
{
if (MyTarget.IsValid && MyTarget.AbstractLookAtTargetGroup == null)
EditorGUILayout.HelpBox(
"The Framing settings will be ignored because the LookAt target is not a kind of ICinemachineTargetGroup",
MessageType.Info);
base.OnInspectorGUI();
}
[DrawGizmo(GizmoType.Active | GizmoType.InSelectionHierarchy, typeof(CinemachineGroupComposer))]
private static void DrawGroupComposerGizmos(CinemachineGroupComposer target, GizmoType selectionType)
{
// Show the group bounding box, as viewed from the camera position
if (target.AbstractLookAtTargetGroup != null)
{
Matrix4x4 m = Gizmos.matrix;
Bounds b = target.LastBounds;
Gizmos.matrix = target.LastBoundsMatrix;
Gizmos.color = Color.yellow;
if (target.VcamState.Lens.Orthographic)
Gizmos.DrawWireCube(b.center, b.size);
else
{
float z = b.center.z;
Vector3 e = b.extents;
Gizmos.DrawFrustum(
Vector3.zero,
Mathf.Atan2(e.y, z) * Mathf.Rad2Deg * 2,
z + e.z, z - e.z, e.x / e.y);
}
Gizmos.matrix = m;
}
}
}
}