Nodes/BV Node Pack/πŸŒ€ BV Regional LUT Plan
ComfyUI Node

πŸŒ€ BV Regional LUT Plan

Give each region of the scene its own grade

By BlackVortexAIΒ·Created 8 months agoΒ·Updated a day agoΒ· 6
πŸŒ€ BV Regional LUT Plan
  • 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
β—„config_json{"version":1,"jobs":[]}β–Ί

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_json has 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_ids scoped as global will intentionally grade everything. Check mask_composition and 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.

CategoryπŸŒ€ BV Node Pack/regional/LUT

Inputs (42)

NameTypeDefaultDescription
regional_promptBV_REGIONALβ€”
config_jsonSTRING{"version":1,"jobs":[]}β€”
resource_provider_1optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_2optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_3optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_4optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_5optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_6optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_7optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_8optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_9optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_10optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_11optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_12optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_13optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_14optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_15optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_16optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_17optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_18optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_19optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_20optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_21optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_22optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_23optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_24optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_25optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_26optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_27optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_28optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_29optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_30optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_31optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_32optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_33optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_34optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_35optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_36optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_37optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_38optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_39optBV_RUNTIME_RESOURCE_PROVIDERβ€”
resource_provider_40optBV_RUNTIME_RESOURCE_PROVIDERβ€”

Outputs (3)

NameTypeDescription
lut_planBV_LUT_PLANβ€”
job_countINTβ€”
plan_summarySTRINGβ€”