Constant BLEND

Source
pub const BLEND: &str = r#"
float blend_1(int mode, float s, float d) {
    if (mode == 1) { return s * d; }                                    // Multiply
    if (mode == 2) { return 1.0 - (1.0 - s) * (1.0 - d); }              // Screen
    if (mode == 3) {                                                    // Overlay
        return (d <= 0.5) ? 2.0 * s * d : 1.0 - 2.0 * (1.0 - s) * (1.0 - d);
    }
    if (mode == 4) { return min(s, d); }                                // Darken
    if (mode == 5) { return max(s, d); }                                // Lighten
    if (mode == 6) { return min(s + d, 1.0); }                          // Add
    if (mode == 7) { return max(d - s, 0.0); }                          // Subtract
    if (mode == 8) { return abs(s - d); }                               // Difference
    if (mode == 9) {                                                    // SoftLight
        if (s <= 0.5) { return d - (1.0 - 2.0 * s) * d * (1.0 - d); }
        float g = (d <= 0.25) ? ((16.0 * d - 12.0) * d + 4.0) * d : sqrt(d);
        return d + (2.0 * s - 1.0) * (g - d);
    }
    if (mode == 10) {                                                   // HardLight
        return (s <= 0.5) ? 2.0 * s * d : 1.0 - 2.0 * (1.0 - s) * (1.0 - d);
    }
    if (mode == 11) {                                                   // ColorDodge
        if (d <= 0.0) { return 0.0; }
        if (s >= 1.0) { return 1.0; }
        return min(d / (1.0 - s), 1.0);
    }
    if (mode == 12) {                                                   // ColorBurn
        if (d >= 1.0) { return 1.0; }
        if (s <= 0.0) { return 0.0; }
        return 1.0 - min((1.0 - d) / s, 1.0);
    }
    return s;                                                           // Normal
}

vec3 blend(int mode, vec3 s, vec3 d) {
    if (mode == 0) { return s; }
    return vec3(blend_1(mode, s.r, d.r), blend_1(mode, s.g, d.g), blend_1(mode, s.b, d.b));
}
"#;
Expand description

Blend modes as a GLSL function (vec3 blend(int mode, vec3 s, vec3 d)) mirroring engine::blend. The int is BlendMode::ALL’s index — see blend_index in engine/gpu.rs.