neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.
The plan is for v1.0 supported platforms to be Windows (desktop) and Linux (desktop) followed later with OS X, iOS and Android support.
Test executable demonstrating latest implemented features: .
neoGFX is open source currently licensed as GPLv3 with a commercial licence available when v1.0 is released.
The full library source code is available from: https://github.com/i42output/neogfx.git.
The library is also dependent on the neolib C++ utility library available from https://github.com/i42output/neolib.git.
neoGFX library documentation (work-in-progress in the form of a wiki) and the neoGFX forum can be found here.
Version | ETA | Features |
---|---|---|
v0.99 | Q3, 2025 | Windows OpenGL; widget library feature complete; GUI designer tool |
v1.00 | Q4, 2025 | Linux OpenGL; Vulkan; scripting engine |
v1.10 | Q2, 2026 | Android support; physics engine |
v1.20 | Q4, 2026 | macOS support |
Documentation for neoGFX will appear on the Wiki, here.
neoGFX is still a work in progress (incomplete) so is not yet suitable for making apps or games. Currently neogfx has only been built for and tested on Windows.
Progressing ClicksAndWhistles 3.0 the flagship neoGFX sample application, an open source multi-protocol chat client.
Created neoGFX Chess sample application from scratch (including an AI) in less than 2 weeks demonstrating the maturity of neoGFX:
Added advanced text effects, superscript/subscript etc to the font selection dialog:
Shader based blurred outline (black) applied to colorized "material design" icons so they look legible on both dark and light backgrounds:
Work has begun in ernest on neoGFX Design Studio.
Gradients can now be batched in the rendering pipeline allowing the same gradient with different bounding boxes to be applied without changing shader state. New filter shader created allowing, for example, enhanced gaussian-blur-based text rendering effects:
Major neoGFX milestone reached: after reducing the default ECS physics step time from 10ms to 1ms a framerate of 450 FPS was achieved:
Fullscreen mode added.
neoGFX has two modes of operation: green and turbo. In green mode CPU usage is close to 0% and GPU rendering only happens if things change. In turbo mode FPS limits are turned off as can be seen in this screenshot. #neoGFX #gamedev #cpp #coding #ClimateAction
Widget skinning support added. Tree view widget implemented. SDL removed as a dependency.
New demonstration video of the responsiveness and performance of the neoGFX C++ game engine / app framework when dragging/resizing windows and scrolling window contents:
Major re-work of the GPU shader architecture and how ECS entities are rendered resulting in significant FPS performance improvements. Font glyphs can now be individually rendered with a gradient:
Significant progress made with the UI resource compiler tool, nrc, that converts a UI described using Relaxed JSON (RJSON) into C++. Event and property systems refactored.
Created a new text field widget. Added support for anchor-based layouts as used to align the "First field:" and "Second field:" labels of the text fields below:
Started work on the scripting engine: this is an independent project called neos.
Added 2D/3D mesh patch support to the ECS which is now used to compose the playing cards in the video poker sample:
Implemented render to texture and easing (tweening) functions.
Implementation ongoing of the new pure entity-component-system (ECS) that will be used by neoGFX's game functionality; there is also the potential to use the ECS in the implementation of application widgets such as charting widgets.
Gradients are now a lot subtler in the default skin so there is less of an old fashioned "Web 2.0" look.
Disabled text is now displayed with 25% alpha (rather than 50%) so there is more of a contrast with non-disabled text (see "Radio 3"):
12th May 2018
neoGFX now renders on both nVIDIA GTX and AMD Radeon cards; significant FPS performance improvements.
Finished implementing drop list widget (list always visible) and font selection dialog.
Drop lists with optional "editable" (combo box) mode implemented. Status bar widget implemented. Support for high DPI displays added including automatic integer DPI scaling factor.
Sprite plane broad phase collision detection is now done using a quadtree (2D) or an octree (3D). Drop lists have been implemented; work is proceeding on making them support editable mode (aka combo box). The 3D shading effect used for rendering push buttons is now more subtle (less shiny).
The playing card sprites are now fully rendering in the neoGFX C++ sample application "Video Poker" as can be seen in this screenshot. neoGFX sprites are 2D/3D meshes (with physics) the faces of which can map to texture atlas sub-textures; the screenshot also demonstrates the mapping of sprites onto GUI widgets using transformation matrices:
It is now possible to easily specify using a size policy that a widget's aspect ratio must be maintained when being laid out:
Red black AABB tree for broad phase collision detection implemented:
Sprites can now be added to a sprite plane during the physics/collision update loop:
Message box implemented:
Window non-client related functionality implemented including window title bars:
Bespoke icons for neoGFX have been commissioned, delivered and re-coloured; they will be used for standard menus (e.g. "File" and "Edit") and the message box:
Implementation of item view editing is proceeding well; cell data entry is as simple as pressing the TAB key:
Item view models have been refactored; now multiple item views can share the same item model but have individual item presentation models:
2D collision detection (AABB for now, SAT to come later) and sprite sheet animation have been implemented in the game module:
The neoGFX wiki has been setup at http://neogfx.io/wiki; library and framework documentation will be contained in the wiki.
Progress made on the generic dynamic lexer which will be used by CSS3 parser and scripting language; invoking it is pretty simple:
Support for fully CSS3 compliant gradients added. Started work on a CSS3 parser; a simple visitor pattern will be used to set widget properties based on CSS3 style sheet contents.
Fixed a bug in the layout manager code: nested group box widgets now render perfectly:
Implemented group box widget. Started work on GUI designer tool:
Support for mipmapped textures added. Colour emoji support implemented.
Tab stops implemented in text_edit widget along with multi-line RTL text input.
RTL text (e.g. Arabic) input implemented.
Tired of signals and slots offered by more traditional GUI libraries some of which even use code generation in their implementation? You should be as signals and slots are an old solution to an old problem. In neoGFX the alternative is modern simplicity at its finest:
button1.clicked([](){...});
As you can see C++ lambdas have made traditional signals and slots redundant.
If you want automatic event deregistration (traditional role of the "slot"):
neogfx::sink s;
s += button1.clicked([](){...});
When 's' is destroyed any associated event registrations are deregistered automatically. Sink objects can be on the stack, member variables or the more traditional base class sub-object.
Just cracked FAST sub-pixel text rendering (no longer does any FBO blitting).
Finished implementing sub-pixel text rendering.
Finished implementing the colour gradient selection widget:
Finished implementing the colour selection tool, colour_dialog.
Progress on the first neoGFX standard (modal) dialog the colour selection tool, colour_dialog, continues.
A new website has been opened that will eventually host the neoGFX project: it is currently empty except for the new neoGFX forum!
Line edits, spin boxes and sliders implemented. Support for modal dialogs added.
Progress on text edit widget continues; support for outlined text effect added; word wrap implemented; cursor implemented.
Progress on text edit widget continues (day three).
Menus fully implemented along with keyboard mnemonic accelerators:
Support for rendering underline text added.
Support for font kerning added:
Improved non-sub-pixel text rendering by aligning characters on pixel boundaries.
Implementation of menus virtually complete (just mnemonic keyboard accelerators to do):
Progress on menu widgets continues; as part of this support for multiple windows has been added.
Menu bars almost implemented (which utilize new "flow" layout manager).
Fixed various problems including problems with layout managers.
Toolbars implemented; used GLSL to render greyscale icons for disabled actions.
Published several YouTube videos demoing 2D sprite physics:
Fixed several issues. Logical coordinate system added with two automatic systems "GUI" and "Game"; GUI logical coordinate system has origin in top left corner whilst Game logical coordinate system has origin in bottom left corner and both modes update the coordinates automatically as a widget is resized; screenshot demoing this:
I have decided to change neoGFX's scope: now instead of just being a GUI library neoGFX will be a combined GUI/game library.
Progress on implementing sprites continues; here is my version of "Hello, World!": Goldenrod Spaceship!:
Obviously one wouldn't normally create sprite images in-code like this and indeed neogfx::image will support loading standard image files such as .PNG directly from a file or from asset archives or from a file embedded in the executable (method used to load textures as seen in the previous three progress updates). This in-code method might be useful to easily create simple widget elements.
Buttons can now have a image:
Progress on texture drawing continues, neogfx::image_widget implemented:
Implementation of images and textures proceeding well:
Tabs more or less implemented:
Implemented changing focus by tabbing.
Just implemented radio buttons (after adding circle drawing primitives):
Just implemented check boxes:
Improved text font glyph hinting and improved the handling of styles and added new "Slate" style.
Keyboard and mouse navigation in the table view widget complete just selection left to do. Made some improvements to the style code and how widgets render their backgrounds. Improved test program so you can click the keypad buttons to change the style colour.
Made some speed improvements related to widget layout and table view column size determination.
Change licence of source code to GPLv3 with a view to dual licensing it upon release of v1.0.
Migrated the source repository from svn to git; library source code is now publicly available.
Event framework is taking shape; you can now register for push button pressed events. Clicking on list view header view buttons now sorts list view items by column (with history).
Progress on the list view widget continues:
I've arrived at my final design for the item (list/tree) view widget model classes which uses type erased "generic iterators" as part of the interface. You can choose different containers for the default item view model and a variable or fixed number of columns (fixed number of columns allows for in-place allocation/construction of item view cell data). Custom models are also supported which can be used if a standard container is not desirable.
It's only taken me just over six hours to switch from SFML to SDL. Test .exe is 35% bigger now... meh.
Tweaked how text is positioned in text widgets, should now be on a pixel boundary.
Sub-pixel text rendering is still on the to-do list; resuming implementation of list view widget.
Just implemented middle button press/hold scrolling.
Work has begun on list and tree view widget item models.
It looks like I am going to have to switch from SFML to SDL as SFML does not provide everything I need. Switching should be almost painless due to the layered design of the neoGFX.
Scrollbars fully implemented:
With the aid of a few vodka red bulls progress on scrollbars continues.
Now that I have widget clipping sorted (the OpenGL function glScissor() is ideal for this) work can begin in earnest on scrollbars.
Took me most of the weekend to get basic (non-sub-pixel) text rendering using GLSL (Open GL shader language) working mainly because GLSL is so hard to debug and documentation (complete example) is hard to come by for specific use-cases. Here is the result (link above for executable).
Just got a massive performance boost which should result in a great FPS: I fixed a silly bug whereby I was calling app().instance() instead of app::instance() in a couple of places .. doh! Bloody singletons! :) I was also not using my text glyph cache properly so HarfBuzz was getting invoked every widget layout and frame render.
Not had much chance to work on the project during the past few weeks. Sub-pixel text rendering with Open GL shaders is still to do (hopefully this weekend); just implemented horizontal and vertical spacers for the layout managers.
Text rendering almost sorted (just needs sub-pixel rendering).
First ever neogfx screenshot:
First code commit.