Camera Patches are short-lived, additively-composable overlays that read an upstream pose, run a node graph, and write a modified pose. They sit above the normal camera evaluation tree — the Director's evaluation tree runs first (producing the base pose), then active Patches are applied in layer order on top of it.

See Concepts → Camera Patches for the full lifecycle and composition model (once that page is drafted). This page catalogs the shipped runtime types and their data assets.

Auto-drafted — please review

This page was generated by the auto-updater from the Camera Patch system introduced in plugin commits 145a2e9..1f6fc9d. Expand with usage examples, BP workflow notes, and Sequencer integration walkthrough when convenient.


UComposableCameraPatchTypeAsset

Concrete. Blueprintable.

Data asset describing a Camera Patch type. Authored in the same visual graph editor as UComposableCameraTypeAsset — no schema change. Subclasses UComposableCameraTypeAsset for type-safe API segregation: AddCameraPatch only accepts a UComposableCameraPatchTypeAsset*, preventing accidental use of a regular camera type as a patch.

Field Type Purpose
DefaultEnterDuration float Fade-in duration used when AddPatch doesn't override it.
DefaultExitDuration float Fade-out duration.
DefaultEaseType EComposableCameraPatchEase Symmetrical easing curve for both enter and exit ramps.
DefaultLayerIndex int32 Composition order (lower runs earlier, matching GameplayCameras' StackOrder).
DefaultExpirationType uint8 (bitmask) Which expiration channels are active by default.
DefaultDuration float Seconds in Active phase before auto-expiry (Duration channel only).

Override CanRemain(DeltaTime, UpstreamPose) in a Blueprint subclass to implement per-frame Condition-channel expiration (e.g. "stop this recoil overlay when the player's FOV drops below 30°").

C++ reference: UComposableCameraPatchTypeAsset


UComposableCameraPatchManager

Runtime. Director-scoped.

Created by UComposableCameraDirector at init time; lives for the director's lifetime. Owns the ordered list of active patch instances and drives the per-frame Apply pass.

Key entry points (also exposed via Blueprint through UK2Node_AddCameraPatch / UComposableCameraBlueprintLibrary):

Method Purpose
AddPatch(Asset, Params, ParameterBlock) Activate a patch. Returns a UComposableCameraPatchHandle. Rejects null asset and invalid Duration. Sorted-inserts by (LayerIndex asc, PushSequence asc).
ExpirePatch(Handle, ExitDurationOverride) Manually retire a patch (Manual expiration channel).
Apply(DeltaTime, InputPose) Per-frame application pass. Returns the blended output pose. (Stage 1: no-op. Stage 2 wires this into Director::Evaluate.)
DestroyAll() Synchronous teardown — no exit blend. Called on context pop and director destroy.
ExpireAll(ExitDurationOverride) Soft expire all active patches via the normal envelope ramp.
ApplyParameterBlockToActivePatch(Handle, Block) Per-frame parameter re-sync (used by Sequencer track instance).

C++ reference: UComposableCameraPatchManager


UComposableCameraPatchHandle

Runtime. Caller-facing opaque handle.

Returned by AddPatch; pass to ExpirePatch to manually retire. Holds a weak reference to the underlying UComposableCameraPatchInstance — when the instance expires or the Director is destroyed, IsActive() returns false and all getters return safe defaults.

GC lifetime

Blueprint variables hold strong refs automatically. In C++, store the handle in a UPROPERTY on the owning class — a raw local pointer will be collected, making Manual-channel expiry impossible (Duration/Condition channels still fire normally).

C++ reference: UComposableCameraPatchHandle


Patch lifecycle types (ComposableCameraPatchTypes.h)

EComposableCameraPatchPhase

Value Meaning
Entering Alpha ramping 0 → 1 over EnterDuration. Evaluator ticks at full fidelity.
Active Alpha == 1. Expiration channels evaluated each frame.
Exiting Alpha ramping 1 → 0 over ExitDuration.
Expired Terminal. Removed by PatchManager::Apply at end of frame.

EComposableCameraPatchExpirationType (bitmask)

Bit Channel
Duration Auto-expires after N seconds in Active phase.
Manual Expires only on explicit ExpirePatch(handle) call.
Condition Expires when PatchAsset::CanRemain() returns false.

Bits combine additively — the first channel to fire flips phase to Exiting.

EComposableCameraPatchEase

Linear, EaseIn, EaseOut, EaseInOut, Smooth — applied symmetrically to both the enter and exit alpha ramps.

FComposableCameraPatchActivateParams

Per-call overrides for envelope, expiration, and layer. Each overridable field is paired with a bOverride* bool (InlineEditConditionToggle). On UK2Node_AddCameraPatch, "Show Pin For X" in the MakeStruct node details panel is what drives bOverride* — the per-pin eye icon does not (it only affects visual collapse, not the override flag). To use asset defaults for a field, uncheck "Show Pin For [FieldName]" in the MakeStruct details panel.


Sequencer integration

UMovieSceneComposableCameraPatchTrack

Root-level (no object binding) Sequencer track. Each section represents one Patch activation window. Multi-row supported for stacking overlapping patches in the same track. Modeled on UMovieSceneCVarTrack.

UMovieSceneComposableCameraPatchSection

One section = one Patch activation window (asset + params + parameter bag). Inherits from UMovieSceneParameterSection so individual ExposedParameter entries can be promoted to keyable channels via right-click → "Camera Parameters → X". Parameter resolution per frame: keyed channel (highest priority) → bag default → asset default.

Bound to a specific AComposableCameraLevelSequenceActor via TargetActorBinding — Sequencer-driven patches apply on the LS Actor's CineCamera, orthogonally to BP-driven patches on the gameplay Director.

C++ references: UMovieSceneComposableCameraPatchTrack · UMovieSceneComposableCameraPatchSection


Patch envelope math (ComposableCameraPatchEnvelope.h)

Two pure functions in UE::ComposableCameras::PatchEnvelope:

  • ApplyEase(Ease, t) — canonical single implementation of the 5-curve ease shapes. Both the stateful runtime path and the stateless Sequencer-preview path call this to stay in sync.
  • ComputeStatelessAlpha(CurrentFrame, SectionStart, SectionEnd, EnterDurationSeconds, ExitDurationSeconds, Ease, TickRate) — used by the Sequencer editor preview so scrubbing backwards correctly shows the fade-out without requiring a live stateful phase machine.