| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- using UnityEngine;
- using UnityEditor;
- using Cinemachine.Utility;
- using System.Collections.Generic;
- namespace Cinemachine.Editor
- {
- [CustomEditor(typeof(CinemachineFramingTransposer))]
- internal class CinemachineFramingTransposerEditor : BaseEditor<CinemachineFramingTransposer>
- {
- CinemachineScreenComposerGuides mScreenGuideEditor;
- GameViewEventCatcher mGameViewEventCatcher;
- /// <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);
- if (Target.m_UnlimitedSoftZone)
- {
- excluded.Add(FieldPath(x => x.m_SoftZoneWidth));
- excluded.Add(FieldPath(x => x.m_SoftZoneHeight));
- excluded.Add(FieldPath(x => x.m_BiasX));
- excluded.Add(FieldPath(x => x.m_BiasY));
- }
- ICinemachineTargetGroup group = Target.AbstractFollowTargetGroup;
- if (group == null || Target.m_GroupFramingMode == CinemachineFramingTransposer.FramingMode.None)
- {
- excluded.Add(FieldPath(x => x.m_GroupFramingSize));
- excluded.Add(FieldPath(x => x.m_AdjustmentMode));
- 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));
- excluded.Add(FieldPath(x => x.m_MinimumFOV));
- excluded.Add(FieldPath(x => x.m_MaximumFOV));
- excluded.Add(FieldPath(x => x.m_MinimumOrthoSize));
- excluded.Add(FieldPath(x => x.m_MaximumOrthoSize));
- if (group == null)
- excluded.Add(FieldPath(x => x.m_GroupFramingMode));
- }
- else
- {
- CinemachineBrain brain = CinemachineCore.Instance.FindPotentialTargetBrain(Target.VirtualCamera);
- bool ortho = brain != null ? brain.OutputCamera.orthographic : false;
- if (ortho)
- {
- excluded.Add(FieldPath(x => x.m_AdjustmentMode));
- 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));
- excluded.Add(FieldPath(x => x.m_MinimumFOV));
- excluded.Add(FieldPath(x => x.m_MaximumFOV));
- }
- else
- {
- excluded.Add(FieldPath(x => x.m_MinimumOrthoSize));
- excluded.Add(FieldPath(x => x.m_MaximumOrthoSize));
- switch (Target.m_AdjustmentMode)
- {
- case CinemachineFramingTransposer.AdjustmentMode.DollyOnly:
- excluded.Add(FieldPath(x => x.m_MinimumFOV));
- excluded.Add(FieldPath(x => x.m_MaximumFOV));
- break;
- case CinemachineFramingTransposer.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;
- }
- }
- }
- }
- protected virtual void OnEnable()
- {
- mScreenGuideEditor = new CinemachineScreenComposerGuides();
- mScreenGuideEditor.GetHardGuide = () => { return Target.HardGuideRect; };
- mScreenGuideEditor.GetSoftGuide = () => { return Target.SoftGuideRect; };
- mScreenGuideEditor.SetHardGuide = (Rect r) => { Target.HardGuideRect = r; };
- mScreenGuideEditor.SetSoftGuide = (Rect r) => { Target.SoftGuideRect = r; };
- mScreenGuideEditor.Target = () => { return serializedObject; };
- mGameViewEventCatcher = new GameViewEventCatcher();
- mGameViewEventCatcher.OnEnable();
- CinemachineDebug.OnGUIHandlers -= OnGUI;
- CinemachineDebug.OnGUIHandlers += OnGUI;
- if (CinemachineSettings.CinemachineCoreSettings.ShowInGameGuides)
- InspectorUtility.RepaintGameView();
- }
- protected virtual void OnDisable()
- {
- mGameViewEventCatcher.OnDisable();
- CinemachineDebug.OnGUIHandlers -= OnGUI;
- if (CinemachineSettings.CinemachineCoreSettings.ShowInGameGuides)
- InspectorUtility.RepaintGameView();
- }
- public override void OnInspectorGUI()
- {
- BeginInspector();
- if (Target.FollowTarget == null)
- EditorGUILayout.HelpBox(
- "Framing Transposer requires a Follow target. Change Body to Do Nothing if you don't want a Follow target.",
- MessageType.Warning);
- // First snapshot some settings
- Rect oldHard = Target.HardGuideRect;
- Rect oldSoft = Target.SoftGuideRect;
- // Draw the properties
- DrawRemainingPropertiesInInspector();
- mScreenGuideEditor.SetNewBounds(oldHard, oldSoft, Target.HardGuideRect, Target.SoftGuideRect);
- }
- /// Process a position drag from the user.
- /// Called "magically" by the vcam editor, so don't change the signature.
- public void OnVcamPositionDragged(Vector3 delta)
- {
- if (Target.FollowTarget != null)
- {
- Undo.RegisterCompleteObjectUndo(Target, "Camera drag");
- var fwd = Target.transform.forward;
- var zComponent = Vector3.Dot(fwd, delta);
- delta -= fwd * zComponent;
- Vector3 localOffset = Quaternion.Inverse(Target.FollowTarget.rotation) * delta;
- Target.m_TrackedObjectOffset += localOffset;
- Target.m_CameraDistance = Mathf.Max(0.01f, Target.m_CameraDistance - zComponent);
- }
- }
-
- protected virtual void OnGUI()
- {
- if (Target == null)
- return;
- // Draw the camera guides
- if (!Target.IsValid || !CinemachineSettings.CinemachineCoreSettings.ShowInGameGuides)
- return;
- CinemachineBrain brain = CinemachineCore.Instance.FindPotentialTargetBrain(Target.VirtualCamera);
- if (brain == null || (brain.OutputCamera.activeTexture != null && CinemachineCore.Instance.BrainCount > 1))
- return;
- bool isLive = CinemachineCore.Instance.IsLive(Target.VirtualCamera);
- // Screen guides
- mScreenGuideEditor.OnGUI_DrawGuides(isLive, brain.OutputCamera, Target.VcamState.Lens, !Target.m_UnlimitedSoftZone);
- // Draw an on-screen gizmo for the target
- if (Target.FollowTarget != null && isLive)
- {
- Vector3 targetScreenPosition = brain.OutputCamera.WorldToScreenPoint(Target.TrackedPoint);
- if (targetScreenPosition.z > 0)
- {
- targetScreenPosition.y = Screen.height - targetScreenPosition.y;
- GUI.color = CinemachineSettings.ComposerSettings.TargetColour;
- Rect r = new Rect(targetScreenPosition, Vector2.zero);
- float size = (CinemachineSettings.ComposerSettings.TargetSize
- + CinemachineScreenComposerGuides.kGuideBarWidthPx) / 2;
- GUI.DrawTexture(r.Inflated(new Vector2(size, size)), Texture2D.whiteTexture);
- size -= CinemachineScreenComposerGuides.kGuideBarWidthPx;
- if (size > 0)
- {
- Vector4 overlayOpacityScalar
- = new Vector4(1f, 1f, 1f, CinemachineSettings.ComposerSettings.OverlayOpacity);
- GUI.color = Color.black * overlayOpacityScalar;
- GUI.DrawTexture(r.Inflated(new Vector2(size, size)), Texture2D.whiteTexture);
- }
- }
- }
- }
- [DrawGizmo(GizmoType.Active | GizmoType.InSelectionHierarchy, typeof(CinemachineFramingTransposer))]
- private static void DrawGroupComposerGizmos(CinemachineFramingTransposer target, GizmoType selectionType)
- {
- // Show the group bounding box, as viewed from the camera position
- if (target.AbstractFollowTargetGroup != null
- && target.m_GroupFramingMode != CinemachineFramingTransposer.FramingMode.None)
- {
- 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;
- }
- }
- }
- }
|