sugarloaf 0.4.5

Sugarloaf is Rio rendering engine, designed to be multiplatform. It is based on WebGPU, Rust library for Desktops and WebAssembly for Web (JavaScript). This project is created and maintained for Rio terminal purposes but feel free to use it.
#version 450

// Image vertex shader, ported from `image_vs_main` in
// `sugarloaf/src/renderer/image.metal`. One instance per image
// placement (background image, kitty graphic, sixel image), 4
// vertices per instance drawn as TRIANGLE_STRIP.
//
// Per-instance vertex layout matches `ImageInstance` in
// `sugarloaf/src/renderer/mod.rs` (32 bytes):
//   loc 0  R32G32_SFLOAT       dest_pos     (offset 0)
//   loc 1  R32G32_SFLOAT       dest_size    (offset 8)
//   loc 2  R32G32B32A32_SFLOAT source_rect  (offset 16)

layout(set = 0, binding = 0, std140) uniform Globals {
    mat4 transform;
    uint input_colorspace;
    uint _pad0;
    uint _pad1;
    uint _pad2;
} globals;

layout(location = 0) in vec2 in_dest_pos;
layout(location = 1) in vec2 in_dest_size;
layout(location = 2) in vec4 in_source_rect;

layout(location = 0) out vec2 out_tex_coord;

void main() {
    // Triangle strip: 4 vertices → quad
    //   0 → 1
    //   |  /|
    //   2 → 3
    vec2 corner;
    corner.x = float(gl_VertexIndex == 1 || gl_VertexIndex == 3);
    corner.y = float(gl_VertexIndex == 2 || gl_VertexIndex == 3);

    // `source_rect` is `[u0, v0, u1, v1]` (origin, end).
    out_tex_coord = mix(in_source_rect.xy, in_source_rect.zw, corner);

    vec2 image_pos = in_dest_pos + in_dest_size * corner;
    gl_Position = globals.transform * vec4(image_pos, 0.0, 1.0);
}