Mesh Edge Rotate
Flip a triangle pair's shared diagonal
- BPY_OBJ
- BPY_OBJ
If you've ever hit Ctrl+E → Rotate Edge in Blender to fix an ugly triangulation, this is that operator, wired straight into ComfyUI. Give it a mesh with a selected edge that's shared by two triangles, and it flips which pair of corners that edge connects - the two triangles stay in place, but the diagonal running through their shared quad swaps to the other direction. No vertex moves; only the connectivity changes.
Why you'd reach for it
That sounds tiny, but it's a real fix, not a curiosity. Auto-generated meshes - like the ones Avatar Graph builds from a segmented character image, its whole reason for existing - often triangulate in a way that looks fine in a still render but deforms badly once you drive it with shape keys (Avatar Graph's blink/mouth-movement rigging step). A badly-oriented diagonal across a quad is exactly the kind of thing that pinches or creases wrong when the mesh bends. Rotating it to the other diagonal is the standard retopology fix, and it's cheap: it doesn't add or remove geometry, it just changes which corners are connected.
This node isn't part of the README's documented node table - none of the twenty in this family are. They're a separate, auto-generated layer: the repo's own dev notes describe a generate_blender_types.py script for regenerating Blender operator bindings, and the naming convention (Mesh_EdgeRotate ↔ bpy.ops.mesh.edge_rotate) confirms it's a direct wrap of Blender's Edit Mode toolkit, exposed for anyone who needs to hand-fix topology the packaged nodes don't cover.
Inputs and outputs
BPY_OBJ in, BPY_OBJ out, plus one real setting: use_ccw (boolean, default false). It picks the rotation direction when there's ambiguity about which way to flip the diagonal - leave it off for the default (clockwise-equivalent) rotation, flip it on if the result comes out mirrored from what you expected. As with the rest of this family, it acts on whatever edge is currently selected on the incoming mesh object - there's no separate "which edge" parameter, because the selection travels with the BPY_OBJ itself.
Installing Avatar Graph
ComfyUI Manager is the easy route: search "Avatar Graph," install, restart. Manual install is cd ComfyUI/custom_nodes && git clone https://github.com/avatechai/avatar-graph-comfyui, then inside that folder python -m pip install -r requirements.txt, then restart. Worth flagging: the README's own manual-clone command actually points at a different GitHub org (avatechgg rather than avatechai) - use the canonical URL above instead of copy-pasting that line verbatim.
The thing that actually decides whether this installs cleanly is your Python version, not the clone step. The pack depends on bpy, Blender's Python API, which only publishes wheels for specific Python builds - this one needs 3.10.x exactly. If your ComfyUI is running a newer Python (3.11, 3.12, common on current portable builds), bpy will fail to install or import. Conda is the cleanest fix on Mac/Linux (conda create --name comfyui python=3.10); on Windows, the author ships a whole prebuilt ComfyUI + Python 3.10 zip rather than asking you to retrofit an existing setup.
Once it loads, restart with python main.py --enable-cors-header (add --force-fp16 on Mac) if you want the live preview panel talking to Avatech's hosted editor at editor.avatech.ai. Without that flag, everything still runs - you just export manually via right-click → Save on Avatar Main Output instead of watching it live.
Common issues
No model downloads, no exotic runtime dependency beyond bpy - install friction is almost always the Python-version mismatch, and preview friction is almost always the missing CORS flag. The README's own warning that nodes and templates are "still making changes" is a fair heads-up for why documentation on a node this specific is essentially nonexistent.
The one thing to actually watch for with this node: it only does anything useful on an edge that's shared by exactly two triangles. Run it on a boundary edge, an edge bordering an n-gon, or nothing selected at all, and you'll get no visible change rather than an error - check upstream selection first if the topology isn't shifting the way you expect.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — | |
| use_ccwopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |