Nodes/AP Netflix VOID/VOID Quad Mask (AP)
ComfyUI Node

VOID Quad Mask (AP)

How VOID deletes an object and the mess it made

By adampolczynski·Created 5 months ago·Updated 5 months ago· 7
VOID Quad Mask (AP)
  • remove_mask
  • affected_mask
  • overlap_mask
  • quadmask

Ordinary inpainting masks one thing: where to regenerate. VOID asks for a bit more, and this node is where you provide it. The idea is that when you delete a person from a shot, you don't just have to fill in where they stood - you have to deal with the glass they were holding, the chair that was supporting them, the shadow under their feet. A plain mask says "remove this region"; the quadmask says "remove this region, and also rebuild these regions that physically reacted to it." That's the difference between a hole patched and a scene that looks like the object was never filmed.

It's called a quadmask because each pixel carries one of four values instead of the usual binary black-or-white:

  • 0.0 (black) - the primary object to remove
  • 63/255 - overlap: pixels that are both primary object and affected region
  • 127/255 - the affected region: things that fall, move, or otherwise react
  • 1.0 (white) - background, keep it

The node builds that 4-level map from up to three mask layers you feed it. remove_mask is required - white = the object to delete. affected_mask is optional - white = the region that physically reacts (the book that tips over when you take the hand away). overlap_mask is the fiddly one: white = pixels that are both, so a falling object that overlaps the person you're removing lands in overlap, not in both of the other masks. When layers conflict the priority is overlap > remove > affected > background, which keeps the "remove this" signal dominant. Wire it up, and the single quadmask output goes straight into the mask input of VoidSampler.

The whole thing is a thin, honest wrapper. Feed it only remove_mask and it emits a proper two-level VOID mask - remove/keep - which is genuinely enough for most scenes with no physics interactions. In fact any plain ComfyUI binary mask is accepted and auto-converted, so if you just want the four levels as "here's the thing, get rid of it," you can skip the extra layers entirely. The quadmask detail matters only when the scene has visible knock-on effects you want the model to rebuild.

The one convention that trips everyone: the polarity is flipped from what you're used to. In ComfyUI you normally paint white = "do something here." Here black = remove and white = keep, matching the official VOID pipeline. The sampler passes this through as-is, so do not run InvertMask before it - you'd turn your "remove the person" mask into "remove everything except the person." The pack's own code even sniffs the mask values on load and prints a warning if it sees no background region at all, because that's the signature of an inverted mask sneaking in. Relatedly, don't set overlap_mask to an InvertMask of remove_mask - that's the full background, not the overlap, and it'll confuse the whole conditioning.

Getting the masks themselves is the usual drill from the masking docs: paint them by hand frame-by-frame, or run SAM / GroundingDINO on a keyframe and track it across the clip. For a first run, single-image (1 frame) is the fastest way to validate that your masks are even right before you spend GPU time on the video pass.

Install is the pack's shared story - ComfyUI Manager, search "AP Netflix VOID", or clone https://github.com/adampolczynski/AP_Netflix_VOID into ComfyUI/custom_nodes and restart. No pip dependencies. Just remember you're on a beta wrapper around a research model: the author's own demo admitted the cup removal "wasn't really satisfying," so budget some iteration on the affected/overlap layers - that's precisely the part that turns a so-so result into the "never there" effect.

CategoryAP/VOID

Inputs (3)

NameTypeDefaultDescription
remove_maskMASK
affected_maskoptMASK
overlap_maskoptMASK

Outputs (1)

NameTypeDescription
quadmaskMASK