hashavatar 1.1.0

Stable deterministic procedural avatars in Rust with configurable identity hashing, WebP, optional PNG/JPEG/GIF, and SVG export
Documentation
use super::*;

pub(crate) fn render_rocket_svg(spec: AvatarSpec, identity: &AvatarIdentity) -> String {
    let w = spec.width as f32;
    let h = spec.height as f32;
    let cx = w / 2.0;
    let cy = h * 0.52;
    let body_w = w * (0.18 + identity.unit_f32(5) * 0.05);
    let body_h = h * (0.42 + identity.unit_f32(6) * 0.08);
    let top_y = cy - body_h / 2.0;
    let bottom_y = cy + body_h / 2.0;
    let hull = hsl_to_color(200.0 + identity.unit_f32(1) * 50.0, 0.12, 0.88);
    let trim = hsl_to_color(identity.unit_f32(2) * 360.0, 0.58, 0.54);
    let window = hsl_to_color(185.0 + identity.unit_f32(3) * 70.0, 0.54, 0.72);
    let flame = hsl_to_color(20.0 + identity.unit_f32(4) * 30.0, 0.86, 0.58);
    let mut windows = String::new();
    for index in 0..(1 + (identity.byte(7) % 2) as usize) {
        let wy = top_y + body_h / 3.0 + index as f32 * body_w;
        windows.push_str(&format!(
            r##"<circle cx="{cx}" cy="{wy}" r="{wr}" fill="{trim}"/><circle cx="{cx}" cy="{wy}" r="{ir}" fill="{window}"/>"##,
            wr = body_w * 0.22,
            ir = body_w * 0.15,
            trim = color_hex(trim),
            window = color_hex(window),
        ));
    }
    format!(
        r##"<polygon points="{nx1},{ny1} {nx2},{ny1} {cx},{ny2}" fill="{trim}"/><rect x="{bx}" y="{by}" width="{bw}" height="{bh}" fill="{hull}"/><ellipse cx="{cx}" cy="{by}" rx="{erx}" ry="{ery}" fill="{hull}"/><polygon points="{lf1},{lfy1} {lf2},{lfy2} {lf3},{lfy3}" fill="{trim}"/><polygon points="{rf1},{lfy1} {rf2},{lfy2} {rf3},{lfy3}" fill="{trim}"/>{windows}<polygon points="{fx1},{fy1} {fx2},{fy1} {cx},{fy2}" fill="{flame}"/>"##,
        cx = cx,
        nx1 = cx - body_w / 2.0,
        nx2 = cx + body_w / 2.0,
        ny1 = top_y + body_w / 2.0,
        ny2 = top_y - body_w / 2.0,
        trim = color_hex(trim),
        bx = cx - body_w / 2.0,
        by = top_y + body_w / 2.0,
        bw = body_w,
        bh = body_h - body_w / 2.0,
        hull = color_hex(hull),
        erx = body_w / 2.0,
        ery = body_w / 5.0,
        lf1 = cx - body_w / 2.0,
        lf2 = cx - body_w,
        lf3 = cx - body_w / 2.0,
        rf1 = cx + body_w / 2.0,
        rf2 = cx + body_w,
        rf3 = cx + body_w / 2.0,
        lfy1 = bottom_y - body_w / 2.0,
        lfy2 = bottom_y + body_w / 3.0,
        lfy3 = bottom_y,
        windows = windows,
        fx1 = cx - body_w / 4.0,
        fx2 = cx + body_w / 4.0,
        fy1 = bottom_y,
        fy2 = bottom_y + h * (0.10 + identity.unit_f32(8) * 0.08),
        flame = color_hex(flame),
    )
}