π BV Regional LUT Plan
Give each region of the scene its own grade
- regional_prompt
- resource_provider_1
- resource_provider_2
- resource_provider_3
- resource_provider_4
- resource_provider_5
- resource_provider_6
- resource_provider_7
- resource_provider_8
- resource_provider_9
- resource_provider_10
- resource_provider_11
- resource_provider_12
- resource_provider_13
- resource_provider_14
- resource_provider_15
- resource_provider_16
- resource_provider_17
- resource_provider_18
- resource_provider_19
- resource_provider_20
- resource_provider_21
- resource_provider_22
- resource_provider_23
- resource_provider_24
- resource_provider_25
- resource_provider_26
- resource_provider_27
- resource_provider_28
- resource_provider_29
- resource_provider_30
- resource_provider_31
- resource_provider_32
- resource_provider_33
- resource_provider_34
- resource_provider_35
- resource_provider_36
- resource_provider_37
- resource_provider_38
- resource_provider_39
- resource_provider_40
- lut_plan
- job_count
- plan_summary
This is the payoff node of BV Node Pack's color work: it builds an ordered LUT plan straight from your Regional V3 regions, so the subject gets one look, the background gets another, and a detected face inside the subject region can gate a third - all from the same regional graph you already drew. It's the LUT equivalent of regional prompting: the grade becomes part of the composition instead of a thing you slap on at the end.
If you've never touched Regional V3, the concept is simple: you draw named regions over your image (layered geometry with prompts and stable identities), and the pack compiles them into conditioning - or, here, into a plan of masked LUT jobs. This node reads that regional context, applies the LUT jobs you configured, and resolves each job's mask from the region masks, with optional detector bindings layered on top.
How it works
Two inputs drive it. regional_prompt is the BV_REGIONAL context from your regional graph - this is where the regions, their geometry, and their identities come from. config_json is the job list, defaulting to {"version":1,"jobs":[]}. Each job references the regions by id and says what to do with them:
{
"version": 1,
"jobs": [
{
"lut_source": { "resource_id": "hero" },
"region_ids": ["subject"],
"mask_composition": "union",
"strength": 0.8,
"mask_invert": false
}
]
}
The lut_source references a LUT by its resource id - which is why you connect BV LUT Registry's resource_provider into one of the 40 optional provider inputs. mask_composition controls how multiple region masks combine: union (any region), intersection (all of them), or subtract (region minus others). A job can also carry a detector binding, in which case the plan's resolver will run the detector and intersect the detected mask with the region - subject-only grading that survives the subject moving.
Outputs: lut_plan (wire it to BV LUT Loop Start), job_count, and plan_summary - one line per job (1. Dustfire Β· 1 region(s) Β· 0.80), which is your sanity check that the plan matches intent.
The inputs and outputs that matter
regional_prompt- the regional context; without regions, there's nothing to plan.config_json- the jobs. The pack's UI builds this for you; hand-editing works too, but the schema is strict.resource_provider_1β¦resource_provider_40- where named LUT providers (from BV LUT Registry) plug in.- Output
lut_planβ BV LUT Loop Start; the loop + resolver handle execution.
How to install
Part of BV Node Pack:
cd ComfyUI/custom_nodes
git clone https://github.com/BlackVortexAI/bv_nodepack.git
Restart ComfyUI, hard-refresh. Or ComfyUI Manager β "BV Node Pack". No models to download - LUTs are built-in or from ComfyUI/models/luts.
Common issues
- "LoRA/LUT target references a missing region" - the job references a region id that isn't in your regional document. Region ids are stable (that's the point of Regional V3), so this usually means the regional graph changed after you wrote the config. Re-save the config from the UI.
- Empty plan / "No LUT jobs" -
config_jsonhas no jobs, or no LUT capability resolved. Check that a registry provider is actually wired in. - The plan runs but the grade is global - a job with no
region_idsscoped as global will intentionally grade everything. Checkmask_compositionand scope per job.
If you've only ever done whole-image LUTs, this node is the reason to look at regional prompting at all. It turns color into a spatial decision, and once you've graded one face independently of its background, you won't want to go back.
Inputs (42)
| Name | Type | Default | Description |
|---|---|---|---|
| regional_prompt | BV_REGIONAL | β | |
| config_json | STRING | {"version":1,"jobs":[]} | β |
| resource_provider_1opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_2opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_3opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_4opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_5opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_6opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_7opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_8opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_9opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_10opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_11opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_12opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_13opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_14opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_15opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_16opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_17opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_18opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_19opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_20opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_21opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_22opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_23opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_24opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_25opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_26opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_27opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_28opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_29opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_30opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_31opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_32opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_33opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_34opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_35opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_36opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_37opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_38opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_39opt | BV_RUNTIME_RESOURCE_PROVIDER | β | |
| resource_provider_40opt | BV_RUNTIME_RESOURCE_PROVIDER | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| lut_plan | BV_LUT_PLAN | β |
| job_count | INT | β |
| plan_summary | STRING | β |