Merge branch 'worktree-agent-a22a049c461818dbe' into integration
# Conflicts: # core/dr-pipeline/tests/mask_sidecar.rs
This commit is contained in:
@@ -43,7 +43,9 @@ struct MaskParams {
|
||||
// `falloff_code` on the Rust side.
|
||||
falloff: u32,
|
||||
|
||||
// Geometry, in normalised output coordinates. Meaning depends on `mode`.
|
||||
// Geometry. Meaning depends on `mode`. The centre is in normalised 0..1
|
||||
// coordinates; every distance below it is in the isotropic frame units
|
||||
// `frame_delta` establishes.
|
||||
centre: vec2<f32>,
|
||||
// Linear: (cos, sin) of the ramp direction. Radial: semi-axes.
|
||||
axis: vec2<f32>,
|
||||
@@ -128,9 +130,23 @@ fn region_mask(px: vec2<i32>) -> f32 {
|
||||
return total / n;
|
||||
}
|
||||
|
||||
// Offset from a gradient's centre, in the frame's own **isotropic** units:
|
||||
// y spans 0..1 and x spans 0..aspect, so a step of the same length means the
|
||||
// same distance whichever way it points.
|
||||
//
|
||||
// Without this the geometry lives in raw 0..1, where one axis is compressed
|
||||
// against the other by the aspect ratio — so a 45° ramp is not at 45° on
|
||||
// anything but a square frame, and a radial with equal radii draws an ellipse.
|
||||
// Both faults are invisible in the stored numbers and obvious the moment a
|
||||
// handle is dragged on a photograph, which is what this exists for.
|
||||
fn frame_delta(uv: vec2<f32>) -> vec2<f32> {
|
||||
let aspect = vec2<f32>(f32(p.width) / f32(max(p.height, 1u)), 1.0);
|
||||
return (uv - p.centre) * aspect;
|
||||
}
|
||||
|
||||
fn linear_mask(uv: vec2<f32>) -> f32 {
|
||||
// Signed distance along the ramp direction, from the centre.
|
||||
let d = dot(uv - p.centre, p.axis);
|
||||
let d = dot(frame_delta(uv), p.axis);
|
||||
if (p.softness <= 0.0) {
|
||||
return select(0.0, 1.0, d >= 0.0);
|
||||
}
|
||||
@@ -140,7 +156,7 @@ fn linear_mask(uv: vec2<f32>) -> f32 {
|
||||
fn radial_mask(uv: vec2<f32>) -> f32 {
|
||||
let ca = cos(-p.angle);
|
||||
let sa = sin(-p.angle);
|
||||
let d = uv - p.centre;
|
||||
let d = frame_delta(uv);
|
||||
// Into the ellipse's own frame, then normalised by its semi-axes so the
|
||||
// problem becomes a unit circle.
|
||||
let local = vec2<f32>(d.x * ca - d.y * sa, d.x * sa + d.y * ca);
|
||||
|
||||
Reference in New Issue
Block a user