# icons.ling - small vector icons (Feather-style), drawn centred at (cx, cy) in colour c.
# The transport / file / edit icons match LingStationX; the rest are LingDev's node and tool icons.
fn icon_draw(name, cx, cy, size, c) {
    bind h = size * 0.5
    if st_get("clip_on", 0.0) > 0.5 {
        if cy - h < st_get("clip_y0", 0.0) || cy + h > st_get("clip_y1", 99999.0) || cx - h < st_get("clip_x0", 0.0) || cx + h > st_get("clip_x1", 99999.0) { return 0.0 }
    }
    if name == "play" {
        g_tri(cx - h * 0.55, cy - h, cx - h * 0.55, cy + h, cx + h * 0.95, cy, c)
        return 0.0
    }
    if name == "pause" {
        g_rect(cx - h * 0.7, cy - h * 0.85, h * 0.5, h * 1.7, c)
        g_rect(cx + h * 0.2, cy - h * 0.85, h * 0.5, h * 1.7, c)
        return 0.0
    }
    if name == "stop" {
        g_rrect(cx - h * 0.8, cy - h * 0.8, h * 1.6, h * 1.6, 2.0, c)
        return 0.0
    }
    if name == "rec" {
        g_disc(cx, cy, h * 0.85, c)
        return 0.0
    }
    if name == "loop" {
        bind x0 = cx - h
        bind x1 = cx + h
        bind y0 = cy - h * 0.55
        bind y1 = cy + h * 0.55
        g_line(x0 + 2.0, y0, x1 - 1.0, y0, c)
        g_line(x1 - 1.0, y0, x1 - 1.0, y1 - 1.0, c)
        g_line(x0 + 1.0, y1, x1 - 2.0, y1, c)
        g_line(x0 + 1.0, y0 + 1.0, x0 + 1.0, y1, c)
        g_tri(x1 - 4.0, y0 - 3.0, x1 - 4.0, y0 + 3.0, x1 + 1.0, y0, c)
        g_tri(x0 + 4.0, y1 - 3.0, x0 + 4.0, y1 + 3.0, x0 - 1.0, y1, c)
        return 0.0
    }
    if name == "skip_start" {
        g_rect(cx - h * 0.8, cy - h * 0.7, 1.5, h * 1.4, c)
        g_tri(cx + h * 0.7, cy - h * 0.7, cx + h * 0.7, cy + h * 0.7, cx - h * 0.5, cy, c)
        return 0.0
    }
    if name == "skip_end" {
        g_rect(cx + h * 0.65, cy - h * 0.7, 1.5, h * 1.4, c)
        g_tri(cx - h * 0.7, cy - h * 0.7, cx - h * 0.7, cy + h * 0.7, cx + h * 0.5, cy, c)
        return 0.0
    }
    if name == "chev_r" {
        g_tri(cx - h * 0.4, cy - h * 0.65, cx - h * 0.4, cy + h * 0.65, cx + h * 0.55, cy, c)
        return 0.0
    }
    if name == "chev_l" {
        g_tri(cx + h * 0.4, cy - h * 0.65, cx + h * 0.4, cy + h * 0.65, cx - h * 0.55, cy, c)
        return 0.0
    }
    if name == "chev_d" {
        g_tri(cx - h * 0.65, cy - h * 0.4, cx + h * 0.65, cy - h * 0.4, cx, cy + h * 0.55, c)
        return 0.0
    }
    if name == "chev_u" {
        g_tri(cx - h * 0.65, cy + h * 0.4, cx + h * 0.65, cy + h * 0.4, cx, cy - h * 0.55, c)
        return 0.0
    }
    if name == "plus" {
        g_rect(cx - h * 0.8, cy - 0.5, h * 1.6, 1.5, c)
        g_rect(cx - 0.5, cy - h * 0.8, 1.5, h * 1.6, c)
        return 0.0
    }
    if name == "minus" {
        g_rect(cx - h * 0.8, cy - 0.5, h * 1.6, 1.5, c)
        return 0.0
    }
    if name == "x" {
        g_line(cx - h * 0.7, cy - h * 0.7, cx + h * 0.7, cy + h * 0.7, c)
        g_line(cx - h * 0.7, cy + h * 0.7, cx + h * 0.7, cy - h * 0.7, c)
        g_line(cx - h * 0.7 + 1.0, cy - h * 0.7, cx + h * 0.7 + 1.0, cy + h * 0.7, c)
        g_line(cx - h * 0.7 + 1.0, cy + h * 0.7, cx + h * 0.7 + 1.0, cy - h * 0.7, c)
        return 0.0
    }
    if name == "trash" {
        g_frame(cx - h * 0.6, cy - h * 0.4, h * 1.2, h * 1.35, c)
        g_rect(cx - h * 0.85, cy - h * 0.6, h * 1.7, 1.5, c)
        g_rect(cx - h * 0.25, cy - h * 0.95, h * 0.5, 1.5, c)
        g_rect(cx - h * 0.2, cy - h * 0.15, 1.0, h * 0.8, c)
        g_rect(cx + h * 0.15, cy - h * 0.15, 1.0, h * 0.8, c)
        return 0.0
    }
    if name == "folder" {
        g_rrect(cx - h * 0.95, cy - h * 0.55, h * 1.9, h * 1.35, 2.0, c)
        g_rect(cx - h * 0.95, cy - h * 0.8, h * 0.85, h * 0.4, c)
        return 0.0
    }
    if name == "folder_open" {
        g_rframe(cx - h * 0.95, cy - h * 0.55, h * 1.9, h * 1.35, 2.0, c)
        g_rect(cx - h * 0.95, cy - h * 0.8, h * 0.85, h * 0.4, c)
        return 0.0
    }
    if name == "file" {
        g_rrect(cx - h * 0.65, cy - h * 0.9, h * 1.3, h * 1.8, 2.0, c)
        return 0.0
    }
    if name == "save" {
        g_rframe(cx - h * 0.85, cy - h * 0.85, h * 1.7, h * 1.7, 2.0, c)
        g_rect(cx - h * 0.45, cy - h * 0.85, h * 0.9, h * 0.55, c)
        g_frame(cx - h * 0.5, cy + h * 0.05, h * 1.0, h * 0.8, c)
        return 0.0
    }
    if name == "undo" {
        g_line(cx - h * 0.7, cy - h * 0.1, cx + h * 0.2, cy - h * 0.1, c)
        g_line(cx + h * 0.2, cy - h * 0.1, cx + h * 0.8, cy + h * 0.35, c)
        g_line(cx + h * 0.8, cy + h * 0.35, cx + h * 0.8, cy + h * 0.6, c)
        g_tri(cx - h * 0.95, cy - h * 0.1, cx - h * 0.35, cy - h * 0.6, cx - h * 0.35, cy + h * 0.4, c)
        return 0.0
    }
    if name == "redo" {
        g_line(cx + h * 0.7, cy - h * 0.1, cx - h * 0.2, cy - h * 0.1, c)
        g_line(cx - h * 0.2, cy - h * 0.1, cx - h * 0.8, cy + h * 0.35, c)
        g_line(cx - h * 0.8, cy + h * 0.35, cx - h * 0.8, cy + h * 0.6, c)
        g_tri(cx + h * 0.95, cy - h * 0.1, cx + h * 0.35, cy - h * 0.6, cx + h * 0.35, cy + h * 0.4, c)
        return 0.0
    }
    if name == "eye" {
        g_line(cx - h, cy, cx, cy - h * 0.55, c)
        g_line(cx, cy - h * 0.55, cx + h, cy, c)
        g_line(cx - h, cy, cx, cy + h * 0.55, c)
        g_line(cx, cy + h * 0.55, cx + h, cy, c)
        g_disc(cx, cy, h * 0.28, c)
        return 0.0
    }
    if name == "eye_off" {
        g_line(cx - h, cy, cx, cy - h * 0.55, c)
        g_line(cx, cy - h * 0.55, cx + h, cy, c)
        g_line(cx - h, cy, cx, cy + h * 0.55, c)
        g_line(cx, cy + h * 0.55, cx + h, cy, c)
        g_line(cx - h * 0.8, cy + h * 0.8, cx + h * 0.8, cy - h * 0.8, c)
        return 0.0
    }
    if name == "lock" {
        g_rect(cx - h * 0.6, cy - h * 0.1, h * 1.2, h * 0.95, c)
        g_ring(cx, cy - h * 0.4, h * 0.4, c)
        return 0.0
    }
    if name == "layers" {
        g_tri(cx, cy - h * 0.85, cx + h, cy - h * 0.3, cx - h, cy - h * 0.3, c)
        g_tri(cx + h, cy - h * 0.3, cx, cy + h * 0.25, cx - h, cy - h * 0.3, c)
        g_line(cx - h, cy + h * 0.1, cx, cy + h * 0.65, c)
        g_line(cx, cy + h * 0.65, cx + h, cy + h * 0.1, c)
        return 0.0
    }
    if name == "copy" {
        g_frame(cx - h * 0.3, cy - h * 0.3, h * 1.1, h * 1.2, c)
        g_frame(cx - h * 0.8, cy - h * 0.8, h * 1.1, h * 1.2, c)
        return 0.0
    }
    if name == "edit" {
        g_line(cx - h * 0.8, cy + h * 0.8, cx + h * 0.6, cy - h * 0.6, c)
        g_line(cx - h * 0.8, cy + h * 0.8, cx - h * 0.4, cy + h * 0.8, c)
        g_line(cx - h * 0.8, cy + h * 0.8, cx - h * 0.8, cy + h * 0.4, c)
        g_line(cx + h * 0.6, cy - h * 0.6, cx + h * 0.9, cy - h * 0.3, c)
        return 0.0
    }
    if name == "arrow_up" {
        g_tri(cx - h * 0.7, cy + h * 0.3, cx + h * 0.7, cy + h * 0.3, cx, cy - h * 0.6, c)
        return 0.0
    }
    if name == "arrow_down" {
        g_tri(cx - h * 0.7, cy - h * 0.3, cx + h * 0.7, cy - h * 0.3, cx, cy + h * 0.6, c)
        return 0.0
    }
    if name == "select" {
        g_tri(cx - h * 0.6, cy - h * 0.8, cx - h * 0.6, cy + h * 0.5, cx + h * 0.55, cy + h * 0.1, c)
        return 0.0
    }
    if name == "move" {
        g_line(cx - h, cy, cx + h, cy, c)
        g_line(cx, cy - h, cx, cy + h, c)
        g_tri(cx - h, cy, cx - h * 0.55, cy - h * 0.3, cx - h * 0.55, cy + h * 0.3, c)
        g_tri(cx + h, cy, cx + h * 0.55, cy - h * 0.3, cx + h * 0.55, cy + h * 0.3, c)
        g_tri(cx, cy - h, cx - h * 0.3, cy - h * 0.55, cx + h * 0.3, cy - h * 0.55, c)
        g_tri(cx, cy + h, cx - h * 0.3, cy + h * 0.55, cx + h * 0.3, cy + h * 0.55, c)
        return 0.0
    }
    if name == "rotate" {
        g_ring(cx, cy, h * 0.75, c)
        g_tri(cx + h * 0.35, cy - h * 1.0, cx + h * 1.0, cy - h * 0.3, cx + h * 0.05, cy - h * 0.3, c)
        return 0.0
    }
    if name == "scale" {
        g_frame(cx - h * 0.9, cy - h * 0.1, h * 1.0, h * 1.0, c)
        g_line(cx - h * 0.2, cy + h * 0.2, cx + h * 0.85, cy - h * 0.85, c)
        g_tri(cx + h * 0.9, cy - h * 0.9, cx + h * 0.9, cy - h * 0.3, cx + h * 0.3, cy - h * 0.9, c)
        return 0.0
    }
    if name == "bars" {
        g_rect(cx - h * 0.8, cy - h * 0.6, h * 1.6, 1.5, c)
        g_rect(cx - h * 0.8, cy - 0.5, h * 1.6, 1.5, c)
        g_rect(cx - h * 0.8, cy + h * 0.55, h * 1.6, 1.5, c)
        return 0.0
    }
    if name == "note" {
        g_disc(cx - h * 0.4, cy + h * 0.55, h * 0.4, c)
        g_rect(cx - h * 0.05, cy - h * 0.8, 1.5, h * 1.4, c)
        g_rect(cx - h * 0.05, cy - h * 0.8, h * 0.8, 2.0, c)
        return 0.0
    }
    if name == "gear" {
        px_ring(cx, cy, h * 0.55, c)
        px_ring(cx, cy, h * 0.9, c)
        g_disc(cx, cy, h * 0.18, c)
        return 0.0
    }
    if name == "info" {
        g_rframe(cx - h * 0.9, cy - h * 0.9, h * 1.8, h * 1.8, h * 0.9, c)
        g_rect(cx - 0.5, cy - h * 0.1, 1.5, h * 0.7, c)
        g_rect(cx - 0.5, cy - h * 0.5, 1.5, 1.5, c)
        return 0.0
    }
    if name == "help" {
        g_rframe(cx - h * 0.9, cy - h * 0.9, h * 1.8, h * 1.8, h * 0.9, c)
        g_text_c(cx, cy - h * 0.55, size * 0.8, c, "?")
        return 0.0
    }
    if name == "refresh" {
        px_ring(cx, cy, h * 0.7, c)
        g_tri(cx + h * 0.4, cy - h * 0.95, cx + h * 0.95, cy - h * 0.25, cx + h * 0.05, cy - h * 0.25, c)
        return 0.0
    }
    # ── LingDev node and tool icons ──────────────────────────────────────────
    if name == "cube" {
        g_line(cx - h * 0.8, cy - h * 0.3, cx, cy - h * 0.8, c)
        g_line(cx, cy - h * 0.8, cx + h * 0.8, cy - h * 0.3, c)
        g_line(cx + h * 0.8, cy - h * 0.3, cx, cy + h * 0.2, c)
        g_line(cx, cy + h * 0.2, cx - h * 0.8, cy - h * 0.3, c)
        g_line(cx - h * 0.8, cy - h * 0.3, cx - h * 0.8, cy + h * 0.5, c)
        g_line(cx + h * 0.8, cy - h * 0.3, cx + h * 0.8, cy + h * 0.5, c)
        g_line(cx, cy + h * 0.2, cx, cy + h * 0.95, c)
        g_line(cx - h * 0.8, cy + h * 0.5, cx, cy + h * 0.95, c)
        g_line(cx, cy + h * 0.95, cx + h * 0.8, cy + h * 0.5, c)
        return 0.0
    }
    if name == "sphere" {
        g_ring(cx, cy, h * 0.85, c)
        g_line(cx - h * 0.85, cy, cx + h * 0.85, cy, c)
        g_line(cx - h * 0.55, cy - h * 0.45, cx + h * 0.55, cy - h * 0.45, c)
        g_line(cx - h * 0.55, cy + h * 0.45, cx + h * 0.55, cy + h * 0.45, c)
        return 0.0
    }
    if name == "camera" {
        g_rframe(cx - h * 0.9, cy - h * 0.5, h * 1.3, h * 1.0, 2.0, c)
        g_tri(cx + h * 0.4, cy, cx + h * 0.95, cy - h * 0.5, cx + h * 0.95, cy + h * 0.5, c)
        g_disc(cx - h * 0.25, cy, h * 0.2, c)
        return 0.0
    }
    if name == "light" {
        g_ring(cx, cy - h * 0.15, h * 0.5, c)
        g_rect(cx - h * 0.25, cy + h * 0.45, h * 0.5, h * 0.2, c)
        g_rect(cx - h * 0.2, cy + h * 0.75, h * 0.4, h * 0.15, c)
        g_line(cx - h * 0.9, cy - h * 0.15, cx - h * 0.7, cy - h * 0.15, c)
        g_line(cx + h * 0.7, cy - h * 0.15, cx + h * 0.9, cy - h * 0.15, c)
        g_line(cx, cy - h * 0.95, cx, cy - h * 0.8, c)
        return 0.0
    }
    if name == "actor" {
        g_disc(cx, cy - h * 0.6, h * 0.3, c)
        g_line(cx, cy - h * 0.3, cx, cy + h * 0.3, c)
        g_line(cx - h * 0.6, cy - h * 0.1, cx + h * 0.6, cy - h * 0.1, c)
        g_line(cx, cy + h * 0.3, cx - h * 0.5, cy + h * 0.9, c)
        g_line(cx, cy + h * 0.3, cx + h * 0.5, cy + h * 0.9, c)
        return 0.0
    }
    if name == "spawn" {
        g_rect(cx - h * 0.6, cy - h * 0.9, 1.5, h * 1.8, c)
        g_tri(cx - h * 0.5, cy - h * 0.9, cx + h * 0.7, cy - h * 0.45, cx - h * 0.5, cy, c)
        return 0.0
    }
    if name == "trigger" {
        g_frame(cx - h * 0.85, cy - h * 0.85, h * 1.7, h * 1.7, c)
        ds_hatch(cx - h * 0.8, cy - h * 0.8, h * 1.6, h * 1.6, c, 45.0, 3.0, 0.6)
        return 0.0
    }
    if name == "audio" {
        g_tri(cx - h * 0.9, cy - h * 0.35, cx - h * 0.2, cy - h * 0.8, cx - h * 0.2, cy + h * 0.8, c)
        g_rect(cx - h * 0.9, cy - h * 0.35, h * 0.4, h * 0.7, c)
        g_line(cx + h * 0.15, cy - h * 0.4, cx + h * 0.15, cy + h * 0.4, c)
        g_line(cx + h * 0.5, cy - h * 0.7, cx + h * 0.5, cy + h * 0.7, c)
        g_line(cx + h * 0.85, cy - h * 0.95, cx + h * 0.85, cy + h * 0.95, c)
        return 0.0
    }
    if name == "midi" {
        g_frame(cx - h * 0.9, cy - h * 0.6, h * 1.8, h * 1.2, c)
        g_rect(cx - h * 0.55, cy - h * 0.6, h * 0.25, h * 0.7, c)
        g_rect(cx - h * 0.12, cy - h * 0.6, h * 0.25, h * 0.7, c)
        g_rect(cx + h * 0.3, cy - h * 0.6, h * 0.25, h * 0.7, c)
        return 0.0
    }
    if name == "script" {
        g_text_c(cx, cy - size * 0.42, size * 0.95, c, "{}")
        return 0.0
    }
    if name == "scene" {
        g_frame(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 1.4, c)
        g_line(cx - h * 0.9, cy + h * 0.3, cx - h * 0.2, cy - h * 0.3, c)
        g_line(cx - h * 0.2, cy - h * 0.3, cx + h * 0.3, cy + h * 0.2, c)
        g_line(cx + h * 0.3, cy + h * 0.2, cx + h * 0.9, cy - h * 0.2, c)
        g_disc(cx + h * 0.4, cy - h * 0.35, h * 0.15, c)
        return 0.0
    }
    if name == "film" {
        g_frame(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 1.4, c)
        g_rect(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 0.25, c)
        g_rect(cx - h * 0.9, cy + h * 0.45, h * 1.8, h * 0.25, c)
        g_tri(cx - h * 0.25, cy - h * 0.35, cx - h * 0.25, cy + h * 0.35, cx + h * 0.4, cy, c)
        return 0.0
    }
    if name == "clock" {
        g_ring(cx, cy, h * 0.85, c)
        g_line(cx, cy, cx, cy - h * 0.55, c)
        g_line(cx, cy, cx + h * 0.4, cy + h * 0.2, c)
        return 0.0
    }
    if name == "key" {
        g_diamond(cx, cy, h * 0.75, c)
        return 0.0
    }
    if name == "key_off" {
        g_line(cx - h * 0.75, cy, cx, cy - h * 0.75, c)
        g_line(cx, cy - h * 0.75, cx + h * 0.75, cy, c)
        g_line(cx + h * 0.75, cy, cx, cy + h * 0.75, c)
        g_line(cx, cy + h * 0.75, cx - h * 0.75, cy, c)
        return 0.0
    }
    if name == "image" {
        g_frame(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 1.4, c)
        g_tri(cx - h * 0.7, cy + h * 0.5, cx - h * 0.1, cy - h * 0.3, cx + h * 0.4, cy + h * 0.5, c)
        g_disc(cx + h * 0.45, cy - h * 0.3, h * 0.18, c)
        return 0.0
    }
    if name == "text" {
        g_rect(cx - h * 0.8, cy - h * 0.8, h * 1.6, 1.5, c)
        g_rect(cx - 0.75, cy - h * 0.8, 1.5, h * 1.6, c)
        g_rect(cx - h * 0.3, cy + h * 0.7, h * 0.6, 1.5, c)
        return 0.0
    }
    if name == "panel" {
        g_rframe(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 1.4, 2.0, c)
        g_rect(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 0.35, c)
        return 0.0
    }
    if name == "button" {
        g_rrect(cx - h * 0.9, cy - h * 0.5, h * 1.8, h * 1.0, 3.0, c)
        return 0.0
    }
    if name == "bar" {
        g_frame(cx - h * 0.9, cy - h * 0.35, h * 1.8, h * 0.7, c)
        g_rect(cx - h * 0.9, cy - h * 0.35, h * 1.1, h * 0.7, c)
        return 0.0
    }
    if name == "grid" {
        g_frame(cx - h * 0.85, cy - h * 0.85, h * 1.7, h * 1.7, c)
        g_line(cx - h * 0.85, cy, cx + h * 0.85, cy, c)
        g_line(cx, cy - h * 0.85, cx, cy + h * 0.85, c)
        return 0.0
    }
    if name == "axes" {
        g_line(cx - h * 0.2, cy + h * 0.5, cx + h * 0.9, cy + h * 0.5, c)
        g_line(cx - h * 0.2, cy + h * 0.5, cx - h * 0.2, cy - h * 0.9, c)
        g_line(cx - h * 0.2, cy + h * 0.5, cx - h * 0.9, cy + h * 0.95, c)
        return 0.0
    }
    if name == "build" {
        g_line(cx - h * 0.9, cy + h * 0.8, cx - h * 0.1, cy, c)
        g_line(cx - h * 0.7, cy + h * 0.95, cx + h * 0.1, cy + h * 0.15, c)
        g_ring(cx + h * 0.4, cy - h * 0.4, h * 0.5, c)
        g_rect(cx + h * 0.15, cy - h * 0.65, h * 0.5, h * 0.5, C_BG_PANEL)
        return 0.0
    }
    if name == "chip" {
        g_frame(cx - h * 0.6, cy - h * 0.6, h * 1.2, h * 1.2, c)
        g_rect(cx - h * 0.3, cy - h * 0.3, h * 0.6, h * 0.6, c)
        g_line(cx - h * 0.95, cy - h * 0.3, cx - h * 0.6, cy - h * 0.3, c)
        g_line(cx - h * 0.95, cy + h * 0.3, cx - h * 0.6, cy + h * 0.3, c)
        g_line(cx + h * 0.6, cy - h * 0.3, cx + h * 0.95, cy - h * 0.3, c)
        g_line(cx + h * 0.6, cy + h * 0.3, cx + h * 0.95, cy + h * 0.3, c)
        g_line(cx - h * 0.3, cy - h * 0.95, cx - h * 0.3, cy - h * 0.6, c)
        g_line(cx + h * 0.3, cy - h * 0.95, cx + h * 0.3, cy - h * 0.6, c)
        g_line(cx - h * 0.3, cy + h * 0.6, cx - h * 0.3, cy + h * 0.95, c)
        g_line(cx + h * 0.3, cy + h * 0.6, cx + h * 0.3, cy + h * 0.95, c)
        return 0.0
    }
    if name == "window" {
        g_frame(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 1.4, c)
        g_rect(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 0.3, c)
        return 0.0
    }
    if name == "globe" {
        g_ring(cx, cy, h * 0.85, c)
        g_line(cx - h * 0.85, cy, cx + h * 0.85, cy, c)
        g_line(cx, cy - h * 0.85, cx, cy + h * 0.85, c)
        g_line(cx - h * 0.4, cy - h * 0.75, cx - h * 0.4, cy + h * 0.75, c)
        g_line(cx + h * 0.4, cy - h * 0.75, cx + h * 0.4, cy + h * 0.75, c)
        return 0.0
    }
    if name == "net" {
        g_disc(cx - h * 0.7, cy + h * 0.6, h * 0.25, c)
        g_disc(cx + h * 0.7, cy + h * 0.6, h * 0.25, c)
        g_disc(cx, cy - h * 0.7, h * 0.25, c)
        g_line(cx - h * 0.7, cy + h * 0.6, cx, cy - h * 0.7, c)
        g_line(cx + h * 0.7, cy + h * 0.6, cx, cy - h * 0.7, c)
        g_line(cx - h * 0.7, cy + h * 0.6, cx + h * 0.7, cy + h * 0.6, c)
        return 0.0
    }
    if name == "brain" {
        g_ring(cx - h * 0.3, cy, h * 0.55, c)
        g_ring(cx + h * 0.3, cy, h * 0.55, c)
        g_line(cx, cy - h * 0.5, cx, cy + h * 0.5, c)
        return 0.0
    }
    if name == "home" {
        g_tri(cx - h, cy, cx + h, cy, cx, cy - h * 0.9, c)
        g_rect(cx - h * 0.6, cy, h * 1.2, h * 0.85, c)
        g_rect(cx - h * 0.15, cy + h * 0.3, h * 0.3, h * 0.55, C_BG_PANEL)
        return 0.0
    }
    if name == "up" {
        g_line(cx, cy + h * 0.8, cx, cy - h * 0.6, c)
        g_tri(cx, cy - h * 0.95, cx - h * 0.55, cy - h * 0.2, cx + h * 0.55, cy - h * 0.2, c)
        return 0.0
    }
    if name == "search" {
        g_ring(cx - h * 0.2, cy - h * 0.2, h * 0.55, c)
        g_line(cx + h * 0.2, cy + h * 0.2, cx + h * 0.85, cy + h * 0.85, c)
        return 0.0
    }
    if name == "dot" {
        g_disc(cx, cy, h * 0.4, c)
        return 0.0
    }
    if name == "check" {
        g_line(cx - h * 0.7, cy, cx - h * 0.2, cy + h * 0.55, c)
        g_line(cx - h * 0.2, cy + h * 0.55, cx + h * 0.8, cy - h * 0.6, c)
        return 0.0
    }
    if name == "box2d" {
        g_frame(cx - h * 0.85, cy - h * 0.6, h * 1.7, h * 1.2, c)
        return 0.0
    }
    if name == "orbit" {
        g_disc(cx, cy, h * 0.3, c)
        g_ring(cx, cy, h * 0.9, c)
        g_disc(cx + h * 0.9, cy, h * 0.2, c)
        return 0.0
    }
    if name == "terminal" {
        g_frame(cx - h * 0.9, cy - h * 0.7, h * 1.8, h * 1.4, c)
        g_line(cx - h * 0.6, cy - h * 0.3, cx - h * 0.2, cy, c)
        g_line(cx - h * 0.2, cy, cx - h * 0.6, cy + h * 0.3, c)
        g_line(cx, cy + h * 0.3, cx + h * 0.5, cy + h * 0.3, c)
        return 0.0
    }
    return 0.0
}

# icon for a node kind
fn kind_icon(k) {
    if k == "box" || k == "cube" { return "cube" }
    if k == "sphere" || k == "cylinder" || k == "cone" || k == "capsule" || k == "torus" { return "sphere" }
    if k == "plane" { return "grid" }
    if k == "model" { return "layers" }
    if k == "actor" { return "actor" }
    if k == "camera" { return "camera" }
    if k == "light" { return "light" }
    if k == "spawn" { return "spawn" }
    if k == "trigger" { return "trigger" }
    if k == "audio" || k == "music" { return "audio" }
    if k == "midi" { return "midi" }
    if k == "text" || k == "label" || k == "text3d" { return "text" }
    if k == "image" { return "image" }
    if k == "panel" { return "panel" }
    if k == "button" { return "button" }
    if k == "bar" { return "bar" }
    if k == "empty" { return "dot" }
    if k == "swarm" { return "dot" }
    if k == "knot" { return "orbit" }
    return "cube"
}

# icon for a file extension
fn ext_icon(e) {
    if e == "glb" || e == "gltf" || e == "lmesh" || e == "obj" || e == "blend" { return "layers" }
    if e == "png" || e == "jpg" || e == "jpeg" || e == "bmp" || e == "svg" { return "image" }
    if e == "wav" || e == "ogg" || e == "mp3" || e == "flac" || e == "aac" { return "audio" }
    if e == "mid" || e == "midi" { return "midi" }
    if e == "ling" { return "script" }
    if e == "lscene" { return "scene" }
    if e == "lcut" { return "film" }
    if e == "ttf" || e == "otf" { return "text" }
    if e == "toml" || e == "cfg" || e == "txt" || e == "md" { return "file" }
    return "file"
}
fn ext_col(e) {
    if e == "glb" || e == "gltf" || e == "lmesh" || e == "obj" || e == "blend" { return C_ORANGE }
    if e == "png" || e == "jpg" || e == "jpeg" || e == "bmp" || e == "svg" { return C_RED }
    if e == "wav" || e == "ogg" || e == "mp3" || e == "flac" || e == "aac" { return C_INDIGO }
    if e == "mid" || e == "midi" { return C_VIOLET }
    if e == "ling" { return C_GREEN }
    if e == "lscene" { return C_BLUE }
    if e == "lcut" { return C_YELLOW }
    if e == "ttf" || e == "otf" { return C_TEXT }
    return C_FILEICON
}
