Rendering Base
Began experimenting with OpenGL 3.0
Geometry + Texture loading + 2D Camera + Shaders
Rendering
Moved to OpenGL 4.6 for modern functionality:
Direct State Access (DSA) + Persistent buffer mapping + Program pipelines + Synchronization objects.
Text
First basic monochrome ASCII text was rendered on the screen.
Window
Introduced basic window management and input handling using GLFW, providing the first interactive application environment.
Project Restructure
Restructured the project from an initially unorganized codebase into a more structured library architecture.
Core and rendering layers began to emerge, establishing clearer boundaries between shared library functionality, rendering, and platform-specific operations.
Rendering Optimization
Introduced the first major rendering performance improvements, including texture caching, batching, and texture atlases.
Rendering resources could now be reused and grouped across elements, reducing redundant texture operations and draw calls.
Platform Support & Logging
Introduced a platform layer to isolate operating-system-specific functionality and provide a foundation for future cross-platform work. A new logging system was also introduced to improve debugging and output clarity, alongside core functionality such as file I/O.
Build Speed
Significantly improved build times by optimizing the project's build process, evidently leading to faster production. Build scrips for debug and release were also separated to reduce unnecessary complexity and bloat.
Button
Began development of the first interactive UI component, establishing the foundation for reusable UI controls.
Core utility
Introduced Rect and Color structures with
common operations, reducing the reliance on OpenGL Mathematics (GLM).
An input system was also introduced to provide a common interface for handling keyboard and mouse input independently of the underlying platform.
Rendering Text
Monochrome Unicode text rendering was extended to support arbitrary glyph combinations from loaded fonts, enabling text in languages and scripts supported by the selected font.
Development surrounding text behavior such as alignment and line wrapping started.
Label
Introduced a reusable label component to provide a higher-level interface for text rendering.
Rendering Optimization & Features
Introduced basic text wrapping and alignment functionality.
New rendering improvements to per-frame storage using a scratch arena. Frame-temporary rendering data will now be allocated from the scratch arena and reused each frame without performing new allocations for each frame.
Also reworked glyph atlases to improve lookup time using a hashmap.
Rendering Features
Introduced an alternative rendering path for drawing repeated geometry more efficiently. The renderer expanded from only supporting VertexBase to also supporting instanced rendering.
Instanced rendering became the primary path for drawing UI elements, allowing appropriate per-element data to be supplied as instance data while sharing the underlying geometry.
Application
An application layer emerged within the core to encapsulate window boiler plate, component initialization, and application lifecycle management.
This allowed applications built using NGUI to follow a common initialization path and execution structure rather than managing these responsibilities independently.
This was also the first major leap made towards adopting a framework architecture.
COLR Rasterizer
First successfull COLR rasterizer implementation, capable of rendering certain color emoji, depending on the paint structures encountered.
UI Layer
First major effort to structure the UI system around reusable
elements. Element creation and common behavior across
UI components were generalized to establish a consistent
foundation for building UI components. Rendering depth was also
naturally derived from the ordering of elements within the
UI tree containing every UIElement.
This marked another major step towards adopting a framework architecture, moving beyond a library that simply provided UI functionality.
UI Layer Improvements
Expanded the UI layer with hierarchical bounds and clipping propagation. Child elements could now inherit restrictions from their parent elements and establish more restrictive clipping regions of their own.
This provided the foundation for rendering UI elements correctly within nested containers and established a more robust UI hierarchy.
Also redesigned the UI tree to utilize a persistent arena allocator as well as some improvements to the UI tree structure leading to traversal optimizations.
UI Utility
Small bounds utility (Insets) for padding elements integrated with the bounds propagation
workflow.
Text Layout
Text got its own layout system calculating line wrapping based on language and font rules set by the UNICODE standard and HarfBuzz shaping utility.
Internal Debugging
Memory allocation metadata tracking to identify leaks and lifetime issues in debug builds, while collecting metrics surrounding allocation counts and memory usage.
Redirected debug output from external libraries such as OpenGL, HarfBuzz, and ICU to its own debug output category to reduce noise.
UI Events
Introduced an event system for the UI, allowing elements to receive and respond to user input such as mouse and keyboard events.
Event propagation was introduced alongside the system, allowing events to travel through the UI hierarchy and be handled by the appropriate elements. With this approach, event data became packed using unions to reduce memory overhead of dispatched events.
Hit testing was moved from specific components to being generalized in the UI.
New UI primitive
New UIText primitive introduced to bring text rendering
into the UI layer as a first-class UI element.
This established a direct connection between the UI hierarchy and the existing text rendering system, allowing text to participate in layout, bounds, clipping, and rendering like other UI elements.
Fallback Fonts
Introduced font fallback support for glyphs not available in the selected font.
When a glyph is missing, the font system searches the configured fallback fonts in order and selects the first font containing the required glyph.
Currently lacks a missing-glyph representation when no configured font contains the required glyph.
Also added a dedicated rasterizer path for color glyphs, sharing the existing glyph rasterization pipeline while using color-specific handling.
Rasterizer + Text Field
Migration from custom COLR rasterizer to HarfBuzz's experimental COLR rasterizer.
Began development of an editable text input component, extending the UI system with text interaction and keyboard input.
Platform Layer
The Platform layer can now handle enough window features to justify leaving GLFW for explicit platform window creation.
Moved UTF utilities into core layer to remove its dependency on the platform layer.
Transferred Input ownership from Application to Window, removing application's role as an input adapter.
Platform Emoji Picker & More...
Working on a platform-specific solution for emoji picker functionality not exposed through GLFW. The solution is aimed to integrate with the underlying platform while keeping the functionality accessible through the UI layer.
Looking to improve debugging further by introducing core assertion functionality, potentially with platform-specific implementations.
Also considering if a core Point utility would be
benifical enough to justify a codebase refactor.