Immediate mode GUI
An immediate mode graphic user interface (GUI), also known as IMGUI, is a graphical user interface design pattern which uses an immediate mode API to render controls, as opposed to a retained mode one.[1]
Implementations
Most of the immediate mode GUI widget toolkit is implemented in default system controls and custom rendering for game development, graphic apps. Libraries include Scaleform, and Dear ImGui.
For game implementation, a GUI should
- be updated in sync with the game scene or complex graphic.
- be overlaid on a game scene or complex graphic (which is especially easy in both cases, when both GUI and game scene are controlled by the game loop).
- have an unusual appearance or complex graphics. This implies that in an immediate mode GUI, the client code is holding its own rendering primitives and API design which affects the graphics pipeline implementation.
The immediate mode GUI widget toolkit
- is more direct in the sense that the widget tree is often a function call tree that is composable and flexible but hard to interact with.
- is less complex and easier to understand (in terms of fewer implicit assumptions per toolset API call). This usually also results in less functionality.
- is more elaborate to create and manage (typically needs more tool set API calls) if more than a simple widget tree, including layout (absolute and relative positioning referring to parent or siblings).
- has less sophisticated occlusion culling (z-buffering), hit-testing, state change handling, scrolling, and focus/hot control (widget) animations. This also implies the need to manage the logical tree/visual tree itself.
- has to rebuild the vertex buffers completely from scratch for each new frame.
- can put a constant workload on the CPU if not utilizing shaders loaded on the GPU.
Immediate mode GUI widget toolkits are a good choice for those who prefer a simple, easily changeable, and extendable GUI toolkit. They are usually generic, open-source, and cross-platform. One way to have the flexibility and composability of an immediate mode GUI without the disadvantages of keeping the widget tree only in function calls, with the lack of direct control of how the GUI is drawn in the rendering engine would be to use a virtual widget tree, just like React uses a virtual DOM.
History
Casey Muratori developed the technique and coined the term "Single-path Immediate Mode Graphical User Interface" to describe it.[2][3] One of the earliest publicly available implementations was written by Sean Barrett.[4]
Other types of immediate mode GUI
- Dear ImGui[5] written in C++ with back-ends for several graphics APIs (Allegro 5, DirectX, GLFW, iOS, Marmalade, Metal, OpenGL, SDL 2 and Vulkan), that also has
- egui[7] for Rust
- Gio[8] for Go
- kiss_sdl[9] for SDL (Simple Direct Media Layer)
- nuklear[10] with backends for several graphics libraries (Direct3D, GLFW, OpenGL, SDL, SFML, Wayland, Windows GDI, Window GDI+ and X11)
References
- ↑ Radich, Quinn (May 30, 2018). "Retained Mode Versus Immediate Mode". Win32 apps. Microsoft. https://docs.microsoft.com/en-us/windows/win32/learnwin32/retained-mode-versus-immediate-mode.
- ↑ "Immediate-Mode Graphical User Interfaces (2005)" (in en). https://caseymuratori.com/blog_0001.
- ↑ Barrett, Sean (September 2005). "Immediate Mode GUIs". Game Developer 12: 34–36. https://ubm-twvideo01.s3.amazonaws.com/o1/vault/GD_Mag_Archives/GDM_September_2005.pdf. Retrieved 14 February 2021.
- ↑ "Sample IMGUI implementation and demo program.". http://silverspaceship.com/inner/imgui/.
- ↑ Cornut, Omar (2019-12-22). "ocornut/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C++ with minimal dependencies". https://github.com/ocornut/imgui.
- ↑ kotlin-graphics (2019-12-19). "kotlin-graphics/imgui: Bloat-free Immediate Mode Graphical User interface for JVM with minimal dependencies (rewrite of dear imgui)". https://github.com/kotlin-graphics/imgui.
- ↑ "egui: an easy-to-use immediate mode GUI in pure Rust". 3 June 2021. https://github.com/emilk/egui.
- ↑ "Gio - immediate mode GUI in Go". https://gioui.org/.
- ↑ Korrovits, Tarvo (2019-12-19). "actsl/kiss_sdl: Simple generic GUI widget toolkit for SDL2". https://github.com/actsl/kiss_sdl.
- ↑ Mettke, Micha (2019-12-22). "vurtun/nuklear: A single-header ANSI C gui library". https://github.com/Immediate-Mode-UI/Nuklear.
Original source: https://en.wikipedia.org/wiki/Immediate mode GUI.
Read more |