refactor(render): TextBackend owns its atlas, and staged glyphs carry a rotation basis

This commit is contained in:
Martino Ferrari committed 2026-09-28 09:57:28 +02:00
1 parent 90e17a0a11
commit e074f57ddf
23 files changed
+1073 -227

No files matched your search

+15 -7
View File
@@ -30,16 +30,24 @@ extern const char* const kLineFS;
/// GLSL source of the instanced text pipeline.
///
/// One glyph cell per instance: `a_pos` at location 0 is the quad's top-left
/// corner in Rect pixels and `a_uv` at location 1 is the glyph's atlas texel
/// origin, both with a vertex attribute divisor of 1. The quad grows by
/// `u_px_range` pixels per cell and the fragment shader samples the
/// One glyph cell per instance, every attribute with a vertex attribute divisor
/// of 1: `a_pos` at location 0 is the cell's top-left corner in Rect pixels,
/// `a_uv` at location 1 is the glyph rect's normalised top-left in the atlas and
/// `a_axis` at location 2 is the cell's local +x axis, a unit vector in pixels.
///
/// The vertex shader builds the cell from that basis and its perpendicular --
/// the cell's own +v direction -- so `a_axis` of `(0, -1)` draws a run that
/// advances up the screen, and it maps `a_uv` over the cell with the same
/// handedness, so a glyph's top row stays its top row however the cell is
/// turned. The fragment shader converts back to texels and samples the
/// single-channel `GL_R8` atlas at the nearest texel centre, so `GL_NEAREST`
/// never lands on a cell boundary. `u_color` tints the straight alpha.
///
/// Uniforms: `u_viewport` (vec2, pixels), `u_px_range` (vec2, pixels per glyph
/// cell), `u_tex_size` (vec2, atlas texels), `u_atlas` (sampler2D, unit 0),
/// `u_color` (vec4).
/// Uniforms: `u_viewport` (vec2, pixels), `u_px_range` (vec2, the glyph cell's
/// size on screen in pixels), `u_glyph_uv` (vec2, the glyph cell's size in
/// normalised atlas coordinates -- one size for the whole draw, since every
/// glyph of a frame comes from one atlas), `u_tex_size` (vec2, atlas size in
/// texels), `u_atlas` (sampler2D, unit 0), `u_color` (vec4).
extern const char* const kTextVS;
extern const char* const kTextFS;