Repository navigation
Suggesting software to add to bindings/backend pages + musing on ABI compatibility #9286
Description
Activity
Below is a draft of a blurb you could use. It is probably too long so feel free to make or request any changes you feel are necessary. I am happy to provide snippets or links to relevant code sections. The key points to highlight are the custom driver agnostic renderer and header-only, deprecation-proof build support for add-ons
[....] supports creating and loading dll add-ons that can utilize ImGui by linking against imgui.h and ReShade's own API headers. While ReShade itself stays up to date with ImGui releases on the docking branch, the add-on API has been designed to handle version changes without recompilation providing indefinite support for older add-ons (link to imgui function tables).I just peeked at the code and indeed it is quite impressive the work that they put at it. Supposedly all the imgui function table stuff are for ABI compatibility with old pre-compiled add-ons working on newer version of ReShade using newer version of Dear ImGui?
But I can't seem to understand how ABI back/forward compatibility would work with the occasionally changing enum/flags values?The point for me to not be guaranteeing long-term ABI compatibility is to give me leeway to cleanup and improve things with minimum constraints, to facilitate moving forward in an already very-constrained ecosystem. This include me occasionally shuffling/reordering enum/flags values. While it doesn't happen too often, presumably that would break the support provided by ReShade?
Reshade is listed as a software using imgui but it should also be added to the Bindings page as an example of a custom backend implementation.
On the topic adding ReShare/reframework/UEVR on backends/binding page: I am not the slightest denying that they contains lots of clever and quality engineering and they are great projects, but AFAIK the infrastructure developed for ReShade is available for ReShade mods writers/users and doesn't really constitute a backend/binding that may be reused elsewhere.
If you consider this statement:
ReShade passes imgui data into its own API that supports almost every available graphics API and [...] other backend data like input are handled by reshade
This is essentially what any custom cross-platform engine would do, except probably ReShade supports a larger and more esoteric palette of graphics API.
TL;DR; correct me if I am wrong, but from the point of view of a non-ReShade user the backend is not reusable for other projects?
I have added a blurb under Miscellaneous -> API Wrapping
https://github.com/ocornut/imgui/wiki/Bindings#api-wrappingI have intentionally simplified part of your blurb because my technical understanding is that "providing indefinite support for older add-ons" is not possible under all enums/flags and possibly changed public strict are converted using trampoline functions and extra logic/data. But I must state that this only apply for a few things.
As an exercise I have compared imgui.h between 1.86 and current (1.92.7 WIP) and listing header contents that would be affected by ABI changes:
1.86
ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows.
1.92.7 WIP
ImGuiWindowFlags_NoNavInputs = 1 << 16, // No keyboard/gamepad navigation within the window ImGuiWindowFlags_NoNavFocus = 1 << 17, // No focusing toward this window with keyboard/gamepad navigation (e.g. skipped by Ctrl+Tab) ImGuiWindowFlags_UnsavedDocument = 1 << 18, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. //ImGuiWindowFlags_NavFlattened = 1 << 29, // Obsoleted in 1.90.9: moved to ImGuiChildFlags. BeginChild(name, size, 0, ImGuiWindowFlags_NavFlattened) --> BeginChild(name, size, ImGuiChildFlags_NavFlattened, 0)
1.86
ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function. ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Callback on pressing TAB (for completion handling) ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Callback on pressing Up/Down arrows (for history handling) ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Callback on each iteration. User code may query cursor position, modify text buffer. ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter). ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally ImGuiInputTextFlags_AlwaysOverwrite = 1 << 13, // Overwrite mode ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*' ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input) ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) ImGuiInputTextFlags_CallbackEdit = 1 << 19 // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)
1.92.7 WIP
ImGuiInputTextFlags_CharsScientific = 1 << 2, // Allow 0123456789.+-*/eE (Scientific notation input) ImGuiInputTextFlags_CharsUppercase = 1 << 3, // Turn a..z into A..Z ImGuiInputTextFlags_CharsNoBlank = 1 << 4, // Filter out spaces, tabs // Inputs ImGuiInputTextFlags_AllowTabInput = 1 << 5, // Pressing TAB input a '\t' character into the text field ImGuiInputTextFlags_EnterReturnsTrue = 1 << 6, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider using IsItemDeactivatedAfterEdit() instead! ImGuiInputTextFlags_EscapeClearsAll = 1 << 7, // Escape key clears content if not empty, and deactivate otherwise (contrast to default behavior of Escape to revert) ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 8, // In multi-line mode: validate with Enter, add new line with Ctrl+Enter (default is opposite: validate with Ctrl+Enter, add line with Enter). Note that Shift+Enter always enter a new line either way. // Other options ImGuiInputTextFlags_ReadOnly = 1 << 9, // Read-only mode ImGuiInputTextFlags_Password = 1 << 10, // Password mode, display all characters as '*', disable copy ImGuiInputTextFlags_AlwaysOverwrite = 1 << 11, // Overwrite mode ImGuiInputTextFlags_AutoSelectAll = 1 << 12, // Select entire text when first taking mouse focus ImGuiInputTextFlags_ParseEmptyRefVal = 1 << 13, // InputFloat(), InputInt(), InputScalar() etc. only: parse empty string as zero value. ImGuiInputTextFlags_DisplayEmptyRefVal = 1 << 14, // InputFloat(), InputInt(), InputScalar() etc. only: when value is zero, do not display it. Generally used with ImGuiInputTextFlags_ParseEmptyRefVal. ImGuiInputTextFlags_NoHorizontalScroll = 1 << 15, // Disable following the cursor horizontally ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). // Elide display / Alignment ImGuiInputTextFlags_ElideLeft = 1 << 17, // When text doesn't fit, elide left side to ensure right side stays visible. Useful for path/filenames. Single-line only! // Callback features ImGuiInputTextFlags_CallbackCompletion = 1 << 18, // Callback on pressing TAB (for completion handling) ImGuiInputTextFlags_CallbackHistory = 1 << 19, // Callback on pressing Up/Down arrows (for history handling) ImGuiInputTextFlags_CallbackAlways = 1 << 20, // Callback on each iteration. User code may query cursor position, modify text buffer. ImGuiInputTextFlags_CallbackCharFilter = 1 << 21, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. ImGuiInputTextFlags_CallbackResize = 1 << 22, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) ImGuiInputTextFlags_CallbackEdit = 1 << 23, // Callback on any edit. Note that InputText() already returns true on edit + you can always use IsItemEdited(). The callback is useful to manipulate the underlying buffer while focus is active.
1.86
ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop)
1.92.7
ImGuiTreeNodeFlags_NavLeftJumpsToParent = 1 << 17, // Nav: left arrow moves back to parent. This is processed in TreePop() when there's an unfulfilled Left nav request remaining.
1.86
ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel
1.92.7
ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 7, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack ImGuiPopupFlags_NoOpenOverItems = 1 << 8, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space ImGuiPopupFlags_AnyPopupId = 1 << 10, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. ImGuiPopupFlags_AnyPopupLevel = 1 << 11, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel,
1.86
ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit ImGuiTabBarFlags_FittingPolicyScroll = 1 << 7, // Add scroll buttons when tabs don't fit
1.92.7
ImGuiTabBarFlags_FittingPolicyShrink = 1 << 8, // Shrink down tabs when they don't fit ImGuiTabBarFlags_FittingPolicyResizeDown = ImGuiTabBarFlags_FittingPolicyShrink, // Renamed in 1.92.2 ImGuiTabBarFlags_FittingPolicyScroll = 1 << 9, // Enable scrolling buttons when tabs don't fit
1.86
ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 8, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window ImGuiHoveredFlags_AllowWhenDisabled = 1 << 9, // IsItemHovered() only: Return true even if the item is disabled
1.92.7
ImGuiHoveredFlags_AllowWhenOverlappedByItem = 1 << 8, // IsItemHovered() only: Return true even if the item uses AllowOverlap mode and is overlapped by another hoverable item. ImGuiHoveredFlags_AllowWhenOverlappedByWindow = 1 << 9, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window. ImGuiHoveredFlags_AllowWhenDisabled = 1 << 10, // IsItemHovered() only: Return true even if the item is disabled ImGuiHoveredFlags_AllowWhenOverlapped = ImGuiHoveredFlags_AllowWhenOverlappedByItem | ImGuiHoveredFlags_AllowWhenOverlappedByWindow,
1.86
ImGuiKey_Tab, ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow, ImGuiKey_PageUp, ImGuiKey_PageDown, ImGuiKey_Home, ImGuiKey_End, ImGuiKey_Insert, ImGuiKey_Delete, ImGuiKey_Backspace, ImGuiKey_Space, ImGuiKey_Enter, ImGuiKey_Escape, ImGuiKey_KeyPadEnter, ImGuiKey_A, // for text edit CTRL+A: select all ImGuiKey_C, // for text edit CTRL+C: copy ImGuiKey_V, // for text edit CTRL+V: paste ImGuiKey_X, // for text edit CTRL+X: cut ImGuiKey_Y, // for text edit CTRL+Y: redo ImGuiKey_Z, // for text edit CTRL+Z: undo1.92.7
Value have changed in 1.87.1.86
ImGuiCol_Tab, ImGuiCol_TabHovered, ImGuiCol_TabActive, ImGuiCol_TabUnfocused, ImGuiCol_TabUnfocusedActive, ImGuiCol_PlotLines, ImGuiCol_PlotLinesHovered, ImGuiCol_PlotHistogram, ImGuiCol_PlotHistogramHovered, ImGuiCol_TableHeaderBg, // Table header background ImGuiCol_TableBorderStrong, // Table outer and header borders (prefer using Alpha=1.0 here) ImGuiCol_TableBorderLight, // Table inner borders (prefer using Alpha=1.0 here) ImGuiCol_TableRowBg, // Table row background (even rows) ImGuiCol_TableRowBgAlt, // Table row background (odd rows) ImGuiCol_TextSelectedBg, ImGuiCol_DragDropTarget, ImGuiCol_NavHighlight, // Gamepad/keyboard: current highlighted item ImGuiCol_NavWindowingHighlight, // Highlight window when using CTRL+TAB ImGuiCol_NavWindowingDimBg, // Darken/colorize entire screen behind the CTRL+TAB window list, when active ImGuiCol_ModalWindowDimBg, // Darken/colorize entire screen behind a modal window, when one is active1.92.7
Values have changed since.
1.86
ImGuiStyleVar_GrabMinSize, // float GrabMinSize ImGuiStyleVar_GrabRounding, // float GrabRounding ImGuiStyleVar_TabRounding, // float TabRounding ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign
1.92.7
Values have changed since.
1.86
ImGuiColorEditFlags_AlphaBar = 1 << 16, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker. ImGuiColorEditFlags_AlphaPreview = 1 << 17, // // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque. ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 18, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque.
1.92.7
ImGuiColorEditFlags_AlphaBar = 1 << 18, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker. ImGuiColorEditFlags_AlphaPreview = 0, // Removed in 1.91.8. This is the default now. Will display a checkerboard unless ImGuiColorEditFlags_AlphaNoBg is set.
1.86
ImGuiSliderFlags_AlwaysClamp = 1 << 4, // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds.
1.92.7
ImGuiSliderFlags_ClampOnInput = 1 << 9, // Clamp value to min/max bounds when input manually with Ctrl+Click. By default Ctrl+Click allows going out of bounds. ImGuiSliderFlags_ClampZeroRange = 1 << 10, // Clamp even if min==max==0.0f. Otherwise due to legacy reason DragXXX functions don't clamp with those values. When your clamping limits are dynamic you almost always want to use it. ImGuiSliderFlags_AlwaysClamp = ImGuiSliderFlags_ClampOnInput | ImGuiSliderFlags_ClampZeroRange,
1.86
ImGuiMouseCursor_NotAllowed, // When hovering something with disallowed interaction. Usually a crossed circle.1.92.7
Value has changed since.
-
ImGuiInputTextCallbackData,ImDrawCmd,ImFontGlyph, layouts have changed. -
ImGuiStyleandImGuiIOlayouts have changed but I think ReShade has code for that?
This is fairly exhaustive AFAIK. I would assume old addons support is never 100% anyhow but note that I reserve myself the right to do other changes.
-
- changed the title
[-]Suggesting software to add to bindings/backend pages[/-][+]Suggesting software to add to bindings/backend pages + musing on ABI compatibility[/+]on Mar 9, 2026 Hey, sorry I'm just getting to this. Those changes are totally fine! I'll address some of the points just to add a bit of clarity but I think what you added already is great so I'm not looking for any changes and you can feel free to close this.
On the topic adding ReShare/reframework/UEVR on backends/binding page: I am not the slightest denying that they contains lots of clever and quality engineering and they are great projects, but AFAIK the infrastructure developed for ReShade is available for ReShade mods writers/users and doesn't really constitute a backend/binding that may be reused elsewhere.
I think rather than immediately usable backends/bindings I saw these projects moreso as strong code examples someone doing similar work could reference or copy from. UEVR/Reframework's lua bindings could very easily be pulled into a standalone project with the only other requirements being sol2 and glm and imnodes/imguizmo for reframework and there are quite a few usage examples out in the wild. I think it would be nice to at least mention somewhere in the wiki that uevr/reframework use imgui with custom lua bindings and anyone interested can do their own investigation.
IRT the enum changes I actually just ran into that issue while I've been updating UEVR to use the latest imgui docking version. We have a few functions that simply take an integer for flags so I had a pure lua string-key lookup table for the old enums which did not go very well on the new version. I had a script to regenerate my mapping so I just have both versions available and check based on UEVR plugin version but I ended up having to change a lot of the usage as well. I think I'm fine with that for UEVR.
ReShade does not have that luxury due to the larger userbase and number of developers so crosire uses a combination of scripted and manual conversions to preserve functionality.
const imgui_function_table_18971 init_imgui_function_table_18971() { return { []() -> imgui_io_18971 & { static imgui_io_18971 io = {}; convert(g_imgui_function_table_19000.GetIO(), io); return io; }, []() -> imgui_style_18971 & { static imgui_style_18971 style = {}; convert(g_imgui_function_table_19000.GetStyle(), style); return style; }, g_imgui_function_table_19000.GetVersion, [](const char *name, bool *p_open, ImGuiWindowFlags flags) -> bool { return g_imgui_function_table_19000.Begin(name, p_open, convert_window_flags(flags)); }, g_imgui_function_table_19000.End, [](const char *str_id, const ImVec2 &size, bool border, ImGuiWindowFlags flags) -> bool { ImGuiChildFlags child_flags = 0; if (border) child_flags |= 1 << 0; // ImGuiChildFlags_Border if (flags & (1 << 16)) child_flags |= 1 << 1; // ImGuiChildFlags_AlwaysUseWindowPadding ImVec2 full_size = size; if (flags & (1 << 6)) // ImGuiWindowFlags_AlwaysAutoResize { flags ^= 1 << 6; child_flags |= (1 << 4) | (1 << 5) | (1 << 6); // ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize if (size.x == 0.0f) full_size.x = g_imgui_function_table_19000.GetContentRegionAvail().x; if (size.y == 0.0f) full_size.y = g_imgui_function_table_19000.GetContentRegionAvail().y; } return g_imgui_function_table_19000.BeginChild(str_id, full_size, child_flags, convert_window_flags(flags)); }, [](ImGuiID id, const ImVec2 &size, bool border, ImGuiWindowFlags flags) -> bool { ImGuiChildFlags child_flags = 0; if (border) child_flags |= 1 << 0; // ImGuiChildFlags_Border if (flags & (1 << 16)) child_flags |= 1 << 1; // ImGuiChildFlags_AlwaysUseWindowPadding ImVec2 full_size = size; if (flags & (1 << 6)) // ImGuiWindowFlags_AlwaysAutoResize { flags ^= 1 << 6; child_flags |= (1 << 4) | (1 << 5) | (1 << 6); // ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize if (size.x == 0.0f) full_size.x = g_imgui_function_table_19000.GetContentRegionAvail().x; if (size.y == 0.0f) full_size.y = g_imgui_function_table_19000.GetContentRegionAvail().y; } return g_imgui_function_table_19000.BeginChild2(id, full_size, child_flags, convert_window_flags(flags)); },
ReShade plugins are built with an associated API version which in turn has an associated ImGui function table mapping. It is entirely possible that some features might not work correctly in older addons but I can tell you for a fact that this addon which was built with an imgui 1.86 header still works exactly as expected with updated reshade/imgui. I know there's a lot of files to dig into so if you had any remaining questions about how that works I could send a message in the reshade discord and report back.
This is essentially what any custom cross-platform engine would do, except probably ReShade supports a larger and more esoteric palette of graphics API.
I think that aspect of it is mainly useful as a code example and it is comparable to some of the UE plugins out there that heavily use the RHI module which is essentially doing the same thing from a high-level view as reshade in providing an abstraction for multiple graphics APIs. But there's also the difference that Unreal is only made for independent software while reshade ships as a dll that can be renamed and used as a proxy loader for every graphics API it supports (except vulkan which it uses an API layer for) meaning that it can function as a backend or host for unofficial software extensions or universal tools, e.g. memory scanning tools can simply call GetCurrentProcess from a reshade addon and could then use your imgui memory editor with only minimal changes needed.
TL;DR; correct me if I am wrong, but from the point of view of a non-ReShade user the backend is not reusable for other projects?
In practice yes in that no one is using reshade as an independent platform, although it is mostly capable of doing that. But the addon API does get a lot of usage outside of "reshade users" due to the fact the reshade dll will happily load into basically any windows application and provide an imgui overlay. That and the ability to make an imgui overlay without having to pick a standard backend, consider input routing, or manage multiple possible graphics APIs makes reshade API attractive to a large number of users. e.g. Unreal Engine 4 games often support D3D11 and D3D12 so for anyone who is not a professional programmer, the easiest way to get an imgui overlay that works for both into an existing game is to use reshade API. Of course I understand the potential for crossover with the cheat developers discouraged from making issues here so I don't think reshade API necessarily should be labeled as a proper backend. I think from an imgui perspective just acknowledging it is plenty, and anyone interested can always find this issue from a search to get a little bit more insight.
Version/Branch of Dear ImGui:
Version 1.XX, Branch: XXX (master/docking/etc.)
Back-ends:
imgui_impl_XXX.cpp + imgui_impl_XXX.cpp
Compiler, OS:
N/A
Full config/build information:
No response
Details:
Reshade is listed as a software using imgui but it should also be added to the Bindings page as an example of a custom backend implementation. Platform window data is irrelevant due to ReShade's main role as an injected dll that spawns overlays in existing games (though it can host a standalone app as well). All other backend data like input are handled by reshade. ReShade passes imgui data into its own API that supports almost every available graphics API and provides add-on developers a way to build imgui overlays with only imgui.h and the reshade headers included.
Below is a draft of a blurb you could use. It is probably too long so feel free to make or request any changes you feel are necessary. I am happy to provide snippets or links to relevant code sections. The key points to highlight are the custom driver agnostic renderer and header-only, deprecation-proof build support for add-ons. Note that I have not been asked to do this, I am simply an occasional contributor to ReShade who happens to be very familiar with the imgui component and add-on system. If you'd like a statement from the actual creator I can request that as well but I think this should be fine as is.
ReShade is a software designed to inject custom rendering capabilities into games and applications with a Dear ImGui powered overlay. ReShade uses a custom renderer backend implementation that passes all ImGui draw data into its own driver-agnostic API supporting D3D9-D3D12, OpenGL, and Vulkan. The platform backend is also implemented by ReShade with most major features aside from multiviewport supported.
A number of useful ImGui widgets are included such as a file browser, image viewers, and a text editor made for its own shader language. Shader developers can add customizable properties that are parsed by ReShade during shader compilation to automatically generate ImGui widgets and documentation for users.
Furthermore ReShade optionally supports creating and loading dll add-ons that can utilize ImGui by linking against imgui.h and ReShade's own API headers. While ReShade itself stays up to date with ImGui releases on the docking branch, the add-on API has been designed to handle version changes without recompilation providing indefinite support for older add-ons (link to imgui function tables).
In addition to ReShade I wanted to mention reframework and UEVR both by praydog as they both have custom lua bindings for ImGui with a large but not complete subset of functions implemented. I have personally been working on updating uevr from a 2021 imgui version to the latest and have written a lot of code expanding the bindings on both the c++ and lua side but I am not closely involved with the creator and am not requesting this on his behalf.
Reframework also includes cimgui and imgui.net support and has bindings for imguizmo and imnodes. Since these are game engine mods not game specific they have wide enough support an argument could be made for listing in the bindings section but otherwise I would at least like them added to the list of software using imgui if they're not already included. If you think it's worth including in the bindings section I can provide a blurb for that as well and these two can probably be combined.
Screenshots/Video:
No response
Minimal, Complete and Verifiable Example code: