Files
Oratorian 50c7af0b4b feat: add Wired Controller for reliable cross-subgraph control
A source node that lives next to your booleans (typically inside a
  subgraph) and relays them to Group/Node Controllers elsewhere. It reads
  booleans in its own graph (always reliable) and delivers the result the
  safe way, sidestepping the flaky cross-boundary boolean reads.

  Fully automatic: each tick it walks its patch output to discover the
  Controllers it feeds - up out of its subgraph, across at the root, and
  down into sibling/nested subgraphs - pulls their target labels, and
  auto-creates one boolean input per target (no manual signal naming). It
  resolves those booleans locally and pushes the result onto every
  Controller on the lane, so one Wired Controller fans out to many
  (Group and Node, mixed). A patched signal governs its target and
  overrides ALL, just like a direct boolean; a target's own direct boolean
  wins for that one target.

  Two bindings (wire tried first, channel is the fallback):
  - wire: WiredController `patch` output -> Controller `patch` input,
    followed across boundaries by a robust output walk (link map +
    floating links + reverse output-proxy lookup; host matched by id and
    identity; descends into sibling subgraphs).
  - channel: name-keyed global registry, no traversal, any nesting depth.

  Controllers gain a `patch` input and a `channel` field (both inert until
  connected). The bus socket is named "patch" (SWITCHBOARD_PATCH) to fit
  the Switchboard theme; older saved nodes are normalised on load. Boolean
  resolution refactored into shared module functions. Adds a Wired
  Controller diagnostics menu. README + example_workflows notes updated.
2026-06-07 00:41:28 +02:00

46 lines
1.9 KiB
Markdown

# Example 2 - Node Controller
**Same one-boolean hi-res gate, but targeting a single node by id.**
Identical wiring to Example 1, except the target is an **individual node**
instead of a group. A single **Value on Boolean** (`true`/`false`) drives two
things from its `boolean` output:
1. **→ Node Controller (`995: Highres` input)** - governs node **995** (the
Highres node).
- `true` = node **enabled** (it runs)
- `false` = node **disabled** using its `↳ disable as` mode (**bypass** here)
2. **→ Boolean Switch (`boolean` input)** - selects the **Preview Image** source:
- `on_true` = the **Highres** node output
- `on_false` = the plain **VAE Decode (Tiled)** output
One toggle, consistent result: `true` runs Highres and previews it; `false`
bypasses it and previews the base image.
**Group vs Node Controller - when to use which:**
- **Node Controller** targets by **id** (shown as `id: Title`), so retitling the
node still works. Good for flipping one specific node - including a whole
**subgraph node** (node 995 here is a subgraph), which bypasses everything
inside it at once.
- **Group Controller** targets by group **title** - good for flipping a labelled
region of the graph.
A boolean wired into a target *governs* it (overrides the target's toggle and
the master `ALL`); `↳ disable as` chooses bypass vs mute.
## Two fields not shown in the screenshot
Newer versions add these to **every** Controller; this example doesn't use them,
so leave them as-is:
- **`↦ patch`** (patch input, top of the node) - accepts a **Wired Controller**'s
output. Unwired here = no effect.
- **`channel`** (text field) - subscribes the Controller to a **Wired
Controller** by name. Blank here = no subscription.
Both are only for driving this Controller from a **Wired Controller** (see
Example 3). Empty/unwired, they do nothing and the example behaves exactly as
pictured.
> Every node here ships with Switchboard - no other custom nodes needed.