Transform Edge Bevelweight
Softening edges with bevel weights, one float at a time
- BPY_OBJ
- BPY_OBJ
Transform Edge Bevelweight sets the bevel weight of the selected edges on your mesh. In Blender that's the number a Bevel modifier reads to decide which edges get rounded and how much - paint a 0.0–1.0 weight onto edges, and the bevel follows it. As an Avatar Graph node it's your way of doing that from inside a graph instead of a 3D viewport.
Why would you care in this pack? Avatar Graph's characters are flat, texture-mapped planes stitched together into mesh layers. If you're adding any geometry with actual thickness - a prop, a 3D piece of hair, an accessory - bevel weights are how you stop it looking like a paper cutout. A small bevel weight on the visible silhouette edges kills the razor-sharp look that screams "generated." It's a polish node, but polish is what separates a rig that looks like an asset from one that looks like a flat cutout.
How it works
This is an EditOps node: the wrapper deselects everything, sets your BPY_OBJ active, enters edit mode, runs bpy.ops.transform.edge_bevelweight, then returns to object mode and hands the object back. The value input is a FLOAT - the weight to stamp onto the selected edges. The widget shows a range of -1 to 1 (that's Blender's hard min/max leaking through the auto-generated wrapper), but bevel weights are meaningful in the 0–1 range: 0 means untouched, 1 means fully beveled.
The other inputs are the standard transform-tool boilerplate: snap, release_confirm, use_accurate. You can ignore all three. There's no mirror here, so if you want symmetric bevels you set weights on both sides yourself or rely on Blender's mirror modifier elsewhere in the pipeline.
Inputs that matter
- BPY_OBJ - the mesh to operate on.
- value - the bevel weight (0–1) to apply to selected edges.
That's the whole interface. Output: BPY_OBJ - the modified mesh for the next node.
The catch, and it's the same one across this whole generated family: the node operates on whatever is selected in the shared Blender scene when it runs. The wrapper doesn't give you a selection input, so you need the selection to already be where you expect - typically by chaining after a mesh-select node or setting it up earlier in the graph.
Installing it
Part of the Avatar Graph pack. ComfyUI Manager → search "Avatar Graph", or:
cd ComfyUI/custom_nodes
git clone https://github.com/avatechai/avatar-graph-comfyui
cd avatar-graph-comfyui && python -m pip install -r requirements.txt
Restart after. Pack gotchas: bpy==3.6.0 needs Python 3.10.x (a 3.11+ env fails to install the pack), and the first launch downloads the SAM ViT-H model (~2.5 GB) to ComfyUI/models/sams plus two MediaPipe landmarker files.
Common issues
- "No module named bpy" → Python 3.10.x, always the first suspect.
- Bevel weights don't show up visually → weights only do something when a Bevel modifier is set to use them. The node just writes the attribute; the bevel happens elsewhere. Set
valueto 0 to clear edges. - It beveled the wrong edges → selection. The node acts on the current selection; sort that out earlier in the chain.
- Scene resets between runs - build and bevel in a single graph pass.
If your avatars are strictly flat planes, you can skip this. The moment you add any 3D geometry, it's the difference between "cutout" and "asset."
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — | |
| valueopt | FLOAT | 0.00-1–1 | — |
| snapopt | BOOLEAN | false | — |
| release_confirmopt | BOOLEAN | false | — |
| use_accurateopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |