mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-14 19:27:01 -04:00
Issue #157: colour-range mask tolerance narrowed so a sample stops at its own colour
`tol = 0.04 + 0.16·refine` fully selected anything within 0.06 OkLab of a sample at the default Refine 50. Through `tonemap_for_select` the report's teal mid-grey and neutral light grey are only ~0.063 apart (L 0.60 vs 0.72, a/b ≤ 0.02), so the second patch was 99 % selected and the mask covered the whole photo; Refine 85 and 100 kept most of it too. Now `0.015 + 0.06·refine` (full ≤ 0.0225 / gone ≥ 0.045 at Refine 50, gone ≥ 0.066 at 85, 0.075 at 100), computed once in `lightcraft_pipeline::masks::color_range_tolerance` and used by both the CPU evaluator and the GPU `mask.wgsl` kind-3 parameter so the two keep agreeing. Test: two flat patches at the report's sRGB values, sampled as `mask.sampleColor` does; the sampled patch stays fully selected and the other one is out at Refine 0, 50 and 85 and mostly out at 100. Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
1 parent
629e39380e
commit
39e04ae7ab
2 files changed
+55
-2
No files matched your search
@@ -905,7 +905,7 @@ fn masks(cx: &mut Cx<'_>, lin: &Buf, prep: &Prep, plan: &Plan<'_>, host: &mut Ho
|
||||
Some(2)
|
||||
}
|
||||
MaskShape::ColorRange { samples, refine } => {
|
||||
let tol = 0.04 + 0.16 * (*refine as f32 / 100.0);
|
||||
let tol = lightcraft_pipeline::masks::color_range_tolerance(*refine);
|
||||
p.extend([tol.to_bits(), ev.exp2().to_bits(), samples.len() as u32]);
|
||||
aux.extend(samples.iter().flat_map(|s| s.map(|v| v as f32)));
|
||||
Some(3)
|
||||
|
||||
Reference in new issue
Block a user