BD Blender Edge Marking
Mark the edges you want to survive, before the geometry tools eat them
- mesh
- mesh
- edge_preview
- edge_metadata
- status
Mesh tools have a bad habit of collapsing edges you wanted to keep. If you're doing stylized low-poly work, the fix isn't to fight the decimator - it's to tell the pipeline which edges matter before you run it. BD Blender Edge Marking does exactly that: it detects edges worth preserving - where colors change, where the surface angle changes - and marks them as sharp/seam/crease on the mesh, so downstream tools like BD Blender Merge Planes respect them.
The feature that makes it interesting for image-to-3D pipelines is color-based edge detection. A character's shirt-to-skin boundary is a color boundary, and if you mark those edges as sharp, they survive decimation and merging while flat interior regions get eaten away. That's how you get a clean low-poly character instead of a melted one.
Operations
- FROM_COLORS_AND_ANGLE (default) - marks edges where color changes or face angle does. The combined mode and the one you'll usually want.
- FROM_COLORS - color-change edges only. Controlled by color_threshold (0.15).
- FROM_ANGLE - dihedral angle edges only. Controlled by angle_threshold (30°).
- CLEAR - wipe existing sharp/crease marks.
- SHARP_TO_CREASE / CREASE_TO_SHARP - convert between mark types (handy for different downstream tools).
Plus mark_mode (ADD vs REPLACE), mark_type, crease_value, clear_sharp/clear_crease, and a generate_preview that outputs a visible wireframe of the marked edges as its own TRIMESH (preview_thickness controls the tube size).
The warning that matters
The node's docs carry a big ⚠️ for a reason: color detection requires FACE/CORNER-domain vertex colors. That means the colors must live per-corner (per-face), not per-vertex (POINT domain) - because POINT-domain colors are shared at vertices, so two faces meeting at a vertex report the same color and there's nothing to detect. To feed this node correctly, sample colors with BD_SampleVoxelgridColors in face mode (which produces the CORNER domain). Get this wrong and FROM_COLORS silently finds nothing.
Outputs: the marked mesh, an edge_preview TRIMESH, edge_metadata (an EDGE_METADATA object you can feed to BD Blender Merge Planes or BD Combine Edge Metadata), and status.
Install
Pack install as usual:
cd ComfyUI/custom_nodes
git clone https://github.com/BizaNator/ComfyUI-BrainDead
cd ComfyUI-BrainDead
pip install -r requirements.txt
(ComfyUI Manager → "BrainDead", restart.) It's a Blender node, so the recurring rule applies: a real Blender must be on the system (/usr/bin/blender, a sibling pack, or a bundled build you place yourself) - the README's "bundled" claim refers to scripts, not the binary. Keep ComfyUI current for the V3 API.
The typical pipeline shape: BD Planar Grouping (clean boundaries) → BD Blender Edge Marking (FROM_COLORS_AND_ANGLE) → BD Blender Merge Planes (delimit_sharp=True) - that's the pack's documented hard-edge preservation chain, and each node in it depends on the one before doing its job.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| mesh | TRIMESH | — | |
| operation | COMBO | FROM_COLORS_AND_ANGLE | Edge marking operation (combined mode detects both color and angle edges) |
| color_threshold | FLOAT | 0.150.01–1 | Color difference threshold (for FROM_COLORS) |
| angle_threshold | FLOAT | 300–180 | Angle threshold in degrees (for FROM_ANGLE) |
| mark_mode | COMBO | ADD | ADD to existing marks or REPLACE all |
| mark_type | COMBO | BOTH | Type of edge mark to apply |
| crease_value | FLOAT | 1.00–1 | Crease strength (for CREASE marking) |
| clear_sharp | BOOLEAN | false | Clear sharp marks (for CLEAR/conversion ops) |
| clear_crease | BOOLEAN | false | Clear crease values (for CLEAR/conversion ops) |
| generate_preview | BOOLEAN | true | Generate edge preview mesh (visible wireframe of marked edges) |
| preview_thickness | FLOAT | 0.00200.0005–0.02 | Thickness of preview edge tubes (mesh units) |
| timeoutopt | INT | 12030–600 | Maximum processing time |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| mesh | TRIMESH | — |
| edge_preview | TRIMESH | — |
| edge_metadata | EDGE_METADATA | — |
| status | STRING | — |