Core/CameraExtension.cs
namespace MANIFOLD.Camera {
    /// <summary>
    /// An extension that modifies the camera when updated.
    /// </summary>
    [Icon("extension")]
    public abstract class CameraExtension : Component, Component.ExecuteInEditor {
        [Property, RequireComponent, Hide]
        public VirtualCamera Camera { get; set; }

        /// <summary>
        /// Called when the <see cref="VirtualCamera"/> is initialized. (Happens whether the GameObject is active or not)
        /// </summary>
        protected internal abstract void OnCameraInitialize();
        /// <summary>
        /// Called when the <see cref="VirtualCamera"/> is active.
        /// </summary>
        /// <remarks>Local transformations do not persist.</remarks>
        /// <param name="localPosition">Position local to the camera transform.</param>
        /// <param name="localRotation">Rotation local to the camera transform.</param>
        protected internal abstract void OnCameraUpdate(ref Vector3 localPosition, ref Rotation localRotation);
    }
}