Ir para o conteúdo

Agregação e o sibling aggregator

Uma árvore tem que descrever dois grafos. Esta página é sobre o segundo — e sobre a única regra que decide o que cada composite coleta.

Por que duas hierarquias

O Node View do Harmony carrega dois grafos de conexão ao mesmo tempo:

Hierarquia Cor Conecta Significa
Input / Transform 🟢 verde peg → seus filhos "este move aquele"
Output / Composite 🔵 azul comp ← o que o alimenta "este compõe aquele"

Elas não são a mesma árvore. Um peg pode dirigir várias composições distintas, e um composite pode juntar coisas que nenhum peg único move.

A árvore de staging é uma árvore — tem exatamente um tipo de parentesco. Então o OSA a usa para o grafo verde, onde a indentação já significa o que você quer que signifique: uma linha filha é um nó filho.

Isso deixa o grafo azul sem indentação para morar. A resposta dele é posição entre os irmãos.

O sibling aggregator

Um composite sem green container agrega os irmãos abaixo dele.

Isso é um sibling aggregator (agregador de irmãos). Ele não tem escopo próprio para olhar dentro, então olha lista abaixo.

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

Lendo isso em voz alta: um comp abre um bloco, tudo depois dele flui para dentro, e o próximo comp no mesmo nível fecha o bloco e abre um novo.

Um peg não alimenta um comp — quem alimenta é a saída da hierarquia dele

Peg-1 é um transform, não uma imagem. O que chega em Comp-1 é o resultado de tudo que está sob Peg-1, e esse resultado sai de Comp-2 — o comp dentro do escopo de Peg-1, que já juntou Drawing-1 e Drawing-2.

Então o fio é Comp-2 → Comp-1. Peg-1 está no grafo verde; ele nunca aparece no azul.

Tire Comp-2 e Peg-1 não tem comp para falar por ele — aí Drawing-1 e Drawing-2 sobem (bubble up) e são ligados em Comp-1 individualmente, como duas entradas em vez de uma. Essa é toda a diferença entre um peg com comp e um peg sem comp, e está coberta em O que um container entrega na saída.

E um segundo comp dentro de Peg-1 significaria duas saídas chegando em Comp-1 — uma por bloco:

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 bloco que termina dentro de um container sobe como sua própria saída, na ordem da árvore. Então o número de fios que chegam em Comp-1 vindos de Peg-1 é exatamente o número de blocos que Peg-1 fechou — um comp, um fio; dois comps, dois fios; nenhum comp, um fio por drawing.

O que quebra a corrente

Outro composite no mesmo nível. É a única coisa que faz isso.

Quando a varredura encontra um segundo comp entre os mesmos irmãos, ela descarrega o bloco atual e começa um novo. Não há marcador para definir nem opção para marcar: a presença do segundo comp é a fronteira.

É por isso que você pode montar uma cena como uma lista plana de irmãos e ainda assim tirar dela várias composições separadas — você as separa colocando um comp onde cada grupo deve terminar.

A regra que decide filhos vs irmãos

green containers criam escopo, e existem exatamente dois: Peg e Group.

Slot O comp agrega Por quê
C sozinho irmãos abaixo nada além de um ponto de agregação
D-C irmãos abaixo sem green container, sem escopo
BD-C irmãos abaixo um backdrop é visual — ele não possui nós
BD-D-C irmãos abaixo o mesmo: o backdrop não muda nada na fiação
P-C, G-C filhos o green container cria um escopo interno
P-D-C, G-D-C filhos o mesmo
BD-P-C, BD-P-G-D-C filhos quem faz isso é o peg; o backdrop só desenha uma caixa

Um backdrop nunca muda quem agrega

Esta é a que as pessoas erram, e vale dizer sem rodeio: BD é visual. BG=BD-C agrega irmãos exatamente como um C puro, porque não existe conexão verde entre o backdrop e o comp para o comp coletar filhos por ela. Só P ou G transformam um comp em agregador de filhos.

Super node com Peg (ou Group) + Comp

Agora o caso que você monta todo dia.

Um slot com um green container e um comp — hero=P-C, hero=BD-P-G-C — faz o comp agregar seus filhos imediatos, na ordem da árvore…

…até o primeiro filho que também é um comp. Esse filho começa um novo bloco de sibling aggregator, e tudo depois dele pertence a aquele bloco.

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 recebe arm e leg. fx-C recebe glow e dust, e a saída do próprio fx-C é o que continua subindo.

Essa é toda a linguagem de composição: um green container abre um escopo, e um comp dentro dele coleta até o próximo comp mandar parar.

O que um container entrega na saída

O container A saída dele
tem um comp interno uma saída única — o comp, ou o último efeito depois dele
não tem comp interno multi-saída: cada drawing lá dentro sobe (bubbles up)

Um peg sem comp não junta nada. Ele entrega ao pai uma lista, e cada item é ligado individualmente ao comp do pai.

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

Peg-1 retorna [Drawing-A, Drawing-B], então SuperNode-C recebe quatro entradas:

Porta Entrada
3 o drawing do próprio SuperNode
2 Drawing-A (subiu de Peg-1)
1 Drawing-B (subiu de Peg-1)
0 Drawing-C

Coloque um comp no peg e esses dois colapsam em uma entrada só. Essa é a diferença prática entre Peg-1=P e Peg-1=P-C, e geralmente é a razão de um grafo ter mais fios do que você esperava.

Ordem das portas

O grafo azul tem uma direção, e ela é fixa:

Porta Renderiza Fica
Porta N (a mais alta) à frente à esquerda no Node View
Porta 0 (a mais baixa) atrás à direita no Node View

Então o elemento mais à esquerda no Node View está por cima no render, e o mais à direita está no fundo. Dentro de um super node, o drawing do próprio slot ocupa a porta da frente e os filhos ficam nas de baixo, da esquerda para a direita.

É por isso também que o Wide Bus põe o topo da sua árvore à esquerda: ordem da árvore, ordem das portas e ordem de render são a mesma ordem, lida do mesmo jeito.

Lendo isso na árvore

Você não precisa simular nada disso na cabeça — a coluna Details já diz o que cada linha constrói, e a regra acima diz o que o comp dela vai coletar:

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

Se um comp está coletando as coisas erradas, só há duas perguntas a fazer: existe um green container nesse slot? e existe outro comp acima dele entre os mesmos irmãos?