π Moon Anima Regional Patcher (Advanced)
The one Anima regional node that knows when to stop masking
- model
- clip
- mask_list
- patched_model
- POSITIVE
- NEGATIVE
The plain Moon Anima Regional Patcher does the attention masking and expects you to hand it pre-encoded conditioning lists. This Advanced version is the one you'll actually reach for on a two-character scene, because it does the encoding for you and - the genuinely clever part - knows when to stop masking and let the whole canvas blend back together. That scheduling is what separates "two clean characters" from "two characters with a visible seam down the middle."
What changed
Instead of wiring in a Moon Indexed Encoder, you get a single multi-line positive_text box. Type the base prompt, then BREAK on its own line, then one prompt per region:
duo, outdoors, oil painting
BREAK
anthro lynx
BREAK
anthro tiger
The node splits on BREAK, encodes each part with your clip (the Qwen3-0.6B encoder that ships with Anima), and attaches each prompt to the matching mask in mask_list. Region N's prompt pairs with mask N, same indexing as the standard patcher.
The inputs that matter
prompt_mode- decides what thePOSITIVEoutput actually carries.base_onlypasses just the base prompt (the safe default).concat_textandconcat_conditioningglue everything into one pass for stronger multi-character interaction.merge_averageblends all conditionings into a single average embedding.comfy_area_conditioningemits a standard ComfyUI area-conditioning list with the masks attached - useful if you want to hand regions to nodes that expect that format.conditioning_dropoff- the headline feature. At whatever point you set (0.40β0.60 works well), the node switches from your selected mode to clean base-only conditioning for the rest of the run. Early steps need the full regional text to lock in poses and composition; late steps just want to refine detail without the regional noise. Default 1.0 keeps the mode all the way through - which, per the community consensus on this technique, is exactly how you get seams.cross_mask_strength(1.0),self_mask_strength(0.0),base_strength(0.8) andbase_ratio(0.0) - identical to the standard patcher. Raise self-masking only if bounds leak, and rememberbase_ratioabove 0 doubles per-step cost.
Wiring it up
model (Anima) and clip (from a Qwen CLIPLoader) in, patched_model out to your KSampler. POSITIVE and NEGATIVE come out fully built - you don't need a separate CLIP Text Encode anywhere in the regional chain. negative_text is applied globally as you'd expect.
Install and gotchas
cd ComfyUI/custom_nodes
git clone https://github.com/m0rtus59/ComfyUI-MoonNodes.git
cd ComfyUI-MoonNodes
pip install -r requirements.txt
Restart after, or install via ComfyUI Manager (search "ComfyUI-MoonNodes"). The only pinned dependency is google-genai, and it's imported at pack load time by the Gemini nodes - so yes, you need it even if you never touch Gemini, or the whole pack vanishes from your node list.
The usual traps: the inputs are list-typed and positive_list[0] - your base prompt - must exist or you get a runtime error; extra masks beyond your encoded prompts are silently ignored. The pack ships example workflows in its workflows/ folder, which is the fastest way to see the whole chain in one go.
When to use it
Any time you're regional prompting on Anima and you'd rather type than wire encoders. The conditioning dropoff is the reason to prefer this over the standard node - it's the "end masking early" best practice from the regional-prompting playbook, baked into a single slider instead of left to your discipline.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The Anima diffusion model to patch with regional conditioning. | |
| clip | CLIP | The CLIP / Qwen text encoder used to tokenize and encode prompts. | |
| mask_list | MASK | List of spatial masks corresponding to regional prompt zones (Zone 0, Zone 1, ...). | |
| positive_text | STRING | duo, outdoors, oil painting BREAK anthro lynx BREAK anthro tiger | Multi-line prompt. Use 'BREAK' on its own line or between phrases to separate the base prompt from regional prompts. |
| negative_text | STRING | low quality, blurry, deformed | Negative prompt applied across the generation. |
| prompt_mode | COMBO | base_only | - base_only: passes only prompt 0 (base) to POSITIVE output. - concat_text: replaces BREAK with a newline for a single natural language encoding pass. - concat_conditioning: concatenates individual conditioning tensors. - merge_average: blends/averages all conditionings into a single embedding. - comfy_area_conditioning: outputs standard ComfyUI area-conditioning list with spatial masks attached. |
| conditioning_start_percent | FLOAT | 0.000β1 | Sampling percentage (0.0 to 1.0) when the selected prompt mode begins. Before this point, only the clean base prompt is applied. |
| conditioning_dropoff | FLOAT | 1.000β1 | At what point in generation (0.0 to 1.0) the prompt switches back to 'base_only'. Default 1.0 uses the selected mode all the way through. Setting to e.g. 0.40β0.60 uses concatenated/merged conditioning for early poses/composition, then drops off to clean base conditioning to eliminate noise and refine sharp details. |
| base_strength | FLOAT | 0.800β1 | How much the global base prompt affects regional zones. Higher values blend more shared style/lighting into regions; lower values isolate the regional prompt. |
| start_percent | FLOAT | 0.000β1 | Sampling percentage (0.0β1.0) when regional conditioning starts being applied. |
| end_percent | FLOAT | 1.000β1 | Sampling percentage (0.0β1.0) when regional conditioning stops being applied. |
| cross_mask_strength | FLOAT | 1.000β1 | Cross-attention isolation between distinct regions (Zone A vs Zone B). 1.0 blocks bleed-through; lower values allow soft cross-regional influence. |
| self_mask_strength | FLOAT | 0.000β1 | Spatial self-attention isolation between regions. 0.0 maintains global scene coherence (shared lighting, perspective); higher values isolate spatial patches. |
| base_ratio | FLOAT | 0.000β1 | Direct blend ratio with the un-partitioned base generation. 0.0 is pure regional output. Values > 0 blend in the global base image (runs the model twice per step). |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| patched_model | MODEL | β |
| POSITIVE | CONDITIONING | β |
| NEGATIVE | CONDITIONING | β |