Saltar a contenido

Agregación y el sibling aggregator

Un árbol tiene que describir dos grafos. Esta página trata del segundo — y de la única regla que decide qué recoge cada composite.

Por qué hay dos jerarquías

El Node View de Harmony lleva dos grafos de conexión a la vez:

Jerarquía Color Conecta Significa
Input / Transform 🟢 verde peg → sus hijos "esto mueve aquello"
Output / Composite 🔵 azul comp ← lo que lo alimenta "esto compone aquello"

No son el mismo árbol. Un solo Peg puede mover varias composiciones distintas, y un solo Composite puede reunir cosas que ningún Peg mueve junto.

Un árbol de staging es un árbol — tiene exactamente un tipo de parentesco. Así que OSA lo usa para el grafo verde, donde la indentación ya significa lo que quieres que signifique: una fila hija es un nodo hijo.

Eso deja al grafo azul sin indentación donde vivir. Su respuesta es la posición entre hermanos.

El sibling aggregator

Un composite sin contenedor verde agrega a los hermanos que están debajo de él.

Eso es un sibling aggregator (un composite que recoge a sus hermanos). No tiene ámbito propio donde mirar hacia adentro, así que mira hacia abajo en la lista.

Comp-1        ← starts block 1
Peg-1         ← feeds Comp-1 … but see below: what enters is Comp-2's output
  Comp-2      ← starts an inner block; its output IS Peg-1's output
  Drawing-1   ← feeds Comp-2
  Drawing-2   ← feeds Comp-2
Drawing-3     ← feeds Comp-1
Comp-3        ← ENDS block 1, starts block 2
Drawing-4     ← feeds Comp-3
Drawing-5     ← feeds Comp-3

Leído en voz alta: un comp abre un bloque, todo lo que viene después fluye hacia él, y el siguiente comp del mismo nivel cierra el bloque y abre uno nuevo.

Un peg no alimenta a un comp — lo hace la salida de su jerarquía

Peg-1 es una transformación, no una imagen. Lo que llega a Comp-1 es el resultado de todo lo que hay bajo Peg-1, y ese resultado sale de Comp-2 — el comp dentro del ámbito de Peg-1, que ya reunió Drawing-1 y Drawing-2.

Así que el cable es Comp-2 → Comp-1. Peg-1 está en el grafo verde; nunca aparece en el azul.

Quita Comp-2 y Peg-1 no tiene comp que hable por él — entonces Drawing-1 y Drawing-2 suben y se cablean a Comp-1 individualmente, como dos entradas en vez de una. Esa es toda la diferencia entre un peg con comp y un peg sin comp, y se trata en Qué produce un contenedor.

Y un segundo comp dentro de Peg-1 significaría dos salidas llegando a Comp-1 — una por bloque:

Comp-1
Peg-1              ← now hands Comp-1 TWO outputs
  Comp-2           ← block A → its output goes to Comp-1
  Drawing-1        → feeds Comp-2
  Comp-2b          ← block B: closes A, opens its own
  Drawing-2        → feeds Comp-2b
                   ← Comp-2b's output ALSO goes to Comp-1

Cada bloque que termina dentro de un contenedor sube como salida propia, en orden de árbol. Así que el número de cables que llegan a Comp-1 desde Peg-1 es exactamente el número de bloques que Peg-1 cerró — un comp, un cable; dos comps, dos cables; ningún comp, un cable por dibujo.

Qué rompe la cadena

Otro composite en el mismo nivel. Es lo único que lo hace.

Cuando el recorrido encuentra un segundo comp entre los mismos hermanos, vacía el bloque actual y empieza uno nuevo. No hay marca que poner ni opción que marcar: la presencia del segundo comp es la frontera.

Por eso puedes montar una escena como una lista plana de hermanos y aun así obtener varias composiciones separadas — las separas poniendo un comp donde cada grupo debe terminar.

La regla que decide hijos o hermanos

Solo los contenedores verdes crean un ámbito, y hay exactamente dos: Peg y Group.

Slot El comp agrega Por qué
C solo hermanos de abajo no es más que un punto de agregación
D-C hermanos de abajo sin contenedor verde, no hay ámbito
BD-C hermanos de abajo un backdrop es visual — no posee nodos
BD-D-C hermanos de abajo igual: el backdrop no cambia nada del cableado
P-C, G-C hijos el contenedor verde crea un ámbito interno
P-D-C, G-D-C hijos igual
BD-P-C, BD-P-G-D-C hijos el peg es lo que lo hace; el backdrop solo dibuja una caja

Un backdrop nunca cambia quién agrega

Esta es la que la gente confunde, y vale decirla sin rodeos: BD es visual. BG=BD-C agrega hermanos exactamente igual que una C sola, porque no hay conexión verde entre el backdrop y el comp por la que el comp pueda recoger hijos. Solo P o G convierten un comp en agregador de hijos.

Super node con Peg (o Group) + Comp

Ahora el caso que construyes todos los días.

Un slot con contenedor verde y comp — hero=P-C, hero=BD-P-G-C — hace que el comp agregue a sus hijos inmediatos, en orden de árbol…

…hasta el primer hijo que sea a su vez un comp. Ese hijo abre un nuevo bloque de sibling aggregator, y todo lo que venga después pertenece a ese bloque.

hero=P-C            ← green scope; its comp collects the children below
├── arm=D           → feeds hero-C
├── leg=D           → feeds hero-C
├── fx=C            ← a comp among the children: block boundary
├── glow=D          → feeds fx-C
└── dust=D          → feeds fx-C

hero-C recibe arm y leg. fx-C recibe glow y dust, y la salida de fx-C es lo que sigue subiendo.

Ese es todo el lenguaje de composición: un contenedor verde abre un ámbito, y un comp dentro de él recoge hasta que el siguiente comp dice basta.

Qué produce un contenedor

El contenedor Su salida
tiene un comp interno una única salida — el comp, o el último efecto después de él
no tiene comp interno multi-salida: cada dibujo de dentro sube

Un peg sin comp no fusiona nada. Le entrega a su padre una lista, y cada elemento se cablea individualmente al comp del padre.

SuperNode=P-D-C
├── Peg-1  (P only, no Comp)
│   ├── Drawing-A
│   └── Drawing-B
└── Drawing-C

Peg-1 devuelve [Drawing-A, Drawing-B], así que SuperNode-C recibe cuatro entradas:

Puerto Entrada
3 el dibujo propio de SuperNode
2 Drawing-A (subido desde Peg-1)
1 Drawing-B (subido desde Peg-1)
0 Drawing-C

Pon un comp en el peg y esas dos se colapsan en una sola entrada. Esa es la diferencia práctica entre Peg-1=P y Peg-1=P-C, y suele ser la razón de que un grafo tenga más cables de los que esperabas.

Orden de puertos

El grafo azul tiene una dirección, y es fija:

Puerto Se renderiza Se sitúa
Puerto N (el más alto) delante a la izquierda en el Node View
Puerto 0 (el más bajo) detrás a la derecha en el Node View

Así que el elemento más a la izquierda del Node View está encima en el render, y el más a la derecha está al fondo. Dentro de un super node, el dibujo propio del slot toma el puerto delantero y los hijos toman los de debajo, de izquierda a derecha.

Por eso también el Wide Bus pone la parte alta de tu árbol a la izquierda: orden de árbol, orden de puertos y orden de render son el mismo orden, leído igual.

Cómo leerlo en el árbol

No hace falta que simules nada de esto en la cabeza — la columna Details ya te dice qué construye cada fila, y la regla de arriba te dice qué va a recoger su comp:

BACKGROUND      (Backdrop > Peg > Comp)     ← green scope: collects its children
  sky           (Read)                       → feeds BACKGROUND-C
  clouds        (Read)                       → feeds BACKGROUND-C
EFFECTS         (Backdrop > Peg > Comp > Effects)

Si un comp está recogiendo lo que no debe, solo hay dos preguntas que hacer: ¿hay un contenedor verde en ese slot? y ¿hay otro comp por encima de él entre los mismos hermanos?