#include <ComposableCameraShotSolver.h>
Solver output. bValid == false when an essential anchor cannot be resolved (placement / aim) — caller should preserve upstream pose for the frame.
Public Attributes¶
| Return | Name | Description |
|---|---|---|
bool |
bValid |
|
FVector |
CameraPosition |
|
FRotator |
CameraRotation |
|
float |
FieldOfView |
|
float |
FocusDistance |
|
float |
Aperture |
|
float |
EffectiveDistance |
Effective Placement.Distance actually used by the solve this frame — = FInterpTo(prior.LastDistance, Shot.Placement.Distance, dt, Shot.Placement.DistanceSpeed) clamped >= 1cm, or simply max(Shot.Placement.Distance, 1) when no prior pose was supplied / DistanceSpeed is 0 / DeltaTime is 0. |
bValid¶
bool bValid = false
CameraPosition¶
FVector CameraPosition = FVector::ZeroVector
CameraRotation¶
FRotator CameraRotation = FRotator::ZeroRotator
FieldOfView¶
float FieldOfView = 79.f
FocusDistance¶
float FocusDistance = 200.f
Aperture¶
float Aperture = 2.8f
EffectiveDistance¶
float EffectiveDistance = -1.f
Effective Placement.Distance actually used by the solve this frame — = FInterpTo(prior.LastDistance, Shot.Placement.Distance, dt, Shot.Placement.DistanceSpeed) clamped >= 1cm, or simply max(Shot.Placement.Distance, 1) when no prior pose was supplied / DistanceSpeed is 0 / DeltaTime is 0.
Caller should feed this back into [FShotPriorPose::LastDistance](FShotPriorPose.md#lastdistance) on the next tick to keep the IIR seeded. < 0 ⇒ Distance was irrelevant for this solve (e.g. FixedWorldPosition mode).
ExposedBag¶
Functions¶
| Return | Name | Description |
|---|---|---|
bool |
AddDescIfSupported |
Build a single FPropertyBagPropertyDesc and, if the pin type is representable in a property bag, append it to OutDescs. Returns false for types we intentionally skip (currently just Delegate). |
void |
CopyBagValueIntoBlock |
Copy a single bag value (keyed by Name) into OutBlock via the matching FComposableCameraParameterBlock typed setter. If the bag has no value for Name, the block is left untouched and the camera will fall back to the node's authored default during ApplyParameterBlock. |
AddDescIfSupported¶
bool AddDescIfSupported(FName Name, EComposableCameraPinType PinType, const UScriptStruct * StructType, const UEnum * EnumType, TArray< FPropertyBagPropertyDesc > & OutDescs)
Build a single FPropertyBagPropertyDesc and, if the pin type is representable in a property bag, append it to OutDescs. Returns false for types we intentionally skip (currently just Delegate).
The descriptor's PropertyFlags include CPF_Edit | CPF_Interp. CPF_Interp is what Sequencer's FindPropertySetter checks to decide whether the leaf is keyable — without it CanKeyProperty returns false on every leaf and any track-editor parameter menu collapses. The flag propagates onto the dynamic FProperty that UPropertyBag::GetOrCreateFromDescs creates.
Centralised here so both the LS Component (FComposableCameraTypeAssetReference) and the Patch Section (UMovieSceneComposableCameraPatchSection) use the exact same descriptor shape — divergence there would mean only one of the two surfaces is keyable in Sequencer.
CopyBagValueIntoBlock¶
void CopyBagValueIntoBlock(const FInstancedPropertyBag & Bag, FName Name, EComposableCameraPinType PinType, const UScriptStruct * StructType, const UEnum * EnumType, FComposableCameraParameterBlock & OutBlock)
Copy a single bag value (keyed by Name) into OutBlock via the matching FComposableCameraParameterBlock typed setter. If the bag has no value for Name, the block is left untouched and the camera will fall back to the node's authored default during ApplyParameterBlock.
Centralised for the same reason as AddDescIfSupported above — keeping one canonical shape for "bag → parameter block" guarantees any future pin-type addition flows uniformly through every consumer.
PatchEnvelope¶
Functions¶
| Return | Name | Description |
|---|---|---|
float |
ApplyEase |
Apply the 5-curve enum ease shape to a normalized time t ∈ [0, 1]. Returns f(t) ∈ [0, 1]. |
float |
ComputeStatelessAlpha |
Stateless envelope alpha at a given frame, computed purely from time + section bounds + ease parameters — no Phase / ElapsedInPhase / ExitStartAlpha fields, no per-call mutation. |
ApplyEase¶
float ApplyEase(EComposableCameraPatchEase Ease, float t)
Apply the 5-curve enum ease shape to a normalized time t ∈ [0, 1]. Returns f(t) ∈ [0, 1].
Pulled out of UComposableCameraPatchManager.cpp's anonymous namespace so the runtime stateful envelope (AdvancePatchEnvelope in PatchManager.cpp) and the editor-preview stateless envelope (ComputeStatelessAlpha below) agree on the curve shape to a single canonical implementation. Adding a new ease type means editing one switch instead of two.
ComputeStatelessAlpha¶
float ComputeStatelessAlpha(FFrameNumber CurrentFrame, FFrameNumber SectionStart, FFrameNumber SectionEnd, float EnterDurationSeconds, float ExitDurationSeconds, EComposableCameraPatchEase Ease, FFrameRate TickRate)
Stateless envelope alpha at a given frame, computed purely from time + section bounds + ease parameters — no Phase / ElapsedInPhase / ExitStartAlpha fields, no per-call mutation.
Used by the Sequencer editor preview path (LS Component's TickComponent applies the result onto its InternalCamera's pose before projecting to the CineCamera). The runtime PIE path keeps the stateful machine on UComposableCameraPatchInstance because it needs to handle real-time Manual / Condition / OnCameraChange channels — Sequencer editor scrub doesn't have those. Computing alpha as a pure function of time also makes scrub-backwards correct: dragging the playhead to the section's exit window shows the fade-out, no matter how the user got there.
Curve shape: playhead < SectionStart → 0 playhead in [Start, Start + EnterDuration] → ease(t) // ramp up playhead in [Start + Enter, End - Exit] → 1 playhead in [End - ExitDuration, End] → 1 - ease(t) // ramp down playhead >= SectionEnd → 0
EnterDuration / ExitDuration ≤ 0 short-circuit (no ramp on that side).
Parameters
-
CurrentFramePlayhead in tick units (the section / movie scene's tick resolution). -
SectionStartSection's inclusive lower bound. -
SectionEndSection's exclusive upper bound. -
EnterDurationSecondsResolved enter duration (asset default OR overridden by Params; section easing is folded in upstream by the caller). -
ExitDurationSecondsSame shape as EnterDurationSeconds. -
EasePatch asset's authored ease type. -
TickRateOwning movie scene's tick resolution; used to convert enter/exit seconds → tick counts for the in-tick-space comparison.