Skip to content

Parent

Drives a layer's Transform2D from another layer's transform, so moving the parent moves the child. Inserted automatically by the timeline Parent dropdown — not placed by hand.

Category: Utility Menu path: (none — created via the timeline Parent column)

Ports

PortTypeDirectionDescription
positionvec2outputComposed world position → child Transform2D position_in
scalevec2outputComposed world scale → child Transform2D scale_in
rotationscalaroutputComposed world rotation (degrees) → child Transform2D rotation_in

The node has no inputs — it reads the parent's transform from the composition's published values by name.

Parameters

ParamTypeDefaultDescription
parentPositionPublishstring""Publish name of the parent's Transform2D world position (internal — hidden in Properties)
parentScalePublishstring""Publish name of the parent's Transform2D world scale (internal — hidden in Properties)
parentRotationPublishstring""Publish name of the parent's Transform2D world rotation (internal — hidden in Properties)
localPositionvec2(0, 0)Child's offset in parent space (shown as Position in Properties)
localScalevec2(1, 1)Child's scale relative to the parent (shown as Scale)
localRotationscalar0Child's rotation relative to the parent, degrees (shown as Rotation)

The local* params are baked when you set the parent so the child doesn't jump, but they're live afterward — editing them (or moving the layer in the viewport) repositions the child relative to its parent. In Properties they read simply as Position / Scale / Rotation, with a clickable Parent ▸ <layer> reference that jumps to the parent. The publish names are internal plumbing and hidden.

Finding the rig in the node graph: Parent nodes and the controlling Transform2D are tinted link-blue; the controlling T2D also shows a ⤵ badge ("drives this layer's children"). If a layer has several Transform2Ds, only the one that was published when you parented controls the children.

How It Works

When you parent a layer to another layer (or a Null) via the timeline Parent dropdown, Caddis:

  1. Publishes the parent's primary Transform2D position / scale / rotation.
  2. Enables the child Transform2D's input channels and inserts a Parent node wired into its position_in / scale_in / rotation_in.
  3. Bakes the child's current placement into localPosition / localScale / localRotation.

Each frame the engine composes the parent's (animated) world transform with the baked local offset:

world_pos   = parent_pos + R(parent_rot) · (parent_scale ⊙ local_pos)
world_scale = parent_scale ⊙ local_scale
world_rot   = parent_rot + local_rot

The parent's transform is a composition-level published value resolved every frame, so an animated parent animates its children for free. Because the inherited transform lives in the child's own graph (not an out-of-graph composite step), the child re-rasterizes at full quality at the parented placement — no extra blur or clipping.

Usage Examples

Basic: Parent layers to a Null

Add a Null (toolbar crosshair button), then set several layers' Parent column to that Null. Move or animate the Null's Transform2D (Properties panel or arrow keys) and all children follow, keeping their relative offsets.

Creative: Animate a group along a path

Parent a cluster of shape layers to a Null, then keyframe the Null's position/rotation/scale. The whole cluster moves as one rig while each child keeps its own internal animation.

Tips

  • A Null renders nothing — it exists only to be a parent transform.
  • Chains work: parent an arm to an elbow to a shoulder. Each level inherits the full chain above it (the Parent node publishes its layer's resolved world transform, which already includes its own parent).
  • Moving a parent's anchor holds its children in place — only the parent re-pivots, the children don't drift.
  • To unparent without the layer jumping, set the Parent column back to No Parent — the world placement is re-baked into the layer's own Transform2D.
  • Parenting assumes the child's Transform2D uses the default Pixels position mode.
  • Deleting a parent reverts its children to their local offset — unparent first if you want to keep their world position.
  • Within a motion-blur shutter window the parent transform is sampled at the whole frame, so a child does not inherit the parent's velocity in its own motion blur.
  • Transform2D — the node the Parent drives via expose channels
  • ValueSource — the general "consume a published value" node; Parent is a transform-specialized composition of the same idea