par-term 0.32.0

Cross-platform GPU-accelerated terminal emulator with inline graphics support (Sixel, iTerm2, Kitty)
/*! par-term shader metadata
name: gradient-background
author: null
description: null
version: 1.0.0
defaults:
  animation_speed: 0.5
  channel0: ''
  channel1: null
  channel2: null
  channel3: null
  cubemap: textures/cubemaps/env-outside
  cubemap_enabled: false
  use_background_as_channel0: null
  uniforms:
    angle_speed: 0.24999996
    animate_angle: false
    gradient_angle: 45.0
    gradient_center:
    - 0.5
    - 0.5
    gradient_end_color: '#c48a3a'
    gradient_mid_color: '#2b6f6f'
    gradient_start_color: '#0b1d33'
    gradient_type: 0
    wave_frequency: 3.0
*/

// credits: https://github.com/unkn0wncode

// control color label="Start Color"
uniform vec3 gradient_start_color;
// control color label="Middle Color"
uniform vec3 gradient_mid_color;
// control color label="End Color"
uniform vec3 gradient_end_color;
// control select options="linear,radial,conic,diamond,wave" label="Gradient Type"
uniform int gradient_type;
// control angle unit=degrees label="Angle"
uniform float gradient_angle;
// control checkbox label="Animate Angle"
uniform bool animate_angle;
// control slider min=-2 max=2 step=0.01 label="Angle Speed"
uniform float angle_speed;
// control point label="Gradient Center"
uniform vec2 gradient_center;
// control slider min=0.25 max=12 step=0.05 label="Wave Frequency"
uniform float wave_frequency;

vec3 gradientPalette(float t) {
    t = clamp(t, 0.0, 1.0);

    vec3 startColor = gradient_start_color;
    vec3 midColor = gradient_mid_color;
    vec3 endColor = gradient_end_color;
    float paletteSpan = distance(startColor, midColor) + distance(midColor, endColor) + distance(startColor, endColor);

    if (paletteSpan < 0.01) {
        startColor = vec3(0.043, 0.114, 0.200);
        midColor = vec3(0.169, 0.435, 0.435);
        endColor = vec3(0.769, 0.541, 0.227);
    }

    if (t < 0.5) {
        return mix(startColor, midColor, t * 2.0);
    }
    return mix(midColor, endColor, (t - 0.5) * 2.0);
}

float linearGradient(vec2 uv, float angle, vec2 center) {
    vec2 dir = vec2(cos(angle), sin(angle));
    vec2 p = uv - center;
    float span = abs(dir.x) + abs(dir.y);
    return dot(p, dir) / max(span, 0.0001) + 0.5;
}

vec2 rotatePoint(vec2 p, float angle) {
    float s = sin(angle);
    float c = cos(angle);
    return vec2(c * p.x - s * p.y, s * p.x + c * p.y);
}

void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
    vec2 uv = fragCoord.xy / iResolution.xy;
    vec2 centered = uv - gradient_center;
    centered.x *= iResolution.x / iResolution.y;

    float gradientFactor;
    float effectiveAngle = gradient_angle;
    if (animate_angle) {
        effectiveAngle += iTime * angle_speed;
    }

    if (gradient_type == 0) {
        gradientFactor = linearGradient(uv, effectiveAngle, gradient_center);
    } else if (gradient_type == 1) {
        gradientFactor = length(centered) * 1.8;
    } else if (gradient_type == 2) {
        gradientFactor = fract(atan(centered.y, centered.x) / 6.2831853 + 0.5);
    } else if (gradient_type == 3) {
        vec2 rotated = rotatePoint(centered, effectiveAngle);
        gradientFactor = (abs(rotated.x) + abs(rotated.y)) * 1.4;
    } else {
        float linear = linearGradient(uv, effectiveAngle, gradient_center);
        gradientFactor = 0.5 + 0.5 * sin((linear * wave_frequency + iTime * 0.08) * 6.2831853);
    }

    fragColor = vec4(gradientPalette(gradientFactor), 1.0);
}