Dear ImGui v1.93.0 🎨🖌️
✋ Reading the changelog is a good way to keep up to date with whaat Dear ImGui has to offer, and will give you ideas of some features that you've been ignoring until now!
📣 If you are browsing multiple releases: click version number above to display full release note contents, otherwise it is badly clipped by GitHub!
Links: Homepage - Release notes - FAQ - Issues, Q&A. Also see our Wiki with sections such as..
- Getting Started (~25 lines in an existing app)
- Useful Extensions/Widgets
- Software using Dear ImGui
- Language Bindings & Engine Backends
- and more! 👌
Dear ImGui is funded by your contributions and absolutely needs them to sustain and grow. We can invoice and accommodate to many situations. If your company uses Dear ImGui, please reach out. See Funding page. Did you know? If you need an excuse to pay, you may buy licenses for Test Engine and buy hours of support (and cough not use them all) and that will contribute to fund Dear ImGui.
❤️ Thanks to sponsors ❤️
- BeamNG / G3Dvu / OTOY / Riot Games / Scorewarrior / Supercell / Asobo Studio / Artifex Mundi / ID Software / Lucid Games / Mobigame / Remedy Entertainment / Passtech Games / Planestate Software / River End Games / RocketWerkz / SCS Software / Sofistik / Tanius Technology / Thatgamecompany / Tuxedo Labs / Valve / Vector Unit !
As well as various paid/corporate licenses to imgui_test_engine supporting the project.
News about Third-Party Projects
- imgui_explorer: @pthom's fabulous imgui_manual has been improved and rebranded as imgui_explorer. It also now includes ImPlot and ImPlot3d: https://pthom.github.io/imgui_explorer. The latest version releasing today has improved interface and touch conrols on mobile/phone devices. He also improved Dear ImGui Bundle Explorer which packs in more extensions.
- ImGuiColorTextEdit: @goossens has rewritten the fancy text editor initially created by @BalazsJako (which was unmaintained and had many small forks). New version: https://github.com/goossens/ImGuiColorTextEdit
Check the Useful Extensions/Widgets page for many more.
Changes in v1.93.0 (since v1.92.9b)
🆘 PS: v1.92.8 contained a signature change for the trailing optional parameters of ImDrawList::AddRect(), AddPolyline(), PathStroke(). C++ users should be notified at compile-time, but languages without type-checking may only be notified at runtime. Read v1.92.8 if using non a C++ language. Consider enabling IMGUI_DISABLE_OBSOLETE_FUNCTIONS from time to time to get rid of obsolete calls.
In 1.93.0, the ImDrawList rendering API has been improved to be more robust and more consistent over the whole range of shapes. The rendering now matches much closer to common vector drawing APIs, like html canvas. Improvements, like anti-aliased line endings and stroke position were added. The coordinates passed to the API are now consistently describing shape outlines.
For code using custom rendering: some details are now rendered slightly differently (even if generally more consistent). The difference in rendering is in the range of half a pixel, but that can lead to issues like some lines now look blurrier or more transparent. All Dear ImGui widgets should appear identical or better.
The rendering of common shapes was optimized when the shapes fall on integer coordinates (which is most of the UI). This includes skipping anti-aliasing when not needed, or using textures instead of tessellated geometry to draw round corners. The varying code-paths are designed to look indistinguishable from each others.
New rendering code fixes some inconsistencies between graphics APIs (e.g. DirectX vs OpenGL) which are using different diamond exits rules. New code should work precisely the same regardless of which graphics API is used (note that using _StrokeLegacy mode can lead to the same old inconsistencies).
New rendering code also deals better with animating thickness and rounding (integer values are recommended).
While the current version doesn't make lots of visible use of the new features and facilities, they are among the pillars that will make it easier to create prettier contents, both for custom rendering and future versions of the library.
Use ImDrawFlags_StrokeLegacy mode to emulate old rendering:
- Per-primitive:
draw_list->AddLine(..., ..., ImDrawFlags_StrokeLegacy); - For a given scope:
draw_list->PushDrawFlag(ImDrawFlags_StrokeLegacy, true); draw_list->AddLine(...); draw_list->PopDrawFlag(); - Globally:
ImGui::Checkbox("DefaultsToStrokeLegacy", &io.ConfigDebugDrawListDefaultsToStrokeLegacy); // Map to a checkbox - Globally:
io.ConfigDebugDrawListDefaultsToStrokeLegacy = io.KeyShift; // Map on Shift
Don't panic!
Many applications will not notice any difference! You will more likely see differences if you used lots of direct ImDrawList calls for custom rendering.
Credits
For ImDrawList changes in 1.93.0:
- main work courtesy of Mikko Mononen (@memononen).
- additional work/reviewing/guidance by @ocornut.
- with legacy bits from @thedmd, @potocpav.
Other changes:
- tagged with @, or @ocornut when omitted.
- every bit of code merged carefully reviewed by a caring human (me).
Refer to our guides:
📘 ImDrawList Vector Rendering Reference ❤️
https://github.com/ocornut/imgui/wiki/Draw-List
(includes a precise list of differences between 1.92.9 and 1.93.0).
📘 Pixel Perfect Anti-aliased Rendering ❤️
https://github.com/ocornut/imgui/wiki/Pixel-Perfect-Rendering
📘 How Anti-aliased Polyline Rendering is Implemented ❤️
https://github.com/ocornut/imgui/wiki/Polyline-Rendering
🗨️ Discussion topic #9504
(if you have a problem to discuss, please open a new issue)
🔍 Interactive 1.92.9 vs 1.93 Testbed w/ commentary ❤️
https://www.dearimgui.com/docs/drawlist_v193
Breaking Changes
ImDrawList:
AddLine(): removed the (+0.5f,+0.5f) offset that was sneakily added to input coordinates. (#9504)- This fixes inconsistencies in the API and matches the PathXXX API.
- It seems scary but in reality
AddLine()is not used that often and many won't immediately notice the difference. - By default, stroke thickness extends on both side of the given segment. e.g for a "pixel-perfect" looking line with thickness=1.0f, coords should be passed as center of each ends of the line.
- Use
ImDrawFlags_StrokeLegacyto use old offset if required. Or you can apply the offset manually! - Generally better, simple and faster to use
AddLineH(),AddLineV()functions added in 1.92.8. - READ IF YOU ARE MINDFUL OF PIXEL-PERFECTNESS IN YOUR CUSTOM RENDERING/WIDGETS USING
AddLine():- TRANSITION GUIDE FOR AXIS-ALIGNED LINES:
- When switching from legacy
AddLine()values toAddLineV(),AddLineH()you can keep same inputs coordinates as before:- Old
AddLine({x, y1}, {x, y2}, col)-->AddLineV(x, y1, y2, col);// Vertical line. - Old
AddLine({x1, y}, {x2, y}, col)-->AddLineH(x1, x2, y, col);// Horizontal line. - This will be equivalent and faster for thickness=1.0f lines.
- Old
- Since
AddLine()use default stroke pos Center andAddLineV(),AddLineH()use Inside, thickness>1.0f strokes will differ. UsingImDrawFlags_StrokeCenterwill match old result more closely (aka look centered), but is more likely to look blurry as it already did before. - Read table below about StrokePos and the Pixel-Perfect Rendering guide if you care about pixel-perfect lines.
- When switching from legacy
- TRANSITION GUIDE FOR DIAGONAL LINES:
- Your lines will appear offset by -0.5f pixels on each axis. Being anti-aliased diagonal lines, they won't look particularly better or worse, just slightly offset. It'll likely only be noticeable if you carefully combined them with other primitives for a pixel-perfect result.
- Old
AddLine({x1, y1}, {x2, y2}, col)-->AddLine({x1 + 0.5f, y1 + 0.5f}, {x2+ 0.5f, y2 + 0.5f}, col);// Same - or use
ImDrawFlags_StrokeLegacy-->AddLine({x1, y1}, {x2, y2}, col, thickness, ImDrawFlags_StrokeLegacy); // Offset by +0.5f + disable AA ends. - This reapplies the old offset, and should get you exactly the same result you previously got for thickness=1.0f lines. But said result were previously sometimes ambiguous and renderer-dependent. (#3116, #3258, #2441)
- Old code did not support anti-aliased ends, which could create gaps when rendering shapes out of multiple contiguous lines instead of using
AddPolyline(). There is a possibility that you legacy code added fudge offsets here and there; which may not be necessary anymore if you use_AALineEnds, or if you combine rendering of contiguous lines usingAddPolyline().
- 📘 ImDrawList Vector Rendering Reference
- 🔍Interactive 1.92.9 vs 1.93 Testbed w/ commentary.
- TRANSITION GUIDE FOR AXIS-ALIGNED LINES:
AddRect(),AddCircle(),AddNgon(),AddEllipse(),AddTriangle(),AddQuad(): defaulting to "inside" stroke.- All closed shapes with thickness=1.0f will appear identical.
- The difference for thickness>1.0f shapes may be minimal since very large strokes were not well supported for widgets, but stroke will default inside widgets.
AddCircle(),AddNgon(): removed -0.5f offset added to radius.- This fixes inconsistencies in the API.
- Use
ImDrawFlags_StrokeLegacyto use old method if required. Or you can apply the offset manually!
AddRectFilled(): non-integer coordinates will now display anti-aliased edges. Previously, non-integer coordinates rendered with aliased edges snapped by the rasterizer. (#6971)AddRect(),AddRectFilled(): rectangles with inverted coordinates won't be visible unless usingImDrawFlags_StrokeLegacymode. With inverted coordinates (min > max):- Legacy
AddRect()rounding off -> visible but incorrect outer size. - Legacy
AddRect()rounding on -> visible but very glitchy. - Legacy
AddRectFilled()rounding off -> visible and correct. - Legacy
AddRectFilled()rounding on -> visible but very glitchy. - Use
ImDrawFlags_StrokeLegacyto use old rendering for cases without rounding, or fix coordinates.
- Legacy
- Merged
ImDrawListFlagsintoImDrawFlags.ImDrawListFlagswas rarely used directly and generally setup by the ImGui context. Unifying them allows easily using them for both per-primitives and scope alterations. Kept redirection enums (will obsolete).ImDrawListFlags_AntiAliasedLines->ImDrawFlags_AALinesImDrawListFlags_AntiAliasedFill->ImDrawFlags_AAFillImDrawListFlags_AllowVtxOffset->ImDrawFlags_UseVtxOffsetImDrawListFlags_TextNoPixelSnap->ImDrawFlags_TextNoPixelSnap- Renamed all
ImDrawFlags_RoundCornersXXXflags toImDrawFlags_RoundXXX. Kept redirection enums (will obsolete).ImDrawFlags_RoundCornersAll->ImDrawFlags_RoundAllImDrawFlags_RoundCornersNone->ImDrawFlags_RoundNoneImDrawFlags_RoundCornersTopLeft->ImDrawFlags_RoundTopLeftImDrawFlags_RoundCornersTopRight->ImDrawFlags_RoundTopRightImDrawFlags_RoundCornersBottomLeft->ImDrawFlags_RoundBottomLeftImDrawFlags_RoundCornersBottomRight->ImDrawFlags_RoundBottomRightImDrawFlags_RoundCornersTop->ImDrawFlags_RoundTopImDrawFlags_RoundCornersBottom->ImDrawFlags_RoundBottomImDrawFlags_RoundCornersLeft->ImDrawFlags_RoundLeftImDrawFlags_RoundCornersRight->ImDrawFlags_RoundRight
- Marked
ImDrawListFlags_AntiAliasedLinesUseTexandstyle.AntiAliasedLinesUseTexas obsolete, as the new line rendering code always uses textures. - Enabling
ImFontAtlasFlags_NoBakedLinesin the font atlas will now disable support for anti-aliased lines by clearingstyle.AntiAliasedLines/style.AntiAliasedLineEnds.
Style:
- Obsoleted
style.CurveTessellationTol(default 1.25) which was in Pixels² unit in favor ofstyle.CurveTessellationMaxError(default 1.12) which is in Pixels unit. It is easier to tweak + this allows us to easily scale error threshold on high density screens.style.CurveTessellationMaxError == sqrtf(style.CurveTessellationTol).
ImGuiTextFilter:
- Removed
float widthparameter ofDraw(const char* filter, float width): prefer usingSetNextItemWidth(float)which is standard. Kept inline redirection function.
Fonts:
Backends:
- DirectX12: Removed support for legacy
ImGui_ImplDX12_Init()signature, which was obsoleted in 1.91.6 (December 2014), because it needed to forcefully disable support forImGuiBackendFlags_RendererHasTextures. Use the new signature! (#9487) - OpenGL3: Does not attempt to read
GL_CLIP_ORIGINby default as the detection is sub-optimal and not reliable on some setup. UseImGui_ImplOpenGL3_SetClipOrigin(0)to enable auto-detection, or e.g.ImGui_ImplOpenGL3_SetClipOrigin(GL_UPPER_LEFT).
Other Changes
Style:
- StyleColorsDark(): minor refresh of the default style to look more modern: changed WindowBg to use a slightly greyer value and removed opacity. changed FrameBg values to use a dark black to make frames stand out better. Tweak TextDisabled, TableHeaderBg, TableBorders to match altered WindowBg.
- StyleColorsLight(): inverted
ImGuiCol_TitleBgXXXcolors so that the selected window title bar appears brighter.
DrawList:
- Added flags to specify stroke position in all
ImDrawListstroking functions: (#9504) [@memononen]ImDrawFlags_StrokeInside(default for Rect, Circle/Ellipse, Triangle, Quad, Ngon + AddLineH, AddLineV)ImDrawFlags_StrokeCenter(default for Line, Polyline, Beziers, Paths function)ImDrawFlags_StrokeCenterBiased(center w/ bias for pixel perfect alignment)ImDrawFlags_StrokeOutsideImDrawFlags_StrokeLegacy(match old behavior)- Legacy mode may be set as default for a given scope using
PushDrawFlag(ImDrawFlags_StrokeLegacy, true). - Legacy code was generally applying +0.50f offsets which meant that,
- with thickness=1.0f: the stroke would appear inside.
- with thickness>1.0f: the stroke would start expanding on both sides but starting from that small initial offset.
- with thickness>1.0f for even integer values, the stroke would look blurry.
- TL;DR; the logic didn't make much sense for thickness>1.0f.
- Defaulting to Inside for closed shapes ensure that rectangles and lines are never blurry, regardless of thickness, as long as input coordinates/sizes are integers. (#9359) Recap:
| Thickness | Legacy | Inside | Outside | Center | CenterBiased |
|---|---|---|---|---|---|
| 1.0f | sharp | sharp | sharp | blurry | sharp |
| 2.0f | blurry | sharp | sharp | sharp | sharp |
| 3.0f | sharp | sharp | sharp | blurry | sharp |
Read our Wiki guides for more details! https://github.com/ocornut/imgui/wiki/Draw-List
And interactive 1.92.9 vs 1.93.0 comparing testbed: https://www.dearimgui.com/docs/drawlist_v193
- AddPolyline(), PathStroke(), AddTriangle(): the algorithm to render lines got overhauled. (#9504, #2183, #2964, #7972 + #9360, #6331, #4250, #4091) [@memononen]
- Generally fixed rendering of thick strokes/paths.
- The new stroke expansion now uses corner miter calculation, which keeps thickness along the line segments consistent. If the corner becomes too sharp, it will be beveled to avoid long spikes at corners.
- There are also some robustness measures for the case where the line thickness is larger than the features being drawn.
- Rendering artifacts are still possible when the path features are smaller than line thickness, but the artifacts should be more localized. The new implementation attempted to favor simple implementation and robustness over the corner case accuracy.
- All functions: new rendering code fixes some inconsistencies between graphics APIs (e.g. DirectX vs OpenGL) which are using different diamond exits rules. New code should work precisely the same regardless of graphics API. (#3116, #3258, #2441) [@memononen]
- Debug: added
io.ConfigDebugDrawListDefaultsToStrokeLegacyto facilitate comparing old/new behaviors. This is equivalent to callingPushDrawFlag(ImDrawFlags_StrokeLegacy, true)on every drawlists. Suggested uses:- e.g.
io.ConfigDebugDrawListDefaultsToStrokeLegacy = io.KeyShift; // Map on holding Shift - e.g.
ImGui::Checkbox("DefaultsToStrokeLegacy", &io.ConfigDebugDrawListDefaultsToStrokeLegacy);
- e.g.
- Added
ImDrawFlags_AALineEndsflag to enable anti-aliased line ends.- Most noticeable for thick lines.
- Also helps fill minor gaps if combining multiple individual lines. For best looking continuous lines you should use AddPolyline(), it creates joins between line segments to avoid any gaps.
- Added
style.AntiAliasedLineEndsin ImGui to set default state. - This is disabled by default! Enabling AA Ends by default would be more "correct", but since it is very slightly slower and increases vertex/index data we decided to not enable it by default. This keeps situations such as "throw tens of thousands of lines at ImDrawList" optimal. You can opt-in for a given shape or in a scope using
PushDrawFlag().
- Added
ImDrawFlags_JoinMiterflag to disable using beveled corner.- Closer to legacy rendering and slightly faster, but corners sharper than 90 degrees may expand far out.
- Automatically used by
AddRect(),AddCircle(),AddNgon(),AddEllipse()functions since we know that the input path does not contain sharper corners.
- Automatically used by
- Closer to legacy rendering and slightly faster, but corners sharper than 90 degrees may expand far out.
- Added
ImDrawFlags_CapSquareflag to extend lines ends using square caps. (#9360) AddConvexPolyFilled()/PathFillConvex(): improved to handle input geometry more robustly. The rendering of sharp corners was improved. Earlier there were issues with sharp corners either creating long spikes, or messing up the adjacent edge's anti-aliasing. Now the anti-aliasing fringe calculation is more consistent, and sharp corners get beveled to avoid spikes. There might still be issues when the smallest extent of a long thin polygon is less than a pixel. Also supportsImDrawFlags_JoinMiter, to facilitate matching a stroke using the same flag. [@memononen]AddRect(),AddRectFilled(): various optimizations for rounded rectangles. (#1962, #9504)- Integer-aligned coordinates and thicknesses will automatically use baked textures, saving on both CPU and vertex/index data.
- Enabled by default. Use
ImFontAtlasFlags_NoBakedRoundCornersto disable baking round corners in font atlas. - Added
ImDrawFlags_UseTexForRoundCornersflag to enable in scope or per-shape. Added for consistency and debugging, not really needed in practice.
AddCircle(),AddCircleFilled(): fixed large circles being under-tessellated (when above ~140 with defaultCircleTessellationMaxError).- Improved debug-build performance in various locations.
- Improved minor mismatches when overlapping strokes and filled shapes.
For example, when using inside strokes,AddRect()andAddRectFilled()with rounding now overlap better. (#3656)AddCircle()andAddCircleFilled()now overlap better.
- Added ImDrawList::PushDrawFlag()/PopDrawFlag() to alter certain flags for a scope and a given
ImDrawList. (#9489)- e.g.
PushDrawFlag(ImDrawFlags_StrokeLegacy, true);enforce legacy tweaks.
- e.g.
- About
ImDrawFlags_StrokeLegacy:- This is designed to emulate old behavior:
- Most shapes use
ImDrawFlags_StrokeCenter. AddLine()add +0.5f,+0.5f offset to position.AddRect()andAddRectFilled()allow inverted positions.AddRectFilled()has no AA when passed non-integer coordinates.AddCircle(),AddNgon()add a -0.5f offset to radius.- Closed shapes use miter corners.
- Lines don't have anti-aliased ends.
- Most shapes use
- But there are known difference between legacy code and ImDrawFlags_StrokeLegacy:
- Thick shapes with acute angles will now preserve thickness better, which may make them appear as protruding a little more.
- About disabling anti-aliasing:
- Disabling anti-aliasing is now emulated by applying different UV coordinates.
- It does not result in a performance increase or vertex/index data decrease any more (however the tendency is that the new code behaves better than old code).
- But may be a useful stylistic choice in some circumstances.
- Many thick shapes had broken corners with old no-AA code, and the old no-AA code was wildly different from the AA code. Not the case any more. (#288)
- Disabling anti-aliasing is now emulated by applying different UV coordinates.
- This is designed to emulate old behavior:
- Per-viewport
FramebufferScalefor Apple/Retina screen is applied to draw lists:- AA Fringe is scaled accordingly. (#9577)
- Circle and Curves tessellation error are scaled accordingly.
- Reworked assert in
PushTexture()to allow convenience grace period of using a texture that was queue for destroy during the frame. Make it safe to stick to an existing texture during the frame. (#9528, #8465) - Added optional
platform_io.DrawCallback_SetSamplerFromTexstandard backend-agnostic draw callback for requesting to use the sampler associated already associated to a texture. Currently only supported by the OpenGL2/3 and SDLRenderer3 backend. (#9378) - Fixed dangling
ImDrawList::_OwnerNamewhen using animated label. (#9552) [@ubi-dcastonguay]
Mixed Values:
- Added
ImGuiItemFlags_MixedValueflag for representing mixed/indeterminate values. Supported by: Checkbox(), RadioButton(), DragXXX(), SliderXXX(), InputXXX(), ColorXXX() and Combo() functions. The scoped flag is designed for usage by advanced property editors. (#5518, #5677, #6865)
Drags, Sliders:
- Ongoing drags may be cancelled using Right-Click, Escape or Gamepad Triangle. Cancelling reverts to the initial value. (#8564, #9534)
- Fixed an overflow using
ImGuiSliderFlags_Logarithmicwith S32/S64 types which leads to clamped interactions. (#9526, #3361, #1823, #1316, #642) [@lailoken]
Tree Nodes:
- Fixed issues/asserts with 32+ deep trees when using
ImGuiTreeNodeFlags_DrawLinesXXXfeatures or other features requiring stack storage. (#9509) [@lasrod]
Tab Bars:
- Improved scroll target when clicking a Tab that is larger than the scrolling section width.
- Using
<>scrolling buttons while the selected Tab is at either end of the section mid-section but not fully visible always makes it fully visible (before eventually selecting a Tab in the leading/trailing section).
Tables:
- Fixed a bug restoring correct .ini columns order when table use is Sortable but had no user changes. (regression from 1.92.9). (#9519, #9108)
- Fixed a bug tracking topology changes (insert new columns in the middle) when the table is not _Reorderable: new columns would be ordered incorrectly. (#9570, #9108, #9572) [@lailoken]
InputText:
- Fixed a crash in some cases when using Home key in a WordWrap+ReadOnly field. (#9561)
Selectable:
- Fixed
ImGuiSelectableFlags_SelectOnNavtriggering during NavInit.
Fonts:
- Reworked
AddFontDefault()to useio.DisplayFrameBufferScaleas part of the heuristic to selectAddFontDefaultVector()by default, effectively using ProggyForever instead of ProggyClean on most Apple/Retina setups by default. - Added
ImFont::AddRemapCodepointToGlyphIndex()allowing to access glyphs that are not mapped to codepoints. (#9559, #5647, #609, #5748, #8466) - imgui_freetype: Fixed blurriness rendering
AddFontDefaultVector(). Caused by a non-pixel aligned offset caused byExtraSizeScale. (#9348, #9233) [@redpartizan, @RDMCz] - (Internal) ImFontLoader: reworked
FontSrcContainsGlyph,FontBakedLoadGlyphsignatures to take raw glyph index instead of codepoint. AddedFontSrcGetGlyphIndexFromCodepoint. (#9559, #5647, #9540, #8466, #8465) - Added
IMGUI_DISABLE_STB_TRUETYPEto completely omit the stb_truetype loader code + stb_truetype.h code. (#9573)
ColorEdit:
ColorButton(),ColorEdit4(),ColorPicker4(): cancel-out alpha caused byBeginDisabled()so disabled color buttons have the same color as non-disabled ones. (#9511)ColorButton(): fixed issues/inconsistencies with checkerboard rendering when combining color alpha and global style alpha. (#9511) [@enjmiah, @ocornut]
Popups:
- Amended context menu right-click opening code to check that the right-click hasn't been owned by another items. This is more correct and also necessary to avoid Drags/Sliders cancelling also triggering a cancel menu. (#8564, #9534)
- Reworked
GetMousePosOnOpeningCurrentPopup()to be legal to call within theBeginPopup()/EndPopup()scope of a popup which was just closed. (#9551) [@jkunstwald]
ImGuiTextFilter:
- Added support for space as an "and" filter, which is the standard. (#2435, #30) e.g. w/ filter 'hello world' (without quotes) both words needs to be in input data.
- Added support for double-quoted "xxx" blocks to e.g. match words sequences. (#2435) e.g. w/ filter "hello world" the exact sequence needs to be in input data.
- Fixed filtering when mixing "include" and "-exclude" keyword so that an "-exclude" match always filters out. (#2435) [@kudaba, @ocornut]
- Added
DrawWithHint()function. (#6206, #6395, #6447) - Added a "incl -excl" hint by default when the search field is empty. (#6206, #6395, #6447)
Widgets:
- Checkbox, Menus: check marks use anti-aliased ends.
- Tweaked rendering in various locations to avoid blurriness:
- Windows: title-bar and menu-bar border (when thickness>1.0f).
- SeparatorText: border (when thickness>1.0f).
- Tree: hierarchy lines (when thickness>1.0f).
- InputText: input caret (when thickness>1.0f).
- TabBar: selected overline border (when thickness>1.0f).
Misc:
- Fixed
GetBackgroundDrawList()/GetForegroundDrawList()not being properly reset every frame when accumulated session time is very large (e.g. a few days). [@lailoken] - Added
IM_NODEBUGSTEPhelper to tag functions with__declspec(non_user_code)(MSVC) or[[gnu::artificial]](Clang/GCC) in order to provide a hint to debuggers to skip trivial functions when stepping into. - Tagged various trivial functions using
IM_NODEBUGSTEP:ImVec2(),ImVec4()etc. and various operators. - Fixed strict aliasing violation in
ImHashData()affecting Clang 23 + SSE 4.2 + -flto. Could manifest asImFontAtlasBakedGetId()computation omitting font size from the hashed data. (#9557, #9560) [@sthalik] - IO: restore default clipboard/ime/shell platform handlers on
ClearPlatformHandlers(), fixing issues switching backends mid-session to one relying on default. (#9537, #8945, #2769) [@lstalmir]
Demo:
- Added
Widgets->Mixed Valuessection. (#5518, #5677, #6865) - Custom Rendering section: exposed new flags; showcasing overlapping strokes and filled shapes; added an option to animate thickness; added new shapes to showcase new rendering features that previously hit limitations.
- Style Editor: fixed style/colors combo box applying style when opening Combo.
Backends:
- QNX: added QNX Screen backend. (#9492) [@mgorchak-blackberry]
- Metal, Metal4: added support for rendering inside a render pass with multiple color attachments (e.g. when merged with other passes): we render to the first color attachment and leave the other ones untouched. (#9574) [@tqjxlm]
- OpenGL2, OpenGL3: added support for
platform_io.DrawCallback_SetSamplerFromTexdraw callback to request using the sampler associated already associated to a texture. (#9378) - OpenGL2, OpenGL3: fixed
DrawCallback_ResetRenderStatehandler not resetting all states in the glTexParameter() path. (#9378) - OpenGL3: added
ImGui_ImplOpenGL3_SetClipOrigin()to specify origin betweenGL_LOWER_LEFT(new default),GL_UPPER_LEFTand0(autodetect, old default). - OpenGL3: avoid querying
glGetIntegerv(GL_CLIP_ORIGIN)multiple times when using when using default and usingDrawCallback_ResetRenderState, at it appear to stall some drivers. (#2186, #3998, #3146, #3143, #8640) - SDL2: fixed querying framebuffer scale/density when using Metal without going through a SDL_Renderer. (#5592) [@lailoken]
- SDLRenderer3: restore any temporarily modified texture scale modes at the of
RenderDrawData(). (#9378) - SDLRenderer3: expose
CurrentScaleModeinImGui_ImplSDLRenderer3_RenderState. (#9543, #9378) [@Clownacy] - SDLRenderer3: added support for
platform_io.DrawCallback_SetSamplerFromTexdraw callback to request using the sampler associated already associated to a texture viaSDL_SetTextureScaleMode(). (#9378) It is equivalent to settingrender_state->CurrentScaleMode = SDL_SCALEMODE_INVALID. Note: this callback is only supported by selected rendering backends: most other graphics API don't have the equivalent ofSDL_SetTextureScaleMode()and the callback won't work with them. - Vulkan: added for support for multiple Vulkan contexts with custom loaders. (#6616) [@lstalmir]
- Vulkan: added support for rendering inside a render pass with multiple color attachments (e.g. when merged with other passes): we render to the first color attachment and leave the other ones untouched. (#9574) [@tqjxlm]
- WebGPU: fixed passing non-integer sizes to
wgpuRenderPassEncoderSetViewport()whenFramebufferScaleis >1.0f. (#9515, #8628) [@WayU] - WebGPU: update to build with wgpu-native 29.0+. (#9377, #9532, #9530) [@lucascompython, @ivan-enzhaev]
Changes from 1.92.9b to 1.93.0 specific to the Docking+Multi-Viewports branch:
git tag: v1.93.0-docking
Docking+Viewports Branch:
- Style: Changed
ImGuiCol_DockingEmptyBgvalue in dark/light styles. - Backends: DX10, DX11, DX12: fixed crash when
CreateSwapChain()orCreateRenderTargetView()calls are failing. (#9546) [@lailoken] - Backends: GLFW: fixed applying mouse cursor shapes to secondary viewports, broken in 1.92.6 when introducing a cache. (#9545) [@JamesWrigley]
- Backends: Metal: fixed resizing windows losing framebuffer scale. (#6828, #8856) [@laikoken]
- Examples: SDL3+Metal, GLFW+Metal: fix multi-viewport support.
Gallery
@markaren threepp: "A cross-platform C++20 3D library with the high-level API of three.js — and modern backends: portable OpenGL, and a deferred Vulkan renderer with ray-traced accents."
https://github.com/markaren/threepp
@stiiv: Poietic Playground – "modelling and simulation application for Stocks and Flows. Tech details: Using ImGui from Swift through native C++ bindings (no wrapper package), SDL backend, rendering of the canvas content through Cairo."
https://github.com/openpoiesis/poietic-playground
@sindney: "This is my WIP vibe game engine https://github.com/sindney/fury3d, picked up with vibe coding from a 9 year old code base."
@csclyde: "The texture atlas packer I made in Zig with Dear ImGui, called Packrat. I also built a ton of internal tooling for my game, Cursemark, with Dear ImGui. Great technology, thanks for making it."
Assurance Forge _"is an open-source safety case engineering tool built around SACM 2.3, with GSN visualization, automatic layout, and AI-assisted review against the Safety Case Core Guidelines."
https://www.assurance-forge.com, https://github.com/lasrod/assurance-forge
SuperDex Studio
https://github.com/facebookresearch/project_superdex
Homepage: https://projectsuperdex.com/studio/ / Video: https://projectsuperdex.com/studio/docs/overview/
Overview.SuperDex.Studio.1.overview-1.mp4
Kapi Engine
https://x.com/toncijukic/status/2094426446252970312
https://kapiengine.com/
@hyblocker: Space Calibrator 2.0 "a rewrite of Space Calibrator. Update includes updated UI (using Dear ImGUI of course)"
https://store.steampowered.com/app/3368750/Space_Calibrator, https://github.com/hyblocker/OpenVR-SpaceCalibrator

more screenshots
@mewiof: "Free & open source Ableton alternative"
https://github.com/Mewiof/MSDAW (MIT)
@eliasdaler: _"It’s so convenient to use Dear ImGui with a mouse directly on Sega Dreamcast to setup environment colors. 😍"
https://bsky.app/profile/eliasdaler.bsky.social/post/3mv3j2n4mtc2s
Dreamcast.mp4
Pulsarus for Active USB Ultrasound Probes
Homepage: https://vermon.com/oem-usb-probe/
Brochure: https://decel.univ-tours.fr/data/presentations/BrochureDkpocV17.pdf

@ValentineShilov: WebRemoteImgui: "C++ library and example that brings Dear ImGui to the web. It executes all application logic on the server and streams the UI to any modern web browser using WebGL, while piping user interactions back in real-time. Features per-user sessions, making it ideal for remote monitoring, headless server dashboards, and cloud-based C++ tools."
https://github.com/ValentineShilov/webremoteimgui

Private dashboard created using this library:
@auygun: Gel is a cross-platform, gitk-like graphical git repository browser.
https://github.com/auygun/gel

camomill is an application for generating 5-axis toolpaths for CNC machines. It aims to be a cost-effective (buy once, perpetual license) Computer-Aided Manufacturing (CAM) tool with a focus on the 5-axis operations that are traditionally reserved for very expensive industrial-grade software suites.
https://gustavolsson.itch.io/camomill
ceasta: a reverse engineering tool (disassembler, decompiler, debugger)
https://github.com/ngwg/ceasta
"win32 + dx11 on windows, glfw + opengl3 on linux and macos (the mac build is one universal .app; the window works in points and 1.92's dynamic fonts render at the retina density). a plain fixed layout with splitters instead of docking, ImGuiListClipper for the listing and every table, the function graph drawn with ImDrawList, and a command palette for every action. three themes: dark, light and high contrast."
@ExtasyHosting: "Custom firmware on a FlySky TX. It’s always a pleasure getting ImGui running on embedded hardware"


more screenshots
@sse2: hammer knockoff for my game engine. quite happy with how it turned out (still very wip)"
MeshInspector seems to be using a modded version of Dear ImGui
https://meshinspector.com
Web version https://app.meshinspector.com, OSS part https://github.com/MeshInspector/MeshLib
Only part of it is open-source, eg. the MRViewer which seems to be a simpler app:
Misc helpers https://github.com/MeshInspector/MeshLib/blob/master/source/MRViewer/ImGuiHelpers.cpp
As well as SmileInspector https://smileinspector.io/
@abdullahoday710: "Particle system editor for my game engine"
@AnthonyBall1966: Deluxe Pixel
https://kage.games/dpixel
@Zaryob: ImShark — a packet analyzer built with Dear ImGui
"I started ImShark in 2023 as a small project to learn how network packets and protocols work, using Dear ImGui to inspect them visually. Over time, it grew into a Wireshark-inspired desktop application, with live packet capture alongside offline capture analysis."
https://github.com/Zaryob/imshark
...More in gallery threads.
Also see previous releases details.
Note that GitHub are now clamping release notes sometimes really badly, click on a header/title to read full notes.
💰 🙏 Dear ImGui is funded by your contributions and absolutely needs them to sustain and grow. We can invoice and accommodate to many situations. If your company uses Dear ImGui, please reach out. See Funding page. Did you know? If you need an excuse to pay, you may buy licenses for Test Engine and buy hours of support (and cough not use them all) and that will contribute to fund Dear ImGui.