Bug fixes
- text_fragment now v-flips its sample. TextRasterizer writes glyphs via a
y-flipped CGContext (CoreText y-up → image-y-down), so memory row 0 holds
the visual top of the text. quad_vertex already flips v for camera frames,
so HUD text needed its own compensating flip in the fragment.
- EdgePass was creating the threshold compute pipeline but never binding the
threshold value to buffer(0). The kernel read garbage memory which usually
evaluated as ~0, letting almost every fragment pass and producing the
inverted look in the EDGES pane. Now binds Theme.Performance.edgeThreshold
(default 0.18) explicitly.
- Footer was anchored to y=2 (top of drawable). Moved to drawableSize.height
minus footer height so it sits along the bottom edge where it belongs.
Pane changes (per user request)
- Pane 1 (JARVIS) now combines the stylization with the detection overlay:
jarvis fragment → bounding-box strokes → per-box text labels. Labels are
cached by string in labelTextureCache so a typical scene only rasterizes
half a dozen unique strings ever.
- Pane 3 was DETECT; now ASCII. Renders the live source through a new
ascii_fragment that quantizes the image into a grid of monospaced glyphs
picked from a pre-rasterized dark→bright atlas (` .:-=+*#%@`).
New components
- Sources/Shaders/Ascii.metal — ascii_fragment with AsciiUniforms (gridSize,
atlasCharCount, tintColor).
- Sources/Process/AsciiPass.swift — builds the glyph atlas at startup via
CTLineDraw into a CGContext, uploads to a BGRA MTLTexture, and produces
uniforms sized to keep glyph cells roughly square at any pane aspect.
- Pipelines gains an ascii render state (quad_vertex + ascii_fragment).
- Theme: paneLabels now ["LIVE", "JARVIS", "EDGES", "ASCII"], plus
Performance.edgeThreshold and Performance.asciiColumns knobs.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>