Skip to main content

COLOUR_WGSL

Constant COLOUR_WGSL 

Source
pub const COLOUR_WGSL: &str = r#"
fn look_decode(c: vec3f) -> vec3f {
    return select(pow((c + 0.055) / 1.055, vec3f(2.4)), c / 12.92, c <= vec3f(0.04045));
}

fn look_encode(c: vec3f) -> vec3f {
    let x = clamp(c, vec3f(0.0), vec3f(1.0));
    return select(1.055 * pow(x, vec3f(1.0 / 2.4)) - 0.055, x * 12.92, x <= vec3f(0.0031308));
}

fn look_cbrt(x: f32) -> f32 {
    return sign(x) * pow(abs(x), 1.0 / 3.0);
}

fn look_oklab(encoded: vec3f) -> vec3f {
    let c = look_decode(encoded);
    let l = look_cbrt(0.41222146 * c.r + 0.53633255 * c.g + 0.051445995 * c.b);
    let m = look_cbrt(0.2119035 * c.r + 0.6806995 * c.g + 0.10739696 * c.b);
    let s = look_cbrt(0.08830246 * c.r + 0.28171885 * c.g + 0.6299787 * c.b);
    return vec3f(
        0.21045426 * l + 0.7936178 * m - 0.004072047 * s,
        1.9779985 * l - 2.4285922 * m + 0.4505937 * s,
        0.025904037 * l + 0.78277177 * m - 0.80867577 * s,
    );
}

fn look_srgb(lab: vec3f) -> vec3f {
    let l_ = lab.x + 0.39633778 * lab.y + 0.21580376 * lab.z;
    let m_ = lab.x - 0.105561346 * lab.y - 0.06385417 * lab.z;
    let s_ = lab.x - 0.08948418 * lab.y - 1.2914855 * lab.z;
    let l = l_ * l_ * l_;
    let m = m_ * m_ * m_;
    let s = s_ * s_ * s_;
    return look_encode(vec3f(
        4.0767417 * l - 3.3077116 * m + 0.23096994 * s,
        -1.268438 * l + 2.6097574 * m - 0.34131938 * s,
        -0.0041960863 * l - 0.7034186 * m + 1.7076147 * s,
    ));
}

fn look_stop_mix(a: vec4f, b: vec4f, f: f32, oklab: bool) -> vec4f {
    if (oklab) {
        let lab = mix(look_oklab(a.rgb), look_oklab(b.rgb), f);
        return vec4f(look_srgb(lab), mix(a.a, b.a, f));
    }
    return mix(a, b, f);
}

fn look_gradient_position(kind: f32, geometry: vec4f, p: vec2f) -> f32 {
    if (kind < 0.5) {
        let d = geometry.zw - geometry.xy;
        return clamp(dot(p - geometry.xy, d) / max(dot(d, d), 1e-12), 0.0, 1.0);
    }
    return clamp(length((p - geometry.xy) / max(geometry.zw, vec2f(1e-6))), 0.0, 1.0);
}
"#;