Mesh Shape Propagate To All
Keep every shape key in sync after a base edit
- BPY_OBJ
- BPY_OBJ
The exact kind of node you don't know you need until a rig starts glitching for no obvious reason. It wraps Blender's real bpy.ops.mesh.shape_propagate_to_all operator, part of Avatar Graph, the pack that runs actual Blender inside ComfyUI's process (via the bpy Python package) to build interactive 2D-to-3D avatars, auto-generating a node for every mesh operator Blender has.
The problem this solves
Once a mesh has shape keys on it, each one stores its own fixed vertex offsets, calculated relative to the base ("Basis") shape as it existed at the time. If you go back and edit that base geometry afterward - nudging the resting/neutral shape after you've already sculpted a blink or a mouth shape, say - the existing shape keys don't automatically follow along. They still store offsets relative to the old base. The result: every one of those expressions can snap back to stale, no-longer-correct geometry the moment its value hits 1.0, even though the neutral shape looks fine.
This operator fixes exactly that. It takes the edit you just made to the current shape and applies that same delta across every existing shape key on the mesh, keeping all of them consistent with the new base instead of silently drifting out of sync.
Inputs and output
The only input is BPY_OBJ - the mesh coming in, with a base-geometry edit that needs propagating to its existing shape keys. There's nothing to configure; it's a single, unparameterized cleanup step.
Output is a single BPY_OBJ, shape keys now updated to match.
Installing it
ComfyUI Manager: search "avatar-graph-comfyui", install, restart. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/avatechai/avatar-graph-comfyui, then cd avatar-graph-comfyui && python -m pip install -r requirements.txt, then restart.
Python 3.10.x is the requirement to nail down first - the bpy package this pack is built on needs that exact minor version, and the README recommends a dedicated conda environment on macOS/Linux (conda create --name comfyui python=3.10) rather than trusting an existing Python install. Windows users get a prebuilt ComfyUI + Python 3.10 zip linked in the README to unzip over their install before adding the pack via Manager. Restart with --enable-cors-header (macOS also wants --force-fp16) for the live 3D preview - worth having active while rigging, since a stale shape key is exactly the kind of bug that's obvious once you can actually see the expression play, and easy to miss staring at raw numbers.
Common issues
Rule out the Python version first if this pack's nodes aren't loading. If you run this before any shape keys exist on the mesh yet, it's a no-op - nothing to propagate to, and it won't error, it'll just do nothing. If shapes still look wrong afterward, check that the base-geometry edit you're trying to propagate actually happened as a live change this node can see - it needs to catch the edit as a current delta on the mesh, not something that was already applied and reverted somewhere upstream in the graph before this node ever ran. This is genuinely the kind of node worth adding as a matter of habit any time a base shape gets touched after shape keys already exist, rather than only reaching for it once something's visibly broken.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |