#include <ComposableCameraTypeAsset.h>
Inherits:
UPrimaryDataAsset
Data asset defining a camera type: node composition, exposed parameters, internal variables, pin connections, and default transition.
Replaces the need to create Blueprint subclasses of AComposableCameraCameraBase for most camera types. Designers create and configure camera types entirely within the visual node graph editor.
At runtime, Instantiate() creates an AComposableCameraCameraBase with node instances duplicated from the templates, a wired RuntimeDataBlock, and caller-provided parameter values.
Public Attributes¶
| Return | Name | Description |
|---|---|---|
TArray< TObjectPtr< UComposableCameraCameraNodeBase > > |
NodeTemplates |
Flat list of node template UObjects owned by this asset. |
TArray< FComposableCameraNodeTemplatePinOverrides > |
NodePinOverrides |
Per-asset authoring overrides for the pins on each node template. |
TArray< TObjectPtr< UComposableCameraComputeNodeBase > > |
ComputeNodeTemplates |
Flat list of compute node templates authored on this type asset. Hidden from Details for the same reason NodeTemplates is — the visual graph editor is the authoritative editing surface. |
TArray< FComposableCameraNodeTemplatePinOverrides > |
ComputeNodePinOverrides |
Per-asset authoring overrides for the pins on each compute node template. Parallel array to ComputeNodeTemplates; same semantics as NodePinOverrides. Invariant: after any successful SyncToTypeAsset, ComputeNodePinOverrides.Num() == ComputeNodeTemplates.Num(). |
TArray< FComposableCameraPinConnection > |
ComputePinConnections |
Intra-compute-chain data wires. Same struct as PinConnections but the Source/Target node indices refer to ComputeNodeTemplates rather than NodeTemplates. Cross-chain data wires are disallowed by the schema, so this array never contains camera-node endpoints. |
TArray< int32 > |
ComputeExecutionOrder |
Ordered list of compute node indices defining the BeginPlay execution chain, filtered to compute nodes only. This is a compute-node-only projection of ComputeFullExecChain (analogous to how ExecutionOrder is a camera-node-only projection of FullExecChain). Kept for backward compat with code paths that only care about node ordering. |
TArray< FComposableCameraExecEntry > |
ComputeFullExecChain |
Full BeginPlay execution chain including both compute nodes and internal-variable Set operations, in exec-wire order. Parallel to FullExecChain but for the compute chain. |
FGameplayTag |
CameraTag |
Tag for this camera type. Propagated to spawned camera instances so modifiers can distinguish different cameras at runtime. Mirrors AComposableCameraCameraBase::CameraTag — the TypeAsset carries it so designers don't need to subclass the camera in Blueprint just to set a tag. |
bool |
bDefaultPreserveCameraPose |
Whether cameras of this type preserve the previous camera's pose when resumed from the context stack (e.g., after a transient camera pops). Propagated to spawned camera instances. Mirrors AComposableCameraCameraBase::bDefaultPreserveCameraPose. |
TObjectPtr< UComposableCameraTransitionBase > |
EnterTransition |
Optional enter transition — used when this camera type becomes active. The full resolution chain is: |
TObjectPtr< UComposableCameraTransitionBase > |
ExitTransition |
Optional exit transition — used when leaving this camera type. Checked at priority 3 in the resolution chain (after the table, before the target's EnterTransition). Useful for cameras that must always leave with a specific transition regardless of what comes next (e.g., puzzle cameras, UI overlays). |
TArray< FComposableCameraExposedParameter > |
ExposedParameters |
Parameters that callers provide when activating this camera type. |
TArray< FComposableCameraInternalVariable > |
InternalVariables |
Camera-level variables not exposed to callers but readable/writable by nodes. Used for cross-node communication and cross-frame state caching. |
TArray< FComposableCameraInternalVariable > |
ExposedVariables |
Camera-level variables whose initial value may be overridden by the caller at activation time, but which are otherwise identical to internal variables. |
TArray< FComposableCameraPinConnection > |
PinConnections |
Describes all data-pin connections between nodes. Each entry maps a target node's input pin to a source node's output pin. |
TArray< int32 > |
ExecutionOrder |
Ordered list of node indices defining the execution chain, filtered down to camera nodes only. |
TArray< FComposableCameraExecEntry > |
FullExecChain |
Full execution chain including both camera nodes and internal-variable Set operations, in exec-wire order. |
TArray< FComposableCameraVariableNodeRecord > |
VariableNodes |
Editor-only records describing each Get/Set variable graph node in the visual editor, along with the camera-node pins each one is wired to. The runtime doesn't consume these directly; they exist so the editor can round-trip the variable-node layout and wires. |
NodeTemplates¶
TArray< TObjectPtr< UComposableCameraCameraNodeBase > > NodeTemplates
Flat list of node template UObjects owned by this asset.
This array is intentionally hidden from the Details panel — the visual node graph editor is the authoritative editing surface for camera nodes, and showing a separate "NodeTemplates" array in Details would tempt users into thinking its order has semantic meaning. It does not: execution order comes from the exec-pin wiring chain (see FullExecChain / ExecutionOrder), not from this array's order. The array exists purely as a GC anchor and serialization container for the instanced node UObjects.
UPROPERTY has no EditAnywhere / Category keywords on purpose — the field is still serialized (bare UPROPERTY) and Instanced (so subobjects round-trip), but invisible to IDetailCustomization panels. Editor code accesses this array directly through SyncToTypeAsset / RebuildFromTypeAsset.
NodePinOverrides¶
TArray< FComposableCameraNodeTemplatePinOverrides > NodePinOverrides
Per-asset authoring overrides for the pins on each node template.
Parallel array to NodeTemplates: NodePinOverrides[i] holds the sparse list of per-pin overrides for NodeTemplates[i]. Entries store the user-edited default value and the bAsPin toggle for a specific (node instance, pin name) pair; pins without an entry inherit their class-level declaration defaults (bAsPin = true, DefaultValueString).
Invariant: after any successful SyncToTypeAsset, NodePinOverrides.Num() == NodeTemplates.Num(). Legacy assets saved before this field existed start with an empty array; the first sync after load grows it to match.
Hidden from the Details panel for the same reason NodeTemplates is — the visual graph (+ its per-node Details customization) is the authoritative editing surface. Editor code accesses this array directly through the Sync/Rebuild phases and through the graph node's accessor helpers.
ComputeNodeTemplates¶
TArray< TObjectPtr< UComposableCameraComputeNodeBase > > ComputeNodeTemplates
Flat list of compute node templates authored on this type asset. Hidden from Details for the same reason NodeTemplates is — the visual graph editor is the authoritative editing surface.
ComputeNodePinOverrides¶
TArray< FComposableCameraNodeTemplatePinOverrides > ComputeNodePinOverrides
Per-asset authoring overrides for the pins on each compute node template. Parallel array to ComputeNodeTemplates; same semantics as NodePinOverrides. Invariant: after any successful SyncToTypeAsset, ComputeNodePinOverrides.Num() == ComputeNodeTemplates.Num().
ComputePinConnections¶
TArray< FComposableCameraPinConnection > ComputePinConnections
Intra-compute-chain data wires. Same struct as PinConnections but the Source/Target node indices refer to ComputeNodeTemplates rather than NodeTemplates. Cross-chain data wires are disallowed by the schema, so this array never contains camera-node endpoints.
ComputeExecutionOrder¶
TArray< int32 > ComputeExecutionOrder
Ordered list of compute node indices defining the BeginPlay execution chain, filtered to compute nodes only. This is a compute-node-only projection of ComputeFullExecChain (analogous to how ExecutionOrder is a camera-node-only projection of FullExecChain). Kept for backward compat with code paths that only care about node ordering.
ComputeFullExecChain¶
TArray< FComposableCameraExecEntry > ComputeFullExecChain
Full BeginPlay execution chain including both compute nodes and internal-variable Set operations, in exec-wire order. Parallel to FullExecChain but for the compute chain.
The editor walks the exec pin chain starting from the BeginPlay Start sentinel's ExecOut and records each step here. For CameraNode entries, CameraNodeIndex indexes into ComputeNodeTemplates (not NodeTemplates). For SetVariable entries, CameraNodeIndex also indexes ComputeNodeTemplates — the source node is always on the same chain.
The runtime copies this to AComposableCameraCameraBase::ComputeFullExecChain during OnTypeAssetCameraConstructed. BeginPlayCamera walks it to interleave compute node execution with scratch-variable writes.
CameraTag¶
FGameplayTag CameraTag
Tag for this camera type. Propagated to spawned camera instances so modifiers can distinguish different cameras at runtime. Mirrors AComposableCameraCameraBase::CameraTag — the TypeAsset carries it so designers don't need to subclass the camera in Blueprint just to set a tag.
bDefaultPreserveCameraPose¶
bool bDefaultPreserveCameraPose = true
Whether cameras of this type preserve the previous camera's pose when resumed from the context stack (e.g., after a transient camera pops). Propagated to spawned camera instances. Mirrors AComposableCameraCameraBase::bDefaultPreserveCameraPose.
EnterTransition¶
TObjectPtr< UComposableCameraTransitionBase > EnterTransition
Optional enter transition — used when this camera type becomes active. The full resolution chain is:
-
Caller-supplied override
-
Transition table lookup (Source → Target pair)
-
Source's ExitTransition
-
Target's EnterTransition ← this field
-
Hard cut Callers can always override via the activation API.
ExitTransition¶
TObjectPtr< UComposableCameraTransitionBase > ExitTransition
Optional exit transition — used when leaving this camera type. Checked at priority 3 in the resolution chain (after the table, before the target's EnterTransition). Useful for cameras that must always leave with a specific transition regardless of what comes next (e.g., puzzle cameras, UI overlays).
ExposedParameters¶
TArray< FComposableCameraExposedParameter > ExposedParameters
Parameters that callers provide when activating this camera type.
Authoring model — split between graph and Details panel:
-
Structure (which pins are exposed) is authored exclusively through the visual graph editor: designers right-click a node input pin and select "Expose as Camera Parameter" (or "Unexpose"). The array is
EditFixedSize, so the Details panel does not offer Add/Remove buttons — adding a free-standing entry that doesn't map to any node pin would have no runtime meaning, and removing one from Details would silently leave the underlying pin in an "orphaned-exposed" state on the graph side. -
Per-parameter metadata (DisplayName, bRequired, Tooltip) IS editable on existing entries from the Details panel. The first time a pin is exposed, these fields are seeded from the C++ FComposableCameraNodePinDeclaration, but the per-asset values become the source of truth from that point on and are preserved across SyncToTypeAsset (which only rewrites TargetNodeIndex when node ordering changes; see ComposableCameraNodeGraph.cpp Step 7).
-
Identity fields (ParameterName, PinType, StructType, TargetNodeIndex, TargetPinName) are deliberately read-only or hidden — renaming or retyping them in Details would silently break every consumer keying by name (K2 node UserOverrideNames, DataTable row Values, ParameterBlock activations, the row editor's orphan detection). To rename or retype, change it on the underlying pin and re-expose.
InternalVariables¶
TArray< FComposableCameraInternalVariable > InternalVariables
Camera-level variables not exposed to callers but readable/writable by nodes. Used for cross-node communication and cross-frame state caching.
The struct type (FComposableCameraInternalVariable) is shared with ExposedVariables below; the two categories differ only in whether the caller's ParameterBlock may override the initial value at activation time (ExposedVariables: yes; InternalVariables: no). At runtime both arrays feed the same InternalVariableOffsets map on the data block — Get/Set variable graph nodes treat them uniformly. Names must be unique across ExposedParameters ∪ InternalVariables ∪ ExposedVariables; see Build().
ExposedVariables¶
TArray< FComposableCameraInternalVariable > ExposedVariables
Camera-level variables whose initial value may be overridden by the caller at activation time, but which are otherwise identical to internal variables.
Authoring model: edited in the Details panel like InternalVariables (not via the graph's "Expose as Camera Parameter" flow, which is for input pins on camera nodes). The struct type is the same as InternalVariables.
Activation model: ApplyParameterBlock() first tries to copy the caller's ParameterBlock entry keyed by VariableName into this slot; if the caller didn't supply a value, it falls back to parsing InitialValueString via FComposableCameraParameterBlock::ApplyStringValue (the same parser the DataTable row path uses).
Runtime model: after the activation-time write, these are indistinguishable from InternalVariables. Their slots live in the same FComposableCameraRuntimeDataBlock::InternalVariableOffsets map, and the editor's variable graph nodes (Get/Set) find them via the same FindVariable() lookup path — both arrays are searched.
Name uniqueness is enforced across ExposedParameters ∪ InternalVariables ∪ ExposedVariables in Build(); see that function for the rationale.
PinConnections¶
TArray< FComposableCameraPinConnection > PinConnections
Describes all data-pin connections between nodes. Each entry maps a target node's input pin to a source node's output pin.
ExecutionOrder¶
TArray< int32 > ExecutionOrder
Ordered list of node indices defining the execution chain, filtered down to camera nodes only.
ExecutionOrder[0] is the first camera node executed (closest to Start's exec out), ExecutionOrder[Last] is the last (closest to Output's exec in).
This is a cached projection of FullExecChain for runtime consumers that only care about camera nodes. Set-variable entries from FullExecChain are stripped out here; the runtime (once it starts honoring scratch writes) should iterate FullExecChain instead.
FullExecChain¶
TArray< FComposableCameraExecEntry > FullExecChain
Full execution chain including both camera nodes and internal-variable Set operations, in exec-wire order.
The editor walks the exec pin chain in the visual graph starting from the Start sentinel's ExecOut and records each step here. Set-variable entries capture the variable GUID being written plus the camera-node output pin that supplies the value; camera-node entries just capture the node index.
ExecutionOrder above is a camera-node-only projection of this array.
VariableNodes¶
TArray< FComposableCameraVariableNodeRecord > VariableNodes
Editor-only records describing each Get/Set variable graph node in the visual editor, along with the camera-node pins each one is wired to. The runtime doesn't consume these directly; they exist so the editor can round-trip the variable-node layout and wires.
Public Methods¶
| Return | Name | Description |
|---|---|---|
const TArray< FComposableCameraExposedParameter > & |
GetExposedParameters const inline |
Get the list of exposed parameters for K2Node / DataTable introspection. |
FString |
GetExposedParameterDefaultValue const |
Resolve the effective default value for an exposed parameter. |
FComposableCameraRuntimeDataBlock |
BuildRuntimeDataLayout const |
Build a RuntimeDataBlock layout from this type asset's pin declarations, connections, exposed parameters, and internal variables. |
void |
ApplyParameterBlock const |
Fill a RuntimeDataBlock's exposed parameter slots from a ParameterBlock. Called after BuildRuntimeDataLayout() and before the camera starts ticking. |
void |
ApplyDelegateBindings const |
Apply delegate bindings from the parameter block to the camera's node UPROPERTYs. |
FPrimaryAssetId |
GetPrimaryAssetId virtual const |
GetExposedParameters¶
const inline
inline const TArray< FComposableCameraExposedParameter > & GetExposedParameters() const
Get the list of exposed parameters for K2Node / DataTable introspection.
GetExposedParameterDefaultValue¶
const
FString GetExposedParameterDefaultValue(const FComposableCameraExposedParameter & Param) const
Resolve the effective default value for an exposed parameter.
The default lives on the node's pin, not on the ExposedParameter struct. This helper looks up NodeTemplates[Param.TargetNodeIndex], gathers its pin declarations, finds the one matching Param.TargetPinName, then checks NodePinOverrides for a per-instance override. Returns the override if present, otherwise the class-level declaration default.
Returns an empty string if the target node/pin cannot be resolved (stale index, missing pin name, etc.).
BuildRuntimeDataLayout¶
const
FComposableCameraRuntimeDataBlock BuildRuntimeDataLayout() const
Build a RuntimeDataBlock layout from this type asset's pin declarations, connections, exposed parameters, and internal variables.
This computes all byte offsets and connection mappings. Called once per camera instantiation (or cached if the asset hasn't changed).
ApplyParameterBlock¶
const
void ApplyParameterBlock(FComposableCameraRuntimeDataBlock & DataBlock, const FComposableCameraParameterBlock & Parameters) const
Fill a RuntimeDataBlock's exposed parameter slots from a ParameterBlock. Called after BuildRuntimeDataLayout() and before the camera starts ticking.
ApplyDelegateBindings¶
const
void ApplyDelegateBindings(class AComposableCameraCameraBase * Camera, const FComposableCameraParameterBlock & Parameters) const
Apply delegate bindings from the parameter block to the camera's node UPROPERTYs.
Called after ApplyParameterBlock. Iterates exposed parameters that are Delegate-typed and, for each one that has an entry in Parameters.DelegateValues, writes the FScriptDelegate into the target node's FDelegateProperty via reflection.
Delegates cannot go through the data block (they're not POD) so this is a separate pass that operates directly on node instances.
GetPrimaryAssetId¶
virtual const
virtual FPrimaryAssetId GetPrimaryAssetId() const