Skip to content

@ocornut ocornut released this Jan 21, 2021 · 130 commits to master since this release

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

Did you know? We have a Wiki! It is a bit clunky but has sections such as this Useful Widgets gallery!


Thank you!

Ongoing work on Dear ImGui is currently financially supported by:

Huge thank you to all past and present supporters! Tables have been a LONG time in the making (since early 2019).

Dear ImGui is funded by your contributions and really needs them right now.
If your company uses Dear ImGui, consider reaching out. See Sponsors page for details.

TABLES

Finally Tables are merged in master!

Please note the Tables API is still in Beta. What it means is we are sliiiightly more likely than usual to make small changes to the API. If we do they'll be cautious, documented, with redirecting helpers, as usual. If you update to 1.80, consider updating (later) to 1.81 and 1.82 to make sure you catch up with those future changes sooner rather than later.
Important: If you used the Tables branch before 1.80, it is strongly suggested that you update today as we make several breaking changes to the API in the second half of 2020.

Absurdly tall screenshot:

capture_table_demo_0000_freetype

(using font: NotoSans-Regular.ttf at 16.0f size, rendered with imgui_freetype.

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.)

  • Added imgui_tables.cpp file! Manually constructed project files will need the new file added! (#3740)
  • Backends: moved all backends files (imgui_impl_XXXX.cpp, imgui_impl_XXXX.h) from examples/ to backends/. (#3513)
  • Renamed ImDrawList::AddBezierCurve() to ImDrawList::AddBezierCubic(). Kept inline redirection function (will obsolete).
  • Renamed ImDrawList::PathBezierCurveTo() to ImDrawList::PathBezierCubicCurveTo(). Kept inline redirection function (will obsolete).
  • Removed redirecting functions/enums names that were marked obsolete in 1.60 (April 2018):
    • io.RenderDrawListsFn pointer -> use ImGui::GetDrawData() value and call the render function of your backend
    • ImGui::IsAnyWindowFocused() -> use ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow)
    • ImGui::IsAnyWindowHovered() -> use ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow)
    • ImGuiStyleVar_Count_ -> use ImGuiStyleVar_COUNT
    • ImGuiMouseCursor_Count_ -> use ImGuiMouseCursor_COUNT
  • Removed redirecting functions/enums names that were marked obsolete in 1.61 (May 2018):
    • InputFloat (... int decimal_precision ...) -> use InputFloat(... const char* format ...) with format = "%.Xf" where X was value for decimal_precision.
    • same for InputFloat2()/InputFloat3()/InputFloat4() variants taking a int decimal_precision parameter.
  • Removed redirecting functions/enums names that were marked obsolete in 1.63 (August 2018):
    • ImGui::IsItemDeactivatedAfterChange() -> use ImGui::IsItemDeactivatedAfterEdit()
    • ImGuiCol_ModalWindowDarkening -> use ImGuiCol_ModalWindowDimBg
    • ImGuiInputTextCallback -> use ImGuiTextEditCallback
    • ImGuiInputTextCallbackData -> use ImGuiTextEditCallbackData
  • Internals: Columns: renamed undocumented/internals ImGuiColumnsFlags_* to ImGuiOldColumnFlags_* to reduce confusion with Tables API. Keep redirection enums (will obsolete). (#125, #513, #913, #1204, #1444, #2142, #2707)
  • Renamed io.ConfigWindowsMemoryCompactTimer to io.ConfigMemoryCompactTimer as the feature now applies to other data structures. (#2636)

All Changes

  • Tables: added new Tables Beta API as a replacement for old Columns. (#3740, #2957, #125)
    Check out `Demo->Tables for many demos.
    Read API comments in imgui.h for details. Read extra commentary in imgui_tables.cpp.
    • Added 16 functions:
      • BeginTable(), EndTable()
      • TableNextRow(), TableNextColumn(), TableSetColumnIndex()
      • TableSetupColumn(), TableSetupScrollFreeze()
      • TableHeadersRow(), TableHeader()
      • TableGetRowIndex(), TableGetColumnCount(), TableGetColumnIndex(), TableGetColumnName(), TableGetColumnFlags()
      • TableGetSortSpecs(), TableSetBgColor()
    • Added 3 flags sets:
      • ImGuiTableFlags (29 flags for: features, decorations, sizing policies, padding, clipping, scrolling, sorting etc.)
      • ImGuiTableColumnFlags (24 flags for: width policies, default settings, sorting options, indentation options etc.)
      • ImGuiTableRowFlags (1 flag for: header row)
    • Added 2 structures: ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs
    • Added 2 enums: ImGuiSortDirection, ImGuiTableBgTarget
    • Added 1 style variable: ImGuiStyleVar_CellPadding
    • Added 5 style colors: ImGuiCol_TableHeaderBg, ImGuiCol_TableBorderStrong, ImGuiCol_TableBorderLight, ImGuiCol_TableRowBg, ImGuiCol_TableRowBgAlt.
  • Tab Bar: Made it possible to append to an existing tab bar by calling BeginTabBar()/EndTabBar() again.
  • Tab Bar: Fixed using more than 128 tabs in a tab bar (scrolling policy recommended).
  • Tab Bar: Do not display a tooltip if the name already fits over a given tab. (#3521)
  • Tab Bar: Fixed minor/unlikely bug skipping over a button when scrolling left with arrows.
  • Tab Bar: Requested ideal content size (for auto-fit) doesn't affect horizontal scrolling. (#3414)
  • Drag and Drop: Fix losing drop source Active ID (and often source tooltip) when opening a TreeNode() or CollapsingHeader() while dragging. (#1738)
  • Drag and Drop: Fix drag and drop to tie same-size drop targets by chosen the later one. Fixes dragging
    into a full-window-sized dockspace inside a zero-padded window. (#3519, #2717) [@Black-Cat]
  • Checkbox: Added CheckboxFlags() helper with int* type (internals have a template version, not exposed).
  • Clipper: Fixed incorrect end-list positioning when using ImGuiListClipper with 1 item (bug in 1.79). (#3663) [@nyorain]
  • InputText: Fixed updating cursor/selection position when a callback altered the buffer in a way where the byte count is unchanged but the decoded character count changes. (#3587) [@gqw]
  • InputText: Fixed switching from single to multi-line while preserving same ID.
  • Combo: Fixed using IsItemEdited() after Combo() not matching the return value from Combo(). (#2034)
  • DragFloat, DragInt: very slightly increased mouse drag threshold + expressing it as a factor of default value.
  • DragFloat, DragInt: added experimental io.ConfigDragClickToInputText feature to enable turning DragXXX widgets into text input with a simple mouse click-release (without moving). (#3737)
  • Nav: Fixed IsItemFocused() from returning false when Nav highlight is hidden because mouse has moved. It's essentially been always the case but it doesn't make much sense. Instead we will aim at exposing feedback and control of keyboard/gamepad navigation highlight and mouse hover disable flag. (#787, #2048)
  • Metrics: Fixed mishandling of ImDrawCmd::VtxOffset in wireframe mesh renderer.
  • Metrics: Rebranded as "Dear ImGui Metrics/Debugger" to clarify its purpose.
  • ImDrawList: Added ImDrawList::AddQuadBezierCurve(), ImDrawList::PathQuadBezierCurveTo() quadratic bezier helpers. (#3127, #3664, #3665) [@aiekick]
  • Fonts: Updated GetGlyphRangesJapanese() to include a larger 2999 ideograms selection of Joyo/Jinmeiyo kanjis, from the previous 1946 ideograms selection. This will consume a some more memory but be generally much more fitting for Japanese display, until we switch to a more dynamic atlas. (#3627) [@vaiorabbit] <- Literally the best-ever pull-request created by mankind.
  • Log/Capture: fix capture to work on clipped child windows.
  • Misc: Made the ItemFlags stack shared, so effectively the ButtonRepeat/AllowKeyboardFocus states (and others exposed in internals such as PushItemFlag) are inherited by stacked Begin/End pairs, vs previously a non-child stacked Begin() would reset those flags back to zero for the stacked window.
  • Misc: Replaced UTF-8 decoder with one based on branchless one by Christopher Wellons. [@rokups] Super minor fix handling incomplete UTF-8 contents: if input does not contain enough bytes, decoder returns IM_UNICODE_CODEPOINT_INVALID and consume remaining bytes (vs old decoded consumed only 1 byte).
  • Misc: Fix format warnings when using gnu printf extensions in a setup that supports them (gcc/mingw). (#3592)
  • Misc: Made EndFrame() assertion for key modifiers being unchanged during the frame (added in 1.76) more lenient, allowing full mid-frame releases. This is to accommodate the use of mid-frame modal native windows calls, which leads backends such as GLFW to send key clearing events on focus loss. (#3575)
  • Style: Changed default style.WindowRounding value to 0.0f (matches default for multi-viewports).
  • Style: Reduced the size of the resizing grip, made alpha less prominent.
  • Style: Classic: Increase the default alpha value of WindowBg to be closer to other styles.
  • Demo: Clarify usage of right-aligned items in Demo>Layout>Widgets Width.
  • Backends: OpenGL3: Use glGetString(GL_VERSION) query instead of glGetIntegerv(GL_MAJOR_VERSION, ...) when the later returns zero (e.g. Desktop GL 2.x). (#3530) [@xndcn]
  • Backends: OpenGL2: Backup and restore GL_SHADE_MODEL and disable GL_NORMAL_ARRAY state to increase compatibility with legacy code. (#3671)
  • Backends: OpenGL3: Backup and restore GL_PRIMITIVE_RESTART state. (#3544) [@Xipiryon]
  • Backends: OpenGL2, OpenGL3: Backup and restore GL_STENCIL_TEST enable state. (#3668)
  • Backends: Vulkan: Added support for specifying which sub-pass to reference during VkPipeline creation. (@3579) [@bdero]
  • Backends: DX12: Improve Windows 7 compatibility (for D3D12On7) by loading d3d12.dll dynamically. (#3696) [@Mattiwatti]
  • Backends: Win32: Fix setting of io.DisplaySize to invalid/uninitialized data after hwnd has been closed.
  • Backends: OSX: Fix keypad-enter key not working on MacOS. (#3554) [@rokups, @lfnoise]
  • Examples: Apple+Metal: Consolidated/simplified to get closer to other examples. (#3543) [@warrenm]
  • Examples: Apple+Metal: Forward events down so OS key combination like Cmd+Q can work. (#3554) [@rokups]
  • Examples: Emscripten: Renamed example_emscripten/ to example_emscripten_opengl3/. (#3632)
  • Examples: Emscripten: Added 'make serve' helper to spawn a web-server on localhost. (#3705) [@Horki]
  • Examples: DirectX12: Move ImGui::Render() call above the first barrier to clarify its lack of effect on the graphics pipe.
  • CI: Fix testing for Windows DLL builds. (#3603, #3601) [@iboB]
  • Docs: Improved the wiki and added a Useful Widgets page. [@Xipiryon]
  • Docs: Split examples/README.txt into docs/BACKENDS.md and docs/EXAMPLES.md, and improved them.
  • Docs: Consistently renamed all occurrences of "binding" and "back-end" to "backend" in comments and docs.

Other branches & Beta features!

For users of the once-experimental tables branch before 1.80, some of the important changes since 1.78-era:

  • (Breaking) Renamed ImGuiTableFlags_SizingPolicyStretchX to ImGuiTableFlags_SizingStretchSame.
  • (Breaking) Renamed ImGuiTableFlags_SizingPolicyFixedX to ImGuiTableFlags_SizingFixedFit.
  • (Breaking) Renamed ImGuiTableSortSpecsColumn to ImGuiTableColumnSortSpecs.
  • (Breaking) Removed TableGetHoveredColumn() in favor of using TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered.
  • (Breaking) Renamed ImGuiTableFlags_MultiSortable to ImGuiTableFlags_SortMulti.
  • (Breaking) Removed ImGuiTableColumnFlags_WidthAuto which now can be expressed as _Fixed + _NoResize.
  • (Breaking) Renamed TableAutoHeaders() to TableHeadersRow().
  • (Breaking) Replaced ImGuiTableFlags_ScrollFreezeXXX flags with TableSetupScrollFreeze() api.
  • (Breaking) Renamed ImGuiTableFlags_NoClipX to ImGuiTableFlags_NoClip`.
  • (Breaking) Renamed bool SpecsChanged in ImGuiTableSortSpecs to bool SpecsDirty and made it the user responsability to clear that flag after sorting (you must set it to false yourself).
  • Omitting many many other changes which should be non-breaking and improvements.

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.79 in 1.80 related to the docking branch (multi-viewport and docking features) include:

  • Docking: Docked windows honor change of tab and text colors. (#2771)
  • Docking: Support for appending into existing tab-bar made to work with Docking + internal helper DockNodeBeginAmendTabBar().
  • Docking: Added experimental TabItemFlagsOverrideSet to ImGuiWindowClass.
  • Viewports: Fixed incorrect whitening of popups above a modal if both use their own viewport.
  • Viewports: Backends: Vulkan: Fixed build, removed extraneous pipeline creation (770c995, e8447de, 6a0e85c) (#3459, #3579)

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.

Automation, testing framework, sandbox:
(currently in development, available to selected users)

  • Tests: Added many thousands lines worth of new regression tests. [@rokups, @Xipiryon, @ocornut]
  • TestEngine: Improved capture tools.
  • TestEngine: Better support for horizontal scrolling, tab bar, tables in automation. [@rokups, @Xipiryon, @ocornut]
  • TestEngine: Countless fixes, tweaks.
  • Sandbox: Integrated ImPlot.

ImDrawList Party! (November 2020)

THIS THREAD
#3606

Somehow, what started as
"It'd be fun to organize a contest for writing special effects using the ImDrawList api, with a constraint on source code size. May be fun to see what people can come up with using shape/vector-based api (quite different from a pixel-shading function). Would you participate?"

Led people to an escalating amount of surprise:

Find all sources and many many many more beautiful and crazy entries in #3606

Thank you ❤️ @kudaba ❤️ @Fuzznip ❤️ @Crowbarous ❤️ @ShironekoBen ❤️ @heretique ❤️ @42yeah ❤️ @r-lyeh ❤️ @scemino ❤️ @CedricGuillemet ❤️ @PossiblyAShrub ❤️ @Organic-Code ❤️ @pinam45 ❤️ @Fahien ❤️ @badlydrawnrod ❤️ @jv42 ❤️ @andrewwillmott ❤️ @TonyAlbrecht ❤️ @0x1100 ❤️ @ice1000 ❤️ @pmalin ❤️ @BrunoLevy ❤️ @speedoog ❤️ @floooh ❤️ @StephaneMenardais ❤️ @bdero ❤️ @vzaramel ❤️ @Horrowind ❤️ @Seyedof ❤️ @tcantenot ❤️ @Daandelange ❤️ @redream ❤️ @septag ❤️

Gallery

See Gallery threads for more pictures and to post yours!

@Nicify: "nvtool: A ffmpeg-based video encoding tool built with imgui."
nvtool

@gboisse: "Visual node graph + creative coding with ImGui :)"

@FredrikAleksander: "A fully functional Terminal Emulator widget for ImGui"

@igrekus: "A GUI control tool for a lab RF device QA rig:"
Plots are rendered on a Matplotlib surface with ImGUI datascience.

@cmaughan: "A simple profiler. A poor-man's Tracy. I found having it built in and always available makes it into a really useful debug tool."
details and code

@mgerhardy: "Remote Behaviour Tree Debugging"

@WerWolv: "A Hex Editor for Reverse Engineers, Programmers and people that value their eye sight when working at 3 AM."
https://github.com/WerWolv/ImHex

BeamNG.drive uses imgui for there map editor:

NVIDIA Omniverse got into open-beta. The Omnivers Kit client is written as a layer over Dear ImGui:
https://blogs.nvidia.com/blog/2020/12/15/omniverse-open-beta-available/
https://www.nvidia.com/en-us/design-visualization/omniverse/
https://developer.nvidia.com/nvidia-omniverse-platform

@aiekick: ImGuiFontStudio

@AdamENESS: "During the lockdown we had for months in Melbourne, I started to rewrite the entire GUI portion of the custom software we use to Create Interactive Installations. Not a small task, but it brings a breath of fresh air to our software, and moves the software to have a multi-platform Editor Environment, instead of being stuck to windows."

@epezent: "A quick little toy I put together while working on some DSP algorithms. Using ImGui and ImPlot."
filter_toy

Assets 2