Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Ed94/VEFontCache-Odin
A port of Vertex Engine GPU Font Cache for the Odin programming language
https://github.com/Ed94/VEFontCache-Odin
font-atlas minimalist odin-lang text-rendering
Last synced: 18 days ago
JSON representation
A port of Vertex Engine GPU Font Cache for the Odin programming language
- Host: GitHub
- URL: https://github.com/Ed94/VEFontCache-Odin
- Owner: Ed94
- License: other
- Created: 2024-06-27T03:31:11.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2024-11-24T23:39:48.000Z (19 days ago)
- Last Synced: 2024-11-25T00:24:22.514Z (19 days ago)
- Topics: font-atlas, minimalist, odin-lang, text-rendering
- Language: Odin
- Homepage:
- Size: 18.8 MB
- Stars: 8
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: Readme.md
- License: LICENSE.md
Awesome Lists containing this project
- awesome-odin - VEFontCache - Odin/blob/main/LICENSE.md) (Libraries / Gamedev)
- awesome-odin - VEFontCache - Odin/blob/main/LICENSE.md) (Libraries / Gamedev)
README
# VE Font Cache : Odin Port
This is a port of the [VEFontCache](https://github.com/hypernewbie/VEFontCache) library.
Its original purpose was for use in game engines, however its rendeirng quality and performance is more than adequate for many other applications.
See: [docs/Readme.md](docs/Readme.md) for the library's interface.
## Building
See [scripts/Readme.md](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 freetype, harfbuzz, & stb_truetype to build.
Note: freetype and harfbuzz could technically be gutted if the user removes their definitions, however they have not been made into a conditional compilation option (yet).## Changes from orignal
* Font Parser & Glyph shaper are abstracted to their own warpper interface
* ve_fontcache_loadfile not ported (ust use core:os or os2, then call load_font)
* Macro defines have been coverted (mostly) to runtime parameters
* Support for hot_reloading
* Curve quality step interpolation for glyph rendering can be set on a per font basis.## TODOs
### Additional Features:
* Support for freetype (WIP, Currently a mess... and slow)
* Add ability to conditionally compile dependencies (so that the user may not need to resolve those packages).
* Ability to set a draw transform, viewport and projection
* By default the library's position is in unsigned normalized render space
* Could implement a similar design to sokol_gp's interface### Optimization:
* Check if its better to store the glyph vertices if they need to be re-cached to atlas or directly drawn.
* Look into setting up multi-threading by giving each thread a context
* There is a heavy performance bottleneck in iterating the text/shape/glyphs on the cpu (single-thread) vs the actual rendering *(if doing thousands of drawing commands)*
* draw_text can provide in the context a job list per thread for the user to thenk hookup to their own threading solution to handle.
* Context would need to be segregated into staged data structures for each thread to utilize
* This would need to converge to the singlar draw_list on a per layer basis. The interface expects the user to issue commands single-threaded unless, its assumed the user is going to feed the gpu the commands & data through separate threads as well (not ideal ux).
* How the contexts are given jobs should be left up to the user (can recommend a screen quadrant based approach in demo examples)Failed Attempts:
* Attempted to chunk the text to more granular 'shapes' from `draw_list` before doing the actual call to `draw_text_shape`. This lead to a larger performance cost due to the additional iteration across the text string.
* Attempted to cache the shape draw_list for future calls. Led to larger performance cost due to additional iteration in the `merge_draw_list`.
* The shapes glyphs must still be traversed to identify if the glyph is cached. This arguably could be handled in `shape_text_uncached`, however that would require a significan't amount of refactoring to identify... (and would be more unergonomic when shapers libs are processing the text)