v1.79
Reading the full changelog is a good way to keep up to date with the things Dear ImGui has to offer, and maybe will give you ideas of some features that you've been ignoring until now!
Homepage: https://github.com/ocornut/imgui
Release notes: https://github.com/ocornut/imgui/releases
Wiki: https://github.com/ocornut/imgui/wiki for bindings, links, extensions etc.
FAQ: https://www.dearimgui.org/faq/
Discord server: https://discord.dearimgui.org
Issues and support: https://github.com/ocornut/imgui/issues
Thank you!
Ongoing work on Dear ImGui is currently financially supported by:
- Platinum sponsors: Blizzard, Ubisoft, Nvidia, Google
- Also recently supported by Activision, Arkane Studios, RAD Game Tools, Grinding Gear Games and more.
We are transitioning toward a B2B model to sustain, maintain and grow this project. If your company uses Dear ImGui, consider reaching out. See Sponsors page for details.
Huge thank you to all past and present supporters!
Breaking Changes
(Suggestion: once in a while, add #define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
in your imconfig.h
file to make sure you are not using to-be-obsoleted symbols.)
- Fonts: Removed
ImFont::DisplayOffset
in favor ofImFontConfig::GlyphOffset
. DisplayOffset was applied after scaling and not very meaningful/useful outside of being needed by the default ProggyClean font. It was also getting in the way of better font scaling, so let's get rid of it now! If you used DisplayOffset it was probably in association to rasterizing a font at a specific size, in which case the corresponding offset may be reported into GlyphOffset. If you scaled this value after calling AddFontDefault(), this is now done automatically. (#1619) - ImGuiListClipper: Renamed constructor parameters which created an ambiguous alternative to using the
ImGuiListClipper::Begin()
function, with misleading edge cases. Always useImGuiListClipper::Begin()
! Kept inline redirection function (will obsolete). Note: imgui_memory_editor in version 0.40 from imgui_club used this old clipper API. Update your copy if needed. - Style: Renamed
style.TabMinWidthForUnselectedCloseButton
tostyle.TabMinWidthForCloseButton
. - Renamed
ImGuiSliderFlags_ClampOnInput
toImGuiSliderFlags_AlwaysClamp
. Kept redirection enum (will obsolete). - Renamed
OpenPopupContextItem()
back toOpenPopupOnItemClick()
, REVERTED CHANGE FROM 1.77. For variety of reason this is more self-explanatory and less error-prone. Kept inline redirection function (will obsolete). - Removed return value from
OpenPopupOnItemClick()
- returned true on mouse release on item - because it is inconsistent with other popups API and makes others misleading. It's also and unnecessary: you can useIsWindowAppearing()
afterBeginPopup()
for a similar result.
Other Changes
- Window: Fixed using non-zero pivot in
SetNextWindowPos()
when the window is collapsed. (#3433) - Nav: Fixed navigation resuming on first visible item when using gamepad. [@rokups]
- Nav: Fixed using Alt to toggle the Menu layer when inside a Modal window. (#787)
- Scrolling: Fixed
SetScrollHere()
functions edge snapping when called during a frame where ContentSize is changing (issue introduced in 1.78). (#3452). - InputText: Added support for Page Up/Down in
InputTextMultiline()
. (#3430) [@Xipiryon] - InputText: Added selection helpers in
ImGuiInputTextCallbackData()
. - InputText: Added
ImGuiInputTextFlags_CallbackEdit
to modify internally owned buffer after an edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active). - InputText: Fixed using
ImGuiInputTextFlags_Password
withInputTextMultiline()
. It is a rather unusual or useless combination of features but no reason it shouldn't work! (#3427, #3428) - InputText: Fixed minor scrolling glitch when erasing trailing lines in
InputTextMultiline()
. - InputText: Fixed cursor being partially covered after using CTRL+End key.
- InputText: Fixed callback's helper
DeleteChars()
function when cursor is inside the deleted block. (#3454) - InputText: Made pressing Down arrow on the last line when it doesn't have a carriage return not move to the end of the line (so it is consistent with Up arrow, and behave same as Notepad and Visual Studio. Note that some other text editors instead would move the cursor to the end of the line). [@Xipiryon]
- Tab Bar: Added
TabItemButton()
to submit tab that behave like a button. (#3291) [@Xipiryon] - Tab Bar: Added
ImGuiTabItemFlags_Leading
andImGuiTabItemFlags_Trailing
flags to position tabs or button at either end of the tab bar. Those tabs won't be part of the scrolling region, and when reordering cannot be moving outside of their section. Most often used withTabItemButton()
. (#3291) [@Xipiryon] - Tab Bar: Added
ImGuiTabItemFlags_NoReorder
flag to disable reordering a given tab. - Tab Bar: Keep tab item close button visible while dragging a tab (independent of hovering state).
- Tab Bar: Fixed a small bug where closing a tab that is not selected would leave a tab hole for a frame.
- Tab Bar: Fixed a small bug where scrolling buttons (with
ImGuiTabBarFlags_FittingPolicyScroll)
would generate an unnecessary extra draw call. - Tab Bar: Fixed a small bug where toggling a tab bar from Reorderable to not Reorderable would leave tabs reordered in the tab list popup. [@Xipiryon]
- DragFloat, DragScalar: Fixed
ImGuiSliderFlags_ClampOnInput
not being honored in the special case where v_min == v_max. (#3361) - SliderInt, SliderScalar: Fixed reaching of maximum value with inverted integer min/max ranges, both with signed and unsigned types. Added reverse Sliders to Demo. (#3432, #3449) [@rokups]
- Text: Bypass unnecessary formatting when using the
TextColored()
/TextWrapped()
/TextDisabled()
helpers with a "%s" format string. (#3466) - CheckboxFlags: Display mixed-value/tristate marker when passed flags that have multiple bits set and stored value matches neither zero neither the full set.
- BeginMenuBar: Fixed minor bug where
CursorPosMax
gets pushed toCursorPos
prior to callingBeginMenuBar()
so e.g. calling the function at the end of a window would often add +ItemSpacing.y to scrolling range. - TreeNode, CollapsingHeader: Made clicking on arrow toggle toggle the open state on the Mouse Down event rather than the Mouse Down+Up sequence, even if the _OpenOnArrow flag isn't set. This is standard behavior and amends the change done in 1.76 which only affected cases were _OpenOnArrow flag was set. (This is also necessary to support full multi/range-select/drag and drop operations.)
- Columns: Fix inverted ClipRect being passed to renderer when using certain primitives inside of a fully clipped column. (#3475) [@szreder]
- Popups, Tooltips: Fix edge cases issues with positioning popups and tool-tips when they are larger than viewport on either or both axises. [@rokups]
- Fonts:
AddFontDefault()
adjust its vertical offset based on floor(size/13) instead of always +1. Was previously done by altering DisplayOffset.y but wouldn't work for DPI scaled font. - Metrics: Various tweaks, listing windows front-to-back, greying inactive items when possible.
- Demo: Add simple InputText() callbacks demo (aside from the more elaborate ones in
Examples->Console
). - Backends: OpenGL3: Fix to avoid compiling/calling
glBindSampler()
on ES or pre 3.3 contexts which have the defines set by a loader. (#3467, #1985) [@jjwebb] - Backends: Vulkan: Some internal refactor aimed at allowing multi-viewport feature to create their own render pass. (#3455, #3459) [@FunMiles]
- Backends: DX12: Clarified that imgui_impl_dx12 can be compiled on 32-bit systems by redefining the ImTextureID to be 64-bit (e.g. '#define ImTextureID ImU64' in imconfig.h). (#301)
- Backends: DX12: Fix debug layer warning when scissor rect is zero-sized. (#3472, #3462) [@StoneWolf]
- Examples: Vulkan: Reworked buffer resize handling, fix for Linux/X11. (#3390, #2626) [@RoryO]
- Examples: Vulkan: Switch validation layer to use
VK_LAYER_KHRONOS_validation
instead ofVK_LAYER_LUNARG_standard_validation
which is deprecated (#3459) [@FunMiles] - Examples: DX12: Enable breaking on any warning/error when debug interface is enabled.
- Examples: DX12: Added
#define ImTextureID ImU64
in project and build files to also allow building on 32-bit systems. Added project to default Visual Studio solution file. (#301)
Tab Bar: TabItemButton()
+ ImGuiTabItemFlags_Trailing
CheckboxFlags()
with visible tri-state (previously only in internals)
Other branches & Beta features!
The Tables (#2957) features is still available for testing, it is expected to fully stabilize and be merged for 1.80. You are encouraged to use Tables and provide feedback today. Currently doing a few final aggressive changes before stabilizing the API.
Some user-visible changes from 1.78 in 1.79 related to the tables branch include:
- Tables: BREAKING CHANGE: Renamed
TableNextCell()
toTableNextColumn()
. (see #2957 (comment)) - Tables: BREAKING CHANGE: Made TableNextRow() NOT enter into first column. (see #2957 (comment))
- Tables: BREAKING CHANGE: Renamed
TableAutoHeaders()
to `TableHeadersRow(). - Tables: BREAKING CHANGE: Added
TableSetupScrollFreeze()
api, removeImGuiTableFlags_ScrollFreezeXXX
flags. Avoid awkwardly named ScrollFreeze flags, raise limit over 3, and will allow for future API freezing bottom/right side. See #2957 (comment). - Tables: BREAKING CHANGE: Sorting: Made it users responsibility to clear SpecsDirty back to false, so
TableGetSortSpecs()
doesn't have side-effect any more. See #2957 (comment) - Tables: BREAKING CHANGE: Renamed
ImGuiTableFlags_NoClipX
toImGuiTableFlags_NoClip
, clarified purpose, moved lower in the list as it doesn't need to be so prominent. - Tables: Fixed clipper to support any number of frozen rows.
- Tables: Fixed for calling
TableSetBgColor(ImGuiTableBgTarget_CellBg)
multiple times on the same cell. - Tables: Fixed
ImGuiTableColumnFlags_WidthAlwaysAutoResize
columns when clipped (which would be default behavior without _Resizable and when clipping/scrolling). - Tables: Extend outer-most clip limits to match those of host when merging draw calls. Generally clarify/simplify ClipRect extending/merging code in
TableReorderDrawChannelsForMerge()
. - Tables: Added
TableGetColumnCount()
. - Tables: Added
ImGuiTableFlags_ContextMenuInBody
flag. - Tables: Added
ImGuiTableFlags_NoBordersInBody
,ImGuiTableFlags_NoBordersInBodyUntilResize
, removedImGuiTableFlags_BordersFullHeightV
. - Tables: Fixed lower clipping when using
ImGuiTableFlags_NoHostExtendY
. - Tables: Fixed a crash when using 8-level deep recursive table (was mistakenly holding on a pointer across resize/invalidation of the pool buffer).
The docking (#2109) and multi-viewports (#1542) features are available in the docking branch, they are in beta but actively maintained and being used by many teams already. Your continuous feedback is always appreciated.
Some of changes from 1.78 in 1.79 related to the docking branch (multi-viewport and docking features) include:
- Docking:
DockSpace()
emitsItemSize()
properly (useful when not filling all space). - Docking: Fixed docking while hovering a child window. (#3420) broken by 85a661d. Improve metrics debugging.
- Docking: Fix honoring payload filter with overlapping nodes. (we incorrectly over-relied on g.HoveredDockNode when making change for #3398)
- Docking: Fix handling of
WindowMenuButtonPosition == ImGuiDir_None
in Docking Nodes. (#3499) - Viewports: Fixed a rare edge-case if the window targeted by CTRL+Tab stops being rendered.
- Viewports, Backends: DX12: Make secondary viewport format match main viewport one (#3462) {@BeastLe9enD]
- Viewports: Backends: Vulkan: Removed unused shader code. Fix leaks. Avoid unnecessary pipeline creation for main viewport. Amend 41e2aa2. (#3459) + Add ImGui_ImplVulkanH_CreateWindowSwapChain in ImGui_ImplVulkanH_CreateOrResizeWindow().
- Viewports: Backends: DirectX9: Recover from
D3DERR_DEVICELOST
on secondary viewports. (#3424) - Viewports, Backends: Win32: Fix toggling of ImGuiViewportFlags_TopMost (#3477) [@Kodokuna]
- Viewports: Backends: GLFW: Workaround for cases where
glfwGetMonitorWorkarea
fails (#3457) [@dougbinks]
There's a CMake pull-request (#1713) if you prefer a traditional CMake integration over registering sources files in your own project. There's a premake5 branch if you prefer the sane Visual Studio projects generated by premake.
Gallery
See Gallery threads for more pictures and to post yours!
@enci: "I use Dear ImGui a lot in my curriculum at Breda University of Applied Sciences. Here are two screenshots from student projects, posted with permission.". RTX real-time ray tracer by Viktor Zoutman
@Vitorbnc: "VVERSimulator is a VVER-440 Pressurized Water Reactor Simulator. It simulates the primary circuit of Unit 3 of the Paks Nuclear Power Plant in Hungary."
@crash5band: "Glitter Studio is a WIP particle editor for Sonic Generations"
@ongamex: "The welcome screen in my level editor"
@tomasiser: __"Hello! A bit over 1 year ago, we finished our student project called Pepr3D for 3D printing. Even though the project is not maintained anymore, I wanted to showcase our usage of ImGui here."
World of Warcraft 8th extension technical blog post shows a game ui mockup of their "Adventures" feature:
https://worldofwarcraft.com/en-us/news/23507730/engineers-workshop-developing-for-mobile-and-pc
Kanteran: "This is a code-block editor for education using dear imgui"
@thedmd: " I'm developing more concrete blueprint example for node editor. This one does real job behind the nodes.
It will land on main branch as an example when I decide it is decent enough. You can look at the code right now on https://github.com/thedmd/imgui-node-editor/tree/develop branch. Code is in flux so a lot can change yet."
Flight Simulator 2020 is now released, with dev mode / SDK tools using Dear ImGui
@dfranx SHADERed (a shader IDE) running in the browser
@epezent Amazing ImPlot still moving forward:
@d3cod3: __"here goes a project of mine in current development ( beta stage now ), called Mosaic, a livecoding programming/patching environment for creating real-time audio-visual compositions."