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.