Skip to content

A port & overhaul of Vertex Engine GPU Font Cache for the Odin programming language

License

Notifications You must be signed in to change notification settings

Ed94/VEFontCache-Odin

Repository files navigation

VE Font Cache

This started off as a port of the VEFontCache library to the Odin programming language. Its original purpose was for use in game engines, however its rendeirng quality and performance is more than adequate for many other applications.

Since then the library has been overhauled to offer higher performance, improved visual fidelity, additional features, and quality of life improvements.

Features:

  • Simple and well documented.
  • Load and unload fonts at anytime
  • Almost entirely configurabe and tunable at runtime!
  • Full support for hot-reload
    • Clear the caches at any-time!
  • Robust quality of life features:
    • Tracks text layers!
    • Push and pop stack for font, font_size, colour, view, position, scale and zoom!
    • Enforce even only font-sizing (useful for linear-zoom)
    • Snap-positioning to view for better hinting
  • Basic or advanced text shaping via Harfbuzz
  • All rendering is real-time, triangulation done on the CPU, vertex rendering and texture blitting on the gpu.
    • Can hand thousands of draw text calls with very large or small shapes.
  • 4-Level Regioned Texture Atlas for caching rendered glyphs
  • Text shape caching
  • Glyph texture buffer for rendering the text with super-sampling to downsample to the atlas or direct to target screen.
  • Super-sample by a font size scalar for sharper glyphs
  • All caching backed by an optimized 32-bit LRU indexing cache
  • Provides a draw list that is backend agnostic (see backend for usage example).

Upcoming:

  • Support for ear-clipping triangulation, or just better triangulation..
  • Multi-threading supported job queue.
    • Lift heavy-lifting portion of the library's context into a thread context.
    • Synchronize threads by merging their generated layered draw list into a finished draw-list for processing on the user's render thread.
    • User defines how thread context's are distributed for drawing (a basic quandrant based selector procedure will be provided.)

See: docs/Readme.md for the library's interface.

Building

See scripts/Readme.md for building examples or utilizing the provided backends.

Currently the scripts provided & the library itself were developed & tested on Windows. There are bash scripts for building on linux (they build on WSL but need additional testing).

The library depends on harfbuzz, & stb_truetype to build.
Note: harfbuzz could technically be gutted if the user removes their definitions, however they have not been made into a conditional compilation option (yet).

Gallery

sokol_demo_2025-01-11_01-32-24

2025-01-11.01-33-37.mp4
2025-01-11.01-35-10.mp4
2025-01-11.01-24-39.mp4