Compare commits

..

4998 Commits

Author SHA1 Message Date
e3e1fbcf02 Backends: OpenGL3: OpenGL: Fixed ES 3.0 shader ("#version 300 es") to use normal precision floats. (#4463) 2021-08-23 15:03:27 +02:00
d79ca9b0b6 Fixed nested BeginDisabled()/EndDisabled() calls. (#211, #4452, #4453, #4462) [Legulysse] 2021-08-23 14:57:54 +02:00
e6ffc04291 Moved ImDrawIdx declaration higher up in imgui.h (to ease work for dear_bindings)
Shuffled low-level data types declarations and tweaked comments
2021-08-23 12:00:16 +02:00
32d4f6c5d9 Fix BeginDisabled(false), again, (#211, #4452, #4453) Version 1.84.1
(forced pushed since our earlier versioning didn't sort correctly in github web)
2021-08-20 23:59:46 +02:00
f969e68c10 Fix BeginDisabled(false), (#211, #4452) 2021-08-20 20:30:51 +02:00
d2ffbd9b86 Version 1.84
Fix PVS Studio false positive //-V1020
Fix missing #ifndef for IMGUI_IMPL_OPENGL_LOADER_CUSTOM path
2021-08-20 18:03:55 +02:00
fc062e6028 Backends: OpenGL3: Update loader to include APIs used by test framework. 2021-08-20 17:22:27 +02:00
df2319a854 Small optimizations to BeginDisabled() to allow frequent calls (#211)
Not intended for frequent calls but I suspect some people will do it either way...
Rough/indicative: measured 0.1 ms for 5000 calls in release, 0.5 ms in debug on my desktop windows.
2021-08-20 17:19:18 +02:00
c543d93af1 Expose BeginDisabled()/EndDisabled() in public API. Add to demo. (#211) 2021-08-20 16:34:43 +02:00
cb00972b87 ImDrawList: Fix AddCircle{Filled} with 12 segment case (#4419, #4421) 2021-08-19 17:06:40 +02:00
e3988a84db Backends: OpenGL3: Embed our own minimal GL loader (amends). (#4445) 2021-08-19 16:24:59 +02:00
459de65477 Backends: OpenGL3: Embed our own minimal GL loader based on gl3w and use it in SDL/GLFW examples. (#4445)
Loader repository at https://github.com/dearimgui/gl3w_stripped
Removed support for using custom loaders in examples/opengl3 backend
2021-08-19 16:24:58 +02:00
7bbf8f2ab0 Drag and Drop: fix using AcceptDragDropPayload() with ImGuiDragDropFlags_AcceptNoPreviewTooltip.
Window was not properly hidden in that case.
2021-08-18 15:40:22 +02:00
f24abbc47d Fix various warnings (#4442) 2021-08-18 12:38:24 +02:00
161b74e871 Fix tabbing in/out of an InputTextMultiline(), broken by 6b8a059. 2021-08-17 20:46:39 +02:00
cd39460925 IO: set io.KeyModsPrev in EndFrame() to tolerate backend writing to io.KeyMods without breaking. (#4439)
Amend ff428f1
2021-08-17 20:33:27 +02:00
2f40be638f IO, Backends: add io.AddFocusEvent(). Clear pressed keys after loosing input focus (#3532)
Amend/fix #2445, #2696, #3751, #4377
2021-08-17 20:10:45 +02:00
86afe966d3 Metrics: Fixed a crash when inspecting the individual draw command of a foreground drawlist. 2021-08-17 16:23:26 +02:00
7e9e1ff1c2 InputText: Fix named filtering flags disabling newline or tabs in multiline inputs (#4409, #4410) 2021-08-17 16:10:11 +02:00
b380d3abe3 Backends: OpenGL3: Clarify use of GL_POLYGON_MODE. 2021-08-17 15:16:29 +02:00
5f2df2d2cb Fixed grammar mistake in FAQ (#4431) 2021-08-17 13:47:17 +02:00
ff428f1d2f Nav: Fix not clearing NavWindowingToggleLayer properly (old code left it to true, relied on Alt release only). Removed unnecessary KeyMenu_ from NavInput. (#4439, #787) 2021-08-17 12:54:51 +02:00
8fa502ca42 Nav: Alt doesn't toggle menu layer if other modifiers are held. (#4439) 2021-08-17 12:23:54 +02:00
c7529c8ea8 Reword file list as *.cpp *.h (#4413) 2021-08-10 14:34:34 +02:00
f99fe72c42 Backends: Win32: Fixed keyboard modifiers being reported when host window doesn't have focus. (#2622) 2021-08-02 17:22:33 +02:00
2ad912bb85 Backends: Win32, SDL, GLFW: only honor io.WantSetMousePos when focused + fix GLFW uninstalling handler + tweaks to reduce branch drift with docking. (#787, #2445, #2696, #3751, #4377) 2021-08-02 16:19:50 +02:00
db686ad522 Backends: Win32: Mouse position is correctly reported when the host platform window is hovered but not focused. (#2445, #2696, #3751, #4377) 2021-07-29 19:38:33 +02:00
044fd0cd2d Backends: GLFW: Mouse position is correctly reported when the host platform window is hovered but not focused. (#3751, #4377, #2445) 2021-07-29 19:37:18 +02:00
1cdd110eb4 Backends: SDL2: Mouse position is correctly reported when the host platform window is hovered but not focused. (#2445, #3751, #4377)
(requires SDL 2.0.5 because SDL_GetMouseFocus() is only usable with SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH).
2021-07-29 18:47:43 +02:00
c720075c67 Update FAQ to clarify conflict with window (#4158, #4008, #2562) 2021-07-28 16:46:59 +02:00
3d4d1b8553 Allow imgui_internal.h to be included before imgui.h
(practically speaking it allows me to use StructLayout without hassle)
2021-07-26 21:01:32 +02:00
e362c5af48 Internals: ColorEdit: renamed some internal masks to match our common coding style.
ImGuiColorEditFlags__DisplayMask > ImGuiColorEditFlags_DisplayMask_, ImGuiColorEditFlags__OptionsDefault > ImGuiColorEditFlags_DefaultOptions_, ImGuiColorEditFlags__DataTypeMask > ImGuiColorEditFlags_DataTypeMask_  etc.
2021-07-26 20:44:59 +02:00
923bd2fd21 Examples: DirectX12: Fixed Alt+Enter fullscreen in DirectX12 example. (#4346, #4348)
This also removes unnecessary recreation of backend-owned device objects when the window is resized.
+ amend original PR with a g_pSwapChain->SetFullscreenState(false, NULL); call.
2021-07-26 16:39:09 +02:00
b846969fe1 Removed unnecessary line in Begin() + commented out redirecting functions/enums names that were marked obsolete in 1.67 and 1.69 + readded commented obsoleted function. 2021-07-26 12:22:48 +02:00
3e4c89051d Popups: Fix OpenPopup() being called after BeginPopup() resulting in a failure to open a popup when focus is NULL. (#4308)
Story of removed line begins in commit b80cf0a. It's purpose was to close popups when they lost focus.
Later on few other changes were introduced:
* bcc49ff - closing popups with RMB without changing window focus
* af679a1 - closing popups in FocusWindow()
These two changes covered all the cases of popup closing which made deleted line obsolete. Conveniently, now all popup closing is handled from within UpdateMouseMovingWindowEndFrame() either by calling FocusWindow() or ClosePopupsOverWindow().
2021-07-26 11:43:39 +02:00
9c77734447 Correct version 1.83 release date (#4355) 2021-07-24 02:07:11 +02:00
c881667c00 Fix - amend 1ad1530 (range-select branch need the NextItemData in NavProcessItem) 2021-07-19 21:45:44 +02:00
90bf996e1a Internals: widgets always read back from g.LastItemData.InFlags (so we can now modify per-item disable state more easily). (#211) 2021-07-19 21:26:34 +02:00
6b8a059fc9 Internals: moved LastItem data to a shared structure (instead of one per window)
(should be a no-op as we are restoring things in Begin/End. Toward faciliate backup/restore of LastItemData and favor pulling from here instead of CurrentItemFlags, toward #211)
2021-07-19 21:25:47 +02:00
1ad153056a Internals: ItemAdd: set LastItemXXX fields before navigation calls + comments about io.IniFilename (#4294) 2021-07-19 21:24:15 +02:00
17ec4f1f6f TestEngine, MenuItem: call IMGUI_TEST_ENGINE_ITEM_INFO() at the right stack level. (amend f8fae02) 2021-07-12 16:42:53 +02:00
fb4bbeb033 Disabled: fixed IsItemHovered() if popped disabled state after item, or when using Selectable_Disabled. (#211) 2021-07-12 15:43:17 +02:00
246ad6c03c Disabled: items more consistently release active id if the active item got disabled. (#211) (amend 2952525) 2021-07-12 15:39:47 +02:00
638e1a721b Disabled: fixed IsItemHovered() returning true on disabled item when navigated to. (#211) 2021-07-12 15:01:02 +02:00
5dd1e38b7a Disabled: disabled items set HoveredId, allowing e.g. HoveredIdTimer to function. (#211, #3419) + Menus: fix hovering a disabled menu or menu item not closing other menus.
Rework of https://github.com/rokups/imgui/commit/c24b470
Note that the declared intent of that commit "Prevents window from being dragged if mouse hovers a disabled item." was already fullfilled by a876ad87.
Changes in ButtonBehavior() not needed anymore since ImGuiButtonFlags_Disabled is gone
2021-07-09 19:54:46 +02:00
cac869b333 Disabled: don't prevent Selectable() from being selected. (#211) + BeginMenu()/MenuItemEx() uses PushDisabled() the standard way.
ImGuiSelectableFlags_Disabled is now unused by the library and might be marked obsolete later.
2021-07-09 19:54:43 +02:00
29525255f3 Disabled items more consistently release active id if the active item got disabled. (#211) 2021-07-09 19:54:41 +02:00
ba1c8464ef Internals: Removed ImGuiButtonFlags_Disabled (which had inconsistent behavior) in favor of ImGuiItemFlags_Disabled. Selectable()'s ImGuiSelectableFlags_Disabled now uses the later. (#211) 2021-07-09 19:54:37 +02:00
f6682404e1 InputInt/InputFloat: When used with Steps values and _ReadOnly flag, the step button look disabled. (#211) 2021-07-09 19:54:34 +02:00
97638bf977 BeginMenu: remove unnecessary call to ItemHoverable() which is already done by the Selectable() call.
Amend 88d7b3de
2021-07-09 18:57:28 +02:00
4a100f7f11 Nav: Disabled items are not candidate for default focus. (#211, #787) + simplify handling of ImGuiButtonFlags_PressedOnDragDropHold path. 2021-07-09 18:57:23 +02:00
cc40ae2101 PushDisabled(): added bool + clarify support for stacked disabled (#211) 2021-07-08 19:21:59 +02:00
03ca38eda1 Update FAQ 2021-07-08 16:10:30 +02:00
f8fae02270 Menus: rework to allow for an icon column (not yet exposed, but usable via internals) + fix menus being affected by style.SelectableTextAlign (#126) 2021-07-08 15:05:02 +02:00
30d164eb26 Backends: Win32: IME functions are disabled by default for non-Visual Studio compilers (MinGW etc.) (#2590, #738, #4185, #4301)
Enable with '#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS' for those compilers. Undo change from 1.82.
2021-07-08 14:23:31 +02:00
696d3e056e Internals: Menus: Naming offset field + fix spacing/offset computation to handle more offsets. 2021-07-07 20:47:37 +02:00
3512f2c2c2 Internals: Menus: minor tidying up + renaming in ImGuiMenuColumns + removing extraneous offset field which is always zero + using smaller types.
sizeof() 36 -> 20
2021-07-07 20:16:55 +02:00
baa4caf9e3 Backends: GLFW: Installing and exposed ImGui_ImplGlfw_MonitorCallback() for forward compatibility with docking branch.
+ Comments (#3934)
2021-07-07 14:12:48 +02:00
d9b606672a InputText: Fix handling of paste failure (buffer full) which in some cases could corrupt the undo stack. (#4038) 2021-07-05 17:52:44 +02:00
327a5d8253 Fix warning + apply trailing whitespaces in stb_ libs (as applied on nothings/stb on 2020/02/02, facilitating further diffs) 2021-07-05 17:52:44 +02:00
4ddb6b46c3 Drag and Drop: drop target highlight doesn't try to bypass host clipping rectangle. (#4281, #3272)
Revert 4b94738c
2021-06-30 16:12:52 +02:00
cf2daf353e Backends: Cleanup, removed unnecessary create/destroy wrappers. Fix allegro5 backend + use same code as other backend.
+ Update gallery links (#4280)
2021-06-30 15:50:15 +02:00
6792e1a3e0 Backends: SDL2: Remove unnecessary ImGui_ImplSDL2_NewFrame() parameter. (#3244) 2021-06-30 15:04:40 +02:00
23a15834fa Fonts: Fix calling ClearTexData() (clearing CPU side font data) triggering an assert in NewFrame(). (#3487) + Backends: added additional assert to facilitate detecting user understand they haven't initialized a backend. 2021-06-29 18:16:47 +02:00
4cec3a0467 Backends: support for multiple imgui context with little testing (#586, #1851, #2004, #3012, #3934, #4141)
I believe more renderer backends should work. GLFW/Win32/SDL/Vulkan probably have many issues.
2021-06-29 16:42:13 +02:00
b5a2bd1a5b Backends: amends to 1db1066 + merge minor bits from docking incl SetActiveIdUsingNavAndKeys().
No need to clear fields before deletion. DX12: renamed to match docking branch.
2021-06-29 15:25:19 +02:00
70c603854e Backends: moved global to a data structure to facilitate support for multi-contexts. (#586, #1851, #2004, #3012, #3934, #4141)
This is NOT enable multi-contexts for any backends
- in order to make this commit as harmless as possible, while containing all the cruft/renaming
-
2021-06-29 14:37:58 +02:00
88f4c1321a Examples: Bring code of example_apple_metal and example_apple_opengl2 closer to each other. (#1873, #3543) 2021-06-28 14:22:55 +02:00
0aeb978e61 Comments + adding spacing in headers because VS IDE parser display blocks so badly. Add helper in internal's ImGuiInputTextState. (#4275) 2021-06-28 11:58:37 +02:00
95db098477 ImFontAtlas: move implicit AddFontDefault call to Build() function + remove unnecessary asserts in backend. 2021-06-25 17:27:17 +02:00
2ab7f96f21 Backends: OpenGL3: Enable OES_vertex_array_object extension for emscripten/wasm build (#4266, #4267) 2021-06-25 16:19:55 +02:00
9440974f66 Fonts: Add U+FFFD ("replacement character") to default asian glyphs ranges. Remove SetFallbackChar() (amend 0ffd99d31). (#4269) 2021-06-25 15:47:42 +02:00
38165f420f Fonts: Prefer using U+FFFD character for fallback instead of '?'. Use U+FF0E dot character to construct an ellipsis if U+002E '.' is not available. (#4269) 2021-06-25 15:44:14 +02:00
8ced41570e Backends: DX9: explicitely disable texture state stages after >= 1. (#4268)
imgui only uses texture stage state for stage 0
But any state set in stages >= 1 will affect rendering
Set stage 1 COLOROP to DISABLED, to deactivate stages >= 1
2021-06-25 12:33:38 +02:00
30224fdde0 Examples: example_apple_opengl2: Fix keys remaining stuck in pressed state when using shortcuts with CMD. (#4253)
Fix follows event capture scheme of example_apple_metal, where this issue is not present.
2021-06-25 11:34:12 +02:00
e534c56485 Fonts: Functions with a 'float size_pixels' parameter can accept zero if it is set in ImFontSize::SizePixels. 2021-06-24 17:15:14 +02:00
20d415e939 FIx static analysers warnings and disable false positives. 2021-06-24 17:15:14 +02:00
1965f38e9e ImGuiWindowFlags_UnsavedDocument/ImGuiTabItmeFlags_UnsavedDocument display a dot instead of a '*'. 2021-06-24 14:30:32 +02:00
0b8a247074 Backends: OSX: Added a fix for shortcuts using CTRL key instead of CMD key. (#4253) 2021-06-23 15:25:10 +02:00
f0c4d609a6 Default window focus scope not 0. Added ImGuiSelectableFlags_SelectOnNav with comments and caveats. (#1861, #4242,)
Focus scope default value: amend 7ee623d9 a5041c88 2ebe08be
2021-06-21 17:47:45 +02:00
a15c42d5bd Nav: moved RenderNavHighlight() calls of TreeNode and Selectable out of if (hovered || selected) tests. Should make no difference as NavId currently returns hovered. (#1861, #4242) 2021-06-21 17:38:56 +02:00
98876b4dc2 Added IMGUI_DISABLE_SSE (#4250, #4091) 2021-06-21 14:52:01 +02:00
0905439c31 Backends: OpenGL3: Destroy shader objects right away (#4244)
In OpenGL, after a shader program has been linked, shader objects don't need to be kept neither attached to the program nor in existence
2021-06-21 11:51:51 +02:00
7c44d067e8 Tables: Fix invalid data in TableGetSortSpecs() when SpecsDirty flag is unset. (#4233)
Amend 4ce6bd8cf, but with usage of ImPool<> bug existed even before 4ce6bd8c. Would only materialize if user called (ableGetSortSpecs and used data without checking SpecsDirty.
2021-06-17 15:18:11 +02:00
d5828cd988 SplitterBehavior: fix using IsItemHovered() after SplitterBehavior() 2021-06-16 15:42:42 +02:00
dc676236f0 Minor optimization, removing do/while(0) patterns in some cases as they translate to runtime
(e.g. translate to xor + test + jne in VS x84, unnecessary)
2021-06-15 17:05:25 +02:00
0cca0d1617 Internals/experimental: BeginComboPreview(), EndComboPreview(). (#4168, #1658)
(amended)
2021-06-15 15:27:28 +02:00
98a6292165 Backends: DX12: Fix texture casting crash on 32-bit systems (introduced on 2021/05/19 and v1.83) + added comments about building on 32-bit systems. (#4225) 2021-06-14 17:43:42 +02:00
d0c6dd9baf ImVector: added clear_delete(), clear_destruct() helpers. 2021-06-09 16:57:47 +02:00
61f4aec868 Added PushDisabled(), PopDisabled() currently only exposed in imgui_internal.h (#211) 2021-06-09 15:28:59 +02:00
b66529fe3e Backends: Win32: Rework to handle certains Windows 8.1/10 features without a manifest. (#4200, #4191) 2021-06-08 18:38:20 +02:00
020d1ced1d Examples: SDL2: Accomodate for vcpkg install having headers in SDL2/SDL.h vs SDL.h + vcpkg related comments. 2021-06-08 17:10:24 +02:00
7fc144edde Examples: update all VS project files to VS2015. Update DX12 project Windows SDK to latest. 2021-06-08 17:08:49 +02:00
6ee398ac2b Tables: Added ImGuiTableColumnFlags_Disabled acting a master disable over (hidden from user/context menu). (#3935, #3740) 2021-06-07 15:18:20 +02:00
b918751ff4 Tables: Clarified that TableSetColumnEnabled() requires the table to use the ImGuiTableFlags_Hideable flag. (#3935) 2021-06-07 15:09:02 +02:00
689e387180 Tables: offset and shuffle flags (breaks ABI compatibility as often)
If you rely on ABI compatibility consider reworking how your backends are created, using cimgui metadata output. We will happily often break ABI compat.
2021-06-07 13:20:03 +02:00
642426c15b Tables: Fix columns order on TableSetupScrollFreeze() if previous data got frozen columns out of their section. 2021-06-07 11:23:43 +02:00
2887a6e07d Tables: made TableUpdateBorders() use IsVisibleX flag. comments. 2021-06-07 10:27:11 +02:00
1b4323a1b4 Tables: Added ImGuiTableColumnFlags_NoHeaderLabel to request TableHeadersRow() to not submit label for a column. (#4206) 2021-06-07 09:11:53 +02:00
fe24591411 Backends: OpenGL3: Fix access violation due to NULL from glGetStringi. (#4201) 2021-06-05 16:27:31 +02:00
94b680e830 Internals: fixed ImPool:: iteration, rename GetBufSize to GetMapSize. Amend c6c82b9f 2021-06-04 17:27:20 +02:00
c6c82b9f1d Internals: fixed iterating ImPool, fix after use of TableRemove() (was only used by TestEngine)
Merge metrics bits from 646c87359
2021-06-03 18:36:43 +02:00
a640d8a6d2 Fixed printf-style format checks on non-MinGW flavors. (#4183, #3592) 2021-05-31 13:03:50 +02:00
060b6ee7d1 Internals: Combo: Extracted into a BeginComboPopup() function. (#4168)
Renamed frame_bb > bb locally.
2021-05-28 17:45:07 +02:00
5b4bc985ad Nav, Combo: removed unnecessary window->LastNavIds[] assignment in combo code. + minor renaming. 2021-05-28 17:27:52 +02:00
838c16533d Backends: Comments. 2021-05-27 13:59:35 +02:00
79e18896fe TabBar: Fixed using more than 32 KB-worth of tab names. (#4176) 2021-05-27 12:01:00 +02:00
04fd5072fb Fix warnings with VS2019 in C++20 mode (#4173) 2021-05-25 18:43:52 +02:00
4c420f3cf9 CI: Add a build of imgui_impl_vulkan.cpp with IMGUI_IMPL_VULKAN_NO_PROTOTYPES defined. (#4151, #3759, #3227) 2021-05-25 16:01:25 +02:00
c2bf4abfa1 Internals: Added ImTextCharToUtf8() helper. Added "out_" markers in more UTF-8 functions. Metrics: Fonts: Fixed display of EllipsisChar by feeding proper utf-8. 2021-05-25 13:37:27 +02:00
3a941f95e9 Metrics, Demo: moved font details display to metrics code. (#4171) 2021-05-25 13:37:27 +02:00
e31d13fa76 Version 1.84 WIP 2021-05-25 13:36:53 +02:00
556689591c Backends: OpenGL3: Handle GL_CLIP_ORIGIN on <4.5 contexts if "GL_ARB_clip_control" extension is detected. (#4170, #3998)
Expecting this to somehow cause another issue but we will fix it when it comes.
2021-05-24 23:46:25 +02:00
ad5d1a8429 Version 1.83 2021-05-24 17:39:25 +02:00
142c866bd9 Backends: WebGPU: Support draw_data->FramebufferScale (#4163) 2021-05-24 17:12:23 +02:00
88a24fb896 Fix build with IMGUI_DISABLE_DEMO_WINDOWS 2021-05-24 15:42:26 +02:00
029c83c73e Combos: Changed the combo popup to use a different id to also using a context menu with the default item id. (#4167) 2021-05-24 15:09:39 +02:00
c708299ca9 Docs: Improvements to description of using colored glyphes/emojis. (#4169, #3369) + Add Fonts to Metrics. Removed IMGUI_HAS_TABLE markers. 2021-05-24 13:07:26 +02:00
8877eab393 Docs: Describe IMGUI_DISABLE_FILE_FUNCTIONS in imconfig (#3628, #2734) 2021-05-21 18:44:22 +02:00
b474bff6c6 Nav: Fixed single frame CTRL+Tab from properly enabling the menu layer of target window if it doesn't have other active layers. 2021-05-21 18:39:17 +02:00
5d77b6f274 Docs: update links, sponsors 2021-05-21 15:24:57 +02:00
45f5ed52c1 Menus: made MenuItem() in a menu bar reflect the 'selected' argument with a highlight. (#4128) 2021-05-20 15:00:36 +02:00
fd06dc511f Backends: GLFW: Adding bound check in KeyCallback because GLFW appears to send -1 on some setups. [#4124] 2021-05-19 19:03:15 +02:00
4181ccceea Backends: WebGPU: Fix build, amend 3c72e51. (#3761) 2021-05-19 18:50:31 +02:00
3c72e5142b Backends: Replace direct access to TextureId with GetTexID() call in ImDrawCmd. (#3761) 2021-05-19 18:39:18 +02:00
e7e170c534 InputText: Internal renaming to use our own types to clarify code a little bit. 2021-05-18 14:48:54 +02:00
26a1bbfe1e InputText: Fixed CTRL+Arrow or OSX double-click leaking the presence of spaces when ImGuiInputTextFlags_Password is used. (#4155, #4156) [@michael-swan] 2021-05-18 14:46:25 +02:00
41030cbfe2 Tweak computation of io.Framerate so it is less biased toward high-values in the first 120 frames. (#4138) 2021-05-16 20:37:38 +02:00
83bdfef8e0 Backends: WGPU: update to latest specs. (#4116, #3632)
Merged 13 commits.
2021-05-16 19:09:22 +02:00
4ce6bd8cff Tables: sharing splitter and sort buffers between tables, reducing memory footprints. (#3740)
+ GC pass on that data.
2021-05-07 20:49:52 +02:00
32c453ae53 Tables: sharing transient buffers between tables, reducing memory footprints. (#3740) 2021-05-07 20:49:52 +02:00
cbcd89152b Backends: Android: Tweaks. (#4034) 2021-05-07 17:43:42 +02:00
a8dcab8e2a Backends: DX9: Fix potential resource leak (#4093) 2021-05-07 15:17:24 +02:00
ea9122b0ac Examples: add backends include path in readmes. (#4106) 2021-05-07 15:12:09 +02:00
4c9f0cec27 Add and use SSE-enabled ImRsqrt() in place of 1.0f / ImSqrt(). (#4091)
Squashed 3 commits.
2021-05-06 17:27:19 +02:00
84545dbe6f Disabling some of MSVC most aggressive Debug runtime checks for some simple/low-level functions
(e.g. ImVec2, ImVector) leading to a 10-20% increase of performances with MSVC "default" Debug settings.
2021-05-06 13:04:35 +02:00
393941ceea Refactor focusable/tabbalbe item registration toward allowing to handle it prior to clipping (not yet the case) (#343, #4079)
Now performed in ItemAdd(). It can't be trivially moved above clipping effectively because it would require us to scroll to be useful, meaning we'd be better off locking the bounding box a frame earlier. Still wip.
As-is this commit has no value for end-user, but it's a reengineering that moves us closer to the solution. + Internals: moved internal flags.
2021-04-30 22:40:02 +02:00
2c3f25d2d9 Nav: Fixed Tabbing initial activation from skipping the first item if it is tabbable through. (#787) 2021-04-30 21:49:40 +02:00
9b90639577 Internals: ItemFlags is a shared resource as advertised. Fix Begin/PushItemFlags/End sequence (mostly for consistency) 2021-04-30 21:34:17 +02:00
10a1c5b021 TestEngine: fixed wrong flags passed to ItemInfo queries. Was luckily/misleadingly not causing issues as the test-engine flags we tested were upper bits not colliding with the other type.
Moved those flags higher as well. (unrelated to the fix itself)
2021-04-30 19:32:41 +02:00
788e91aece Fixes for MSVC static analyzers (wider range of versions). (#3938, #4073) + warning fix (#4089) + comments. 2021-04-30 18:21:07 +02:00
89162a04f4 Fixes for PVS Studio and MSVC static analyzers. Using a macro to suppress single-use MSVC false positives. (#3938, #4073) 2021-04-29 21:20:32 +02:00
d28535f351 Fixes for Visual Studio 2019 static analyzers. (#3938, #4073) + two minor edge case were invalid scalar input (e.g. a sign only) would return buffer as modified. 2021-04-29 17:10:27 +02:00
2dec7b3301 InputText: Align caret/cursor to pixel coordinates. (#4080) 2021-04-27 13:31:32 +02:00
7cdb3850e7 CI: test with ImTextureID as pointer to catch accidental reuse of const (#4060) 2021-04-26 10:18:28 +02:00
04e98fbe6b Remove const qualifier on ImTextureID local (#4060)
When defining ImTextureID to a type such as Texture*, the const-qualifier here stops us from using the texture ID. const Texture* is not valid to be pushed as a texture ID anymore.
2021-04-26 10:15:55 +02:00
7b8932554e Backends: Win32: Change the case of XInput.h include, so it cross-compile nicely on unices. (#4074) 2021-04-26 09:29:38 +02:00
b493cae8c9 Nav: Fixed pressing Escape to leave menu layer while in a popup or child window. (#787) 2021-04-23 19:17:20 +02:00
21428ad3f4 Nav, InputText: Fixed accidental menu toggling while typing non-ascii characters using AltGR. (#370) 2021-04-23 18:50:46 +02:00
4540177ce7 Nav: clear activeid on menu toggle (so pressing Alt leaving an InputText will steal ActiveID. Previously wouldn't not, but ButtonBehavior() hover logic would not show Menu layer item as hovered when ActiveId != 0). (#787)
(Adjacent to #370)
2021-04-23 18:50:46 +02:00
e61e8aea9c Nav: clear navid in NavInitWindow() when window is marked with ImGuiWindowFlags_NoNavInputs. (#787)
(no expected side-effects, maybe consistency, but those NavLastIds[] values would likely have been 0 already)
2021-04-23 18:50:46 +02:00
daf97832f1 Internals: Nav: renaming. 2021-04-23 18:39:08 +02:00
06545c4f2a Backends: DirectX9: explicitely setting up more graphics states to increase compatibility with unusual non-default states. (#4063)
Added D3DRS_FILLMODE, D3DRS_ZWRITEENABLE, D3DRS_RANGEFOGENABLE, D3DRS_SPECULARENABLE, D3DRS_STENCILENABLE, D3DRS_CLIPPING. Reordered some to match order in DX9 headers.
2021-04-23 18:39:07 +02:00
bfc4a3347a Nav: Fixed using SetItemDefaultFocus() on windows with _NavFlattened flag + tools in metrics. 2021-04-22 16:21:29 +02:00
6d53884487 Backends: OSX: Fix keys remaining stuck in pressed state when CMD-tabbing to a different application. (#3832) 2021-04-19 15:15:23 +02:00
25fbff2156 ImDrawList: Revert alteration of normal scaling threshold, for now prioritize preserving property of limiting extents. (#4053, #3366, #2964, #2868, #2518, #2183)
Amend fdda8b8
2021-04-19 14:58:54 +02:00
fdda8b8c12 ImDrawList: Fixed/improved thickness of thick strokes with sharp angles. (#4053, #3366, #2964, #2868, #2518, #2183) 2021-04-19 14:03:21 +02:00
936f53229d Internals: maintaining focus order inside windows + only storing root windows in WindowsFocusOrder[] array. (toward #2304) 2021-04-16 19:28:24 +02:00
770f9daab3 Tables: Better preserve column data (mainly widths) when columns count changes. (#4046) + .ini skips columns with no data. 2021-04-16 18:30:11 +02:00
690a90bd35 Make PathArcTo accept counter-clockwise angles (#4030, #3491) 2021-04-15 16:09:38 +02:00
5fed6bdc72 Demo: Improved popups demo and comments. 2021-04-15 15:58:12 +02:00
7c9c5dbe9a Internals: Added ImFloorSigned() + use our own ImFloorSigned() for stb_truetype, compared as matching output for variety of font data. (#2884) 2021-04-15 14:27:45 +02:00
858ea17eba Backends: DirectX10, DirectX11: fixed a crash when backing/restoring state if nothing is bound when entering the rendering function. (#4045) 2021-04-15 13:29:42 +02:00
05a20ca738 Examples: Android: Make Android build compatible with Gradle 7.0. (#3446) 2021-04-15 12:36:06 +02:00
b957300260 Documentation tweaks (#4042) 2021-04-14 15:46:55 +02:00
d6a5cc7934 Metrics: hotfix (fix 6ba13349 + f08566b4, #4005) 2021-04-07 17:57:14 +02:00
bcdc8bcc4b Examples: Vulkan: Update GPU selection to pick discrete GPU if available, or use first GPU otherwise. (#4012)
Fixes examples failing on optimus laptops with integrated graphics not supporting Vulkan.
2021-04-07 14:39:01 +02:00
c283a1da5b Fixed clipping of multi-line value text when label is single-line + Fixed vertical alignment of single-line value text when label is multi-line. (#4004) 2021-04-06 18:35:06 +02:00
92b7b1f72b Scrolling: Fix mouse wheel axis swap when using SHIFT on macOS (system already does it). (#4010) 2021-04-06 17:51:21 +02:00
5f45047fb6 Update example makefiles to check the new homebrew paths (#4003)
Homebrew on Apple Silicon (i.e. Macbook Air/Pro M1) use `/opt/homebrew` instead of /usr/local.
2021-04-06 12:46:09 +02:00
71dda216ef Backends: OpenGL3: Don't try to read GL_CLIP_ORIGIN unless we're OpenGL 4.5. (#3998, #2366, #2186) 2021-04-06 12:39:47 +02:00
f08566b4d7 InputText: Do not filter private unicode codepoints (e.g. icons) when pasted from clipboard. (#4005) 2021-04-06 12:00:52 +02:00
feb8b1e32d Update URLs to HTTPS (#4011) 2021-04-06 09:16:35 +02:00
00d570e280 Added OpenPopup() ImGuiID overload (#3993, #331) 2021-04-01 17:18:18 +02:00
f0fc822837 Fix popup positioning, broken by 84e6fe4. (#3991, #3982) 2021-03-31 19:09:08 +02:00
2403ed92a3 Added build/ to gitignore (#3027), Examples: SDL2: Link with shell32.lib required by SDL2main.lib since SDL 2.0.12. [#3988, #3884] + added batch file for SDL+Vulkan. 2021-03-31 16:19:44 +02:00
3c7177c6a7 Internals: storing WindowsHoverPadding in context for external access. + Docs update binaries 2021-03-31 16:06:36 +02:00
45c45d2506 Internals: shallow tidying up of the old resize border structure. Make them match the ImGuiDir order. Split GetWindowResizeID() into GetWindowResizeCornerID() and GetWindowResizeBorderID(). 2021-03-30 16:44:47 +02:00
84e6fe4fc7 Fix IsWindowAppearing() from returning true twice in most cases. (#3982, #1497, #1061) 2021-03-29 19:45:55 +02:00
951c84969b Popups: fix comment about OpenPopupOnItemClick(). (#3981) 2021-03-29 15:49:40 +02:00
eab3ae473c Fix warning message C4100 (#3974)
- warning C4100: 'fmt_out_size': unreferenced formal parameter
2021-03-27 17:11:57 +01:00
c6c15a44fa Examples: Add OpenGL ES 2.0 support to modern GL examples. (#2837, #3951) 2021-03-26 13:30:35 +01:00
1dcd3a45cc ColorEdit4: Alpha default to 255 (instead of 0) when omitted in hex input. (#3973)
Courtesy of @squadack
2021-03-26 11:34:07 +01:00
688e06490e TabBar: Amend previous commit. Fix tab reordering when tab bar has scrolling.
Some tidying up with helpers + honor 16-bit offsets as with other tab bar features (unlikely single reorder can reach that but consistent)
2021-03-25 19:16:24 +01:00
475c0fcc39 TabBar: Use mouse position instead of hardcoded +1/-1 offset when reordering tabs.
Fixes tab reordering in test engine when using fast mode.
2021-03-25 19:12:49 +01:00
a58271c079 Internals: extracted a more reusable BeginViewportSideBar() out of BeginMainMenuBar(). (#3966, #3518)
Complement ca34c81c in docking branch which removed assumption that we can't tell size ahead of Begin().
2021-03-25 16:20:42 +01:00
aa5431fde2 Tables: Expose TableSetColumnEnabled() in public api. (#3935) 2021-03-24 14:36:01 +01:00
6f360d6040 Examples: Win32: using a more explicit loop for PeekMessage polling to make the code easier to copy and paste and less error-prone. 2021-03-23 18:22:27 +01:00
1491d2c916 Backends: Win32: Clearing keyboard down array when losing focus (WM_KILLFOCUS). (#2062, #3532, #3961) 2021-03-23 16:48:10 +01:00
186b734db0 Backends: SDL2: Extend global mouse pos availability check (#3950) 2021-03-22 15:08:13 +01:00
6d3a980f38 Backends: Vulkan: Fix mapped memory validation error when buffer sizes are not multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize. (#3957)
If using Vulkan backend and either vertex_size or index_size is not aligned to VkPhysicalDeviceLimits::nonCoherentAtomSize, then the call to vkFlushMappedMemoryRanges in ImGui_ImplVulkan_RenderDrawData will result to validation error.
2021-03-22 12:41:45 +01:00
59da01901e Scrolling: Fix scroll tracking with e.g. SetScrollHereX/Y() when WindowPadding < ItemSpacing. Fix scroll snapping on edge of scroll region when both scrollbars are enabled.
CalcNextScrollFromScrollTargetAndClamp() fixed snapping edge calculation missing ScrollbarSizes.y
2021-03-19 16:58:23 +01:00
6e4770ea5c Examples: Vulkan: Rebuild swapchain on VK_SUBOPTIMAL_KHR. (#3881)
Ref https://vulkan-tutorial.com/Drawing_a_triangle/Swap_chain_recreation#page_Suboptimal-or-out-of-date-swap-chain
2021-03-18 18:12:52 +01:00
61a0908713 Tables comments + Backends: DirectX9: calling IDirect3DStateBlock9::Capture() after CreateStateBlock() which appears to workaround/fix state restoring issues. . (#3857) 2021-03-18 18:04:52 +01:00
412d6f7efe Fixes zealous MSVC static analyzers warnings (#3938)
Other unfixed as I'm not happy with caving to false positives of every analyzers.
2021-03-18 16:10:25 +01:00
0c5b0c8b97 Internals: Add a way to request window to not process any interactions for specified number of frames. 2021-03-18 14:19:23 +01:00
a1a39c632a Version 1.83 WIP 2021-03-16 14:45:30 +01:00
4bf646e4b0 Drags, Sliders, Inputs: Specifying a NULL format to Float functions default them to "%.3f" to be consistent with the compile-time default. (#3922) 2021-03-16 12:59:35 +01:00
64aab8480a DragScalar: Add default value for v_speed argument in DragScalar(), DragScalarN(). (#3922) 2021-03-16 12:54:49 +01:00
ebe6ac5fb5 Improvements to minor mistakes in documentation comments (#3923) 2021-03-16 12:44:16 +01:00
35b1148efb Version 1.82 2021-03-15 20:26:48 +01:00
352f64697c Internals: rename legagy tab focus fields to TabFocusXXXX for clarity + removed one unnecessary FocusWindow() call. 2021-03-15 20:10:08 +01:00
d94644261d Drags, Sliders: Support ImGuiSliderFlags_Logarithmic flag with integers. Because why not? (#3786)
Renamed is_decimal to is_floating_point.
2021-03-15 12:21:37 +01:00
287bd9b984 InputText: renamed ImGuiInputTextFlags_AlwaysInsertMode to ImGuiInputTextFlags_AlwaysOverwrite. (#2863) 2021-03-12 18:23:30 +01:00
1bc6f82091 Misc: added imgui.gdb and imgui.natstepfilter debugger helpers for gdb and msvc. 2021-03-12 17:03:16 +01:00
033dfd9d35 ImDrawFlags: rework/revert c2d6d26 + 39432bf in a way that is closer to old version and back to opt-in but with default 0 = all corners. 2021-03-12 16:31:46 +01:00
fdc2324d9a Moved 'misc/natvis/imgui.natvis' to 'misc/debuggers/imgui.natvis' 2021-03-11 16:21:46 +01:00
39432bfd9c Amend 0c93238a ImDrawList: upgraded AddRect(), AddRectFilled(), PathRect() to use general ImDrawFlags instead of ImDrawCornersFlags 2021-03-11 16:03:45 +01:00
c2d6d26139 ImDrawList: upgraded AddRect(), AddRectFilled(), PathRect() to use general ImDrawFlags instead of ImDrawCornersFlags 2021-03-11 16:03:32 +01:00
8b9fedba28 Moved Obsolete function block lower in the file + obsoleted old SetScrollHere (->SetScrollHereY) 2021-03-11 12:16:52 +01:00
e45847d99a Add version of PathArcTo() and PathArcToFast() with adaptive rendering quality. (#3491) 2021-03-11 11:23:55 +01:00
8ed34af6f8 ImDrawList: clarified that PathArcTo()/PathArcToFast() cannot take radius < 0.0f. (#3491) + changed poor-man ceiling in _CalcCircleAutoSegmentCount() to use 0.999999f to reduce gaps
Previously it sorts of accidentally worked but would lead to counter-clockwise paths which and have an effect on anti-aliasing.
2021-03-11 10:51:20 +01:00
a3ebd160cb Fix unused variable warning in ImGui::EndListBox() (#3897) 2021-03-11 10:04:50 +01:00
6ba1334903 Nav: internals: renaming ImGuiInputSource so it is not specific to nav. Comments. 2021-03-10 16:36:39 +01:00
01a2bac7d5 DrawList: Replace "bool close" in drawing functions with flags. 2021-03-10 12:57:01 +01:00
a64e0eb3a4 Nav: merged SetNavID() and SetNavIDWithRectRel() to improve sanity, moved flags overwrite off them. (#787) 2021-03-09 17:21:01 +01:00
1c9cc7c117 Nav: tweaks so docking can use same code. NavRestoreLayer restore nav id but Menu key typicallys clears it for menu layer (+ less relying on _ChildWindow flag). 2021-03-09 16:57:13 +01:00
4bb5a36f90 Nav: do not clear per-window NavId when window reappears. Process NavInit regardless of current highllight state. Consistently set g.NavLayer in SetNavID(). (#787) 2021-03-09 12:39:18 +01:00
954b06afe2 Drag and Drop: can use BeginDragDropSource() for other than the left mouse button (#1637, #3885)
As long as the item has an ID (for ID-less items will add new functionalities later.
Amend 2c3c5125
2021-03-08 15:50:53 +01:00
e842b196df Amend sanitization of format strings. Support ' without stb_printf. Simpler loops, will also be used for ImStrv branch. (8ee77f1) (#3604)
Widgets: Sliders: Fix a bug where numbers after format specifier (eg. %d123) would cause RoundScalarWithFormatT() return incorrect value.
2021-03-05 18:27:35 +01:00
8ee77f1b65 Widgets: Sliders: Skip custom stb_sprintf.h format flags (', #, _) in RoundScalarWithFormatT() as they break ImAtof()/ImAtoi() and cause Drag*()/Slider*() widgets display incorrect values. (#3604)
Widgets: Sliders: Fix a bug where numbers after format specifier (eg. %d123) would cause RoundScalarWithFormatT() return incorrect value.
2021-03-05 18:06:54 +01:00
fdebb2e093 Internals: removed HoveredRootWindow, tweak IsWindowHovered(). 2021-03-05 15:56:59 +01:00
f5bc5e8630 Freetype: Enable FreeType bitmap glyphs. (#3879) 2021-03-05 14:25:27 +01:00
ee643b2ad9 IsItemHovered(): fixed return value false positive when used after EndChild(), EndGroup() or widgets using either... (#3851, #1370)
...when the hovered location is located within a child window, e.g. InputTextMultiline().
This is intended to have no side effects, but brace yourself for the possible comeback..
This essentially makes IsItemHovered() not accept hover from child windows, but EndChild/EndGroup are forwarded.
More or less should fix/revert c76f014292 which was a revert of 344d48be3
2021-03-04 19:59:59 +01:00
b53b8f58df Demo: Use correct string formats on non-windows platforms.
(amended)
2021-03-04 18:40:46 +01:00
3e6dfd3c1a ImDrawList: AddImageRounded() compare texid from cmdheader as with other functions. + Made the ImGuiMemAllocFunc / ImGuiMemFreeFunc consistent with our other typedefs (#3836) 2021-03-04 14:29:01 +01:00
8dd692c29c Android: Amend backend and examples with minor consistency tweaks. (#3446) 2021-03-04 11:07:03 +01:00
fb85c0341b Add Android backend and example (#3446) 2021-03-04 10:35:44 +01:00
d8c88bd943 Tables: Fixed unaligned accesses when using TableSetBgColor(ImGuiTableBgTarget_CellBg). (#3872)
ImSpanAllocator: Support for alignment.
2021-03-04 09:52:03 +01:00
1ddaff83d8 Demo: Tweak inputs display. 2021-03-03 18:45:52 +01:00
662535f357 Backends: DX9: Fix handling of colored textures (#3844, #3868) 2021-03-03 18:34:07 +01:00
25679a411e Window, Nav: Fixed crash when calling SetWindowFocus(NULL) as the time a new window appears. (#3865) 2021-03-02 18:23:08 +01:00
4537d98d46 Backends: DX9: Fix to support colored glyphs, using newly introduced 'TexPixelsUseColors' info. (#3369, #3844) 2021-03-02 15:04:34 +01:00
eb57484935 Backends: DX9: add missing IMGUI_USE_BGRA_PACKED_COLOR support. Remove dinput.h headers. (#3844) 2021-03-02 15:04:34 +01:00
23ab4978e4 ImFontAtlas: Added 'bool TexPixelsUseColors' output to help backend decide of underlying texture format. (#3369, #3844) 2021-03-02 15:04:34 +01:00
cdf1926f21 Fix a typo in the demo text (#3840) 2021-02-25 13:33:47 +01:00
5aaab7424f Update FAQ.md 2021-02-25 13:10:02 +01:00
760c394707 Added links to Discussions. Closed Discord, yeah! (#2748) 2021-02-25 00:47:37 +01:00
3776ba565f Internals: TabBar: minor tweaks and renaming. 2021-02-24 19:40:15 +01:00
6f4b9c65ae Added commentary about DLL boundaries. Added GetAllocatorFunctions(). Tidying up. (#3836) 2021-02-24 19:38:39 +01:00
3f5bb5939a Examples: Fix MinGW detection in makefiles. Fix example_null build due to missing IME input libs. (#2590) 2021-02-24 17:18:53 +01:00
9b32f7bf2d Fix example_null Makefile for Mingw (#2590) 2021-02-22 14:44:06 +01:00
edf135c18d Win32+MinGW: Re-enabled IME functions by default even under MinGW. (#2590, #738) 2021-02-22 14:39:44 +01:00
ece854564a Log/Capture: Added LogTextV, a va_list variant of LogText. (#3828) 2021-02-22 11:58:51 +01:00
a8f76c23a4 Window: Shrink close button hit-testing region when it covers an abnormally high portion of the window visible area (e.g. when window is collapsed and moved in a corner)to facilitate moving the window away. (#3825) 2021-02-18 17:23:10 +01:00
0ecdf8167c DragScalar: Fixed crash when using DragScalar() directly with ImGuiSliderFlags_AlwaysClamp + only one of either p_min or p_max set. (#3824) [@harry75369] 2021-02-18 16:12:41 +01:00
c154629152 Backends: Win32: Added ImGui_ImplWin32_EnableAlphaCompositing() helper. (#2766, #3447)
Pragma linking with dwmapi.lib (Vista-era, ~9 kb). MinGW users will need to link with -ldwmapi.
2021-02-18 16:04:11 +01:00
6a161b8789 Examples: Reworked setup of clear color to be compatible with transparent values. (#2693, #2764, #2766, #2873, #3447, #3813, #3816) 2021-02-18 11:38:41 +01:00
bda12e5fdd Backends: Rework blending equation to preserve alpha in output buffer accross all backends. (#2693, #2764, #2766, #2873, #3447, #3813, #3816)
Some of the viewport ideas from #2766 are not in there yet (e.g. Vulkan: setting compositeAlpha based on cap.supportedCompositeAlpha)
2021-02-18 11:38:41 +01:00
27a5bdb916 Backends: Win32: Fixed ImGui_ImplWin32_EnableDpiAwareness() attempting to get SetProcessDpiAwareness from shcore.dll on Windows 8 whereas it is only supported on Windows 8.1.
+ Added other helpers for reference (unused currently, other features will want them)
2021-02-17 19:41:41 +01:00
fb15d8c858 Improve on automatic circle segment count calculation. (#3808) Amends 2021-02-17 14:22:31 +01:00
f107693d9b Improve on automatic circle segment count calculation. (#3808) 2021-02-17 12:55:39 +01:00
b47aa46d81 Tables: TableSetupColumn() user id uses ImGuiID as intended (typedef ImU32). internals: added GetCurrentTable(), LeftMostEnabledColumn. Demo/docs tweaks. 2021-02-17 12:18:22 +01:00
9576dfd5e7 CI: Use workflow_run to trigger scheduled builds and static analysis.
Scheduled builds now are triggered by a dummy "scheduled" workflow that is invoked by the timer. This gives forks an ability to disable scheduled builds while maintaining ability to perform CI builds in forked repository. Similarly static analysis is invoked on completion of "build" workflow, ensuring analysis is performed with every build. Also should build workflow triggers change, we do not need to replicate same changes in static analysis workflow file.
2021-02-16 14:39:16 +01:00
30b7545841 Version 1.82 WIP 2021-02-15 18:10:14 +01:00
61b19489f1 Made a change to CalcWindowSizeAfterConstraint() which MSVC optimizer seems to trip on. (read on)
We seldomly modify a local ImVec2 passed as parameter. This should be perfectly legal but libigl stumbled on a what may be a MSVC optimizer bug?
Only seven function in the codebase modify as 'ImVec2 parameter' but this is the only static one (and fairly small that is) which may tempt optimizer to perform optimizations over caller-callee boundaries?
While we can't explain it fully yet and I assume it may haunt us back someday. Might also be chain reaction from some unobvious UB but can't see it right now...
Link: https://github.com/libigl/libigl/issues/1669
2021-02-12 16:34:22 +01:00
4df57136e9 Version 1.81 2021-02-10 21:16:58 +01:00
647a308ad3 Backends: GLFW: Add ImGui_ImplGlfw_InitForOther() instead of ImGui_ImplGlfw_InitForWebGPU() so it can be used for e.g. DX11. (#3632)
Amend dff0044
2021-02-10 17:27:33 +01:00
f14042ca78 Viewports Added ImGui::GetMainViewport() as a way to get the bounds and work area of the host display. (#3789, #1542)
Viewports: Backport a few constructs from 'docking' branch.
Viewports: Added ImGuiViewportFlags_IsPlatformWindow, ImGuiViewportFlags_IsPlatformMonitor, ImGuiViewportFlags_OwnedByApp (none of them were in docking branch yet). ImGuiViewportFlags_IsPlatformMonitor is merely there to convey future intent, not yet used.
Reduce uses of io.DisplaySize.
MainMenuBar: Backport work area handling code from 'docking' branch.
Metrics: Backported "Viewports" debug visualizer from 'docking' branch.
Demo: Rework 'Examples->Fullscreen Window'.
Demo: 'Simple Overlay' demo now moves under main menu-bar (if any) using GetMainViewport()'s work area.
2021-02-10 16:09:53 +01:00
3b4d3a9b73 Simplify CI scripts (#3764)
* Deps paths through https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable
* Use heredocs for pasting source code
* Remove fetch-depth arg, it's the default
* Merge the `brew install`s, it's simpler and maybe even faster
2021-02-10 16:08:46 +01:00
56f7bdae99 ImDrawList: Clarified PathArcTo() need for a_min <= a_max with an assert. Fixed PathArcToFast() handling of a_min > a_max. 2021-02-08 16:37:51 +01:00
03038df1cc ImDrawList: fix divide by zero (for which result was unused but triggering on some archs/setup) added by f144c67676 (#3738) 2021-02-08 14:03:24 +01:00
b898281e3c Demo: Added 'Examples->Fullscreen Window' demo. (#3789) + repack and zero-clear ImDrawData. 2021-02-05 15:44:10 +01:00
58a0a7058c Backends: Using SetTexID() consistently instead of assigning to ->TexID. May make the later obsolete eventually. 2021-02-03 18:30:26 +01:00
82a9b599ab Backend: webgpu: Fixes blending issue on Chrome 90+ and makes backend forward compatible with Emscripten 2.0.14 (#3632, #3770) 2021-02-03 16:35:11 +01:00
03d74a293d ListBox: renamed ListBoxHeader>BeginListBox, ListBoxFooter>EndListBox. Added demo bits. 2021-02-03 16:33:22 +01:00
6f6d4e0b70 ListBoxHeader: In version taking height in number of items, made vertical padding consistent regardless of if (items_count <= height_in_items) or not.
Demo: Tweaks.
2021-02-03 15:07:14 +01:00
e5cbf60def ListBox: tweaked default height calculation. simplifying code internally (rework passing of full rect). Should have no visible side-effects + misc comments. 2021-02-03 14:54:56 +01:00
90a518c501 Fixed typos (#3782) 2021-02-03 12:37:32 +01:00
d1a9efdd8f InputText: Fixed slightly off ScrollX tracking, noticeable with large values of FramePadding.x. Multiline: Fixed padding/cliprect not matching single-line version. (#3781)
Fixed FramePadding.y worth of vertical offset when aiming with mouse.
2021-02-02 16:30:57 +01:00
a3f0393351 Menus: Fixed an issue with child-menu auto-sizing (issue introduced by 6af92b0) (#3779) 2021-02-02 13:06:51 +01:00
929563c3a7 Log/Capture: Fixes for handling \n in strings. Improve the look of various widgets. Added LogSetNextTextDecoration helper. Fixup/amend dbaf74d75.
For now removed LogRenderedTextNewLine() - it is eventually desirable but currently carries too much ambiguities, so reverted until we have a better system and test suite.
2021-02-02 12:29:58 +01:00
dbaf74d758 Log/Capture: Fix various new line/spacing issue by using same render text position when there are both RenderText and LogRenderedText call in widget code.
Also Buttons are now enclosed in bracket
2021-02-02 09:38:57 +01:00
9d576a96a5 Tables: added internal TableSetColumnEnabled() helper. Comments. 2021-02-02 09:23:40 +01:00
4dec436161 SliderInt: Fixed click/drag when v_min==v_max from setting the value to zero. (#3774) 2021-02-01 17:34:16 +01:00
24be26e00e imgui_freetype: Add support for colored glyphs. Font: add support for untinted glyphs (#3369)
Amend 9499afd with missing static inline.
2021-02-01 16:32:26 +01:00
24aa6654df imgui_freetype: add support for colored glyphs with ImGuiFreeTypeBuilderFlags_LoadColor (#3369)
(squashed 4 commits)
2021-02-01 16:32:23 +01:00
4622fa4b66 Fonts: Fixed CalcTextSize() width rounding so it behaves more like a ceil. (#3776)
his is in order for text wrapping to have enough space when provided width precisely calculated with CalcTextSize().x. Amend 7b0bf230.
Note that the rounding of either positions and widths are technically undesirable (e.g. #3437, #791) but variety of code is currently on it so we are first fixing current behavior before we'll eventually change it.
2021-02-01 12:49:18 +01:00
9499afdf5e imgui_freetype: clarify breaking changes, and add BuildFontAtlas() to be consistent with planned obsolescence. Rename mislabelled internal helper. Demo: clarify labels in nested table demo. (#3765) 2021-01-28 20:53:53 +01:00
dff0044d4e Backends, Examples: Added support for WebGPU and corresponding example. Amend 5853fbd (#3632) 2021-01-28 15:40:31 +01:00
5853fbd68b Backends, Examples: Added support for WebGPU and corresponding example (#3632)
(Squashed 11 commits)
2021-01-28 11:37:46 +01:00
6487860aae Backends: Vulkan: Rework support for custom function/symbol loader (#3759, #3227), add ImGui_ImplVulkan_LoadFunctions (amend 6001c54)
Making it a separate function allows to use/test this with our examples or any code using the VulkanH helper called before ImGui_ImplVulkan_Init()
2021-01-27 13:43:49 +01:00
6001c54598 Backends: Vulkan: Support for custom function/symbol loader (#3759, #3227)
- It adds an optional feature to support dynamic linkage of Vulkan instead of using default linkage.
 - It is now possible to have several potentially working implementation and whenever the Vulkan library was available it can work.
2021-01-27 12:54:51 +01:00
066406b9be Backends: OSX: Fix mouse position not being reported when mouse buttons other than left one are down. (#3762)
# Conflicts:
#	docs/CHANGELOG.txt
2021-01-27 12:44:42 +01:00
e28b51786e Tables: Fixed PopItemWidth() or multi-components items not restoring per-colum ItemWidth correctly. (#3760) rework local stacks to facilitate modifying current value without altering the stack.
May consider doing the same for ItemFlags and moving to g.ItemFlags...
2021-01-27 12:35:57 +01:00
3867c6c5f0 Fonts: (Breaking) Rename ImGuiFreeType:: flags to ImGuiFreeTypeBuilderFlags_XXX. Remove ImGuiFreeType::BuildFontAtlas() flags. Rename ImFontConfig::RasterizerFlags to FontBuilderFlags. Add ImFontBuilderIO (opaque). Amend 53d59f3 with a dozen of small fixes. 2021-01-26 17:25:09 +01:00
9417acc20f Fonts: if IMGUI_ENABLE_FREETYPE, use library by default for font rasterization
Also renamed IMGUI_DISABLE_STB_TRUETYPE to IMGUI_ENABLE_STB_TRUETYPE
2021-01-26 17:23:11 +01:00
6b32d0ebc7 Fixed minor title bar text clipping issue when FramePadding is small/zero and there are no close button in the window. (#3731) 2021-01-26 16:07:41 +01:00
a8d2d8ee97 Fixed uninitialized variable, amend f3f2578. (#3753) 2021-01-26 15:26:41 +01:00
f3f2578e8f Internals: Added context hook removal support (#3580, #3626, #3753) 2021-01-26 15:24:01 +01:00
f139846750 Backends: Win32: dynamically load XInput library (amends) (#3646, #3645, #3248, #2716) 2021-01-25 16:30:44 +01:00
633d1033af Backends: Win32: dynamically load XInput library (#3646, #3645, #3248, #2716) 2021-01-25 16:30:44 +01:00
2ed47e5822 Version 1.81 WIP 2021-01-25 16:30:44 +01:00
695a4bd1a9 Backends: Metal: Fixed texture storage mode when building on Mac Catalyst. (#3748) 2021-01-25 15:11:43 +01:00
f144c67676 ImDrawList: fixed AddCircle, AddCircleFilled buffer read overflow with (rad > 0.0f && rad < 1.0f && num_segments == 0). (#3738)
Amend 051ce076. Maximum cached count becomes 63 instead of 64.
2021-01-25 14:59:09 +01:00
58075c4414 Version 1.80 2021-01-21 20:36:18 +01:00
5178c3ce21 Tables: added ImGuiTableFlags_NoHostExtendX instead of using outer_size.x == 0.0f. Changed default outer_size to (0.0f, 0.0f). (#3605) 2021-01-21 16:20:31 +01:00
3b409d2b68 BeginChild: half-fixed child window name longer than 255 conflicting, merely raised the limit by using our shared large buffer. Comments. 2021-01-21 12:36:47 +01:00
6737037743 Tab Bar: fix 0ea4408 (#3414) 2021-01-20 19:35:10 +01:00
74b3b7cf58 Added experimental io.ConfigDragClickToInputText feature to enable turning DragXXX widgets into text input with a simple mouse click-release (without moving). (#3737)
+ Offset ImGuiTableColumnFlags values.
2021-01-20 19:18:03 +01:00
dc0f3d982c DragFloat, DragInt: very slightly increased mouse drag threshold + expressing it as a factor of default value + disabled experimental click-to-input on DragXXX functions. (#3737) 2021-01-20 18:36:21 +01:00
ae0d2dd614 Tables: rework submission of content size and ideal content size to outer window (now using IdealMaxPos introduced in 6af92b0).
See Tests suite "table_reported_size_outer".
2021-01-20 11:38:46 +01:00
f379dc28a3 ImBitArray: Rename ClearBits() to ClearAllBits() and add SetAllBits(). ImBitArraySetBitRange work on range [n..n2) instead of [n..n2] 2021-01-20 11:33:59 +01:00
3fef132f62 Tables: Clear scroll value when reactivating scroll. Assert when passing width/weight to TableSetupColumn() without an explicit sizing policy at either table or column label.
Clearing scroll was initially made desirable by tests exhibiting side effects but generally feels saner.
table->UserOuterSize is poorly used in this commit but will be by subsequent commits.
2021-01-19 21:55:28 +01:00
0ea4408fd4 Tab Bar: Requested ideal content size (for auto-fit) doesn't affect horizontal scrolling. Followup to afa01d8. (#3414)
+ minor Table rename
2021-01-15 22:52:47 +01:00
6af92b05bf Internals: Layout: maintain two content sizes, optionally writing to IdealMaxPos to distinguish used from ideal size, later is used for auto-fit. Unused in this commit, should be no-op. (#3414)
# Conflicts:
#	imgui.cpp
2021-01-15 22:52:42 +01:00
6470681d87 Use GitHub URL for Tracy Profiler. (#3721) 2021-01-15 22:39:27 +01:00
4d419d1211 Tables: fixed ColumnsAutoFitWidth for resizable fixed columns reporting ideal width. 2021-01-15 17:48:36 +01:00
3e712631da Tables: more moving of code in EndTable(), should have no side-effect. 2021-01-15 14:20:24 +01:00
626e3e2b3b Tables: fix reported inner-width for scrolling tables off by a small padding amount + moved code.
Makes not much difference for inner-scrolling but makes a difference when reported to outer-window.
2021-01-15 12:40:40 +01:00
3edfc042ff Tables: Internals: Renaming, tweaks preparing ahead for trickier changes (should be all no-op). 2021-01-15 11:11:16 +01:00
9e281c12a8 Tables: Fixed very small tables edge cases: inverted clip rect with freezing + scroll, missing borders. 2021-01-14 19:16:06 +01:00
b0db741770 Demo tweaks. Moved Tabs to Widgets section. Added to Tables demo. Increased version following 00b35c08. 2021-01-14 11:59:33 +01:00
00b35c081e Tables: (breaking) removed ImGuiTableColumnFlags_WidthAuto which now can be expressed as _Fixed + _NoResize. WidthRequest gets updated when RequestOutputMaskByIndex is set rather than Visible. 2021-01-13 18:42:02 +01:00
8cea3e3ed3 Tables: fixed border straying out of rect when using ImGuiTableFlags_NoBordersInBody with small height. 2021-01-13 12:24:55 +01:00
002ba1a69f Tables: comments, tweak. CollapsingHeader: comments. (#3715) 2021-01-13 10:07:59 +01:00
feaa7ea003 Examples: Emscripten: Amend ba636c5. (#3705) 2021-01-11 18:46:23 +01:00
0f14dd9781 Examples: Emscripten: Add 'make serve' helper, move output to web/ folder. (#3705) 2021-01-11 18:46:23 +01:00
31a2f0c164 Tables: fixed outer_width misreported to layout for use with SameLine when ScrollY is set but not ScrollX (#3704, #3414) 2021-01-11 11:31:50 +01:00
e485d451d1 Backends: DX12: improve Windows 7 compatibility (#3696)
- Attempt to load d3d12.dll from local D3D12On7 paths before falling back to System32
- Do not statically import D3D12SerializeRootSignature
2021-01-11 11:07:43 +01:00
36535514d5 Backends: DX12: Fix warning (#3706). Disable obsolete Tables enums, leave them commented out. Using _MSVC_LANG to enable offsetof() and static_assert() on VS2015.3+ 2021-01-11 10:54:52 +01:00
e18abe3619 Tables: (Breaking) Added ImGuiTableFlags_SizingFixedSame, ImGuiTableFlags_SizingStretchProp. Removed ImGuiTableFlags_SameWidths.
Simplified some code and clariffied that currently non-resizable = always revert to default (while waiting to untangle Fixed vs Auto and programmatic override not going through TableSetupColumn)
Whereas ImGuiTableFlags_SameWidths has some unusual handling of mixed Fixed/Stretch columns, we know treat them separately.
2021-01-08 18:40:52 +01:00
0e3ba37e6d Tables: Tidying up. Shuffle some columns fields to facilitate debugging + comments + demo tweaks + metrics highlight. 2021-01-08 18:32:18 +01:00
414f82254b Tables: (Breaking) rename ImGuiTableFlags_SizingPolicyFixed > ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingPolicyStretch > ImGuiTableFlags_SizingStretchSame in prevision for new policies. 2021-01-08 18:10:55 +01:00
8b5f3798e0 Tables: Moved demo chunks. Made right-most non-resizable same-width column hidden to alleviate the issue where they are off by 1 pixel. 2021-01-07 17:11:18 +01:00
94a432275b ImDrawList: Internals: Add ability to scale anti-alias fringe. This enable users to keep geometry sharp while scaling vertex buffer content. 2021-01-05 16:34:11 +01:00
9bcf77eb81 Fixed using IsItemEdited() after Combo() not matching the return value from Combo(). (#2034) + fix some PVS warnings, fix typo, blanks.
Amend e28b1078
2021-01-04 19:15:20 +01:00
7d5d5711c2 Backends: OpenGL2, OpenGL3: Backup and restore GL_SHADE_MODAL, GL_STENCIL_TEST, clear GL_NORMAL_ARRAY. Comments., (#3671, #3668) 2021-01-03 17:01:54 +01:00
0a5f399805 Tables: Fix hiding column right after the frozen line. Fix hovering/resising column delimiter scrolled under frozen columns. (#3678) 2021-01-03 15:45:56 +01:00
1c1d3b7ab5 Added 64-bit variants of CheckboxFlags() in imgui_internal.h. Improve assert on mismatched ListBoxFooter() call. Fix FAQ index. (#3687) 2021-01-03 15:45:56 +01:00
8ec5daf35d Happy new year! 2021-01-03 15:42:32 +01:00
fa963b9aaf Inputs: Internal: added SetItemUsingMouseWheel() and mechanism to request mouse wheel for both HoveredId and ActiveId. (#2891)
Based on @kudaba PR.
2020-12-25 18:22:34 +01:00
eb88fee052 Tables: internal tidying up, calculate WidthAuto in first loop of layout + TableSetupColumn() with unspecified stretch weight leaves it at -1.0f (unset) rather than overrding default. Amend 3b3503e.
Both changes are intended to have no side-effects. Committed separately from upcoming commit for easier future bissecting.
Small demo fix.
2020-12-25 16:30:44 +01:00
68faa16e1d Tables: report auto-fit width in EndTable(), extracted TableGetColumnWidthAuto(). fix minor flickering with IsPreserveWidthAuto (which is a debug feature still), moved some code. 2020-12-25 15:52:42 +01:00
3573195112 Tables: (breaking) rename ImGuiTableFlags_ColumnsWidthStretch > ImGuiTableFlags_SizingPolicyStretch, ImGuiTableFlags_ColumnsWidthFixed > ImGuiTableFlags_SizingPolicyFixed in prevision for other policies. 2020-12-24 18:32:27 +01:00
b015ea93fd Style tweaks, disabled default window rounding by default, reduced size of resize grip, made less prominent, increased WindowBg alpha in classic style.
TestEngine: Fixed Checkbox() not reporting its checkable state when clipped.
2020-12-24 18:31:51 +01:00
3fbb928c9f Tables: explicit/custom width in TableSetupColumn() is reapplied when table or column becomes not resizable. Comments. 2020-12-23 12:14:55 +01:00
956435768f Tables: (breaking) renamed ImGuiTableColumnFlags_WidthAutoResize to _WidthAuto., default to WidthFixed policy when host window has auto-resize.
Fix edge case with TableSetColumnWidth on small windows (amend 972ca816)
2020-12-23 11:39:15 +01:00
d497f112e7 Tables: simplified and tidying up TableSetColumnWidth(), fixes resizing a fixed column surrounded by stretch column (manually or via auto-fit menu). TableHeader() showing highlighted when held. 2020-12-22 17:13:11 +01:00
972ca8166f Tables: extracted code for TableGetMaxColumnWidth(), fixing "stuck" resize being lossy as it used an older calculation for it and didn't honor e.g. _NoKeepColumnsVisible 2020-12-22 16:40:52 +01:00
1aa59f90d0 Minor API comments and tweaks, standardize index used in imgui.h. Tables: tweaked TableSetupColumn() assert to use IM_ASSERT_USER_ERROR(). 2020-12-22 15:30:26 +01:00
2e48c2da81 Removed redirecting functions/enums names that were marked obsolete in 1.63 (August 2018) + tables tweaks. 2020-12-21 19:42:37 +01:00
4d8e839ddf Renamed ImDrawList::AddBezierCurve() to ImDrawList::AddBezierCubic(), ImDrawList::PathBezierCurveTo() to ImDrawList::PathBezierCubicCurveTo(). (#3127, #3664, #3665)
Renamed corresponding internal functions as well.
2020-12-21 17:13:36 +01:00
550bfcfc59 Amend defce31 Add ImDrawList::AddQuadBezierCurve(), ImDrawList::PathQuadBezierCurveTo() (#3127, #3664, #3665) 2020-12-21 16:30:10 +01:00
defce31c2e Add ImDrawList::AddQuadBezierCurve(), ImDrawList::PathQuadBezierCurveTo() (#3127, #3664, #3665) 2020-12-21 16:25:14 +01:00
a640698123 Clipper: Fixed incorrect end-list positioning when using ImGuiListClipper with 1 item (bug in 1.79). (#3663) 2020-12-21 15:53:42 +01:00
ae63d56426 Tables: remove ImGuiTableFlags_NoHeadersWidth since it is so rarely used and can be specified on a per-column basis. 2020-12-18 19:03:47 +01:00
532aa5a69b Tables: (breaking) change outer_size.x default value to -FLT_MIN, make outer_size.x == 0.0f act as ImGuiTableFlags_NoHostExtendX (#3605, ad83976b) when no scrolling and no stretch column. Which is more consistent.
Demo: moved "Compact table" to "Padding" section, makes more sense. Tweaked demo.
2020-12-18 17:51:50 +01:00
22ace4438c Tables: clarify assumption that rendering of bg/borders in bg0/bg1 are cpu-clipped allowing frozen/unfrozen to share drawcmd + remove offset on outer borders of scrolling tables. 2020-12-18 14:33:16 +01:00
30468829c2 Tables: Internal: Maintain InnerRect to further clarify some code. Renamed Bg1 fields to Bg2 (used by Selectable) as the other handles Bg0+Bg1. 2020-12-18 14:32:51 +01:00
ad83976b35 Tables: Added ImGuiTableFlags_NoHostExtendX (#3605) marked as WIP, will probably rename.
Moved some code from BeginTable() to TableUpdateLayout() to late latch some of the required data.
2020-12-18 14:32:51 +01:00
c4dbab8f5e Tables: reset all width apply to hidden stretch columns. Comments. 2020-12-16 17:12:21 +01:00
1fb26d18c4 Tables: fixed seemingly unnecessarily copy of ImGuiTableColumnFlags_NoDirectResize_ which broken resizing from W3| in a F1 W3 F2 setup. Header only allow overlap on hover, not when active (amend f2df804f)
Otherwise TableUpdateBorders() tends to override mouse cursor.
2020-12-16 15:43:51 +01:00
892b48e2d6 Tables: Lock contents width while resizing down an horizontal scrolling table. Headers declare ideal width regardless of clipping. Misc comments. 2020-12-16 13:04:49 +01:00
bd899efbd0 Tables: fixed "resize to default" of multiple stretch column (added 3b3503e, broken 7a61f340).
Fixed a warning.
Storing RightMostStretchedColumn column for resizing code.
Avoid clearing RightMostEnabledColumn in BeginTable() so resizing code can potentially use it.
(Added regression tests for resize all to default imgui_dev)
2020-12-14 15:49:20 +01:00
f2df804fcc Tables: four small fixes.
Fixed last item flags leaking to disabled column, affecting IsItemHovered(). (#3651).
Validate and fix invalid DisplayOrder data from ini file.
Allow TableHeaderRows() to function will missing TableSetupColumn() calls.
Made TableHeader() use AllowItemOverlap mode to allow submit subsequent item in same cell, since it covers the whole cell area.
2020-12-13 19:57:19 +01:00
738606a294 Tables: added ImGuiTableFlags_SortTristate. Renamed ImGuiTableFlags_MultiSortable to ImGuiTableFlags_SortMulti. Removed now unused FlagsIn storage. 2020-12-11 23:01:09 +01:00
cad8935bfd Tables: revert setting colum cliprect.max.x to WorkMax.x instead of Max.x at it complicates header code. Fix clipped sort arrow. (amend 17536f9a) 2020-12-11 21:31:55 +01:00
bff1836922 Internals: added facility to hide windows from render without interfering with the HiddenFramesCanSkipItems/HiddenFramesCannotSkipItems fields which have effects on layout. Compact some fields.
Ideally we'd have a simpler system but it's not easy to make the capture system change to hook at the right spot. Will rework.
2020-12-11 14:37:58 +01:00
1ad5502f18 Tables: Closer to zero-clear constructor. Lazily clearing name offsets to avoid an iteration in BeginTable(). Removed unused TableSetColumnIsEnabled(), signature went faulty anyway. 2020-12-10 19:45:20 +01:00
76964a27ce Tables: moved TableNextRow(), TableBeginRow(), TableEndRow(), TableNextColumn(), TableBeginCell(), TableEndCell() to their own section. 2020-12-10 18:39:37 +01:00
e6b875c09b Tables: Ditch old columns flags/setting if not called again. Displaying right-most border when using _SameWidths. Moving Width-related functions to their own section.
Effectively removed the TableFixColumnFlags() in first loop of TableUpdateLayout() to replace it with similar one but only when column not declared. I think this should be the right thing.
2020-12-10 18:33:33 +01:00
3346544cf5 Examples: Fix batch files (amend b1a18d82, #3513), standardize them + DirectX12: Move ImGui::Render() call above the first barrier to clarify its lack of effect on the graphics pipe. 2020-12-09 18:28:02 +01:00
17536f9add Tables: more consistent use of CellPadding.x*2 and clip-rect on right-most side of non-bordered column + fix cellbg for standalone TableHeader call.
Using CellPadding.x on both sides when BorderV is off, generally most consistent and with default value (4,2) promotes at-glance visible spacing between non-bordered columns. Effectively double horizontal padding on non-bordered columns.
Made ClipRect.Max.x matches WorkMaxX which is where we'd like to go for windows themselves.
TableHeader() submit single cell bg color if not already submitted as a full header row.
Misc comments/docs updates.
2020-12-09 15:13:09 +01:00
9874077fc0 Merge branch 'tables' 2020-12-04 19:17:13 +01:00
0b14dd9e55 Tables: fixed propagation of line height from outside the table. Added outer-width demo. 2020-12-04 19:15:27 +01:00
6e38026627 Tables: changelog. removed TableGetHoveredColumn() from public API in favor of using TableGetColumnFlags(). renamed ImGuiTableSortSpecsColumn to ImGuiTableColumnSortSpecs. 2020-12-04 19:15:27 +01:00
7a61f3407b Tables: support internal TableResetSettings(), clarify lifetime, fixed missing auto-fit on column unhidden after first run, fixed resize assert when changing column sizing policy to stretch mid-frame (before of -1.0f weight) 2020-12-04 19:15:27 +01:00
b194df413c Tables: exposed status flags via TableGetColumnFlags(), removed TableGetColumnIsSorted()
Scoped width auto calc.
2020-12-04 19:15:27 +01:00
984c4cb5f8 Tables: distinguishing per-column IsVisible from IsRequestOutput which is returned to user. Clarified clipping rules/requirements. Comments. 2020-12-04 19:15:27 +01:00
f70bf69e3b Tables: comments and tweaks on TableUpdateLayout(). changed "apply final width" loop to use natural column order. 2020-12-04 19:15:26 +01:00
155b8bb816 Tables: Shared menu item id for "Size all" variations. Avoid allocation on single sort specs. Fix TableGetColumnIsEnabled(). Massage TableHeaderRows(). 2020-12-04 19:15:26 +01:00
e126a64782 Tables: using a typedef in internal code to specify column/draw channel index storage. 2020-12-04 19:15:26 +01:00
6aa8388e9f Tables: index tweaks, fixed some inconsistent spacings. 2020-12-04 19:15:26 +01:00
5877b9d722 Tables: moved TablePushBackgroundChannel(), TablePopBackgroundChannel(), TableDrawBorders() to their own section. 2020-12-04 19:15:26 +01:00
5180025de5 Tables: moved + renamed TableSetupDrawChannels(), TableMergeDrawChannels() to their own section. 2020-12-04 19:15:26 +01:00
b7c83e4bac Tables: moved TableGetSortSpecs(), TableGetColumnIsSorted(), TableFixColumnSortDirection(), TableSetColumnSortDirection() to their own section. 2020-12-04 19:15:26 +01:00
d6b1f0d13d Tables: moved TableHeadersRow(), TableHeader() to their own section. 2020-12-04 19:15:26 +01:00
592fc69054 Tables: moved TableDrawContextMenu(), TableOpenContextMenu() to their own section. 2020-12-04 19:15:26 +01:00
7aed4b152b Tables: improve index, file structure tweaks. 2020-12-04 19:15:26 +01:00
082f1d10d0 Tables: renamed TableBeginUpdateColumns to TableBeginApplyRequests, moved code to TableUpdateLayout, in order to ensure that enable state is not inconsistent due to TableSetupColumn column hiding requests.
All the fields moved from TableBeginUpdateColumns to TableUpdateLayout are not used before.
2020-12-04 19:15:26 +01:00
79c9eaa78e Tables: Internals: renamed Visible to Enabled to avoid confusion with visibility checks. 2020-12-04 19:15:26 +01:00
5ef7b831c2 Tables: removed ImGuiTableSortSpecs::ColumnsMask because it needlessly exposes our 64-columns limitation which we'd eventually would like to lift
+ shuffle declarations in internals
2020-12-04 19:15:26 +01:00
e09454aec4 Tables: removed TableGetColumnIsVisible from public api, re-specced as TableGetColumnIsHidden() returning same flag as setter, clipper increase CurrentRow. 2020-12-04 19:15:26 +01:00
a70c6aae9f Tables: demo synced tables + fix resizing indented synced tables. 2020-12-04 19:15:26 +01:00
0c9ab0acdd Tables: setup and maintain ItemWidth per column. 2020-12-04 19:15:26 +01:00
8f126d5d95 Tables: rename ImGuiTableFlags_SizingPolicyStretchX to ImGuiTableFlags_ColumnsWidthStretch, ImGuiTableFlags_SizingPolicyFixedX to ImGuiTableFlags_ColumnsWidthFixed. 2020-12-04 19:15:26 +01:00
41f89e0f59 Tables: added ImGuiTableFlags_SameWidths, used in demo. Reordered columns flags and exposed them all in Columns Flags section. 2020-12-04 19:15:26 +01:00
3a2f0bfc04 Tables: demo inner_size + scrollx + stretch, added TableGetRowIndex(), renamed _WidthAlwaysAutoResize to _WidthAutoResize. 2020-12-04 19:15:25 +01:00
3b3503e60f Tables: decent support for auto-resize of stretch columns (trickier than it sounds)
Four cases:
1. visible columns are all stretch, resize all : "size all to default" reset to default weight
2. visible columns are all stretch, resize one: "size one to fit" set weight, reapply weight (todo: improve weight redistribution in case of >1 siblings)
3. visible columns are mixed, resize all: "size all to fit/default" reset stretchs to default weight, set fixed to auto width
4. visible columns are mixed, resize one: "size one to fit", redistribute weight the same way as a manual resize
+ TableSetupColumn() more consistently clear AutoFitQueue.
+ zero-clear RowCellData buffer.
2020-12-04 19:15:25 +01:00
c5dcf2fde1 Tables: rework keep-visible/max-width code to be less incorrect, but right-most column may effectively has few pixels less of visible cliprect width.
See table_width_distrib and table_width_keep_visible tests.
+ fix minor left-side clipping on post-frozen column
+ made TableHeader() use reliable column->MaxX
2020-12-04 19:15:25 +01:00
197e9c085b Tables: separate bg0 and bg1 draw channels, selectable above bg color + will facilitate drawing of borders in EndTable().
+ unused code to strip out dummy draw channel calls.
2020-12-04 19:15:25 +01:00
52f24df668 Tables: comments, tweaks, added internal TableSetColumnVisible(), merged the two TableSetColumnWidth(). 2020-12-04 19:15:25 +01:00
bf197c74f6 Tables: storing WorkMaxX, made offset_x == MinX to be clearer, clip rect merge uses ClipRect.max.x directly, removed unused ShrinkWidth code, metrics. 2020-12-04 19:15:25 +01:00
5465d30d67 Tables: added ImGuiTableFlags_PreciseStretchWidths. 2020-12-04 19:15:25 +01:00
10db896813 Tables: store RawData in a simple void* pointer, rename ContentMinX > WorkMinX, misc tidying up.
Removed unnecessary casts when using CheckboxFlags().
2020-12-04 19:15:25 +01:00
82cf41d804 Tables: tooltip on clipped TableHeader() (amended) 2020-12-04 19:15:25 +01:00
507db499e4 Tables: work on background draw channel handling (amend "create a separate background draw channel") + Selectable disable spacing when spanning. 2020-12-04 19:15:25 +01:00
fe6131168a Tables: Additionally commentary about clipper in the demo + minor padding tweak. 2020-12-04 19:15:25 +01:00
94d99f9d0b Tables: Fixed crash when increaasing columns count with bound settings. 2020-12-04 19:15:25 +01:00
24a7c45b02 Tables: Fix for 64 columns (maximum of 131 temporary draw channels). 2020-12-04 19:15:25 +01:00
e5a5256971 Tables: Garbage collection to relieve draw splitter buffers + for test engine: compact settings, remove table. 2020-12-04 19:15:25 +01:00
f80097ca96 Tables: Fix applying WorkRect in non-scrolling tables. Fix inverted BackgroundClipRect being passed to ImDrawCmd. 2020-12-04 19:15:25 +01:00
557253e776 Tables: create a separate background draw channel for rows below the frozen line. 2020-12-04 19:15:24 +01:00
fae362fd0b Tables: fixed auto-fitting columns not marking settings as dirty + fixed CellBg fill not narrow clipping on ScrollX + freeze. 2020-12-04 19:15:24 +01:00
9918b2f147 Tables: Shuffled ordering of draw channels merge group so vertically unfrozen ones come, allowing us to split background channels in two. 2020-12-04 19:15:24 +01:00
d3222086f0 Tables: Moved TableSetupScrollFreeze(), TableUpdateDrawChannels() lower in more adequate spots.
+ rename IsFreezeRowsPassed to IsUnfrozen.
2020-12-04 19:15:24 +01:00
d9ca3939e1 Tables: Tidy up comments. Replaced some Columns by Tables in demo. Removed ImGuiTableFlags_Scroll (combining ScrollX/ScrollY) because each axis inccur different requirements/constraints. 2020-12-04 19:15:24 +01:00
51abdd53e3 Tables: renamed somehow-duplicate ContentWidth members (implicitly == Max - Min), renamed StartX to ContentMinX for consistency. 2020-12-04 19:15:24 +01:00
1731ae5a09 Tables: Reworked padding/spacing/width.
All widths are stored without padding.
Decorelate padding from presence of border.
Added ImGuiTableFlags_Pad/NoPad flags.
Added demo.
Merge StartXHeaders and StartXRows into StartX.
Distinguish CellSpacingX1 and CellSpacingX2 for clarity and to avoid loss of width on non-even spacing values.
2020-12-04 19:15:24 +01:00
75c5f534e8 Tables: Avoid allocating into ColumnsName for empty strings, changed TableGetColumnName() to return "" on missing name, generally more friendly. 2020-12-04 19:15:24 +01:00
f4800db178 Tables: Extracted parts of BeginTable() into TableFixFlags() and TableBeginInitMemory(). 2020-12-04 19:15:24 +01:00
ac5b1648e6 Tables: Various internal renaming + merge StartXHeaders/StartXRows into StartX. 2020-12-04 19:15:24 +01:00
77e561aaf3 Tables: Made demo options consistently compact, replaced constants with font-based sizes, added comments on memory allocations. 2020-12-04 19:15:24 +01:00
02b27b75a4 Tables: Added ImGuiTableFlags_NoBordersInBody, ImGuiTableFlags_NoBordersInBodyUntilResize, removed ImGuiTableFlags_BordersFullHeightV. 2020-12-04 19:15:24 +01:00
172704c079 Tables: Add demo code. Remove dead code + seemingly duplicate border in TableDrawBorders(). 2020-12-04 19:15:24 +01:00
2ee20fdb7c Tables: Frozen rows/columns in nav menu layer, fixed conflict between column id and holding child id. 2020-12-04 19:15:24 +01:00
e66b28693a Tables: Added ImGuiTableFlags_ContextMenuInBody flag.
Worked to get TableOpenContextMenu() in public API but kept it internal.
2020-12-04 19:15:24 +01:00
6182973bde Tables: (Breaking) Rename TableNextCell() to TableNextColumn(), made TableNextRow() NOT enter into first column. 2020-12-04 19:15:24 +01:00
b1ebf964f5 Tables: Moved TableSetColumnIndex() next to TableNextCell() since they are so similar + made NextCell() crash proof. 2020-12-04 19:15:24 +01:00
248960d64c Tables: Fix ImGuiTableColumnFlags_WidthAlwaysAutoResize columns when clipped (which would be default behavior without _Resizable and when clipping/scrolling) 2020-12-04 19:15:23 +01:00
25b5cc2f95 Tables: Fixes to support any number of frozen rows (over modifications to clipper code in master) + make clipper run eval after clipect update 2020-12-04 19:15:23 +01:00
cc12ea084b Tables: Added TableSetColumnSortDirection() + added in default context menu code (disabled, feels unnecessary, but work is done to ensure programmatic access) 2020-12-04 19:15:23 +01:00
9b37087fbe Tables: (Breaking) Rename TableAutoHeaders() to TableHeadersRow() + added TableGetColumnCount(). 2020-12-04 19:15:23 +01:00
3021608392 Tables: (Breaking) Add TableSetupScrollFreeze() api, remove ImGuiTableFlags_ScrollFreezeXXX flags, tweak comments, move columns block.
Avoid awkwardly named ScrollFreeze flags, raise limit over 3, and will allow for future api maybe freezing bottom/right side.
2020-12-04 19:15:23 +01:00
36b2f3b4f1 Tables: renamed ImGuiTableFlags_NoClipX to ImGuiTableFlags_NoClip, clarified purpose, moved lower in the list as it doesn't need to be so prominent. 2020-12-04 19:15:23 +01:00
8ec05fc034 Tables: Fixed holding on table pointers accross resize/invalidation of the pool buffer. 2020-12-04 19:15:23 +01:00
931829f701 Tables: (Breaking change) Sorting: Made it users responsability to clear SpecsDirty back to false, so TableGetSortSpecs() doesn't have side-effect any more. + comments 2020-12-04 19:15:23 +01:00
f6800e9d3b Tables: Extend outer-most clip limits to match those of host when merging draw calls.
Generally clarify/simplify ClipRect extending/merging code in TableReorderDrawChannelsForMerge().
Amend/fix Sep 23
2020-12-04 19:15:23 +01:00
3d573103b6 Tables: Fixed lower clipping when using ImGuiTableFlags_NoHostExtendY. 2020-12-04 19:15:23 +01:00
8e97cdf8e8 Tables: Fix for calling TableSetBgColor(ImGuiTableBgTarget_CellBg) multiple times on the same cell. 2020-12-04 19:15:23 +01:00
45a80716b1 Tables: Fixed three bugs + metrics tweaks.
- Fixed bug when ending a table within another (outer table column offset was overwritten instead of restored).
- Fixed assert when settings data has mismatching column count.
- Fixed restoring g.CurrentTable when calling EndChild() from inside table inner window.
- Made inactive tables grey in metrics.
- Fix warning.
(amended twice)
2020-12-04 19:15:23 +01:00
9372601322 Tables: Fixed stacked popups incorrectly accessing g.CurrentTable of parent-in-stack windows. 2020-12-04 19:15:23 +01:00
eb18636e02 Tables: Fix settings not being saved in child window (issue 3367) + fix for change in master. 2020-12-04 19:15:23 +01:00
9d8b40414a Tables: Added TableSetBgColor() api with color for RowBg and CellBg colors. 2020-12-04 19:15:23 +01:00
b6405a291d Tables: Fixed TableHeader() not declaring its height properly. Do NOT declare width. 2020-12-04 19:15:23 +01:00
0847373b98 Tables: Comments on Sizing Policies + Rename border V/H flags HInner -> InnerH + offset every flags by two. 2020-12-04 19:15:23 +01:00
30e21eb280 Tables: non-resizable columns also submit their requested width for auto-fit, 2020-12-04 19:15:22 +01:00
a0e6aa1766 Tables: Fix calculation of auto-fit (remove padding). Demo setting a width in columns setup + ImGuiTableFlags_NoKeepColumnsVisible. 2020-12-04 19:15:22 +01:00
c96c84b6dc Tables: Store submitted column width and avoid saving default default widths. 2020-12-04 19:15:22 +01:00
57916b891b Tables: Simplified TableHeader() and not relying on Selectable(), fixed various padding issues. Added work-around for CellRect.Min.x offset by CellSpacing.x. 2020-12-04 19:15:22 +01:00
fcdfde2bc6 Tables: Extracted border size into a named variable. 2020-12-04 19:15:22 +01:00
03c8bfaf23 Tables: Removed extra +1.0f pixels initially allocated to make right-most column visible, fix visible padding asymmetry. Tweaked debug code in demo.
Seems visible enough without. Whole thing is/was fishy, may return to it but right cleaning up seems viable.
2020-12-04 19:15:22 +01:00
353bb68e90 Tables: Demo custom per-popup popups, demonstrate TableGetHoveredColumn() and ImGuiPopupFlags_NoOpenOverExistingPopup. 2020-12-04 19:15:22 +01:00
745d8cdb49 Tables: Made TableHeader() responsible for opening per-column context menu to move responsibility away from TableAutoHeaders(). 2020-12-04 19:15:22 +01:00
27e779b3ef Tables: Removed dubious window->SkipItem assignment in TableAutoHeaders(). 2020-12-04 19:15:22 +01:00
7ca70dcb81 Tables: Using same seed ID regardless of when using a child window or not. 2020-12-04 19:15:22 +01:00
798aed729a Tables: Added TableGetHoveredColumn(), extracted some context menu code out, simplifying TableAutoHeaders() toward aim of it being a user-land function. 2020-12-04 19:15:22 +01:00
4c4882ffe4 Tables: Fixed channel merge when resizing columns with headers. Disable unnecessary and broken merge when using _NoClipX. 2020-12-04 19:15:22 +01:00
8530b6af3d Tables: Not flagging whole column as SkipItems based on clipping visibility (breaks layout) 2020-12-04 19:15:22 +01:00
363eae94e6 Tables: Further fix #3293, #3163 + fixed for row unfreezing border not always showing due to unset clip rect. 2020-12-04 19:15:22 +01:00
b741639468 Tables: Fix rendering of row bg and line separators (#3293, broken by fixes #3163, code was accidently relying on SetCurrentChannel not updating rectangle)
+ Used shortcut in PushTableBackground/PopTableBackground
2020-12-04 19:15:22 +01:00
58411f27cb Tables: Avoid TableGetSortSpecs() having a side-effect on sort specs sanitization. 2020-12-04 19:15:22 +01:00
dc915c86ca Tables: Fixed a manual resize path not marking settings as dirty, TableSortSpecsSanitize() doesn't need to test table->IsInitializing 2020-12-04 19:15:22 +01:00
8690d1f9ce Tables: Fix sort specs sometimes incorrectly reporting sort spec count when table loses _MultiSortable flag during runtime. 2020-12-04 19:15:22 +01:00
af992d1321 Tables: Tweak settings functions to more prominently clarify the two levels of function. 2020-12-04 19:15:22 +01:00
7513842284 Tables: Fix assert/crash when a visible column is clipped in a multi clip group situation. 2020-12-04 19:15:22 +01:00
e41fc7b5b0 Tables: Fix TableDrawMergeChannels() mistakenly merging unfrozen columns cliprect with host cliprect. Comments, debug. 2020-12-04 19:15:21 +01:00
fec9d7d226 Tables: Rescale fixed widths when font size change to support varying dpi scale at runtime and on .ini reload. 2020-12-04 19:15:21 +01:00
6bc0bbccf3 Tables: Restore width/weight saving/loading code. Non-weighted width currently not font/DPI change friendly. 2020-12-04 19:15:21 +01:00
af52a0cea2 Tables: Resizing weighted column preserve sum of weights. Fix ResizedColumn init leading to undesirable TableSetColumnWidth() on first run. Rework TableSettingsHandler_ReadLine() structure to allow other types of line. 2020-12-04 19:15:21 +01:00
bc170e7325 Tables: Renamed ResizeWeight->WidthStretchWeight, WidthRequested->WidthFixedRequest, clarififications, comments. 2020-12-04 19:15:21 +01:00
23c60b2814 Tables: Renamed internal fields: Active->Visible, Visible->VisibleUnclipped to be less misleading. 2020-12-04 19:15:21 +01:00
dff26191bd Tables: Try to report contents width to outer window, generally better auto-fit. 2020-12-04 19:15:21 +01:00
466b6e619a Tables: Fixed incorrect application of CursorMaxPos.x (3162) 2020-12-04 19:15:21 +01:00
95c273618e Tables: Allow hot-reload of settings (merge policy), tidying up settings code 2020-12-04 19:15:21 +01:00
9b6d0fdb7a Tables: Fixed ignoring DefaultHide or DefaultSort data from flags when loading settings that don't have them. 2020-12-04 19:15:21 +01:00
9f43aae226 Tables: Calculating ideal total width, some renaming, comments. Clarify that inner_width is unused with ScrollX=0. Clip many comments to 120 columns. 2020-12-04 19:15:21 +01:00
b7ff85d9ad Tables: Browse settings list in Metrics (outside of Table entry). 2020-12-04 19:15:21 +01:00
8eb1c925f0 Tables: Internals: Added FindTableByID(), removing trailing spaces.
# Conflicts:
#	imgui_internal.h
2020-12-04 19:15:21 +01:00
e60b5a3f75 Tables: Internals: Added TableGetColumnResizeID(), renamed InstanceNo > InstanceCurrent. 2020-12-04 19:15:21 +01:00
104b11051f Tables: Added ImGuiTableColumnFlags_NoReorder. 2020-12-04 19:15:21 +01:00
b7fa96679e Tables: Locking IndentX per-row so multiple columns with IndentEnabled don't get indent shearing. 2020-12-04 19:15:21 +01:00
5ffc9e0846 Tables: Renaming Table's DisplayOrder[] -> DisplayOrderToIndex[], Columns's IndexDisplayOrder -> DisplayOrder 2020-12-04 19:15:21 +01:00
a956629b40 Tables: Using same allocation for our Columns and DisplayOrder array. Mostly designed to facilitate adding new arrays. 2020-12-04 19:15:21 +01:00
6dff061309 Internals: added ImSpanAllocator<> helper. 2020-12-04 19:15:20 +01:00
182115409a Internals: added ImSpan helper structure + 2020/10/01 stricter bound checking 2020-12-04 19:15:20 +01:00
054c67079a Tables: Fix scrolling with more than 32 columns (3058). Fix limit of 63 columms instead of 64. Added BitArray. 2020-12-04 19:15:20 +01:00
d37cef40f2 Tables: Tidying up TableDrawMergeChannels() with a struct. (3058) 2020-12-04 19:15:20 +01:00
7277ab6530 Tables: Comments, renamed merge_set_xxx to merge_group_xxx. Removed unused array and incorrect assert, replaced with earlier correct assert. (3058) 2020-12-04 19:15:20 +01:00
0190b619cf Tables: Fixed demo layout when clipped. Fixed warnings. 2020-12-04 19:15:20 +01:00
f130db51ae Tables: Added TableSetColumnWidth() api variant aimed at becoming public facing. 2020-12-04 19:15:20 +01:00
ae6fc48f60 Tables: Fix sort direction (issue 3023). Remove SortOrder from ImGuiTableSortSpecsColumn. Made sort arrow smaller. Added debug stuff in metrics. 2020-12-04 19:15:20 +01:00
643cf6fc8c Tables: Added ImGuiTableFlags_NoKeepColumnsVisible wip flag useful for layout purpose. (WIP) 2020-12-04 19:15:20 +01:00
104ec408a8 Tables: Fixed content size calculation creating feedback loops. Fixed handling of _DefaultSort with _PreferSortXXXflags (@parbo). Comments. 2020-12-04 19:15:20 +01:00
787a309445 Tables: Fixed headers closing popups. 2020-12-04 19:15:20 +01:00
f5eee210a0 Tables: TableHeader() uses provided row min header rather than incremental one to allow multi-item multi-line in header cells. Demo TableHeader() - will caveat, comments. 2020-12-04 19:15:20 +01:00
5431cbd3f0 Tables: Honor width/weight passed to TableSetupColumn() after .ini load since we don't actually restore that data currently.
Demo: Remove filter from Advanced Table demo since it's breaking with clipping.
2020-12-04 19:15:20 +01:00
0e7b3f2f2f Tables: Made only first column honor Indent by default (like Columns api) and exposed flags. Added simple Tree demo. 2020-12-04 19:15:20 +01:00
2958e37310 Tables: Storing per-column SkipItems as a shortcut. Comments, Spacings.
# Conflicts:
#	imgui_internal.h
2020-12-04 19:15:20 +01:00
31de161066 Tables: Fix for hiding first column (fix fcceff5c + reading PrevLineTextBaseOffset in EndCell of inactive column). 2020-12-04 19:15:20 +01:00
164caa2db7 Tables: Support for multi-line columns name. Renaming of some fields from BackupXXX to HostXXX. Comments. 2020-12-04 19:15:20 +01:00
e85c226da4 Tables: Fix reordering across hidden columns. Fix for frozen columns to never be larger than scrolling visible rect width. 2020-12-04 19:15:20 +01:00
416e9bb38d Tables: Clarify internal calculations of row height so that TableGetCellRect() include expected paddings. Add demo code. Comments.
Remove misleading commented-out flags for now.
2020-12-04 19:15:20 +01:00
325b4c69ba Tables: Moved border colors to the Style (maybe temporarily?) instead of hardcoding them. 2020-12-04 19:15:19 +01:00
17578e215a Tables: Separating inner/outer borders flags per axis so it is possible to remove outer vertical borders to mimic old columns.
VInner or VOuter only don't have correct padding/spacing.
2020-12-04 19:15:19 +01:00
1db8d421cf Tables: Fix scroll when releasing resize for multi-instances. Comments. Renaming. 2020-12-04 19:15:19 +01:00
47b39f6371 Tables: Demo: Moved Columns section into Tables & Columns section under a Legacy section. 2020-12-04 19:15:19 +01:00
78b12068d9 Tables: Disable initial output prior to NextRow call to avoid misleading users.
Fixed some inconsistency with BeginTable/EndTable without row.
Move some of the TableBegin() code in TableBeginUpdateColumns().
Allow to submit multiple header lines.
2020-12-04 19:15:19 +01:00
046fad01f1 Tables: Return false when window is Collapsed (consistent + helpful for doc) + Fix empty context menu. 2020-12-04 19:15:19 +01:00
81453ac42c Tables: Comments, better assert, moved some internal flags out of the way. 2020-12-04 19:15:19 +01:00
0c3d7bb154 Tables: Double-clicking on fixed column to resize. Extracted code BeginTableEx().
# Conflicts:
#	imgui_internal.h
2020-12-04 19:15:19 +01:00
883c236eda Tables: Handle columns clipped due to host rect
Return false in user functions, set SkipItems in window, redirect to dummy draw channel.
2020-12-04 19:15:19 +01:00
eee82e0451 Tables: Columns with no policy in a scrolling table will default to WidthFixed instead of WidthAlwaysAutoResize if an explicit value is passed to TableSetupColumn() 2020-12-04 19:15:19 +01:00
e06a36ab12 Tables: Support for multiple Tables using same id where most settings are synced.
(some minor one-frame lack of sync when e.g. toggling visibility in context menu)
2020-12-04 19:15:19 +01:00
a09954bdaf Tables: Initial demo code. 2020-12-04 19:15:19 +01:00
8da7d3c3e5 Tables: Initial commit. [Squashed 123+5 commits from tables_wip/] 2020-12-04 19:15:19 +01:00
818e1a4eb4 Tables: Moving legacy Columns code 2020-12-04 19:15:19 +01:00
9c8671e7b0 Tables: Add empty file, skeleton. 2020-12-04 19:15:19 +01:00
f9b873662b Backends: Win32: Fixed setting of io.DisplaySize to invalid/uninitialized data when after hwnd has been closed.
GetClientRect() fails on closed hwnd which left the rectangle uninitialized and copied to DisplaySize. Ensure it is zero + similar failsafe in io.WantSetMousePos path.
2020-12-04 11:48:17 +01:00
998d7303b1 Log/Capture: fix capture to work on clipped child windows.
+ Tweak ErrorCheckEndFrameRecover() to use local window pointer.
2020-12-03 15:14:32 +01:00
2afdfa602f Rebuild ImFontAtlas::GetGlyphRangesJapanese offset table (#3627)
- GetGlyphRangesJapanese now supports
  - 2136 'Joyo (meaning "for regular use" or "for common use")' Kanji
  - 863 'Jinmeiyo" (meaning "for personal name")' Kanji
2020-12-02 12:02:29 +01:00
d20f2bc90a Rename example_emscripten/ to example_emscripten_opengl3/ (#3632) 2020-12-02 11:23:56 +01:00
ae3e2406ec Misc tweaks/fixes (see details).
Combo: ultra minor fix for popup positioning policy mismatch depending on ImGuiComboFlags_PopupAlignLeft flag.
Made ImHashXXX functions return ImGuiID.
IsWindowNavFocusable use !WasActive.. it worked because it was only called in NewFrame()->NavUpdate() before the transition loop + EndFrame() only.
Fix unused variable warning.
2020-11-30 12:47:14 +01:00
9801c8c1c5 Texture-based thick lines: comment out dead code (amend b5bae978). (#3245) 2020-11-26 19:35:56 +01:00
e0cae25c3c Clarify usage of right-aligned items in Layout>Widgets Width. Tweaks FAQ, added missing syntax coloring. 2020-11-20 17:24:18 +01:00
d4f08d893e InputText: Fixed swiching from single to multi-line while preserving same ID. 2020-11-19 18:30:14 +01:00
97265602c4 Internals: added IsWindowAbove() for use for modal/viewport bugfix. 2020-11-19 16:59:21 +01:00
9712bff0bb Internals: added experimental ErrorCheckEndFrameRecover() to unroll/end/pop. (#1651, #3600) 2020-11-19 15:43:42 +01:00
c0ac4fb788 Columns/Internals: (Breaking): Renamed data structures. (#125, #513, #913, #1204, #1444, #2142, #2707) 2020-11-18 23:42:44 +01:00
72de6f3360 Columns/Internals: (Breaking) renamed ImGuiColumnsFlags_* to ImGuiOldColumnFlags_*. (#125, #513, #913, #1204, #1444, #2142, #2707)
Affected: ImGuiColumnsFlags_None, ImGuiColumnsFlags_NoBorder, ImGuiColumnsFlags_NoResize, ImGuiColumnsFlags_NoPreserveWidths, ImGuiColumnsFlags_NoForceWithinWindow, ImGuiColumnsFlags_GrowParentContentsSize. Added redirection enums. Did not add redirection type.
2020-11-18 23:02:14 +01:00
fcc2b71724 CI: Fix testing for Windows DLL builds + fix broken DLL build. (#3603, #3601) 2020-11-18 22:45:44 +01:00
2e64ee050d Removed duplicate typedef for ImGuiButtonFlags
https://github.com/cimgui/cimgui/issues/166
2020-11-18 19:28:30 +01:00
71cc636696 Metrics: Rebranded as "Dear ImGui Metrics/Debugger". Fix Show Window Rectangle. Fix Clang OSX warnings. Amend #3592 for Mingw only. 2020-11-13 21:30:19 +01:00
e736039538 Nav: Fixed IsItemFocused() from returning false when Nav highlight is hidden because mouse has moved. (#787) 2020-11-13 21:10:03 +01:00
8119759329 Internals: extracted stack checking code into a ImGuiStackSizes helper struct + added test for FocusScope
+ renamed g.ColorModifiers > g.ColorStack, g.StyleModifiers > g.StyleVarStack
2020-11-13 16:33:33 +01:00
6e94013a3d Made ItemFlagsStack and GroupStack shared stacks. 2020-11-13 16:33:33 +01:00
12ba6f4606 Fix PushFocusScopeID() + using shared stack. Renamed GetFocusScopeID() to GetFocusedFocusScope() - the two existing functions name are very error prone. 2020-11-13 16:26:59 +01:00
a3e8dc3f34 CI: Fix deployment of PVS-Studio license + fix reported error. 2020-11-13 12:51:55 +01:00
a138855d56 Hotfix for PushFocusScope() being utterly wrong (until we split the stacks), Added asserts on PopID to help catch bugs, Added GC trigger. 2020-11-12 22:59:05 +01:00
78f1d2d319 ImDrawListSplitter: create first draw cmd on demand + Internals: fix incorrect ImBitArraySetBitRange() (only used by tables)
Make it cheaper to allocate unused draw cmd, can't measure perf difference other our stress tests.
2020-11-12 18:17:17 +01:00
13258f5957 Internals: zero-clearing ImGuiWindow / ImGuiWindowTempData for simplicity. (amend)
All the non-zero fields previously initialized in ImGuiWindowTempData() are in fact setup in Begin: FocusCounterRegular, FocusCounterTabStop, TextWrapPos, LayoutType, ParentLayoutType
2020-11-12 12:19:50 +01:00
7a135a763c Fix format warnings when using gnu printf extensions in a setup that supports them (gcc/mingw). (#3592) 2020-11-12 11:56:21 +01:00
dcfb986fa8 Made EndFrame() assertion for key modifiers being unchanged during the frame more lenient. (#3575) 2020-11-11 18:17:33 +01:00
a3f79104df Examples: Apple+Metal: Forward events to OS key combinations like CMD+Q can work. (#3554) 2020-11-11 15:30:08 +01:00
6a0e85c561 Backends: Vulkan: Add override for the subpass to reference during VkPipeline creation. (#3579)
This allows for binding the pipeline/sending draw commands
(via `ImGui_ImplVulkan_RenderDrawData`) against any subpass, rather than
being restricted to only the first subpass.

Without this, attempting to bind the pipeline against a subpass other than
the first one results in validation layer errors and, at worst, some drivers
failing if the subpass attachments differ.
2020-11-11 15:20:43 +01:00
61825c7735 Tab Bar: Fixed minor/unlikely bug skipping over a button when scrolling left with arrows + InputText: minor optimization. 2020-11-11 12:04:35 +01:00
2785ac0ee3 InputText: Fixed updating cursor/selection position when a callback alters the buffer in a way where the byte count is unchanged but the decoded character count changes. (#3587) 2020-11-11 11:36:53 +01:00
5789e69a62 Checkbox: Added CheckboxFlags() helper with int* type. Demo: removed extraneous casts. 2020-11-05 21:32:05 +01:00
5f97809cab Misc tidying up (zero-clear structures, more unused default in ClipRetFullscreen, NavApplyItemToResult() coding style fix)
Zero-clearing more structures
Remove arbitrary default ClipRetFullscreen value in ImDrawListSharedData.
Nav extracted NavApplyItemToResult() function.
Coding style fixes in OSX Backends.
2020-11-05 13:24:27 +01:00
046057cebb Selectable: Avoid pushing span-column background if clipped. 2020-11-04 20:11:34 +01:00
7a27b2a282 Update Readme, links to Useful Widgets, updated a gif. 2020-11-04 20:11:21 +01:00
2bf5ca7ef2 ImDrawListClipper: avoid over reserving memory. 2020-11-04 18:05:51 +01:00
d6a2f7e95e Reduced padding + unused storage in ImDrawList (224->192 bytes) + zero-init ImDrawListSplitter and ImDrawList
+ Readme tweak
2020-11-04 13:56:04 +01:00
2fa00656a4 Fix for IMGUI_DISABLE_METRICS_WINDOW 2020-11-03 15:46:29 +01:00
b934b9bb86 Backends: OSX, Metal: Fix -Wshadow, -Wimplicit-float-conversion, and -Wsign-conversion warnings. (#3555) 2020-11-03 15:38:59 +01:00
9cca1b2e97 Replace UTF-8 decoder with one based on branchless version by Christopher Wellons. (not branchless anymore tho)
Decoding performance increase ~30%
2020-11-03 14:43:08 +01:00
3777fbbd81 Renamed io.ConfigWindowsMemoryCompactTimer to io.ConfigMemoryCompactTimer as the feature will apply to other data structures. 2020-11-03 14:43:08 +01:00
047d4c4500 Metrics: Extracted most functions.
+ avoid using full namesapce prefix
2020-10-30 23:48:58 +01:00
044ed22379 Metrics: Fixed mishandling of ImDrawCmd::VtxOffset in wireframe mesh renderer + omitting trailing empty ImDrawCmd in count + relying on IdxOffset value. 2020-10-30 22:56:29 +01:00
a129621292 Doc: mention IMGUI_USE_WCHAR32 in fonts documentation (#3562) 2020-10-29 18:21:06 +01:00
6f57d58e82 Backends: OSX: Fix KeyPadEnter on MacOS. (#3554) 2020-10-28 12:31:10 +01:00
df35157397 Drag and Drop: Fix losing drop source ActiveID (and often source tooltip) when opening a TreeNode() or CollapsingHeader() while dragging. (#1738)
Amend 7b3d379, 8241cd62 etc.
2020-10-26 14:40:44 +01:00
b7530e5d04 Revert "Replace UTF-8 decoder with branchless version by Christopher Wellons." (#3558)
This reverts commit b3576dd354.
2020-10-25 16:27:43 +01:00
b3576dd354 Replace UTF-8 decoder with branchless version by Christopher Wellons.
Decoding performance increase ranges from 30-40%.

Changes:
* Errors handling near the end of string changed. If input does not contain enough bytes, decoder returns `IM_UNICODE_CODEPOINT_INVALID`, consuming all remaining bytes while old decoder consumed only one byte.

Guarantees:
* At least one byte is consumed, if input had at least one byte available.
* Number of consumed bytes will never seek past end of string.

Requirements:
* `in_text` is a valid pointer.
* String pointed by `in_text` must be zero-terminated, or `in_text_end` is not NULL.
2020-10-23 13:10:37 +02:00
bca4749346 Examples: Apple: Consolidated example_apple_metal to reduce class and file count (#1873, #3543) 2020-10-23 11:33:08 +02:00
5292320110 Amend ffe8f0177f (#3544) + readme fixes 2020-10-23 11:25:26 +02:00
ffe8f0177f Backends: OpenGL3: Backup/restore GL_PRIMITIVE_RESTART state (#3544) 2020-10-23 11:17:56 +02:00
acb8ef2006 Examples: Vulkan: Fixed CMake include path. (#3550)
The backends directory was not included, so the build was failing.
2020-10-21 09:13:54 +02:00
e6b99a420b Tab Bar: Do not display a tooltip if the name already fits over a given tab. (#3521) 2020-10-19 15:01:24 +02:00
fbe74ed50c Tab Bar: zero clear more structures. 2020-10-19 12:10:31 +02:00
8c9b3c9013 Tab Bar: Fixed using more than 128 tabs in a tab bar.
Using ImS16 consistently + some better packing to avoid struct growing size.
2020-10-19 12:01:15 +02:00
748bd1ba9c Tab Bar: Restore cursor position in EndTabBar() when amending (amend f2f32602) + made LastTabItemIdx consistent ImS8 as other tab storage relies on same type 2020-10-19 11:49:37 +02:00
c9fafd5ea4 Drag and Drop: Fix drag and drop to tie same-size drop targets by choosen the later one. Fixes dragging into a full-window-sized dockspace inside a zero-padded window. (#3519, #2717) 2020-10-15 20:20:35 +02:00
d015004f45 Rename colored>color in comments where possible (#3528) 2020-10-15 20:05:35 +02:00
127f132447 Backends: OpenGL3: Add compatibility of GL_VERSION for GL 2.x (#3530)
GL_MAJOR_VERSION and GL_MINOR_VERSION are available on GL 3.0 and above.
So we have to parse GL_VERSION under GL 2.x
2020-10-15 19:48:45 +02:00
31a144b60c Fix comments (#3534) 2020-10-15 19:37:18 +02:00
f2f326024c Tab Bar: Made it possible to append to an existing tab bar by calling BeginTabBar()/EndTabBar() again. 2020-10-14 18:34:33 +02:00
b1a18d82e3 Moving backends code from examples/ to backends/ (step 6: update markdown documentation) 2020-10-14 14:42:00 +02:00
a2a3d80f04 Moving backends code from examples/ to backends/ (step 5: move documentation to MD files) 2020-10-14 14:41:40 +02:00
a2d845f9dd Moving backends code from examples/ to backends/ (step 4: update documentation, much improvement) 2020-10-14 14:41:40 +02:00
a7e21fb05f Moving backends code from examples/ to backends/ (step 3: fixing project files) 2020-10-14 14:41:40 +02:00
428f4fce70 Moving backends code from examples/ to backends/ (step 2: moving vulkan cruft) 2020-10-14 14:41:40 +02:00
d9b2fb7338 Moving backends code from examples/ to backends/ (step 1: moving source files) 2020-10-14 14:41:40 +02:00
124c2608f1 Docs: Renamed all occurences of "binding" and "back-end" to "backend" in comments and documentations, for consistency. 2020-10-12 17:54:52 +02:00
041ef01b33 Removed redirecting functions/enums names that were marked obsolete in 1.61: InputFloat, InputFloat2, InputFloat3, InputFloat4 with int decimal_precision parameter. (#648, #712) 2020-10-12 15:09:21 +02:00
0f13fdd177 Removed redirecting functions/enums names that were marked obsolete in 1.60: io.RenderDrawListsFn, IsAnyWindowFocused(), IsAnyWindowHovered(), etc. 2020-10-12 13:17:05 +02:00
04de5ef819 Version 1.80 WIP 2020-10-12 13:04:34 +02:00
a38c6dfcc8 Internals: Added support for context hooks (for test engine or other extensions) 2020-10-09 17:13:03 +02:00
e5cb04b132 Version 1.79
+ Update readme and mission statement.
Removed "Minimize screen reel-estate usage", removed details on memory consumption (still very valid, just too much noise in a mission statement)
2020-10-08 16:01:59 +02:00
c6f9c558ec CI: Use our own discord notifier. 2020-10-08 14:23:55 +02:00
ae5b4991be Docs: update gallery links. (#3514) 2020-10-08 13:56:05 +02:00
03b1e643b4 Docs: Funding link, Tweaks, Gallery links. 2020-10-08 10:47:10 +02:00
12d9505534 CheckboxFlags: Display mixed-value/tristate marker when passed flags that have multiple bits set and stored value matches neither zero neither the full set. 2020-10-07 15:13:04 +02:00
4fd43a8b64 Internals: removed NavLayerCurrentMask (redundant, add extra shift in ItemAdd(). 2020-10-05 14:52:18 +02:00
014e5078a8 Demo: add a small easter egg when the 4x4 board of Selectable is filled + tweaked the demo. 2020-10-05 13:08:32 +02:00
01cc666039 ImGuiListClipper: Renamed constructor parameters which created an ambiguous alternative to using the ImGuiListClipper::Begin() function, with misleading edge cases. 2020-10-05 12:28:28 +02:00
6469b94304 Silence memset warning. (#3505)
Compiling the code as-is results in the following warning:

-->8--
imgui_freetype.cpp:341:72: warning: ‘void* memset(void*, int, size_t)’
        clearing an object of type ‘struct ImFontBuildSrcDataFT’ with no
        trivial copy-assignment; use assignment or value-initialization
        instead [-Wclass-memaccess]
  341 |     memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes());
      |                                                                        ^
imgui_freetype.cpp:302:8: note: ‘struct ImFontBuildSrcDataFT’ declared here
  302 | struct ImFontBuildSrcDataFT
      |        ^~~~~~~~~~~~~~~~~~~~
--8<--

This is caused by presence of ImVector<> directly in ImFontBuildSrcDataFT data
structure, as well as in the child ImBitVector. Since ImVector<> has a
constructor, the compiler infers that initialization by memset is not valid.
Such initialization is not a bug, however, as the default ImVector<> ctor just
sets the structure data members to 0, which is exactly what the memset does.

Casting the data structure address to void* pointer silences this warning.
2020-10-02 19:12:53 +02:00
7b1ab5b275 ImVector: Stricter bound-checking asserts. Fix warnings: trailing comma (old compilers), zealous preprocessor warnings. 2020-10-01 14:48:19 +02:00
5f336ce8f8 Tab Bar: Fixed buffer underflow in TabBarLayout, introduced by 4a57a982b (#3501, #3291)
+ Link to CI actions added in 3be352f
2020-10-01 13:31:53 +02:00
3be352fc80 CI: Add discord notifications. 2020-09-30 14:58:18 +02:00
179dc04d8a Examples: Added missing comments in example_apple_metal. (#3400) 2020-09-30 14:55:09 +02:00
52c0b1a340 ImGuiListClipper: internal rework and tidying up to facilitate supporting frozen rows in tables + stop promoting using constructors parameters. 2020-09-28 17:25:34 +02:00
324e0310ad Renamed ImGuiSliderFlags_ClampOnInput to ImGuiSliderFlags_AlwaysClamp. (#1829, #3209, #946, #413) 2020-09-25 13:34:31 +02:00
fbabf651f4 Style: Renamed style.TabMinWidthForUnselectedCloseButton to style.TabMinWidthForCloseButton. Fixed README links. 2020-09-25 13:22:28 +02:00
1ec464eb9a Tab Bar: Further simplification of section/clip rect handling. (#3291) 2020-09-22 16:43:40 +02:00
6b76781c66 Tab Bar: Tidying up. Rework ShrinkWidths to allow marking tabs as not shrinkable (unused yet) + don't unnecessarily move data within ShrinkWidthBuffer. (#3291) 2020-09-22 16:43:39 +02:00
99f69eb185 Tab Bar: Moved up TabBarScrollingButtons function call. (#3291) 2020-09-22 16:43:39 +02:00
205874f5b1 Tab Bar: Fix reorderable tab bars. Fix misleading use of tab_max_width in TabBarLayout(). Misc amends, shortening. (#3291) 2020-09-22 16:43:39 +02:00
3422cb1308 Tab Bar: Various fixes. Tried to reduce code complexity. (#3291) 2020-09-22 16:43:39 +02:00
5e5f25e2dd Tab Bar: Rename named sections members into array. Various tidying up. (#3291) 2020-09-22 16:43:39 +02:00
7ac16c02cc Tab Bar: Fix multiple width and position computation issue. (#3291) 2020-09-22 16:43:38 +02:00
f23c39c395 Tab Bar: Fixed handling of scrolling policy with leading/trailing tabs. + warning fixes + bunch of renaming. (#3291)
Demo tweaks.
2020-09-22 16:43:38 +02:00
4a57a982be Tab Bar: Added TabItemButton(), ImGuiTabItemFlags_Leading, ImGuiTabItemFlags_Trailing + demo. (#3291)
(squashed various commits by 2 authors)
2020-09-22 16:43:38 +02:00
29836412e1 Internals, CollapsingHeader, TabItem: Standardized using a #CLOSE id prefix for TabItem and ColllapsingHeader (same as window) 2020-09-22 15:49:47 +02:00
27d0c3afa9 Tab Bar: Fixed a small bug where scrolling buttons (with ImGuiTabBarFlags_FittingPolicyScroll) would generate an unnecessary extra draw call. 2020-09-21 20:00:25 +02:00
afc1099fb5 Tab Bar: Fixed a small bug where closing a tab that is not selected would leave a tab hole for a frame. 2020-09-21 18:52:20 +02:00
795cf6fcb5 Removed return value from OpenPopupOnItemClick(). Use IsWindowAppearing() after BeginPopup() for a similar result. 2020-09-21 15:05:04 +02:00
a58a727781 Renamed OpenPopupContextItem() back to OpenPopupOnItemClick(), reverting 99ab5210 2020-09-21 14:45:35 +02:00
ec945f44b5 InputText: Added support for Page Up/Down in InputTextMultiline. (#3430)
+ fix stb_textedit.h to build with C language (amend fbf70070)
2020-09-18 14:15:17 +02:00
8eca736a7a Update binary link
(contents of 20200412.zip's dx11.exe is flagged by Windows Defender, can't currently repro)
2020-09-18 10:05:12 +02:00
c206a19373 Removed ImFont::DisplayOffset in favor of ImFontConfig::GlyphOffset. (#1619)
+ Fonts: AddFontDefault() adjust its vertical offset based on floor(size/13) instead of always +1.
2020-09-17 16:45:21 +02:00
fbf70070bb InputText: Fixed minor inconsistency when pressing Down on the last line when it doesn't have a carriage return (it used to move to the end of the line)
+ fixed two of our typos in stb_textedit.h
2020-09-17 12:21:31 +02:00
c47bcb25ed Fix popup and tooltip positioning when not fitting in the screen. Amend fa42ccea8.
# Conflicts:
#	docs/CHANGELOG.txt
2020-09-17 11:02:04 +02:00
b7b08f52a4 Fix popup and tooltip positioning when not fitting in the screen. 2020-09-17 11:01:15 +02:00
825f699bde Backends: OpenGL3: Amends (#3467, #1985) 2020-09-17 09:55:58 +02:00
2460f2abe3 Backends: OpenGL3: Fix to avoid calling glBindSampler() with version <= 3.2 (#3467, #1985)
(nb: GLEW sets the define we previously used)
2020-09-17 09:34:11 +02:00
645a6e0342 Bypass unnecessary formatting when using the TextColored()/TextWrapped()/TextDisabled() helpers with a "%s" format string. (#3466) 2020-09-16 18:36:42 +02:00
d2939ce0a1 Columns: Make sure the ClipRect is valid. (#3475) 2020-09-16 16:52:57 +02:00
a1597cff08 Backends: DX12: Fix D3D12 Debug Layer warning if scissor rect is 0 width or 0 height. (#3472, #3462)
In the event where the scissor rect is 0 width or 0 height, don't call Draw, as it generates warnings if the D3D12 Debug Layer is enabled, and nothing would have been drawn anyway.
2020-09-16 10:43:17 +02:00
a8f409a848 Examples: DX12: Enable breaking on any warning/error when debug interface is enabled. (#3462, #3472) + misc comments & minor fixes. 2020-09-16 10:40:06 +02:00
e8447dea45 Backends: Vulkan: Removed unused shader code. Fix leaks. Avoid unnecessary pipeline creation for main viewport. Amend 41e2aa2. (#3459) 2020-09-08 22:39:53 +02:00
d8d58b038e Backends, Examples: DX12: Clarify support for 32-bit building in project files and comments. (#301) 2020-09-08 20:03:34 +02:00
41e2aa2e7a Backends: Vulkan: Separate the pipeline of the dear imgui created windows from the one created with the user's render-pass. (#3455, #3459)
This is mostly for the benefit of multi-viewports.
2020-09-08 16:54:48 +02:00
6a546a500f ImVector: fix max_size() for signed int value. Amend 444873404 (#3429, #3460) 2020-09-08 13:37:23 +02:00
8a9ee9cded Add const qualifier for parameter ImFontConfig of ImFont::AddGlyph (#3461) 2020-09-08 12:18:28 +02:00
206d78a524 InputText: Fixed minor glitch when erasing trailing lines in InputTextMultiline(). Fixed cursor being partially covered after using Ctrl+End key.
Removed unncessary one-empty-line-worth-of-scrolling.
2020-09-08 11:42:13 +02:00
36af398056 Sliders: Fixed using ImGuiSliderFlags_ClampOnInput with reverse sliders. (#3432, #3449) 2020-09-07 19:52:11 +02:00
b2039aac67 Slider: Fixed to reach maximum value with inverted integer min/max ranges, both with signed and unsigned types. Added reverse Sliders to Demo. (#3432, #3449) 2020-09-07 17:57:23 +02:00
6461fd40ab Examples: Fixed SDL+OpenGL2 and SDL+Vulkan examples not processing SDL_WINDOWEVENT_CLOSE events which tends to be needed in multi-viewport setting. 2020-09-07 12:23:26 +02:00
b25756be4a Examples: Vulkan: Switch validation layer. Fix CMakeLists to find Vulkan the standard way. (#3459) 2020-09-07 11:43:57 +02:00
751d153ca9 InputText: Fixed callback's helper DeleteChars() function when cursor is inside the deleted block. (#3454). 2020-09-03 19:09:57 +02:00
70289ab42c Scrolling: Fixed edge snapping being applied prior to knowing ContentSize. (#3452)
Fix 473a01adb.
2020-09-03 17:38:51 +02:00
8db94cd992 Internals: Scroll related, comments & shallow tweaks. 2020-09-03 17:07:03 +02:00
b73305be11 Examples: Vulkan: Reworked buffer resize handling, amend df89a16d (#3390, #2626) 2020-09-02 12:43:23 +02:00
9a9ee7f813 NavInitWindow: Change IMGUI_DEBUG_LOG to IMGUI_DEBUG_LOG_NAV (#3450) 2020-09-01 23:19:33 +02:00
f4d062fa11 Nav: Added debug logging, extract bits of code into NavUpdateInitResult(). 2020-09-01 18:45:39 +02:00
a456d17dfc Internals: Begin: update ->Hidden flags only on first begin of the frame. (ignore whitespace to see simple diff) 2020-09-01 15:24:24 +02:00
ce230fc370 Internals: TabBar renaming and shuffling stuff around.
+ sneaking a readme change
2020-08-31 17:49:18 +02:00
13f718337a Internals: Added support for overriding locale decimal point, undocumented. (#2278) + Misc doc update.
Doc: Mention IMGUI_VERSION_NUM in recent api breaking changes + textwrap some demo code.
2020-08-28 18:38:31 +02:00
901d432cb7 Nav: Fixed using Alt to toggle the Menu layer when inside a Modal window. (#787) Tidying up todo items. 2020-08-27 19:51:35 +02:00
302896d488 Basic optimization for ShadeVertsLinearColorGradientKeepAlpha() - especially for debug overhead - since it's used massively by some of our experiments. 2020-08-27 12:19:13 +02:00
093afd4f7f Internals: Added Name to ImGuiDataTypeInfo + minor misc comments in BeginGroup(). 2020-08-26 21:00:43 +02:00
45499b8f2f Window: Fixed using non-zero pivot in SetNextWindowPos() when the window is collapsed. (#3433) 2020-08-26 20:18:54 +02:00
8c80d533d9 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. 2020-08-26 16:36:57 +02:00
b30d33378d Nav: Activate InputSource as Gamepad when pressing any of the digital d-pad button. 2020-08-26 12:41:05 +02:00
8d71bc2132 Internals: Nav: shallow refactor. 2020-08-26 12:39:34 +02:00
833eb771f2 Nav: Fix navigation resuming on first visible item when using gamepad.
In cases where navigation was requested with focused item out of view, clipping of current item rect resulted in an inverted rect, which was completely discarded and ImRect(0,0,0,0) was used as current point from which navigation scoring was calculated. IsInverted() check is completely removed as rect can no longer be inverted. Since rects are not initialized to ImRect(0,0,0,0) - old .Min.x != FLT_MAX check (which was changed in c7835dd189) is not necessary either.
2020-08-26 11:30:08 +02:00
1e8b9f84da Nav: Removed stateful NavMoveFromClampedRefRect and made it more explicit that nav move request from gamepad start from a clipped location. 2020-08-26 11:28:35 +02:00
4448734041 ImVector: added max_size() to facilitate usage with sol2 binding generator (#3429) 2020-08-26 11:03:55 +02:00
32be6c064b InputText: Fixed using ImGuiInputTextFlags_Password with InputTextMultiline(). (#3427, #3428) 2020-08-25 20:08:24 +02:00
5919a6fa89 Tab Bar: Keep tab item close button visible while dragging a tab (independent of hovering state).
Improve 08108cf
2020-08-25 19:28:29 +02:00
021c28ae39 Nav: Fix ScrollToBringRectIntoView() not bringing entire item into view when nav moves to the left. Correct some comments. 2020-08-25 16:48:49 +02:00
08108cf9ee Tab Bar: Hide tab item close button while dragging a tab. 2020-08-25 16:48:31 +02:00
2e50d0706b Selectable: Tweaks. Added internal ImGuiSelectableFlags_NoPadWithHalfSpacing. 2020-08-24 16:31:00 +02:00
d451f6cc30 Nav tweaks. Demo: Fixed drag and drop demo state (broken by f152fac4f1). Fixed incorrect format string (which would work without IMGUI_DISABLE_OBSOLETE_FUNCTIONS). 2020-08-24 14:56:50 +02:00
7b0570d6ba Revert "Drags, Sliders: internal ReadOnly flag gets forwarded properly to temp InputText()."
This reverts commit 640d1f60ce140e4c2bf858ac2f2e8a96d432e6a4.
2020-08-21 20:15:07 +02:00
fdf952108d Drags, Sliders: internal ReadOnly flag gets forwarded properly to temp InputText(). 2020-08-21 19:17:44 +02:00
df89a16d26 Examples: Vulkan: Reworked buffer resize handling, fix for Linux/X11. (#3390, #2626) 2020-08-21 15:29:57 +02:00
9b50e691ed TreeNode: Made clicking on arrow toggle toggle the open state on the Mouse Down event. Amend 05420ea2c. 2020-08-20 22:38:00 +02:00
97dad66516 Metrics: Various tweaks, listing windows front-to-back, greying inactive items when possible. 2020-08-20 16:49:11 +02:00
9262609eaf Version 1.79 WIP 2020-08-20 16:46:44 +02:00
05a25e5f36 BeginMenuBar: Fixed minor bug where CursorPosMax gets pushed to CursorPos prior to calling BeginMenuBar(), so e.g. calling the function at the end of a window would often add +ItemSpacing.y to scrolling range. 2020-08-20 16:24:54 +02:00
fc9ccad6b9 InputText: Add ImGuiInputTextFlags_CallbackEdit, selection helpers in ImGuiInputTextCallbackData(). Add simple InputText() callbacks demo. 2020-08-20 11:25:39 +02:00
024993adf9 Revert leftovers from 4c201994d4 2020-08-20 11:25:05 +02:00
4c201994d4 DragFloat, DragScalar: Fixed ImGuiSliderFlags_ClampOnInput not being honored in the special case where v_min == v_max. (#3361) 2020-08-20 11:21:15 +02:00
5dc5610ad5 Docs: TODO, FAQ 2020-08-20 11:20:17 +02:00
95c99aaa4b Version 1.78 2020-08-18 17:50:45 +02:00
c6b01e8e1d Drag, Sliders: Merged ImGuiDragFlags back into ImGuiSliderFlags. (#3361, #1823, #1316, #642, #1829, #3209)
Technically API breaking (but ImGuiDragFlags were pushed on master 16 hours ago)
2020-08-18 17:02:58 +02:00
14539b3ed2 Update Emscripten readme about emrun (#3412) 2020-08-18 12:34:19 +02:00
d3fcc37e9e Update Emscripten readme about local XHR requests (#3412) 2020-08-18 12:27:40 +02:00
3c65b650e8 Merge branch 'features/logarithmic_sliders' 2020-08-17 22:11:09 +02:00
f32663b33c Drags, Sliders: Removed locking behavior with min > max (added in 1.73) 2020-08-17 22:10:42 +02:00
7f8f0096d8 Internals: Renamed SliderCalcRatioFromValueT() -> ScaleRatioFromValueT(), SliderCalcValueFromRatioT() -> ScaleValueFromRatioT().
Replaced drag/slider flags with a single bool is_logarithmic in those functions.
2020-08-17 22:10:42 +02:00
fb0f2ebd41 Drags, Sliders: Tweaks. 2020-08-17 22:10:42 +02:00
fa279a6aa0 Drags, Sliders: Added deadzone to make selecting 0.0 on linear sliders easier, slider navigation delta accumulation. (#3361, #1823, #1316, #642) 2020-08-17 22:10:42 +02:00
f75b29e7be Drags, Sliders: Added ImGuiDragFlags_NoInput/ImGuiSliderFlags_NoInput to disable turning widget into a text input with CTRL+Click or Nav Enter. 2020-08-17 22:10:42 +02:00
8018623c5b Drags, Sliders: Added ImGuiDragFlags_NoRoundToFormat / ImGuiSliderFlags_NoRoundToFormat flags (#642) 2020-08-17 22:10:41 +02:00
170d02bd99 Drags, Sliders: Added ImGuiDragFlags_ClampOnInput/ImGuiSliderFlags_ClampOnInput flags to force clamping value when using CTRL+Click to type in a value manually. (#1829, #3209) 2020-08-17 22:10:41 +02:00
7607aea018 Drags, Sliders: Removed power features. Old entry points will pass-through if power=1.0f, otherwise assert + safe fallback. Remove 3 redirection functions (#3361, #1823, #1316, #642) 2020-08-17 22:10:41 +02:00
43c099f31e Drags, Sliders: Logarithmic: Moved flags to internals, allowing 1.0f to pass by. (#3361, #1823, #1316, #642) 2020-08-17 22:10:41 +02:00
152dae9e2a Drags, Sliders: Logarithmic: Split back flags into drag/slider flags. Moved to an obsolete section. (#3361, #1823, #1316, #642) 2020-08-17 22:10:40 +02:00
9f98b4e7f2 Drags, Sliders: Logarithmic: Added logarithmic mode support to drag widgets, extended API to add flags to drag/sliders (#3361, #1823, #1316, #642) 2020-08-17 22:10:40 +02:00
a252a287bf Drags, Sliders: Logarithmic: WIP experiments with trying to make logarithmic sliders sensible (#3361, #1823, #1316, #642) 2020-08-17 22:10:40 +02:00
46d75202b8 Tab Bar: Allow calling SetTabItemClosed() after a tab has been submitted (will process next frame).
+ larger combo height on TabBarTabListPopupButton()
2020-08-17 12:57:47 +02:00
0e5b1ea297 CI: imscripten fastcomp backend is now deprecated (#3402)
Fastcomp backend was introduced here: 14b18697e6
Emscripten changelog: https://emscripten.org/docs/introducing_emscripten/release_notes.html?highlight=2.0.0:%2008/10/2020
Emscripten issue: https://github.com/emscripten-core/emsdk/pull/590

Updated CHANGELOG.txt
2020-08-12 16:26:42 +02:00
214dd68ec1 Comments, clarifying ClosePopupsOverWindow(). 2020-08-11 10:55:53 +02:00
a4dd4d60b4 CI: moved static analysis to a separate project + fix (uninitialized variable, was harmless in this case). 2020-08-10 17:46:02 +02:00
8241cd6284 Make moving window prevent its active id from being stolen (#3392, #3243, #1738)
Amend 7b3d379, 615e9ae3

# Conflicts:
#	imgui.cpp
#	imgui_widgets.cpp
2020-08-10 16:30:23 +02:00
009276b6cb Backends: Allegro 5: Fixed horizontal scrolling direction with mouse wheel / touch pads (#3394, #2424, #1463) [@nobody-special666]
Amend 7dea158175
+ Fix vsproj GUID
2020-08-10 15:31:48 +02:00
209a6a751c Revert "Examples: Switch most VS projects to enable Edit & Continue by default (may need to upgrade projects to latest toolchain)"
This reverts commit a24578ec09.
/ZI not supported on 64-bit on some toolchains, leaving to default is best?
2020-08-10 11:33:59 +02:00
89ac87cd91 Internals: Added SetLastItemData, rename ImGuiItemHoveredDataBackup to ImGuiLastItemDataBackup. 2020-08-10 11:31:55 +02:00
90b152f265 ImFontAtlas: Fixed multiple rebuild with same inputs erroneously increased ConfigDataCount. CI: Update Ubuntu 18.04 > 20.04 (motivated by #3369)
Fix Freetype warning.
2020-08-07 16:27:55 +02:00
ede8825fb2 Examples: Vulkan: Fixed GLFW+Vulkan and SDL+Vulkan clear color not being set. Broken by a06eb833 (#3390) 2020-08-07 15:24:00 +02:00
b15b25bccd TabBar: made a change to that declared ideal width (for auto-resize) won't lag by an extra frame.
Vaguely relate to underlying (uncommited) work for #3291
2020-08-06 16:35:29 +02:00
8074b49148 Selectable: Fixed highlight/hit extent when used with horizontal scrolling (in or outside columns). (#3187, #3386)
# Conflicts:
#	imgui_widgets.cpp
2020-08-05 19:24:07 +02:00
fc61018b1c Demo: Renamed "Layout" -> "Layout & Scrolling". Fixed usage of local struct as template class (c++11). 2020-08-05 17:10:06 +02:00
473a01adb0 Scrolling: Avoid SetScroll, SetScrollFromPos functions from snapping on the edge of scroll limits. (#3379) + Demo: Rename "Layout" to "Layout & Scrolling". 2020-08-05 17:09:40 +02:00
a24578ec09 Examples: Switch most VS projects to enable Edit & Continue by default (may need to upgrade projects to latest toolchain) 2020-08-05 15:02:30 +02:00
db886f3953 Demo: Rework Clipping section. Fix for static analysis. Added bindings in Readme. 2020-08-05 10:43:42 +02:00
963839373c Demo tweaks + general removal of the word dummy were possible with no issues (kept the API call). 2020-08-03 21:31:42 +02:00
55041ac3be Demo: Removed thin triangle and aligned code. 2020-08-03 19:46:26 +02:00
912c45ab23 Demo: Improve "Custom Rendering"->"Canvas" demo with a grid, scrolling and context menu. 2020-08-03 19:46:25 +02:00
4929a8e4a5 InvisibleButton: Made public a small selection of ImGuiButtonFlags (previously in imgui_internal.h) and allowed to pass them to InvisibleButton(). 2020-08-03 18:45:30 +02:00
a876ad877d Window: Fixed clicking over an item which hovering has been disabled (e.g inhibited by a popup) from marking the window as moved.
+ comments
2020-08-03 18:05:20 +02:00
5d87941451 Fixed ImFontConfig::GlyphExtraSpacing and ImFontConfig::PixelSnapH settings being pulled from the merged/target font settings when merging fonts, instead of being pulled from the source font settings. 2020-08-02 12:20:13 +02:00
76ddacd2a1 Internals: Backport HoveredWindowUnderMovingWindow code from Docking branch.
(effectively allowing a window to be a drag payload without have to make it _NoInputs)
2020-07-29 15:32:25 +02:00
218ff3a2a5 Internals: Backport one ->WasActive test in NavRestoreLastChildNavWindow() from 9bf6509c6 + minor/shallow bits from docking branch. 2020-07-29 15:11:24 +02:00
c7f5876f8a Internals: backport window HitTestHole code from docking branch + RenderRectFilledWithHole() helper. (#1512, #3368) 2020-07-29 15:03:52 +02:00
bbd061538c Internals: Drag/Sliders: simplified some code. 2020-07-24 13:00:56 +02:00
b8c22bdb28 DragFloatRange2, DragIntRange2: Fixed an issue allowing to drag out of bounds when both min and max value are on the same value. (#1441) 2020-07-23 19:05:18 +02:00
fdc526e8f8 Stop advertisting for Drag v_min>v_max which was introduced in 1.73 likely for 0537ac00 then made unnecessary with 32c33c66, added undocumented ImGuiItemFlags_ReadOnly as possible replacement (unused), (#211) 2020-07-23 18:19:11 +02:00
b335225caa Internals: Extract ImFontAtlasBuildRender1bppRectFromString() out of ImFontAtlasBuildRenderDefaultTexData() + minor renaming, comments 2020-07-22 17:31:59 +02:00
e223bd8177 ImDrawList: changed AddCircle(), AddCircleFilled() default num_segments from 12 to 0. 2020-07-16 22:25:56 +02:00
4be8155002 Style Editor: Added preview of circle auto-tessellation when editing the corresponding value.. 2020-07-16 21:51:49 +02:00
825f2ae455 Demo: Tweak "child windows" section. (#3318) 2020-07-16 17:20:24 +02:00
eefae08261 Nav: Fixed clicking on void from not clearing focused window. Amend d31fe97f7. (#3344, #2880)
This would be problematic e.g. in situation where the application relies on io.WantCaptureKeyboard flag being cleared accordingly.
2020-07-14 18:36:35 +02:00
550f110354 InputText, ImDrawList: Fixed assert triggering when drawing single line of text with more than ~16 KB characters. (#3349) 2020-07-12 23:51:13 +02:00
fb7f6cab8c Backends: Amend, docs + extra comments. (#3330, #3245) 2020-07-10 14:36:00 +02:00
06f7854b16 Backends: OpenGL3: Add glad 2 to OpenGL loaders. (#3330) 2020-07-10 14:34:25 +02:00
89685b346c ImDrawList: Fixed minor bug introduced in 1.75 where AddCircle() with 12 segments would generate an extra unrequired vertex.
Actual missing code for d3b37180a3, thanks @domgho!
2020-07-09 11:21:31 +02:00
66336528c8 Merge branch 'features/tex_antialiased_lines' (#3245) 2020-07-08 20:20:07 +02:00
3a6c9907cd Texture-based thick lines: Minor tweaks and rename toward merging in master. Changes to allow changing AA_SIZE (disable texture path). 2020-07-08 20:18:41 +02:00
b5bae9781d Texture-based thick lines: Only use textured lines for integer line widths 2020-07-08 17:38:02 +02:00
78d6bdf080 Texture-based thick lines: Remove unnecessary indirection in fetching UV data, removed lerp call, renames, tweaks. 2020-07-08 17:38:02 +02:00
a07c8b6999 Texture-based thick lines: Fixes for AddCustomRect api, add IMGUI_HAS_TEXLINES define (temporarily) to facilitate working with test cases, Demo allows growing FrameBorderSize for testing 2020-07-08 17:38:02 +02:00
21d9e8e1f4 Texture-based thick lines: Simplified line width calculation code and removed hack for thickness 1.0 lines 2020-07-08 17:38:02 +02:00
403bf45245 Texture-based thick lines: Allow interpolation between textures for non-integer line widths 2020-07-08 17:38:01 +02:00
222b7ddbfa Texture-based thick lines: Tweaks, fix for truetype builder. 2020-07-08 17:38:01 +02:00
741ab74b55 Texture-based thick lines: Improvements to code for drawing anti-aliased lines using textures
Moved line width into a constant
Removed test code (now in imgui-tests)
Improved matching between geometry and texture rendering at non-integer sizes
2020-07-08 17:38:01 +02:00
1d3c3070d8 Texture-based thick lines: Initial version of AA line drawing using textures (press SHIFT to enable) 2020-07-08 17:38:01 +02:00
8e4046e13b Atlas build use GetCustomRectByIndex() + comments, rename, and shallow merge from tex_antialiasing_lines branch. 2020-07-08 17:25:40 +02:00
0d03e1fafa CI: Fix emscripten builds that broke due behavior change of emscripten SDK. 2020-07-07 13:06:02 +02:00
a1d2c6fad9 Fixed invalid comment (#3327) 2020-06-30 19:00:31 +02:00
ab4ef822f0 Version 1.78 WIP 2020-06-30 16:56:09 +02:00
0738611559 Misc: Bunch of code formatting changes suggested by a pass running 'astyle' 2020-06-30 16:37:21 +02:00
dca7c3c629 TestEngine: Added hook to notify test engine of a removed imgui context. 2020-06-29 20:16:55 +02:00
9418dcb693 Version 1.77
+ fix minor clang-tidy warnings which seems reasonable
2020-06-29 15:54:28 +02:00
122febcdbf IO: Added storage for PenPressure (unused by core library, to facilitate experiments) (#2372) 2020-06-29 15:03:11 +02:00
dd02a180b5 Windows: Amend 6b0cf2e6 to facilitate working in viewport branch + handle safe area padding and ConfigWindowsMoveFromTitleBarOnly. 2020-06-25 23:04:55 +02:00
6b0cf2e6ae Windows: Fix unintended window size changes when resizing windows close to main viewport edges. 2020-06-25 22:16:19 +02:00
45a7cf47ab FAQ update, removed redundant block in imgui.cpp 2020-06-25 16:44:06 +02:00
fed80b9537 Popups: Changed 'int mouse_buttons' to ImGuiPopupFlags. Added ImGuiPopupFlags_NoOpenOverExistingPopup, ImGuiPopupFlags_NoOpenOverItems. Refactored signature of BeginPopupContextWindow(). 2020-06-23 20:05:15 +02:00
5acf6d861a Popups: Added ImGuiPopupFlags type, ImGuiPopupFlags_AnyPopupId and ImGuiPopupFlags_AnyPopupLevel flags for IsPopupOpen().
# Conflicts:
#	docs/CHANGELOG.txt
2020-06-23 20:00:32 +02:00
1c35750ee0 Added ImGuiCond_None for consistency and for generated bindings needing this for enums mapping. 2020-06-23 19:45:31 +02:00
b83a1f3b00 BeginPopupModal() doesn't set the ImGuiWindowFlags_NoSavedSettings flag anymore, and will not always be auto-centered. (#915, #3091) 2020-06-23 17:52:13 +02:00
68389200c4 Internals: Comments about CalcWrapWidthForPos() (#778) 2020-06-23 16:29:48 +02:00
e0ec69d84b Internals: Added ImageButtonEx() helper to temporarily bypass ID issues (#2464, #1390) 2020-06-23 15:47:07 +02:00
1a1dcea1a0 Internals: Initialize drawlist earlier in Begin() to facilitate detecting accidental draw earlier than legal. (#3311) 2020-06-20 22:04:04 +02:00
99f68d7958 Docs: Added FAQ entries removed old one which is misleading today. Misc tweaks. 2020-06-19 11:34:04 +02:00
9c2a36f573 Internals: clarified the code for ClampWindowRect().
As a side-effect, some rounding error may be neutralized however this isn't the intent. (#3309)
2020-06-19 10:08:05 +02:00
8ead38c100 Clang: Reduce uses of __has_warning for overall sanity, as compilers are hostile to software targetting multiple compiler version. 2020-06-18 17:02:24 +02:00
704723744e Disabled latest overzealous warnings from Clang 2020-06-18 16:19:51 +02:00
b1d8309abc Added ImGuiTabItemFlags_NoTooltip for individual Tab Item. 2020-06-18 15:55:10 +02:00
078571b7a9 Popups: added comments, reorganized the functions in imgui.h 2020-06-16 23:39:00 +02:00
6e138504c1 Popups: Fix BeginPopupContextVoid() when clicking over the area made unavailable by a modal. (#1636) 2020-06-16 19:32:59 +02:00
37eb89371b Popups: Internals: Added IsAnyPopupOpen(). 2020-06-16 18:46:25 +02:00
d31fe97f74 Popups: Fix an edge case where programatically closing a popup while clicking on its empty space would attempt to focus it and close other popups. (#2880) 2020-06-16 17:10:47 +02:00
1dfd0634cb Internals: Allow ItemHoverable() to be used with id==0 to facilitate high-level read-only hover test in widget code. 2020-06-15 22:13:06 +02:00
99ab521024 Renamed OpenPopupOnItemClick() to OpenPopupContextItem(). Kept inline redirection function (will obsolete). + Removed CalcItemRectClosestPoint() entry point 2020-06-15 22:12:38 +02:00
c658cba22b Comments, reworded some !(xxx && xxx) complex expression to be a little less confusing. 2020-06-15 18:06:48 +02:00
90c0c0c163 Columns: Lower overhead on column switches and switching to background channel. (second attempt for 9b3ce49)
Internals: Bits, comments, added ImRect::ToVec4()
2020-06-13 18:04:50 +02:00
d3b37180a3 ImDrawList: Fixed minor bug introduced in 1.75 where AddCircle() with 12 segments would generate an extra unrequired vertex.
Amend 5363af7f47, 051ce0765e
2020-06-13 14:16:29 +02:00
a933cc4f4d Documentation update 2020-06-11 10:21:31 +02:00
64d8d302fb ImDrawList: Fixed VtxOffset change leading to unnecessary leading empty ImDrawCmd in certain cases. 2020-06-10 19:16:14 +02:00
16da8e6da6 Revert "Columns: Lower overhead on column switches and switching to background channel (some stress tests in debug builds went 3->2 ms). (#125)"
This reverts commit 9b3ce494fd.
2020-06-10 17:54:19 +02:00
53f0f97273 Added FAQ entry about DPI. Added Japanese font loading example. 2020-06-09 17:29:26 +02:00
40b799023b Docs: Update fonts.md (#2861) + update all references to FONTS.txt 2020-06-09 16:56:48 +02:00
a72754886f Docs: Initial draft of fonts documentation (#2861) 2020-06-09 16:56:45 +02:00
9b3ce494fd Columns: Lower overhead on column switches and switching to background channel (some stress tests in debug builds went 3->2 ms). (#125)
This change benefits Columns but was primarily made with Tables in mind.
2020-06-08 23:18:23 +02:00
84862ec78e ImDrawList, ImDrawListSplitter, Columns: Fixed an issue where changing channels with different TextureId, VtxOffset would incorrectly apply new settings to draw channels. (#3129, #3163) 2020-06-08 20:58:30 +02:00
3bef743df4 ImDrawList: Clarifying and guarateeing that CmdBuffer.back()->UserCallback should be always be NULL. 2020-06-08 20:58:30 +02:00
b1f2eacdf3 ImDrawList: Prefixed internal functions with underscore, renamed UpdateClipRect() to _OnChangedClipRect(), UpdateTextureID() -> _OnChangedTextureID() 2020-06-08 20:58:30 +02:00
e35a813d57 ImDrawList: Separating PrimXXX sections from more internals helper in the header file. 2020-06-08 20:58:30 +02:00
117d57df5b ImDrawList: Additional comments and extracted bits into ImDrawList::PopUnusedDrawCmd() 2020-06-08 20:58:29 +02:00
a6bb047bab ImDrawList: Store header/current ImDrawCmd in instance to simplify merging code. Amend 0320e72, toward #3163, #3129 2020-06-08 19:36:02 +02:00
57191fe3d0 Comments about limiting WindowRounding to a reasonable size. 2020-06-08 14:17:49 +02:00
f6120f8e16 ImDrawList, ImDrawListSplitter, Columns: Fixed an issue where starting a split when current VtxOffset was not zero would lead to draw commands with wrong VtxOffset. (#259 2020-06-06 21:31:31 +02:00
41f47c853b ImDrawList: Amend 0320e72 removed an unnecessary test. 2020-06-06 20:35:29 +02:00
0320e7257b ImDrawList: Small refactor to create empty command when beginning the frame, allowing to simplify some functions.
+ Missing clearing two fields in ClearFreeMemory() (was hamrless)
2020-06-06 20:27:24 +02:00
003153b3ac ImDrawList: Tweaks to make style consistent (using pointers, same local names). Added comments. Should be no-op. 2020-06-06 20:26:04 +02:00
e22e3f300a ImDrawList: Fixed an issue when draw command merging or cancelling while crossing the VtxOffset boundary would lead to draw command being emitted with wrong VtxOffset value. (#3129, #3163, #3232) 2020-06-06 18:54:53 +02:00
78d5ccfb90 ImDrawList: PushColumnsBackground(): Fixed incorrect assert. (#3163) 2020-06-06 18:54:46 +02:00
5af8a8c7e8 CI: Extra warnings for builds with Clang. Backends: OpenGL3: Fix sign conversion warnings. 2020-06-05 15:50:12 +02:00
dc49b14e29 Misc: Fix examples of using other OpenGL3 bindings in Makefiles. 2020-06-05 14:05:39 +02:00
6eb66fbef3 Backends: Win32: Cache the result of a windows version check. (#3283)
This is not expected to change while the application is running :)
2020-06-05 01:23:18 +02:00
79fbab543d Minor fix to avoid undefined behavior sanitizer triggering (#3276) 2020-06-04 18:59:04 +02:00
53dfccbe4b imgui_freetype: Fix for rare case where FT_Get_Char_Index() succeed but FT_Load_Glyph() fails. (#618) 2020-06-04 17:53:50 +02:00
5e976e9b05 Title capitalization (#3280) 2020-06-03 22:04:14 +02:00
41e8837f59 Comments, adding some spacing in ImVec2() constructors. 2020-06-02 18:13:54 +02:00
3f26a07ee1 Backends: OpenGL: Fixed loader auto-detection to not interfere with ES2/ES3 defines. (#3246) 2020-05-25 18:57:23 +02:00
5ddf60d8ce Commit to facilitate branches merges 2020-05-25 18:28:25 +02:00
a06eb83359 Examples: GLFW+Vulkan, SDL+Vulkan: Fix for handling of minimized windows. (#3259) 2020-05-25 18:15:59 +02:00
6b688561aa CI: Test building without C++ runtime on GCC/Clang. 2020-05-25 14:43:18 +02:00
bb2529dd48 Backends: SDL: Report a zero display-size when window is minimized, consistent with other backends. 2020-05-25 12:26:59 +02:00
a056603d8b Backends: Vulkan: Rename internal helper ImGui_ImplVulkanH_CreateWindow to ImGui_ImplVulkanH_CreateOrResizeWindow 2020-05-25 12:12:02 +02:00
9c209d5a90 Minor amend 9028088 (#3261) 2020-05-25 11:42:45 +02:00
43f79aa210 Backends: OSX: import the glfw workaround to avoid missing mouse clicks. (#3261) 2020-05-25 11:42:45 +02:00
39d17ca07f Examples: Apple: catch events from the right and other mouse buttons when using Cocoa. (#3260) 2020-05-25 11:29:41 +02:00
d29157ce58 Moved static array with non-trivial constructors outside of function seems to remove requirement of linking with libstdc++ on some compilers. 2020-05-24 12:32:31 +02:00
c8cde28cf3 IO: AddInputCharacters function ignore 0 input. (#3252)
Amend ef13d954 + c8ea0a01 (#2541, #2538, #2815)
2020-05-20 17:56:08 +02:00
f44962c01a Backends: Allegro: Don't call AddInputCharacter if the pressed key has no character. (#3252) 2020-05-20 17:48:21 +02:00
75bbbda645 Examples: Update comments to get SDL2 package with msys2's pacman (#3251) 2020-05-20 11:44:00 +02:00
417ac68f82 Internals: AddPolyline: Add spaces for consistency, renaming. 2020-05-18 12:07:53 +02:00
39c978f499 Fix typo/bug introduced by 0679e056 (#3231, #3209, #1829, #946, #413) 2020-05-15 10:51:51 +02:00
476daf9aac Settings: Added ReadInitFn pre-load handler.
(docking branch already has it, so it'll probably conflict with same contents)
2020-05-13 23:51:29 +02:00
5fdfa32cce Update README.md 2020-05-12 15:42:29 +02:00
6b80bd9cc3 Fix GetGlyphRangesKorean() end-range to end at 0xD7A3 (instead of 0xD79D). (#348, #3217)
https://en.wikipedia.org/wiki/Hangul_Syllables
2020-05-11 18:01:42 +02:00
a6f4b0fd70 Nav, Menus: Fix vertical wrap-around in menus or popups created with multiple appending calls to BeginMenu()/EndMenu() or BeginPopup/EndPopup(). (#3223, #1207)
First call to EndPopup() called NavRequestTryWrapWindow() which performed wrap-around operation while we were not done composing menu. This resulted in navigation wrapping around to first item.
Since wrap-around operation is only valid in last call to EndPopup() and there is no way to know which call is last - this operation is delayed to the end of the frame.
2020-05-11 15:30:12 +02:00
7b3d379819 FocusWindow(NULL) correctly steal active id from previous window. (#1738) amend b0a9bbf6 2020-05-08 18:36:05 +02:00
685ca27d84 Backends: OpenGL: On OSX, if unspecified by app, made default GLSL version 150. (#3199) 2020-05-08 17:32:34 +02:00
4f33dd15c4 Internals: stand-in for large branches to facilitate merging. 2020-05-08 17:00:11 +02:00
5f752a5ba9 Internals: shuffling some sections (2) 2020-05-08 16:30:14 +02:00
f466cfc2ca Internals: shuffling some sections, added index. 2020-05-08 16:21:00 +02:00
3aa1684129 Comments 2020-05-08 15:59:59 +02:00
c0d5b3f55a Fix to facilitate branch merges 2020-05-07 23:58:35 +02:00
53ebd6a02f Metrics: Added Table settings block. 2020-05-07 23:54:32 +02:00
d33021d828 Settings: Made it possible to load window .ini data mid-frame. Added clear and post-read handlers. (#2573) 2020-05-07 21:38:04 +02:00
b6a04d7750 Settings: Added Clear Settings in Metrics. (#2188) + Preserve last loaded copy in internal buffer used for save (so it can be browsed easily). 2020-05-07 21:38:03 +02:00
9ee442d3f0 Metrics: Added a "Settings" section with some details about persistent ini settings. InputText: Assert early on null buffer. 2020-05-07 21:34:44 +02:00
510f301c9f Internals: Removed seemingly unnecessary size_on_first_use arg to CreateNewWindow(), extracted code into ApplyWindowSettings. 2020-05-07 21:34:00 +02:00
0679e05677 Internals: Added code in TempInputScalar() to clamp values, NOT used by stock Drag/Float (#3209, #1829, #946, #413) 2020-05-07 12:27:21 +02:00
673d6df85f Demo: Clamping font scale. Added helpers in demo. Comments. Update sponsors. (#3206) 2020-05-07 11:45:41 +02:00
f152fac4f1 Demo: Wrapped many (not all) code and comments lines to 120 characters to fit below GitHub viewer limit. (#3193) 2020-05-05 21:33:16 +02:00
419f905f91 Demo: Extracted some code out of ShowStyleEditor() into NodeFont(). 2020-05-05 19:53:54 +02:00
11a3e75f47 Backends: Win32: Fix _WIN32_WINNT < 0x0600 (MinGW defaults to 0x502 == Windows 2003). (#3183) 2020-05-04 20:46:20 +02:00
b4dd28ffbb Style: Added style.TabMinWidthForUnselectedCloseButton settings.
Set to 0.0f (default) to always make a close button appear on hover (same as Chrome, VS).
Set to FLT_MAX to only display a close button when selected (merely hovering is not enough).
Set to an intermediary value to toggle behavior based on width (same as Firefox).
2020-05-04 14:58:21 +02:00
099091280f Backends: DX10/DX11: Minor tweaks. 2020-05-04 11:40:31 +02:00
1e9abf60d1 Backends: Keep shader blobs as local variables. (#3176) 2020-05-04 11:22:43 +02:00
794bf7a28d CI: Implement builds with IMGUI_DISABLE_WIN32_FUNCTIONS, IMGUI_DISABLE_FILE_FUNCTIONS, IMGUI_USE_BGRA_PACKED_COLOR IM_VEC2_CLASS_EXTRA, IM_VEC4_CLASS_EXTRA and building library as a DLL. 2020-05-04 11:05:07 +02:00
d5ce3b43ae Backends: Vulkan: Fixed error in if initial frame has no vertices. (#3177) 2020-05-04 11:03:41 +02:00
a2454f2a45 Use __NEWLIB__ instead of __SWITCH__ and __CYGWIN__ for alloca.h-detection (#3070)
Cygwin uses newlib, so it's covered by the __NEWLIB__ check.
You can see how it defines __NEWLIB__ here: https://cygwin.com/git/?p=newlib-cygwin.git;a=blob;f=newlib/configure.in#l453
2020-04-28 16:15:00 +02:00
8cbff5ccb2 Fix various typos. (#3161)
(found by Debian's lintian on a package that uses imgui.)
(found by codespell.)
2020-04-28 16:10:15 +02:00
2593b6a1c8 Drag and Drop: Fix unintended fallback "..." tooltip during drag operation when drag source uses _SourceNoPreviewTooltip flags. (#3160) 2020-04-27 13:51:07 +02:00
73c30aa085 Backends: Vulkan: Don't skip drawing when there's no vertexes to ensure that user callbacks are still processed. 2020-04-26 20:26:06 +02:00
d3212482fe Fix multiple macro definitions of GLFW_INCLUDE_NONE (#3157) 2020-04-23 22:58:45 +02:00
5ac5d3674f Removed unncessary ID (first arg) of ImFontAtlas::AddCustomRectRegular() function. 2020-04-23 19:27:04 +02:00
223297b075 Clarified comments about popups input blocking and ImGuiHoveredFlags_AllowWhenBlockedByPopup flag. (#3154) 2020-04-23 16:32:01 +02:00
fd6d3155c0 Fix wrong comment in ImGuiCond_ (#3139) 2020-04-22 10:13:20 +02:00
528b12eb7a Fix glClipControl(GL_UPPER_LEFT) handling in opengl3. 2020-04-22 10:10:51 +02:00
c0283c1289 TestEngine: Changed PushID hooks into GetID(), makes more sense and catches more information. 2020-04-20 11:31:30 +02:00
37f665b619 Backends: Win32: Support for #define NOGDI, won't try to call GetDeviceCaps(). (#3137, #2327) 2020-04-19 17:52:09 +02:00
388bf66247 Fix missing comma in FAQ.md (#3134) 2020-04-17 18:50:33 +02:00
9f9ff84ba1 TestEngine: Added PushID() hooks. 2020-04-16 16:59:46 +02:00
b0e9092d6f TestEngine: Added extra storage and global enable flag. Added missing ItemInfo hooks. 2020-04-16 16:56:15 +02:00
3233fbff0e Internals: Added SetNextWindowScroll() (#1526) 2020-04-16 14:07:58 +02:00
1fd9e131e4 TreeNode: Fixed bug where dragging a payload over a TreeNode() with either _OpenOnDoubleClick or _OpenOnArrow would open the node. (#143) 2020-04-15 13:06:05 +02:00
54b38d88f7 TreeNode: Fixed bug where BeginDragDropSource() failed when the _OpenOnDoubleClick flag is set. Added basic demo code. (Amend 05420ea) 2020-04-15 12:31:51 +02:00
e8c986b34e Version 1.77 WIP 2020-04-14 14:55:50 +02:00
5503c0a12e Version 1.76
+ fixed PVS warning, update demo binaries, update readme image
2020-04-12 20:18:47 +02:00
7ee623d9b1 Internals: FocusScope not inherited by popups, modals. Amend a5041c88 2ebe08be) 2020-04-12 18:58:06 +02:00
ec7294d890 Backends: OpenGL3: Fixed version check mistakenly testing for GL 4.0+ instead of 3.2+ to enable ImGuiBackendFlags_RendererHasVtxOffset, leaving 3.2 contexts without it. (#3119, #2866, #2852) 2020-04-12 18:01:10 +02:00
977ac53dd8 Examples: Win32+DX12: Fixed resizing main window, enabled debug layer. (#3087, #3115) 2020-04-12 09:55:56 +02:00
f7852fa8e8 Internals: Extracted GetWindowScrollbarRect() out of Scrollbar() and tidying up code to make it more obvious how to draw over scrollbars. (#3114) 2020-04-10 11:51:17 +02:00
fb70d90fef Made default clipboard handlers for Win32 and OSX use a buffer inside the main context instead of a static buffer, so it can be freed properly on Shutdown. (#3110) 2020-04-09 13:34:39 +02:00
832fda8488 Fixed stray end of line blanks, added comments in .editorconfig, tweaked some headers. 2020-04-07 14:46:46 +02:00
4e7ceb5f90 Plot: Internals: Added hovered index to PlotEx() function. (#2670) 2020-04-07 12:11:06 +02:00
e9366b4c73 Regretfully moved .gitignore file from examples/ into root directory because OSX keeps pooping its DS_Store/ artifacts everywhere. (#3088) 2020-04-07 11:56:51 +02:00
cc0e43e631 Backends: Comments next to include, misc minor comments/tweaks, fix imgui_impl_osx.h using IMGUI_API instead of IMGUI_IMPL_API. (#3105) 2020-04-07 11:02:43 +02:00
00927105ba Backends: Include imgui.h in implementation headers. (#3105)
Currently, the implementation headers don't include the imgui.h header.
Which means that the compilation will fail if the implementation header
was included before the imgui.h header in the compilation unit. For
instance, a compilation unit with the following will work:

  #include "imgui.h"
  #include "imgui_impl_glfw.h"
  #include "imgui_impl_opengl3.h"

But a compilation unit with the following will fail because IMGUI_IMPL_API
and possibly other symbols will not be defined:

  #include "imgui_impl_glfw.h"
  #include "imgui_impl_opengl3.h"
  #include "imgui.h"

This patch includes imgui.h in the implementation headers to make
inclusions order-invariant, which is a recommended practice.
2020-04-07 11:01:37 +02:00
752436219d Metrics: Made Tools section more prominent, added options, made mesh viewer more accessible. 2020-04-06 18:10:24 +02:00
cc0d4e346a Misc: Added an explicit compile-time test for non-scoped IM_ASSERT() macros to redirect users to a solution + fixed our stb wrappers.
+ Nav: Use nav layer enum, comments.
2020-04-03 12:41:33 +02:00
b7e1b13ca7 Update docs, FAQ, comments (mainly related to io.WantCaptureMouse / WantCaptureKeyboard flags). 2020-04-02 21:53:10 +02:00
11116eee80 Columns: undid the change in 1.75 were Columns()/BeginColumns() were preemptively limited to 64 columns with an assert. (#3037, #125)
Essentially reverting 9d444062f9.
2020-04-02 20:01:48 +02:00
3490046c97 Nav: Disabled clipping g.NavId and fixed interactions with ImGuiListClipper. (#787) 2020-04-02 17:56:35 +02:00
fd56de1144 Nav: Store key mods associated to a nav request (for range_select) + use io.KeyMods.
+ renamed NavScoringRectScreen > NavScoringRect
2020-04-02 17:56:21 +02:00
05420ea2cf TreeNode: Made clicking on arrow with _OpenOnArrow toggle the open state on the Mouse Down event rather than the Mouse Down+Up sequence (this is rather standard behavior). 2020-04-02 14:26:33 +02:00
68c5d030cd Typo in readme (#3078) 2020-03-29 15:34:57 +02:00
ec2a24a5f1 Selectable: Allow using ImGuiSelectableFlags_SpanAllColumns in other columns than first. Comments. (#125) 2020-03-26 20:33:39 +01:00
5be5add1ad Selectable: Removed extraneous WindowPadding.x worth of width when auto-sized selectable label goes off available width (would not be noticeable) + Renamed ImGuiSelectableFlags_DrawFillAvailWidth to ImGuiSelectableFlags_SpanAvailWidth. 2020-03-26 20:15:24 +01:00
b4d1287011 Selectable: Clarifying the code around use of ImGuiSelectableFlags_DrawFillAvailWidth (with intent of trying to remove it).
Amend old 6251d379, 2bcafc86
2020-03-26 17:02:10 +01:00
7c11997bcc Selectable: Fixed honoring style.SelectableTextAlign with unspecified size. (#2347, #2601) 2020-03-26 15:02:03 +01:00
ac2247f551 Selectable: Removed seemingly ineffective text clipping offset in SpanAllColumns handling path + tweaks.
made max_x absolutely to reduce confusion.
amend cf481e1
2020-03-26 14:50:13 +01:00
1d4b5def51 Alter definition of IM_UNICODE_ defines to faclitate C-binding. (#2538, #2541, #2815) 2020-03-25 21:40:20 +01:00
670367e51d Added IMGUI_USE_WCHAR32 instead of "#define ImWchar ImWchar32" to faclitate C-binding. (#2538, #2541, #2815) 2020-03-24 20:15:17 +01:00
f2b01c3436 Changelog, tweak OpenGL3 backends. (#3061), update Gallery thread links. 2020-03-24 18:45:05 +01:00
ac4262ad01 Backends: OpenGL3: Support older 2.x series of glbinding as loader for OpenGL3 (#3061)
This removes the unversioned definition IMGUI_IMPL_OPENGL_LOADER_GLBINDING in favor of two versioned ones to choose explicitly.
References: #2870, 5e2329b98e
2020-03-24 18:36:34 +01:00
4986dba270 Scrolling: Fixed scrolling centering API leading to non-integer scrolling values and initial cursor position. (#3073)
This would often get fixed after the fix item submission, but using the ImGuiListClipper as the first thing after Begin() could largely break size calculations. (#3073)
2020-03-24 11:56:21 +01:00
110f506ec0 Comments in imgui.h 2020-03-19 18:39:43 +01:00
fbc93debf9 Internal: Refactor: Moved NewFrameSanityChecks as ErrorCheckNewFrameSanityChecks() 2020-03-19 12:27:16 +01:00
ccf0cc8584 Added ImGuiKeyModFlags. Added additional checks in EndFrame() to verify that io.KeyXXX values have not been tampered with between NewFrame() and EndFrame(). 2020-03-19 12:24:32 +01:00
d8824f9a9a CI: Clarify purpose of example_null, Changelog 2020-03-19 11:13:52 +01:00
ac5ffffc23 CI: Test builds with freetype on linux. 2020-03-19 11:05:53 +01:00
bdd31ec4db Internal: Refactor: Moved RenderColorRectWithAlphaCheckerboard() to imgui_draw.cpp, tweaked signature. 2020-03-18 22:48:23 +01:00
0bbbbe0f68 Internal: Refactor: Moved RenderArrow, RenderBullet, RenderCheckMark to imgui_draw.cpp, changed RenderCheckMark to avoid using ImGui context 2020-03-18 22:48:22 +01:00
2fd411a83e Support custom stb_rect_pack filename in Freetype (#3062)
Copies the #define magic from imgui_draw.cpp to the imgui_freetype implementation to allow the use of a custom stb rect_pack here as well.
References: fe5347ef94
2020-03-18 22:14:29 +01:00
75a65f6fb0 CI: Test build with large indices, obsolete functions disabled and demo/metrics windows disabled.
+ amend notes
2020-03-17 20:33:28 +01:00
339ffd25a9 Internals: Renamed ImBoolVector to ImBitVector, added low-level loose function to replicate the behavior include a help SetBitRange() function. 2020-03-13 18:50:02 +01:00
1d5612a05e Internal: Added two missing ImVec2 operators for consistency. Split up DragDropWithinSourceOrTarget
ImVec2 *= ImVec2 to match  ImVec2 * ImVec2, likewise with /
2020-03-12 20:58:24 +01:00
b016f1ad70 Examples: SDL+DX11: Fixed resizing main window. Amend (#3057) 2020-03-11 21:22:52 +01:00
a0f01d2290 Improve resizing in dx11 example (#3057)
Make the dx11 example implementation resize the window in a sane way, i.e. not the stretching/scaling the initial render to fit the new window size (current behaviour).
2020-03-11 21:22:52 +01:00
a5041c8820 Focus: Child inherit focus scope from parent (amend 2ebe08be). 2020-03-11 21:07:39 +01:00
9a46a19e99 Internals: Rename ImGuiSelectableFlags_PressedOnXXX to ImGuiSelectableFlags_SelectOnXXX, ImGuiButtonFlags_NoHoveredOnNav to ImGuiButtonFlags_NoHoveredOnFocus. 2020-03-11 21:07:32 +01:00
4a10af2bda Unicode, Windows: Remove stringapiset.h include (breaks vs2010 and seems unnecessary?). (#2541, #2815) 2020-03-11 13:25:50 +01:00
e137db2df7 CI: Enable error on warnings for the extra warnings builds as an experiment. FAQ tweaks 2020-03-10 14:09:47 +01:00
aef057e975 Internals: Added GetInputTextState() + comments. 2020-03-07 15:55:05 +01:00
2dcf8df9f4 Internals: Shuffled some of the windows-specific includes to avoid duplication. Might have undesirable side-effects on some compilers, please report! 2020-03-07 15:51:50 +01:00
de37a0bfab Internals: fix potential warning. Comments around include sections. Moved a few bits. 2020-03-07 15:40:22 +01:00
1b5b87a40e Internals: Added #define NOMINMAX before windows.h include for single-compile-unit builds. 2020-03-07 15:19:51 +01:00
0850b46c88 ImDrawList: Internals: Added IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER setting. 2020-03-03 19:26:27 +01:00
b029182a73 Merge branch 'features/unicode' 2020-03-03 18:59:54 +01:00
897704cb49 Menus: Tweak for first-level menu windows to be positioned regardless of MenuBarHeight() which is not stored in window, allowing undocumented modification of the menu bar height). 2020-03-03 18:57:07 +01:00
a41332453e Unicode: Changelog, comments, minimum CI integration. (#2541, #2538, #2815) 2020-03-03 18:53:29 +01:00
0283a6e566 ImFont: Demo, Store Used4kPagesMap[] map in ImFont to facilitate iteration on all codepoints with a large value of IM_UNICODE_CODEPOINT_MAX. (#2815)
Demo uses IsGlyphRangeUnused()
2020-03-03 18:53:29 +01:00
c8ea0a017d Unicode: UTF32 support improvements (#2541, #2538, #2815)
- Make ImWchar32 unsigned.
 - Fix Win32 version of ImFileOpen by including windows.h sooner.
 - Make ImGuiIO::AddInputCharacterUTF16() more robust by disallowing illegal
surrogate pairs.
 - Allow pushing higher plane codepoints through ImGuiIO::AddInputCharacter().
 - Minor cleaning up in the high-plane Unicode support.
 - Fix Clang -Wunreachable-code warning
2020-03-03 18:53:29 +01:00
6d59653e82 Unicode: full Unicode Support (6 squashed commits) (#2541, #2538)
fix build for WideCharToMultiByte
[3181ff1e] Full Unicode Support
[6c9e73ac] Fix ImTextCountUtf8BytesFromChar and ImTextCharToUtf8, these APIs assume the input is an unicode code point, not UTF-16
[ba85665b] Add AddInputCharacterUTF16 for windows backend to handle WM_CHAR
[fafdcaf0] Use Windows API to convert UTF-16 for ImFileOpen
[dc7d5925] Use windows API to convert UTF-16 for clipboard
2020-03-03 18:53:29 +01:00
8c683de33f Internals: Refactor: Moved get height and contents regions functions, to Layout section. IF YOU GREAT CONFLICTS WHILE MERGING (NOT REBASING) THOSE 6 PREV COMMITS, TRY MERGING THEM INDIVIDUALLY 1 by 1 or 2 by 2 etc. 2020-03-03 17:04:32 +01:00
602df11f19 Internals: Refactor: Moved item width/size functions to Layout section. 2020-03-03 16:28:03 +01:00
6c1810e503 Internals: Refactor: Moved cursor position functions to Layout section. 2020-03-03 16:27:58 +01:00
3ce26f65d4 Internals: Refactor: Moved ItemAdd(), ItemSize(), BeginGroup(), EndGroup(), SameLine(), Indent(), Unindent() to Layout section. 2020-03-03 16:27:49 +01:00
caca55c642 Internals: Refactor: Moved code into a Styling section and some code into the Error Handling section. 2020-03-03 16:03:28 +01:00
2679bee28d Internals: Refactor: Moved code out of NewFrame() into UpdateTabFocus() and UpdateSettings() 2020-03-03 16:03:28 +01:00
095dc996b0 Disable deprecated-enum-enum-conversion (#3040, #2983) 2020-03-02 16:13:48 +01:00
628614c6ea Demo: Remove unnecessary code added by 24bd33ac. 2020-03-02 15:49:51 +01:00
24bd33ace8 Menus: Some renaming, comments, add to demo. Amend 0342a3c. (#1207) 2020-02-28 16:42:24 +01:00
0342a3c548 Menus: Implement BeginMenu() appending to existing menu when executed with same ID multiple times. (#1207) 2020-02-28 16:35:33 +01:00
898e91f20d Internals: Added TempInputText() to facilitate creation of custom widgets, renamed TempInputTextScalar() to TempInputScalar() etc. (#2718)
+ Minor imgui.h/todo comments
2020-02-25 21:34:02 +01:00
e547f898a9 Demo: Added color gradient in demo to identify srgb/linear issues better. Tweaks. 2020-02-24 12:44:19 +01:00
0345324646 Backends: SDL: Fixed mapping for ImGuiKey_KeyPadEnter. (#3031) [@Davido71] 2020-02-20 12:28:06 +01:00
02a6c06080 Window: Fixed a bug with child window inheriting ItemFlags from their parent when the child window also manipulate the ItemFlags stack. (#3024) [@Stanbroek]
Amend f843facba4 and 8828889d5e
2020-02-18 14:25:50 +01:00
ea3fc76038 BeginMenu: Fixed a bug where SetNextWindowXXX data before a BeginMenu() would not be cleared when the menu is not open. (#3030) 2020-02-18 12:49:02 +01:00
8836975dcf Drag and Drop, Nav: Disabling navigation arrow keys when drag and drop is active. (#3025) 2020-02-17 18:28:01 +01:00
b62f1ea8e9 Fix zealous PVS studio warnings. Minor tweaks. 2020-02-17 16:17:46 +01:00
09329ea4e6 Fix Clang 9.0 zealous warnings 2020-02-17 15:29:59 +01:00
ceec3cd3fd Backends: Win32: Added ImGui_ImplWin32_EnableDpiAwareness(), ImGui_ImplWin32_GetDpiScaleForHwnd(), ImGui_ImplWin32_GetDpiScaleForMonitor() helpers functions.
(backported from the docking branch)
2020-02-17 11:15:40 +01:00
8601187fee Backends: Win32: Clarify how the WndProc handler requires a forward declaration. 2020-02-17 10:22:39 +01:00
f339b24b3a Links, alphabetical order 2020-02-12 16:19:54 +01:00
2bc3a92f96 Update README.md 2020-02-12 16:10:58 +01:00
b4ac420fc5 Demo: Amend d284a6c (#2149, #515) 2020-02-11 19:31:53 +01:00
d284a6cffc InputText: Fixed password fields displaying ASCII spaces as blanks. Fixed non-ASCII space occasionally creating unnecessary empty polygons. (#2149, #515) 2020-02-11 19:28:11 +01:00
ccaec1a270 Version 1.76 WIP 2020-02-11 16:56:56 +01:00
30bb15672d Remove trailing spaces 2020-02-10 23:22:03 +01:00
70975fe44d Demo: Added a black and white gradient to Demo>Examples>Custom Rendering. 2020-02-10 22:08:52 +01:00
d8948b5343 ColorButton: Added ImGuiColorEditFlags_NoBorder flag to remove the border normally enforced by default. 2020-02-10 21:24:03 +01:00
21b9e42964 Minor fixes to example_sdl_metal and a changelog entry.
Add example_sdl_metal to CI builds.

Closes #3017.
2020-02-10 16:53:37 +01:00
f346b4b302 Examples: SDL+Metal example. 2020-02-10 16:53:27 +01:00
d16c87a5b1 Internals: Minor renaming 2020-02-10 16:46:51 +01:00
58b3e02b95 Version 1.75
Comments
2020-02-10 14:02:41 +01:00
d37d25470a Added IMGUI_DISABLE compile-time definition to make all headers and sources empty. 2020-02-09 17:08:33 +01:00
f694244dec InputText: Fix using a combination of _CallbackResize + _EnterReturnsTrue + lack of persisting user storage. (#3009)
Amend 24ff25981 (#2006, #1443, #1008)
2020-02-04 15:19:49 +01:00
bdbb2b21f5 Fix 83efdcec from overflowing buffer + make it a single undo records + comments (#3008) 2020-02-03 17:39:20 +01:00
83efdcec8d Canceling text input with [esc] key uses stb_textedit facilities to restore original value. This makes restoration undoable using hotkeys.
Fixes #3008.
2020-02-03 15:50:17 +01:00
5a437f198c Internals: GetItemStatusFlags(). Added Comments. 2020-02-02 21:01:22 +01:00
fc42528f13 When testing for the presence of the ImGuiWindowFlags_NoBringToFrontOnFocus flag we test both the focused/clicked window (which could be a child window) and the root window. 2020-01-31 18:28:49 +01:00
fc41839cab Focus: Reworking FocusWindow() so in Docking branch we can fix CTRL+Tab being out of order on Docked windows because WindowsFocusOreder is poorly maintained.
When merging this and d9bca0d8 in Docking we'll replace two ocurrences of RootWindow with RootWindowDockStop.
2020-01-31 18:27:40 +01:00
fb257eef3e Internals: Update ->RootWindow and other links before applying the SetNextWindowXXX stuff. This is so FocusWindow() can always assume that ->RootWindow != NULL. 2020-01-31 18:25:57 +01:00
d9bca0d853 Nav: Fixed a bug where the initial CTRL-Tab press while in a child window sometimes selected the current root window instead of always selecting the previous root window. (#787) 2020-01-31 14:42:59 +01:00
d19297e2fa InputTextMultiline: Provide label to BeginChildEx so internal window name hold a little more context. 2020-01-31 14:42:59 +01:00
47fab0e166 Misc renaming, comments. Docs: add missing spacing to Changelog. 2020-01-31 14:42:59 +01:00
9cff4d6e5e Columns: ImDrawList::Channels* functions now work inside columns.
Use a private splitter in columns, paving way for removal of obsolete ImDrawList::Channels* functions.
2020-01-31 12:02:56 +01:00
05a49f0413 Examples: Emscripten: Demonstrating embedding fonts in Makefile and code. (#2953) [@Oipo] 2020-01-30 17:15:15 +01:00
8cbb693f47 Emscripten: Allow filesystem support. (#3005)
Filesystem functions perfectly work for Emscripten platform. This changes remove extra changes added by #2734.
You can still disable filesystem functions by defining IMGUI_DISABLE_FILE_FUNCTIONS.
2020-01-30 16:26:09 +01:00
6e1f8be07b Window: Fix SetNextWindowBgAlpha(1.0f) failing to override alpha component. (#3007) 2020-01-30 15:13:36 +01:00
0a23582718 Examples: VS projects: Removed inconsistent/extraneous explicit linkage to imm32. 2020-01-29 20:11:42 +01:00
0e89041997 Internals: ButtonEx, ButtonBehavior can support multiple mouse buttons. 2020-01-29 18:55:49 +01:00
5f4dfad5b7 Merge misc/shallow changes from Docking to reduce drift.
Most are comments. Fix menu bar clipping: 07ff47bf1b
2020-01-28 20:06:34 +01:00
6c1a73774d Tooltip: Testing DragDropWithinSourceOrTarget in BeginTooltipEx() instead of just BeginTooltip() - feel this was an overlook. Added tooltip flags instead of using bool. 2020-01-27 22:02:43 +01:00
4d4e3b97f4 TODO, Readme
(dropped TreeNode_NoIndent flag from todo, as it feels unnecessary)
2020-01-27 12:37:06 +01:00
b887259974 Bindings: Improved FreeGLUT support for MinGW (#3004) 2020-01-27 12:11:29 +01:00
f6da5000bf Backends: OpenGL2: Explicitly backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications. (#3000) 2020-01-23 16:20:37 +01:00
5363af7f47 AddCircle, AddCircleFilled: Add auto-calculation of circle segment counts (amends)
Tweak default max error value, Changelog, comments, path-fast for 12 segments circles, made LUT store ImU8
2020-01-23 14:55:05 +01:00
051ce0765e AddCircle, AddCircleFilled: Add auto-calculation of circle segment counts 2020-01-23 14:52:48 +01:00
2eda3585e7 Fixed hoverable/focus bug introduced in 3fe6ae97 (#2997)
+ ArrowButtonEx() internal bits.
2020-01-22 15:20:49 +01:00
7a22767483 CI: Add MSVC extra warnings build and correct labels of other extra warnings builds. 2020-01-22 14:17:03 +01:00
3fe6ae9732 Internals: Move some Nav functions and members around (no functional change) + Misc comments 2020-01-20 18:19:03 +01:00
0a3df4b2ce Update FAQ.md 2020-01-20 14:28:01 +01:00
15c6abe4be Internals: Standard math functions default redirection uses a define instead of an extraneous inline function call 2020-01-20 11:48:17 +01:00
8bcac7d95c Backends: GLFW, SDL: report Windows key (io.KeySuper) as always released.
Neither GLFW nor SDL can correctly report the key release in every cases (e.g. when using Win+V) causing problems with some widgets. The next release of GLFW (3.4+) will have a fix for it. However since it is both difficult and discouraged to make use of this key for Windows application anyway, we just hide it. (#2976)
2020-01-17 15:18:33 +01:00
e499497ec5 Backends: Win32: Added support for io.KeySuper (Windows key) for consistency with other backends. (#2976)
Even if realistically it is difficult to make good use of under Windows.
+ Style editor: Use a more explicit form of RadioButton() to avoid being depending on underlying flags type. (#2983)
2020-01-17 15:06:22 +01:00
2478dbfdb7 Disable warning C5054 introduced in VS 2019 16.2 (#2983) 2020-01-17 14:18:16 +01:00
6c00d1916e Disable format checks when using stb_sprintf.h
STB sprintf allows extra formats like %b or %$d. If ImGui is configured
to use STB sprintf, it generates warnings with GCC and clang when using
such formats because it keeps applying default printf-style warnings.
This commit disables printf-style warnings when using STB sprintf.

Since the printf-style warnings are defined in imgui.h based on the
compiler, IMGUI_USE_STB_SPRINTF can't just be defined in the cpp file
anymore and it's been moved as a proper config in imconfig.h.
2020-01-17 13:27:51 +01:00
aa34681652 Backends: GLFW: inhibit error callback when creating cursors because X11 setups may be missing them + comment (#2980) 2020-01-17 11:36:56 +01:00
9ad4c5da7e Fix zealous warnings + Internals: Renamed members from XxxxID to XxxxxId to be more consistent with rest of the codebase (still some inconsistency left that are harder to fix) 2020-01-16 23:44:05 +01:00
f6d6880a61 Internals: Nav: PushFocusScope, PopFocusScope, GetFocusScopeID() helpers 2020-01-14 20:34:26 +01:00
2ebe08be40 Focus, Nav: Merged bits from RangeSelect features to enable early manipulation of focus scope for styling purpose.
FocusScopeId is tracked by nav scoring/request and stored in result.
It's all rather WIP and we should reorganize the SetNavIDXXX functions fiasco at some point (soon?).
Didn't separate FocusScope from SelectionScope for now, will re-investigate this later, this is the minimum commit to be able to do some styling.
2020-01-14 19:25:20 +01:00
4f7bf7e96a Backends: Win32: Added support for #define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD and IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT. (#2716) 2020-01-14 14:58:36 +01:00
e2eb0b4bc4 Internals: Begin tries to setup WindowTemp/DC members in same order as their declaration. Readme: remove Coverity banner (PVS is better) 2020-01-13 16:50:56 +01:00
02c2d18aa3 Internals: Renaming and marking of legacy focus/tabbing system 2020-01-13 15:21:37 +01:00
52334ad8df Internals: Minor ordering/comments of ImGuiWindowTempData. 2020-01-13 15:04:28 +01:00
f56962cb9a ColorEdit: "Copy As" context-menu tool shows hex values with a '#' prefix instead of '0x' + both with/without alpha when available. 2020-01-13 14:09:42 +01:00
ff5299e0e0 Docs: FAQ, Comments. 2020-01-12 22:09:18 +01:00
4b3c5ff5f1 Comments + minor moving 2020-01-11 16:08:17 +01:00
f03c00bc89 Added imgui_single_file.h, We use this to validate compiling all *.cpp in same compilation unit.
Removed Unity builds stuff from example_null/. CI builds a temporary .cpp file.
2020-01-10 19:04:35 +01:00
97a8dc6514 CI: Added PVS-Studio static analysis on the continuous-integration server. 2020-01-10 16:58:39 +01:00
ae1e3619f6 Disable some PVS studio warnings.
V1048: While they are technically correct we want to emphasize assigned values must remain same.
2020-01-10 15:20:08 +01:00
4ee7aa72e9 ButtonBehavior: Default assignment of pressed behavior now also test for ImGuiButtonFlags_PressedOnDragDropHold which wasn't the case before. 2020-01-10 14:35:03 +01:00
1eb71fc72b ButtonBehavior: Added ImGuiButtonFlags_PressedOnClickReleaseAnywhere behavior (#2971)
Rearranged flags. Added tests in 'widgets_button_press'
2020-01-10 14:34:15 +01:00
00c515f51a Add glbinding build sample to Makefiles of GL3 examples. (#2870) 2020-01-09 16:26:42 +01:00
f9630e60c5 Metrics: Fix not being able to expand "ParentWindow" when parent window is same as root window. 2020-01-07 21:32:00 +01:00
1db78b8ca7 Renaming + missing initialization + missing Changelog update. 2020-01-07 21:26:16 +01:00
32c33c6659 ColorEdit: Preserve last saturation value when V=0. Disable Hue editing lock.
This workaround is no longer necessary because preserving hue value prevents it from resetting when it is edited in said condition.
2020-01-07 21:26:15 +01:00
5e2329b98e Backends: GL3: Implement glbinding opengl loader support. (#2870) 2020-01-07 21:06:37 +01:00
e254167afd ColorEdit: Fix label alignment when using ImGuiColorEditFlags_NoInputs. (#2955) 2020-01-06 16:26:14 +01:00
d581939387 Removed trailing spaces. 2020-01-06 15:24:16 +01:00
22d7f26e06 Tweak wording
Remove Patreon
2020-01-06 12:55:01 +01:00
0dd02dd90d Happy new year!
Comments, Replaced pictures, Removed Patreon
2020-01-06 12:41:37 +01:00
2b10e06555 Fix a typo 2020-01-04 17:29:51 +01:00
dc66f83db8 Additional duplicated comments about usage of std::string and input text resize callback (#2006, #1443, #1008) 2019-12-25 17:46:35 +01:00
854fc08194 Amend f70204f2 to facilitate merges. 2019-12-20 16:34:07 +01:00
061650bd2a Update Readme 2019-12-19 22:14:28 +01:00
f70204f2f4 Minor bits, placeholder aimed at facilitating merging of Tables branch into Docking 2019-12-19 16:53:44 +01:00
e01fb5462d Internals: Separator: Simplify duplicated code. 2019-12-18 18:26:28 +01:00
a610f1da52 Bezier Tweaks, fixed parameter order of 3831d50 2019-12-17 16:43:05 +01:00
3831d50ab9 Add ImBezierClosestPoint() function which returns a point on bezier curve which is closed to a specified point. 2019-12-17 16:22:02 +01:00
0f7105e156 Backends: SDL: Wayland: Use SDL_GetMouseState (amend 78ff147) (#2800, 2802) 2019-12-17 14:35:45 +01:00
78ff147181 SDL: On wayland use SDL_GetMouseState (#2802)
When the SDL Video backend is set to wayland the function
`SDL_GetGlobalMouseState` does not work. Most probably a security measure
for programs to not grab everything the user does
https://wiki.libsdl.org/SDL_GetGlobalMouseState

using SDL_GetMouseState https://wiki.libsdl.org/SDL_GetMouseState works
on wayland
2019-12-17 14:33:36 +01:00
9d444062f9 Limiting Columns()/BeginColumns() api to 64 columns (#125)
While the current code technically supports it, future code may not so we're putting the restriction ahead.
2019-12-17 13:25:46 +01:00
10fdc03a46 Clarification about Im helpers + moving GetColorXXX functions outside of that block. 2019-12-17 13:19:36 +01:00
3a800f2dc9 DragFloat: Mention usage of FLT_MAX, INT_MAX etc. explicitly. (#2931) 2019-12-13 11:56:51 +01:00
43bd80a40d Internals: Breaking: ImRect() default constructor initializes all fields with 0.0f
Instead of (FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX). Previous behavior was designed for adding into a bounding box but rarely relied on and not worth it.
2019-12-13 11:56:00 +01:00
6fdde67be2 Documentation, FAQ, todo tweaks 2019-12-10 13:37:29 +01:00
0e74103659 ImDrawList: Add AddNgon(), AddNgonFilled() API. 2019-12-09 11:23:06 +01:00
f9c26d23de Removed redirecting functions/enums that were marked obsolete in 1.53 (December 2017).
Comments
2019-12-08 16:38:27 +01:00
e42c1e1668 Exposed IMGUI_DEBUG_PARANOID in imconfig.h + using a #define with no value to match other uses in imconfig.h 2019-12-08 16:12:44 +01:00
697f15e339 Added PrimUnreserve() API. Obsoleted calling ImDrawList::PrimReserve() with a negative count. 2019-12-08 16:06:32 +01:00
e4a59d0025 TabItem: honor ImGuiTabItemFlags_NoCloseButton passed as parameter (although undocumented and part of private api) (#2923) 2019-12-07 16:22:07 +01:00
f656e7775e Inputs: Added ImGuiMouseButton enum for convenience (e.g. ImGuiMouseButton_Right=1).
We forever guarantee that the existing value will not changes so existing code is free to use 0/1/2.
2019-12-06 16:29:36 +01:00
6cbed03d4a Comments, clarified mouse button ordering. 2019-12-06 16:29:32 +01:00
03b7170dac Backends: GLFW: Added workaround for people who use development version of GLFW which is older than commit that added required cursor support. (#2922) 2019-12-06 15:12:26 +01:00
7ff13f4ee1 Examples: Explicitly adding -DIMGUI_IMPL_OPENGL_LOADER_GL3W to Makefile to match linking settings
(otherwise if another loader such as Glew is accessible, the opengl3 backend might automatically use it). [#2919, #2798]
2019-12-06 10:43:27 +01:00
b521cd357d Removed implicit default parameter to IsMouseDragging(int button = 0) to be consistent with other mouse functions.
(none of the other functions have it).
2019-12-05 18:33:36 +01:00
6d9a54a904 Examples: Metal: Wrap main event loop body in an @autoreleasepool block to ensure allocations get freed even if underlying system event loop gets paused due to app nap (#2910, #2917) 2019-12-05 15:50:33 +01:00
8342e5b91a Amend previous commits (added ImGuiMouseCursor_NotAllowed enum + new cursors in GLFW 3.4)
Amend b5cad20d79, 945a509773
+ unrelated minor typos
2019-12-05 15:45:30 +01:00
945a509773 Implement ImGuiMouseCursor_NotAllowed mouse cursor. 2019-12-05 15:32:10 +01:00
b5cad20d79 Implement new GLFW 3.4 resizing cursors. 2019-12-05 15:27:09 +01:00
abaf0256b8 Version 1.75 WIP
Added message to font file loading assert.
2019-11-28 20:58:16 +01:00
bf6d1ba3d1 CI: Add 32/64 bit build variations to builds with extra warnings. 2019-11-27 16:20:19 +01:00
1742ca45c5 CI: Add unity builds test. (#2893) 2019-11-27 16:18:52 +01:00
a8092085b1 Internal: Added unused parameter named to facilitate cimgui parsing of imgui_internal.h
https://github.com/cimgui/cimgui/issues/108
2019-11-27 14:02:05 +01:00
f60518b430 Update FAQ.md 2019-11-26 16:28:49 +01:00
bdce833636 Version 1.74 2019-11-25 18:38:53 +01:00
26d177bc03 Docs: Moved misc/fonts/README.txt to docs/FONTS.txt. + tweaks 2019-11-25 18:29:28 +01:00
1615e9ea2a CI: Enable extended warnings in example_null builds.
CI: Add MinGW build with extra warnings on windows.

(cherry picked from commit ebc98c273054d0f9b305a1346db98052616a8b21)
2019-11-25 16:38:21 +01:00
bbe0409942 Metrics: Show wire-frame mesh and approximate surface area when hovering ImDrawCmd. Amend aeb5795.
Internals: Added ImTriangleArea()
2019-11-25 12:01:04 +01:00
aeb57952d6 Added area calculation for draw lists in metrics
Added ability to hover over a draw list's summary stats and see all the contents in wireframe

(cherry picked from commit fd808347bd68a07ad318af6c151028bc9f7b82e7)
2019-11-25 11:10:00 +01:00
0cb1c633ff Demo: tweaked demo help section, reference to "Examples" and "Tools". Reference to Keyboard navigation. Removed some of the more "obvious/standard" controls. 2019-11-24 23:11:53 +01:00
b205ab01f2 Internals: Added IM_ASSERT_PARANOID, IMGUI_DEBUG_PARANOID define. Shuffled a bit of the macros section in imgui_internal.h 2019-11-22 14:45:44 +01:00
51e2e9b239 ImVector: Added shrink() helper. ImFont::RenderText minor optimisation for debug build. Misc: Metrics shows tab names because we now have them. 2019-11-22 14:06:51 +01:00
51a02b319c Added IM_UNICODE_CODEPOINT_MAX. Changed specs of ImFontAtlas::AddCustomRectRegular() (breaking change). 2019-11-21 14:13:17 +01:00
ca63349eb4 Renamed XX-bits -> XX-bit in comments to match what the world appears to be using. 2019-11-20 11:58:25 +01:00
a899c1e570 Internals: Using ImU64 for internal ImFile api so we can later wrap them to fseeko/ftello//_fseeki64/_ftelli64 (#2734) 2019-11-20 10:40:14 +01:00
ecbedc8c26 Tweaks, ammend 93efa54, rename to IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS (#1038) 2019-11-19 21:29:12 +01:00
4e90906b04 Added IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS / IMGUI_DISABLE_FILE_FUNCTIONS #2734)
Using in Emscripten example.
2019-11-19 21:14:44 +01:00
93efa5415f Renamed IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS to IMGUI_DISABLE_DEFAULT_FORMAT_STRING_FUNCTIONS. (#1038)
Renamed IMGUI_DISABLE_MATH_FUNCTIONS to IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS.
2019-11-19 20:53:17 +01:00
9efaf2828b Doc comments. Removed .ini parsing code from 1.53 that parsed entries without the [Window] tag (which enabled importing an old .ini file) 2019-11-19 19:39:46 +01:00
ca30ef4269 Drag and drop: Increase local payload buffer from 8 to 16 bytes. 2019-11-15 18:36:06 +01:00
7e232092a6 Internals: Added GetWindowResizeID(), renamed GetScrollbarID() to GetWindowScrollbarID(). Using integer for resize ID so they matches regardless of the pointer size.
Internals: Renamed IMGUI_USER_ERROR to IM_ASSERT_USER_ERROR().
2019-11-15 16:59:43 +01:00
8f40020ca6 Disable Win32 clipboard and IME functions when build target UWP (#2892, #2895) 2019-11-15 12:19:44 +01:00
be05e12e21 Misc: Using static_assert() when using C++11, instead of our own construct (avoid zealous Clang warnings). 2019-11-14 18:02:18 +01:00
b23dcab6e1 Fix 25eee91 incorrect assert when ending a child-popup (rarely used but used by sub-nenus) 2019-11-14 16:06:39 +01:00
be436e2b0b Fix HelpMarker() symbol collision for unity builds (#2893) 2019-11-13 22:04:16 +01:00
03852470de Internals: Routing recoverable user errors via IMGUI_USER_ERROR() macro. (#1651) 2019-11-13 21:58:18 +01:00
25eee91542 Error handling: Assert if user mistakenly calls End() instead of EndChild() on a child window. (#1651)
Internals: Moved some error handling code.
2019-11-13 21:51:38 +01:00
b138f8cbcd Internal: Nav rename preparing for nav inputs ownership changes. IsNavInputPressed() -> IsNavInputTest() 2019-11-13 21:02:25 +01:00
7c441e37fa CI: Update jobs to MacOS latest (Catalina)
Metrics: Added description to Item Picker.
2019-11-13 20:34:55 +01:00
6e8e2c0fa9 Scrollbar: Fixed an issue where scrollbars wouldn't display on the frame following a frame where all child window contents would be culled.
Demo: Fixed a small bug with scrolling demo.
Metrics: Tweaks.
2019-11-08 19:01:54 +01:00
57dc34f4e8 TreeNode: Added IsItemToggledOpen() to explicitly query if item was just open/closed, facilitating interactions with custom multi-selections patterns. (#1896, #1861) 2019-11-08 15:30:15 +01:00
011d475532 TreeNode: The collapsing arrow accepts click even if modifier keys are being held, facilitating interactions with multi-select patterns. (#2886, #1896, #1861) 2019-11-08 15:30:15 +01:00
037126ee0e TreeNode: Reworded code for ImGuiTreeNodeFlags_OpenOnArrow (follow up to f79b2d6c) to make it lightweight. Should be a no-op from user's point of view. Will facilitate using the arrow hovering information in the hot path. (#2886) 2019-11-08 15:00:28 +01:00
d003674f2c Internals: Added ImChunkStream, used by window settings. (more generic followup to 4c13807, the class will be used more extensively by Tables) 2019-11-07 16:05:03 +01:00
a337e219b6 Internals: ImPool: Renaming. 2019-11-07 16:04:51 +01:00
28f1d60de1 Internals: Renaming + added ImStrSkipBlank() from docking branch.
(cherry picked from commit a573943fa0ce323ffb4080e57f5e8fe1bc777c36)
2019-11-06 23:37:35 +01:00
09b2310237 Internals: Added index of helpers and shuffled a few things. 2019-11-06 20:37:47 +01:00
4c13807b7d Misc: Optimized storage of window settings data (reducing allocation count). 2019-11-05 22:43:53 +01:00
3929255b77 Examples: Emscripten: Removed BINARYEN_TRAP_MODE=clamp from Makefile which was removed in Emscripten 1.39.0 but required prior to 1.39.0, making life easier for absolutely no-one. (#2877, #2878) [@podsvirov] 2019-11-05 12:53:30 +01:00
916487a653 example_emscripten: skip outdated compiler option
For more info see: https://github.com/ocornut/imgui/issues/2877
2019-11-05 12:43:15 +01:00
bff2d5d5e2 Update README.md 2019-11-05 11:41:02 +01:00
c9182424a8 Normalize all the line endings.
(cherry picked from commit f1772d44be09fd78bf5f1ebda44b39b96180d319)
2019-11-04 15:28:31 +01:00
c9ffa62e1f Add .gitattributes with rules for line endings of files.
(cherry picked from commit f2a2be72b341f55c44a035b1257177d83489ea5c)
2019-11-04 15:28:25 +01:00
bcd752cfcc CI: Fix emscripten builds after portable SDK archive became unavailable.
(cherry picked from commit 14b18697e653de80f75af18113033b2086846194)
2019-11-04 15:17:06 +01:00
792a8631aa Metrics: Expose basic details of each window key/value state storage. 2019-10-31 14:01:35 +01:00
8fee5a4349 Internals: Renaming for consistency. 2019-10-31 11:15:40 +01:00
5006639526 CI: Add scheduled builds and limit some examples to build only on schedule in order to decrease time of builds performed on each push.
(cherry picked from commit 6c0e1baca29b853586dadf75eb32ef75e2725f10)
2019-10-30 15:58:03 +01:00
5ebd4e4c6e CI: Install SDL SDK in windows workers and add SDL examples to the build.
CI: Add Vulkan GLFW and SDL builds to windows build job.
2019-10-30 15:58:03 +01:00
a4420be1a2 CI: Split builds of examples into separate jobs.
(cherry picked from commit ee73b1b5a47f176ab123239aa3cbcc2cdf284383)
2019-10-30 15:57:16 +01:00
9f979c33f4 CI: Fix builds failing because of missing v140 toolset and SDK on dx12 sample.
(cherry picked from commit 8d91a77e9b42eac7a6d7d28c8563ccc468842e8b)
2019-10-30 15:57:09 +01:00
d62a413476 Misc: Windows: Do not use _wfopen() if IMGUI_DISABLE_WIN32_FUNCTIONS is defined. (#2815) 2019-10-29 21:47:43 +01:00
6bf5aed325 Declaration and assignment can be joined, Member function may be 'const'. (#2875) 2019-10-29 17:11:49 +01:00
c863c1f6a1 Clean up number rounding. Now it is more obvious what code is doing. (#2862)
Add IM_ROUND() macro
Replace IM_FLOOR(n + 0.5f) and ImFloor(n + 0.5f) with IM_ROUND(n)
2019-10-29 17:05:25 +01:00
0b2d35f63f Fix snprintf and vsnprintf definition inconsistencies. 2019-10-28 13:58:32 +01:00
4e56de757c Doc: Promote Discord over Discourse. Obsoleting Discourse server. 2019-10-25 15:36:37 +02:00
f002a11898 Backends: OpenGL3: Fix building with pre-3.2 GL bindings which do not expose glDrawElementsBaseVertex(), using runtime GL version to decide if we set ImGuiBackendFlags_RendererHasVtxOffset. (#2866, #2852) [@dpilawa] 2019-10-25 11:56:44 +02:00
4d0c88e9e6 Backends: GL3: Fix compile for < 3.2 bindings where glDrawElementsBaseVertex is not available. (#2866, #2852) 2019-10-25 11:42:55 +02:00
9b323a7ebf SplitterBehavior: not using FrameRounding in render (was in first commit of the function, not sure why). (#319) 2019-10-25 11:05:14 +02:00
3c238ecae3 Move issue_template and pull_request_template to .github folder. 2019-10-24 11:26:45 +02:00
d5b5a81946 GitHub Actions CI script for Windows/Linux/MacOS/iOS/Emscripten builds. 2019-10-24 11:24:54 +02:00
24e9a6e92c Remove .travis.yml due to switching to github actions. 2019-10-24 11:24:54 +02:00
ec0e953cca Fixed a couple of subtle bounding box vertical positioning issues relating to text baseline alignment.
The issue would generally manifest when laying out multiple items on a same line, with varying heights and text baseline offsets. (#2833)
Some specific examples, e.g. a button with regular frame padding followed by another item with a multi-line label and no frame padding, such as: multi-line text, small button, tree node item, etc. The second item was correctly offset to match text baseline, and would interact/display correctly,but it wouldn't push the contents area boundary low enough.
Note: previously the second parameter to ItemSize() was 0.0f was default, now -1.0f to signify "no text baseline offset request". If you have code using ItemSize() with an hardcoded zero you may need to change it. (+1 squashed commits)
2019-10-23 18:05:44 +02:00
75d540d336 Example: Emscripten: Fix for compilation (filesystem module is required) (#2734) 2019-10-23 16:55:26 +02:00
be9f1e8f00 ColorPicker: Fixed SV triangle gradient to block (broken in 1.73). (#2864, #2711). [@lewa-j] 2019-10-23 00:43:40 +02:00
23c1ff4907 Removed redirecting functions/enums names that were marked obsolete in 1.52 (October 2017).
- Begin() [old 5 args version]     -> use Begin() [3 args], use SetNextWindowSize() SetNextWindowBgAlpha() if needed
- IsRootWindowOrAnyChildHovered()  -> use IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows)
- AlignFirstTextHeightToWidgets()  -> use AlignTextToFramePadding();
- SetNextWindowPosCenter()         -> use SetNextWindowPos() with a pivot of (0.5f, 0.5f)
- ImFont::Glyph                    -> use ImFontGlyph
If you were still using the old names, read "API Breaking Changes" section of imgui.cpp to find out the new names or equivalent features, or see how they were implemented until 1.73.
2019-10-22 14:45:11 +02:00
048b73dfaa Various comments + Doc: Examples readme. Moved main menu bar code below menu bar code. 2019-10-21 20:57:07 +02:00
7dbae8a198 Doc: Simplified Readme, removed FAQ index 2019-10-21 13:26:47 +02:00
6ffee0e75e Backends: DX12: Added extra ID3D12DescriptorHeap parameter to ImGui_ImplDX12_Init() function. The value is unused in master branch but will be used by the multi-viewport features (docking branch). (#2851)
+ Using SafeRelease() in master.
2019-10-18 18:32:48 +02:00
eedc8f993f Examples: DX12: Using IDXGIDebug1::ReportLiveObjects() when DX12_ENABLE_DEBUG_LAYER is enabled. 2019-10-18 18:20:53 +02:00
4de32cc87e Backends: GLFW: Restore previously installed user callbacks in ImplGlfw when ImGui shuts down (#2836) 2019-10-18 16:27:40 +02:00
714fe29d1a Replace manual flooring with IM_FLOOR() macro. (#2850)
Macro is used to ensure that flooring operation is always inlined even in debug builds. __forceinline does not force inlining in /Od builds with MSVC.

(cherry picked from commit bc165df6fd7969605bbc07b8a6d3d28f9109e8f3)
2019-10-18 16:18:38 +02:00
53278be61f FAQ, Readme. Use = {} instead of = { 0 }, wasn't problematic because they were all static variables or one stack array not read. But hey. 2019-10-18 16:18:05 +02:00
9994f5bcbe Fixed more FAQ links, oops.. (#2848) 2019-10-16 11:28:45 +02:00
3bbc27ebd9 Fixed more FAQ links. (#2848) 2019-10-16 11:23:15 +02:00
5fc427a49e Improved and moved FAQ to docs/FAQ.md so it can be readable on the web. (#2848) 2019-10-16 11:04:00 +02:00
9d6b2b096b Ignore directories created by JetBrains IDEs.
(cherry picked from commit c470de572c2f63e7ba5eeb7d97bc1f4bc114b375)
2019-10-15 17:15:45 +02:00
6892b81578 Remove trailing spaces from bunch of files.
(cherry picked from commit 50e0f8d4ddf4c426f62f346c8260a927f6b7c779)
2019-10-15 16:04:02 +02:00
c21fdabb43 Doc: Readme: moving contents to FAQ. 2019-10-15 14:21:44 +02:00
a41f0b2df4 Inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function.
IMPORTANT: Renamed internal CalcTypematicPressedRepeatAmount to CalcTypematicRepeatAmount and reordered the t1, t0 arguments to t0, t1 !!
If you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix.  The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0).
Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay).
Fixed the code and altered default io.KeyRepeatRate,Delay from 0.250,0.050 to 0.300,0.050 to compensate.
If you never altered io.KeyRepeatRate nor used GetKeyPressedAmount() this won't affect you.
2019-10-14 23:07:06 +02:00
c7bdec7e18 InputText, Nav: Fixed Left!Right keys broken when activating Keyboard Navigation. (#787) Amend 892dfb1 2019-10-14 22:43:04 +02:00
67e4cd5cc6 Comments, some logging for NavInitRequest debugging Moved OpenPopupOnItemClick() next to BeginPopupContextItem() 2019-10-14 15:54:11 +02:00
8c4dcbfa45 Diligent Engine 2019-10-12 17:56:32 +02:00
23eabd5991 Emscripten 2019-10-12 17:41:56 +02:00
58411033e2 Bindings 2019-10-12 17:21:11 +02:00
1c73a0c17e Bindings 2019-10-12 17:18:44 +02:00
cba84df7b5 Update README.md 2019-10-12 17:05:08 +02:00
aeb6481499 InputText: Filter out Ascii 127 (DEL) emitted by low-level OSX layer, as we are using the Key value. (#2578) 2019-10-12 14:27:37 +02:00
fc10ba8d24 Amend f0238ece9cba67ecabef438008fea53682bd6bc7 (#2817, #2818) 2019-10-11 14:20:04 +02:00
378035c6ff Fixed backspace handling on MacOS (fixed https://github.com/ocornut/imgui/issues/2817).
Allow null view passing as parameter to ImGui_ImplOSX_NewFrame
2019-10-11 14:17:07 +02:00
bf746c4215 DragScalar, SliderScalar, InputScalar: Added p_ prefix to parameter that are pointers to the datato clarify how they are used, and more comments redirecting to the demo code. (#2844) 2019-10-11 12:04:28 +02:00
927472f5ff Combo: Added _NoMove flag to prevent window from docking, which has an effect in Docking branch (in Master was not noticeable as the Combo code kept repositioning the window). (#2835) 2019-10-07 19:14:08 +02:00
3b271b1847 Demo: Added simple item reordering demo in Widgets -> Drag and Drop section. (#2823, #143) [@rokups] 2019-10-07 17:52:31 +02:00
8aad3482a4 ImVector: Fixed index_from_ptr() not asserting when passed end() element. 2019-10-07 17:22:55 +02:00
323412dd23 Examples: Allegro5: updated build instructions for macOS 2019-10-07 15:52:09 +02:00
73fa6509a5 Internal: InputTextEx: tweaked a bit of code (should be a no-op) 2019-10-05 16:57:12 +02:00
f1f321d3f6 Update README.md 2019-10-05 16:07:00 +02:00
ee3373d067 TreeNode: Fixed combination of ImGuiTreeNodeFlags_SpanFullWidth and ImGuiTreeNodeFlags_OpenOnArrow incorrectly locating the arrow hit position to the left of the frame. (#2451, #2438, #1897) 2019-10-04 19:21:29 +02:00
ccb2a947a2 Internal: SliderBehaviorT: Condition '!is_decimal' is always true (#2828) 2019-10-04 11:57:20 +02:00
1425bec7a4 Demo: Text baseline demo tweaks. 2019-10-03 18:30:42 +02:00
a6c3be4bda Internals: Tweaks to ItemSize() should be harmless. Added DebugDrawItemRect() helper. 2019-10-03 18:30:41 +02:00
892dfb1dea InputText, Nav: Fixed Home/End key broken when activating Keyboard Navigation. (#787)
Small refactor of ActiveIdUsingXXX inputs flags toward a little more consistent system. (#2637)
2019-10-02 15:57:36 +02:00
a2f3dcfc97 Added comment about SDL and SDL_INIT_GAMECONTROLLER. (#2809) 2019-10-02 11:40:03 +02:00
893056a209 Fix syntax typos in README (#2819) 2019-10-01 21:49:44 +02:00
eb5223276c Update README.md 2019-09-30 20:54:37 +02:00
0dad3f436b Fix harmless float calculation overflow. (#2813) 2019-09-30 15:16:30 +02:00
c262276988 Version 1.74 WIP 2019-09-30 14:27:56 +02:00
f0f5301612 Backends: OpenGL3: Commented out extra tokens at end of #else directive (#2804) 2019-09-25 00:06:14 +02:00
688cf868ea Merge branch 'master' of https://github.com/ocornut/imgui 2019-09-24 17:15:48 +02:00
d5efe16157 Version 1.73 2019-09-24 17:02:26 +02:00
293f74e996 Update README.md 2019-09-24 16:00:53 +02:00
664f9e76b9 Documentation: Various tweaks and improvements to the README page. [@ker0chan] 2019-09-24 15:46:08 +02:00
e100523917 CollapsingHeader: Added support for ImGuiTreeNodeFlags_Bullet and ImGuiTreeNodeFlags_Leaf on framed nodes. (#2159, #2160)
The Bullet and Leaf ImGuiTreeNodeFlags are now taken into account for Framed/CollapsingHeader tree nodes as well. TreeNodeEx() can be used to specify these flags. A choice was made to left-adjust the Framed text when no Bullet/Arrow is rendered, since this was deemed to look better in the Framed context (especially when considering that CollapsingHeader is drawn using NoTreePushOnOpen, so child/sibling Text items etc will often be non-indented).
2019-09-24 12:48:49 +02:00
ca858c084b Demo tweaks. Comments. Compacting the rarely used AutoFitXXX fields in ImGuiWindowTempData. 2019-09-23 20:15:25 +02:00
52deb415e0 Internal: Refactored internal RenderMouseCursor so colors can be specified. (#2614) 2019-09-23 14:53:49 +02:00
25849234f6 Internal: Tree: tweaks (initially tried to implement auto-scrolling, stashed) 2019-09-23 13:11:38 +02:00
97691643b7 Backends: OpenGL3: Attempt to automatically detect default GL loader by using __has_include. Followup to 44cd8e3 (#2798) 2019-09-22 23:19:04 +02:00
44cd8e39da Automatically include the available gl loader header 2019-09-22 22:51:09 +02:00
80b3ab7d3e TabBar: Fixed single tab shrinking reducing the tab to 0.0f size. Broken by a856c670c1. 2019-09-22 22:16:05 +02:00
f47a0a85cc ImVector: added find, find_erase, find_erase_unsorted helpers. 2019-09-22 19:06:20 +02:00
eab03f4467 Selectable: Added ImGuiSelectableFlags_AllowItemOverlap flag in public api (was previously internal only). 2019-09-22 19:03:51 +02:00
a45e3b5bb3 Readme, Wiki: Image loading examples. 2019-09-20 19:04:19 +02:00
f7468d05fe Fixed mouse event forwarding in macos example (#2710, #1961) 2019-09-20 15:48:51 +02:00
38d22bc47d ColorPicker / ColorEdit: restore Hue when zeroing Saturation. (#2722, #2770) - changelog, fixed uninitialized variables, tweaks, renaming. 2019-09-20 15:31:39 +02:00
accb0261b8 ColorPicker / ColorEdit: restore Hue when zeroing Saturation. (#2722, #2770)
Issue is fixed by storing last active color picker color and last hue value when active color picker takes rgb as input. Then if current color picker color matches last active color - hue value will be restored. IDs are not used because ColorEdit4() and ColorWidget4() may call each other in hard-to-predict ways and they both push their own IDs on to the stack. We need hue restoration to happen in entire stack of these widgets if topmost widget used hue restoration. Since these widgets operate on exact same color value - color was chosen as a factor deciding which widgets should restore hue.
2019-09-20 15:31:15 +02:00
656c515bad Warning fix. 2019-09-18 17:21:04 +02:00
9d02ed51e3 TreeNode: Added ImGuiTreeNodeFlags_SpanAvailWidth and ImGuiTreeNodeFlags_SpanFullWidth flags (#2451, #2438, #1897)
Added demo bits.
2019-09-18 17:13:41 +02:00
74e01e62ce Fixed unused static function warning for some compilers. (#2793) 2019-09-18 13:21:12 +02:00
098591fe4c ImDrawListSplitter: fixed an issue merging channels if the last submitted draw command used a different texture. (#2506) 2019-09-17 20:27:15 +02:00
b48dc067ae Style: Allow style.WindowMenuButtonPosition to be set to ImGuiDir_None to hide the collapse button. (#2634, #2639)
+ Fix #2775
2019-09-17 16:33:15 +02:00
3b014d0c31 Merge branch 'features/ellipsis_rendering'
# Conflicts:
#	imgui.cpp
2019-09-17 12:07:30 +02:00
3f986e72d9 Internal: Offset STB_TEXTURE_K_ defines to remove that change from #2541 + sponsors update. 2019-09-17 12:06:31 +02:00
7d5a17e5e4 Remove trailing spaces (grep for ' \r?$' in visual studio) 2019-09-17 11:33:18 +02:00
1c951dca97 Font: Narrow ellipsis: once we know an ellipsis is going to be drawn, we can claim the space between pos_max.x and ellipsis_max.x which gives us enough extra space to not requires the further (and otherwise valid) optimizations. Gets us vastly simplified code, yay. (#2775) 2019-09-17 11:14:46 +02:00
57623c15dd Font: Narrow ellipsis: various minor stylistic tweaks (#2775) 2019-09-17 11:13:34 +02:00
45405f0dc9 Font: implement a way to draw narrow ellipsis without relying on hardcoded 1 pixel dots. (#2775)
This changeset implements several pieces of the puzzle that add up to a narrow ellipsis rendering.

## EllipsisCodePoint

`ImFontConfig` and `ImFont` received `ImWchar EllipsisCodePoint = -1;` field. User may configure `ImFontConfig::EllipsisCodePoint` a unicode codepoint that will be used for rendering narrow ellipsis. Not setting this field will automatically detect a suitable character or fall back to rendering 3 dots with minimal spacing between them. Autodetection prefers codepoint 0x2026 (narrow ellipsis) and falls back to 0x0085 (NEXT LINE) when missing. Wikipedia indicates that codepoint 0x0085 was used as ellipsis in some older windows fonts. So does default Dear ImGui font. When user is merging fonts - first configured and present ellipsis codepoint will be used, ellipsis characters from subsequently merged fonts will be ignored.

## Narrow ellipsis

Rendering a narrow ellipsis is surprisingly not straightforward task. There are cases when ellipsis is bigger than the last visible character therefore `RenderTextEllipsis()` has to hide last two characters. In a subset of those cases ellipsis is as big as last visible character + space before it. `RenderTextEllipsis()` tries to work around this case by taking free space between glyph edges into account. Code responsible for this functionality is within `if (text_end_ellipsis != text_end_full) { ... }`.

## Fallback (manually rendered dots)

There are cases when font does not have ellipsis character defined. In this case RenderTextEllipsis() falls back to rendering ellipsis as 3 dots, but with reduced spacing between them. 1 pixel space is used in all cases. This results in a somewhat wider ellipsis, but avoids issues where spaces between dots are uneven (visible in larger/monospace fonts) or squish dots way too much (visible in default font where dot is essentially a pixel). This fallback method obsoleted `RenderPixelEllipsis()` and this function was removed. Note that fallback ellipsis will always be somewhat wider than it could be, however it will fit in visually into every font used unlike what `RenderPixelEllipsis()` produced.
2019-09-17 11:13:07 +02:00
404dc0367e BeginTabItem: Fixed case where right-most tab would create an extraneous draw calls (probably related to other tab fitting code in 1.73 wip) 2019-09-17 11:12:33 +02:00
e7e88ed413 Examples: SDL/GLFW + OpenGL3: Fixes for Makefile (#2774)
- append CXXFLAGS instead of overwriting them
- add glad.c build rule
2019-09-17 17:04:40 +09:00
Qix
561e7dd490 Fix signed types warning in pasteboard handler (#2786) 2019-09-17 16:21:09 +09:00
3dcf323c35 Columns: Separator: Fixed a bug where non-visible separators within columns would alter the next row position differently than visible ones.
Fixed rounding issues also leading to change of ScrollMax depending on visible items (in particular negative coordinate would be rounded differently)
2019-09-16 19:15:43 +02:00
b05f6f6f50 Nav, Scrolling: Added support for Home/End key. (#787) 2019-09-16 19:01:40 +02:00
3cf519c9cb Fix DragScalar for unsigned types (#2780)
decreasing the value was broken on arm64
2019-09-16 19:01:39 +02:00
cc288e073c Backends: OpenGL3: Tweaked initialization code allow application calling ImGui_ImplOpenGL3_CreateFontsTexture() before ImGui_ImplOpenGL3_NewFrame() if for some reason they wanted. 2019-09-16 12:08:40 +02:00
c077dd4872 Fixed missing IMGUI_API for IsMouseDragPastThreshold(). 2019-08-31 19:59:51 +02:00
0537ac005f ColorEdit: Disable Hue edit when Saturation==0 instead of letting Hue values jump around. 2019-08-30 20:33:35 +02:00
b59ec7b9b7 DragInt, DragFloat, DragScalar: Using (v_min > v_max) allows locking any edit to the value. 2019-08-30 20:30:21 +02:00
3f99890f40 TabBar: feed desired width (sum of unclipped tabs width) into layout system to allow for auto-resize. (#2768)
Before 1.71 tab bars fed the sum of current width which created feedback loops in certain situations. Amend f95c77eeea.
2019-08-29 14:57:34 +02:00
f8d3d8d7f5 TabBar: improved shrinking for large number of tabs to avoid leaving extraneous space on the right side. Individuals tabs are given integer-rounded width and remainder is spread between tabs left-to-right. 2019-08-29 12:21:09 +02:00
bfcdaeb610 Disable with ConfigWindowsMemoryCompactTimer < 0.0f (#2636) 2019-08-28 20:30:36 +02:00
62f75c7fb1 Added a mechanism to compact/free the larger allocations of unused windows (buffers are compacted when a window is unused for 60 seconds, as per io.ConfigWindowsMemoryCompactTimer = 60.0f). Note that memory usage has never been reported as a problem, so this is merely a touch of overzealous luxury. (#2636) 2019-08-28 20:28:36 +02:00
45a0db5979 Demo: PlotLine example displays the average value. (#2759) + extra comments 2019-08-28 19:23:43 +02:00
c8418015c2 SliderScalar: Improved assert when using U32 or U64 types with a large v_max value. (#2765)
+  misc minor stuff.
2019-08-28 15:19:10 +02:00
bcdb89ab07 Rebased imstb_rectpack on stb_rect_pack v1.00. 2019-08-28 09:53:21 +02:00
cb538fadfe Internals: Storing settings using ImVec2ih to match what we are doing with dock node. + removed ImMax from reading Size value (done in Begin) + removed seemingly unnecessary FLT_MAX compare in SettingsHandlerWindow_WriteAll.
About: Added backquote to text copied into clipboard so it doesn't mess up with github formatting when pasted.
2019-08-23 12:02:52 +02:00
c4ff1b3578 ImDrawList: clarified the name of many parameters so reading the code is a little easier. (#2740) 2019-08-22 17:43:57 +02:00
3fb5cf3541 Using offsetof() when available in C++11. Avoids Clang sanitizer complaining about old-style macros. (#94) 2019-08-22 16:55:42 +02:00
c4b0bf718a More typos in comments (#2738) 2019-08-22 11:40:37 +02:00
a856c670c1 TabBar: fixed single-tab not shrinking their width down.
+ minor typo fixes (#2738)
2019-08-22 11:38:58 +02:00
a33cedda14 Internals: Renaming window size calc functions. 2019-08-19 21:48:52 +02:00
7abd41bd5f TabBar: fixed ScrollToBar request creating bouncing loop when tab is larger than available space. 2019-08-19 20:38:17 +02:00
9fce278918 ColorPicker: Made rendering aware of global style alpha of the picker can be faded out. (#2711)
Note that some elements won't accurately fade down with the same intensity, and the color wheel when enabled will have small overlap glitches with (style.Alpha < 1.0).
2019-08-16 11:46:11 +02:00
88bf056a9f Removing Funding file (unnecessary as we'll switch services) 2019-08-15 14:51:38 +02:00
7d2cfa6ff1 Create FUNDING.yml 2019-08-15 14:49:18 +02:00
2e756d5b47 Explicit narrowing cast from size_t to UINT (#2726)
Clang: `non-constant-expression cannot be narrowed from type 'size_t' (aka 'unsigned long long') to 'UINT' (aka 'unsigned int') in initializer list [-Wc++11-narrowing]`
2019-08-12 22:31:49 +02:00
62143dff64 Backends: Vulkan: Added support for specifying multisample count. (#2705, #2706) 2019-08-01 11:10:01 -07:00
6cf4743f17 Backends: DX11: Fixed GSGetShader() call not passing an initialized instance count, would generally make the debug layer complain (Added in 1.72). 2019-08-01 10:58:41 -07:00
f624455d7b Version 1.73 WIP 2019-08-01 10:57:13 -07:00
9bd7846f07 Internal: Made ScrollToBringRectIntoView() handle recursing back to scroll parent window, so the function can be called elsewhere (instead of 1 deep recursion done in NavUpdateMoveResult(). 2019-07-31 18:37:55 -07:00
6a0d0dab5a Version 1.72b (patch for nav) 2019-07-31 14:31:06 -07:00
27079e68c2 Nav: Made hovering non-MenuItem Selectable not re-assign the source item for keyboard navigation. 2019-07-31 14:31:06 -07:00
4cfaf7d89c Scrolling, Nav: Fixed programmatic scroll leading to a slightly incorrect scroll offset when the window has decorations or a menu-bar (broken in 1.71). This was mostly noticeable when a keyboard/gamepad movement led to scrolling the view, or using e.g. SetScrollHereY() function. Fix/amend a0994d74. 2019-07-31 14:31:06 -07:00
3548fb8013 Internal refactor: moved all Scroll related functions in a same spot. 2019-07-30 20:04:02 -07:00
1b1e539288 Internal: Moved NavScrollToBringItemIntoView() declaration to imgui_internal.h. Fixed spacing missing in 494d804. Fixed changelog wreck from 1.72. 2019-07-30 18:21:44 -07:00
5ef7445d92 Internal: Avoid using GImGui multiple times in same function. 2019-07-30 16:51:12 -07:00
494d804735 Internal: Added ImGuiInputTextState::ClearText() helper. 2019-07-30 15:02:40 -07:00
85ad8e0e2e Nav: Fixed an issue with NavFlattened window flag where widgets not entirely fitting in child window (often selectable because of their extruded bits) would be not considered to navigate toward the child window. (#787)
This creates a little bit of tension because g.NavDisableHighlight tends to makes the reference point not always visible.
Amend c665c15a7d
2019-07-30 14:27:25 -07:00
9183e7c426 Version 1.73 WIP 2019-07-29 15:54:32 -07:00
ecb9b1e2eb Version 1.72 2019-07-27 18:15:07 -07:00
7a26a49f08 Internal: Added IsMouseDragPastThreshold(). Tweaks. Todo.
Demo: Showing how to use the format parameter of Slider/Drag functions to display the name of an enum value instead of the underlying integer value
2019-07-26 17:19:01 -07:00
d057550209 Fixed Clang 8.0 warning "empty expression statement has no effect; remove unnecessary ';' to silence this" warning [-Wextra-semi-stmt]
+ Comment
2019-07-24 17:07:05 -07:00
824e8c53b4 Internals: Added IMGUI_DEBUG_INI_SETTINGS. Made IMGUI_DEBUG_LOG redefinable in imconfig.h. Comments. Fix to allow Metrics's NodeWindow() being called with a NULL window. 2019-07-23 21:37:09 -07:00
baae057a03 Internals: Merge in minor noise from wip Tables branch to simplify further merging. 2019-07-23 13:28:36 -07:00
51853292cc ImDrawList: Using ImDrawCornerFlags instead of int in various apis.
Demo: Using ImGuiColorEditrFlags instead of int.
2019-07-23 10:41:48 -07:00
1820aaf444 imgui_freetype: Initialize FT_MemoryRec_ struct manually (#2686)
This fixes gcc warning: missing field 'alloc' initializer [-Wmissing-field-initializers]
2019-07-23 09:41:27 -07:00
26f14e056c Scrolling: Made mouse-wheel scrolling lock the underlying window until the mouse is moved again or until a short delay expires (2 seconds). This allow uninterrupted scroll even if child windows are passing under the mouse cursor. (#2604) 2019-07-22 18:49:52 -07:00
dcd03f62a7 Scrolling: Made it possible for mouse wheel and navigation-triggered scrolling to override a call to SetScrollX()/SetScrollY(), making it possible to use a simpler stateless pattern for auto-scrolling.
Demo: Log, Console: Using a simpler stateless pattern for auto-scrolling.
2019-07-22 18:49:51 -07:00
34cf00566f InputTextMultiline: Fixed vertical scrolling tracking glitch.
Fixed Travis-CI banner address.
2019-07-22 18:11:06 -07:00
835b50b773 Internals: Nav: Tweak NavUpdatePageUpPageDown() to make it more readable. 2019-07-22 17:27:41 -07:00
363d33f64e Increased IMGUI_VERSION_NUM to facilitate transition of OSX clipboard support for framework using/embedding any version of imgui. Amend 29d9394. (#2546) 2019-07-22 10:23:27 -07:00
cbd5a21fb0 Backends: DX10/DX11: Backup, clear and restore Geometry Shader is any is bound when calling renderer.
Backends: DX11: Clear Hull Shader, Domain Shader, Compute Shader before rendering. Not backing/restoring them.
2019-07-21 19:26:13 -07:00
29d9394a41 OSX: Disabled default native Mac clipboard copy/paste implementation in core library (added in 1.71), because it needs application to be linked with '-framework ApplicationServices'. It can be explicitly enabled back by using '#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS' in imconfig.h. Re-added equivalent using NSPasteboard api in the imgui_impl_osx.mm experimental back-end. (#2546) 2019-07-21 19:06:07 -07:00
f0348ddffc Amend 0f86116, renamed to ImGuiKey_KeyPadEnter Changelog.. (#2677, #2005) 2019-07-21 18:39:50 -07:00
0f86116a69 Adding an ImGuiKey 'ImGuiKey_EnterSecondary' to support platforms that differentiate the enter (return key) and the numpad enter key. 2019-07-21 18:29:11 -07:00
4b44f25c9a Fixed incorrect application of io.DisplaySafeAreaPadding which would be problematic with multi-viewports when a monitor uses negative coordinates (correct clamping is done right below). (#2674) 2019-07-21 18:19:56 -07:00
f1ba217a92 Internals: Extracted some code out of the NewFrame() function. 2019-07-21 12:13:44 -07:00
c37f21788f Columns: Made GetColumnOffset() and GetColumnWidth() behave when there's no column set, consistently with other column functions + fixed Columns demo (#2683) 2019-07-21 11:23:15 -07:00
b443bc0a64 Columns: Improved honoring alignment with various values of ItemSpacing.x and WindowPadding.x. (#125, #2666) 2019-07-19 14:22:33 -07:00
4abc2a82e0 Columns: Made the right-most edge reaches up to the clipping rectangle (removing WindowPadding.x*0.5 worth of asymmetrical/extraneous padding). (#125, #2666)
+ Moved a few things in BeginColumns().
2019-07-19 14:22:12 -07:00
493795cdd1 Columns: Fix support for BeginColumns() with a count of 1 (not that this isn't available via the old Columns() api). Tweaked Demo to facilitate testing for it. 2019-07-19 12:11:00 -07:00
047dc16af5 Debug Tools: Added DebugStartItemPicker() in imgui_internal.h to facilitate binding this anywhere in user's tool. Adedd highlight. Added IMGUI_DEBUG_TOOL_ITEM_PICKER_EX to break in ItemAdd(). 2019-07-19 11:28:03 -07:00
44336950e9 Revert "Columns: Improved honoring left-most and right-most alignment with various values of ItemSpacing.x and WindowPadding.x. In particular, the right-most edge now reaches up to the clipping rectangle while ensuring that the right-most column clipping width matches others. (#125, #2666)"
This reverts commit 6c16ba6490.
2019-07-19 11:22:39 -07:00
6c16ba6490 Columns: Improved honoring left-most and right-most alignment with various values of ItemSpacing.x and WindowPadding.x. In particular, the right-most edge now reaches up to the clipping rectangle while ensuring that the right-most column clipping width matches others. (#125, #2666) 2019-07-17 18:40:48 -07:00
e28d20c3e2 Columns: Fixed a regression from 1.71 where the right-side of the contents rectangle within each column would wrongly use a WindowPadding.x instead of ItemSpacing.x like it always did. (#125, #2666) 2019-07-17 17:29:30 -07:00
61c7f0194e Misc: Made Button(), ColorButton() not trigger an "edited" event leading to IsItemDeactivatedAfterEdit() returning true. This also effectively make ColorEdit4() not incorrect trigger IsItemDeactivatedAfterEdit() when clicking the color button to open the picker popup. (#1875)
Demo: Added Button with repeater and InputFloat with +/- button to the status query test demo.
2019-07-17 17:10:28 -07:00
1f3feb481e Internals: Refactor: Moved all Columns code from imgui.cpp to imgui_widgets.cpp (#125)
Also moved NextColumn between BeginColumn and NextColumn which makes it easier to work on that code.
2019-07-17 17:10:27 -07:00
ea79992d9a Fixed old SetWindowFontScale() api value from not being inherited by child window. Added comments about the right way to scale your UI (load a font at the right side, rebuild atlas, scale style).
+ Added missing IMGUI_API marker to the EmptyString storage used by ImGuiTextBuffer. (#2672)
2019-07-17 10:01:49 -07:00
130b44994e Debug, Metrics: Added "Tools->Item Picker" tool which allow clicking on a widget to break in the debugger within the item code. The tool calls IM_DEBUG_BREAK() which can be redefined in imconfig.h if needed. 2019-07-16 18:25:49 -07:00
e6a286b3a5 Style: Added style.ColorButtonButton (left/right, defaults to ImGuiDir_Right) to move the color button of ColorEdit3/ColorEdit4 functions to either side of the inputs. 2019-07-16 16:43:21 -07:00
a35f42f123 Removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). Kept redirection function (will obsolete). (#581, #324) 2019-07-15 18:30:20 -07:00
3d07c7cbe4 TabBar: Fixed unfocused tab bar separator color (was using ImGuiCol_Tab, should use ImGuiCol_TabUnfocusedActive). 2019-07-15 18:30:20 -07:00
7a9d32acee Fixed unnecessary test in UpdateMouseWheel() (thanks PVS).
TreeNodeBehavior: avoid computing bg_col for non-framed non-active tree nodes.
Comments, binaries update, minor typos.
2019-07-15 18:30:20 -07:00
e461e7bc7a Moved ImGuiColumnsFlags erroneously forward declared in imgui.h + demo bit. 2019-07-14 12:29:23 -07:00
71d20abbc3 Settings: Minor optimization to reduce calls in SettingsHandlerWindow_WriteAll. 2019-07-12 13:33:38 +02:00
d52c6316c8 Renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Keep redirection typedef (will obsolete). 2019-07-12 11:58:46 +02:00
e66799f79a Prefixed internal structs exposed in imgui.h with a fully qualified name to facilitate auto-generation with cimgui. 2019-07-12 11:54:22 +02:00
3436132d4b Combo: Hide arrow when there's not enough space even for the square button.
+ Various todo items.
2019-07-11 17:20:56 +02:00
d23f1b1409 fonts/binary_to_compress: display error message when failing to open file + misc comments. 2019-07-10 12:58:11 +02:00
54c49b5fb1 Window: Mouse wheel scrolling while hovering a child window is automatically forwarded to parent window if ScrollMax is zero on the scrolling axis. Also still case if ImGuiWindowFlags_NoScrollWithMouse is set (not new), but previously the forwarding
would be disabled if ImGuiWindowFlags_NoScrollbar was set on the child window, which is not the case any more (amend #1502, #1380).
2019-07-02 18:33:50 +02:00
e16564e67a Scrollbar: Avoid overlapping the opposite side when window (often a child window) is forcibly too small. 2019-07-01 20:59:00 +02:00
58c9f8a194 Misc: Added IMGUI_DISABLE_METRICS_WINDOW imconfig.h setting to explicitly compile out ShowMetricsWindow(). + Internals: Minor renaming. 2019-07-01 20:58:10 +02:00
da29d77253 Added SetScrollXHere, SetScrollFromPosX: Changelog, demo, comments (#1580). 2019-07-01 12:15:53 +02:00
caf119a982 Added 'SetScrollHereX' and 'SetScrollFromPosX' (#1580) 2019-07-01 12:15:48 +02:00
2a3517a399 Internals: Checkbox: Added undocumented mixed/indeterminate/tristate support via ImGuiItemFlags_MixedValue. (#2644) 2019-06-30 12:03:09 +02:00
a89f05a10e Child windows inherit Hidden frames setting from parent more accurately, so HiddenFramesCannotSkipItems is honored by child windows. 2019-06-29 20:12:15 +02:00
401e05147c Internals: Moved CalcListClipping close to ImGuiListClipper code (no-op) 2019-06-29 20:11:03 +02:00
82711251b6 Internals: ImGuiListClipper using absolute coordinate (instead of relative one). Minor no-op tweaks + ImDrawListSplitter assert 2019-06-29 20:10:55 +02:00
1dd322c6fb Style: Attenuated default opacity of ImGuiCol_Separator in Classic and Light styles. 2019-06-27 12:20:29 +02:00
4b95e7c2f3 Doc: Tweak and extra mention of AddCustomRectFontGlyph + made the example register two rectangles. 2019-06-26 12:15:32 +02:00
eb3e271c24 Demo: Using ImVec2(-FLT_MIN,0.0f) instead of ImVec2(-1.0f,0.0f) where it makes sense. (#2449) 2019-06-23 18:20:25 +02:00
41e2d4b5ae ImDrawListSplitter: Fixed memory leak when using low-level split api (was not affecting ImDrawList api, also this type was added in 1.71 and not advertised as a public-facing feature). 2019-06-20 16:09:45 +02:00
f563e1a504 Internals: Renamed GetFrontMostPopupModal() to GetTopMostPopupModal() to be consistent. Renamed other locals to follow that terminology. 2019-06-19 18:16:38 +02:00
dd41df3e98 Word-wrapping: Fixed overzealous word-wrapping when glyph edge lands exactly on the limit. Because of this, auto-fitting exactly unwrapped text would make it wrap. (fixes initial 1.15 commit, 78645a7d). 2019-06-18 12:50:34 +02:00
516c3dee80 Examples: SDL+DX11: Changelog, readme, batch files, fixed vcxproj, minor stylistic fixes + minor sync of other main.cpp files. (#2632) 2019-06-18 11:28:26 +02:00
cc4d76cc23 Implement SDL/dx11 sample 2019-06-18 11:05:29 +02:00
70fe409338 Window: Fixed InnerClipRect right-most coordinates using wrong padding setting (introduced in 1.71). 2019-06-18 10:58:03 +02:00
342751c89e Fiedx OpenGL ES 3.0 include for iOS and tvOS (#2631) 2019-06-18 10:55:33 +02:00
0e37eaff8a Updated Ogre bindings (#2619)
And support python
2019-06-17 15:17:24 +02:00
ae2c9f7101 Internals: Columns: Poke into WorkRect and use them in the GetContentRegionMax() functions. This should be a no-op, but preparing us to transition toward using WorkRect instead of ContentRegionRect.
Removed one use of ContentsRegionRect.
2019-06-17 12:14:34 +02:00
e9b92d1cef Disable -Wpragmas warning in GCC to avoid relying on version checks, as unusual/forks/mods don't appear to always have same warning<>version. (#2618)
+ Fix version number in imgui.h
2019-06-17 11:32:00 +02:00
b82e99c032 ImDrawList: Fixed CloneOutput() helper crashing. Also removed unnecessary risk from ImDrawList::Clear(), draw lists are being clear before use each frame anyway. (#1860) 2019-06-17 11:06:36 +02:00
2645a2516f ImDrawList::ChannelsSplit(), ImDrawListSlitter: Fixed an issue with merging draw commands between channels 0 and 1. (#2624) Introduced by cef88f6aae. 2019-06-14 12:07:43 +02:00
af3080b81b Removed redirecting functions/enums that were obsoleted in version 1.51 (June 2017): ImGuiCol_Column*, ImGuiSetCond_*, IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow(), IMGUI_ONCE_UPON_A_FRAME. 2019-06-14 12:05:00 +02:00
5286ecb8a7 Version 1.72 WIP 2019-06-14 11:58:58 +02:00
2da1c66d15 Version 1.71 + comments 2019-06-12 18:30:06 +02:00
5ae268c0a3 Internals: Reworked RenderTextEllipsis() to satisfy what we need for table headers. 2019-06-11 16:12:00 +02:00
4597632662 Readme, comments, dear imgui prefixes 2019-06-11 16:11:36 +02:00
c3a348aa25 CollapsingHeader: Minor fix to align right side of frames (which is extruded past the Work/Contents rect) with clipping rectangle. 2019-06-11 15:56:57 +02:00
a8eb64fc54 Log/Capture: Fixed BeginTabItem() label not being included in a text log/capture.
Extracted tab rendering code into a RenderTextEllipsis() function.
2019-06-11 14:03:13 +02:00
a9b5c834b6 ImDrawListSplitter: Don't merge draw commands when crossing a VtxOffset boundary + Renamed fields ImDrawChannels to consistently suggest those are internal structures. 2019-06-11 11:49:31 +02:00
d8435c7710 ImDrawListSplitter: Fix idx offset when merging (cef88f6) (#2591) 2019-06-10 15:02:44 +02:00
0770449630 Window: child windows outer decorations (e.g. scrollbar) are rendered as part of their parent window, avoiding the creation of an extraneous draw command.
+ Metrics: inverted color of clip rect vs vertices bounding box when hovering a draw command, so the color matches the per-vertex preview.
2019-06-07 17:34:36 +02:00
afa3978ff6 Internals: Added drawlist and color arg to RenderArrow(), RenderBullet(). Reordered args for RenderPixelEllipsis. 2019-06-07 17:32:51 +02:00
32ab0a82d6 imgui-test: Added IMGUI_TEST_ENGINE_LOG macro to emit into test log from core or user land. 2019-06-07 13:46:54 +02:00
2b997141cf Made PushID() behave the same in 32-bit and 64-bit, by not padding the integer into a void*. (Also technically faster.) 2019-06-06 16:36:26 +02:00
431aa4e456 Synced/merged minor cruft from docking branch to minimize drift. AFAIK the only meaningful no-op change is that the call UpdateHoveredWindowAndCaptureFlags() was moved above UpdateMouseMovingNewFrame() to match what docking branch has been doing for a while. 2019-06-06 16:13:30 +02:00
fea5f70611 ImDrawCallback: Allow to override the signature of ImDrawCallback by #define-ing it. This is meant to facilitate custom rendering back-ends passing local render-specific data to the draw callback. 2019-06-06 15:28:37 +02:00
480d57e6a2 Revert "Changed syntax for (very rarely used) IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT mechanism, instead you only need to '#define ImDrawVert MyDrawVert' to use this feature, avoiding the need to declare the entire structure within an awkward macro. Using the old macro will now error with a message pointing you to the new method. (#38, #103, #1172, #1231, #2489)"
This reverts commit 597c024904.
2019-06-06 01:00:30 +02:00
597c024904 Changed syntax for (very rarely used) IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT mechanism, instead you only need to '#define ImDrawVert MyDrawVert' to use this feature, avoiding the need to declare the entire structure within an awkward macro. Using the old macro will now error with a message pointing you to the new method. (#38, #103, #1172, #1231, #2489) 2019-06-06 00:42:27 +02:00
c96f2c4057 Window: Fixed one case where auto-resize by double-clicking the resize grip would make either scrollbar appear for a single frame after the resize. Moved Scrollbar visibility block. 2019-06-05 15:59:14 +02:00
300d8dd656 Internals: Moved scrollbar visibility calculation block below the call to UpdateManualResize(). This commit is _intended_ to have no side-effect (next commit will). Also moved ItemWidthDefault calculation below rectangles. 2019-06-05 15:59:14 +02:00
c1a61d25a7 Scrollbar overlap an extra WindowBorderSize amount on the left to make all distances consistent. Reverted to BorderSize not affecting work/contents rectangles. Scrollbar, Style: Changed default style.ScrollbarSize from 16 to 14. 2019-06-05 15:59:14 +02:00
15282261dd Internals: Minor no-op tidying up toward solving the WindowPadding / WindowBorderSize / ScrollbarSize overlapping mess.
+ Demo: Use SetScrollY().
2019-06-05 15:59:14 +02:00
4149d22e85 Fixed newly created window (e.g. appearing child window) from having scrollbar active on the first frame. (fix 6e03b27) + reworded code a little. (+1 squashed commits)
Fixed auto-resize with AlwaysVerticalScrollbar or AlwaysHorizontalScrollbar flags not taking account of the expect scrollbar sizes.
2019-06-05 15:59:14 +02:00
06f1d2c101 Internals: Storing ScrollMax into a member. Mostly to facilitate debugging. Also locking down window->Scroll slightly lower in the Begin function. 2019-06-05 15:59:13 +02:00
d6df777ff2 TextWrapped, PushTextWrapPos(0.0f) within a window with horizontal scrolling from not covering the full horizontal area (previously only worked with an explicit contents size). 2019-06-05 15:59:13 +02:00
fe32fde376 Internals: Renamed SizeContents to ContentSize, SizeContentsExplicit to ContentSizeExplicit. Tweaked Metrics->Show Rectangles functionality. 2019-06-05 15:59:13 +02:00
f95c77eeea Window rectangles: Changed WorkRect to cover the whole region including scrolling (toward obsolete ContentsRegionRect) + using full WindowPadding*1 padding.
Tweaked InnerClipRect.
TreeNode, CollapsingHeader: Fixed highlight frame not covering horizontal area fully when using horizontal scrolling. (#2211, #2579)
TabBar: Fixed BeginTabBar() within a window with horizontal scrolling from creating a feedback loop with the horizontal contents size.
Columns: Fixed Columns() within a window with horizontal scrolling from not covering the full horizontal area (previously only worked with an explicit contents size). (#125)
Demo: Added demo code to test contentsrect/workrect
2019-06-05 15:59:13 +02:00
a0994d74c2 Clarified behavior of SetNextWindowContentSize(). Content size is defined as the size available after removal of WindowPadding on each sides. So SetNextWindowContentSize(ImVec2(100,100)) + auto-resize will always allow submitting a 100x100 item without creating a scrollbar, regarding of WindowPadding.The exact meaning of ContentSize for decorated windows was previously ill-defined. 2019-06-05 15:59:13 +02:00
09bcf9fbc5 Window rectangles: Made InnerRect not affected by window border sizes. its few users shouldn't be meaningfully affected. 2019-06-05 15:59:12 +02:00
b9874a2423 Comments about obsoleted features version. Todo. Clarify tab bar initial offset (useful if we decide to remove the half-windowpadding clip margin). 2019-06-05 15:58:49 +02:00
57d8ab62f4 Nav: Fixed rare crash when e.g. releasing Alt-key while focusing a window with a menu at the same frame as clearing the focus. This was in most noticeable in some back-ends with emits key release events when focusing another viewport. (#2609) 2019-06-05 00:28:55 +02:00
6614bab883 Combo: Fixed rounding not applying with the ImGuiComboFlags_NoArrowButton flag. (#2606, #2607) 2019-06-04 20:49:29 +02:00
eb7849b477 Nav: Fixed gamepad/keyboard moving of window affecting contents size incorrectly, sometimes leading to scrollbars appearing during the movement. + minor fix with the mostly dead Ctrl+wheel scaling. 2019-05-31 20:48:52 +02:00
cef88f6aae ImDrawListSplitter: Support merging consecutive draw commands straddling two channels. Support zero-init. 2019-05-31 12:06:35 +02:00
f1f4b42d91 ImDrawListSplitter: extracted out of ImDrawList. Down the line we may obsolete the ImDrawList functions and encourage users to store the splitter aside, in the meanwhile ImDrawList holds a splitter.
(This will allow columns/table to recurse.)
2019-05-31 12:03:10 +02:00
8abf1313aa ImDrawList: Fix broken channel splitting (another issue when the first channel is empty) (#2591) + fixed warnings with newer VS 2019-05-31 11:47:00 +02:00
bff7202ff2 Include <alloca.h> also when __SWITCH__ is defined (#2595)
Fixes compilation with devkitPro for Nintendo Switch
2019-05-31 01:52:22 +02:00
42c98c5eea ImDrawList: Fix broken channel splitting (broken by d1e8b69) (#2591) 2019-05-30 18:47:46 +02:00
546b728199 Internals: Window rectangles: Fixed ContentsRegion lag by moving back after Scrollbar, fixes b50c61c9. Shuffling setup order and added comments. 2019-05-30 18:19:14 +02:00
21ebdcafc9 Internals: Window rectangles: Renaming of all rectangles toward their final form. Should be a no-op. Renamed GetWorkRectMax() to GetContentRegionMaxAbs(). Metrics shows SizeContents. 2019-05-30 18:04:21 +02:00
c3d600abed Fixed imgui_impl_opengl3 broken in previous few commits. (#2591, #2593, #2594) 2019-05-30 16:45:59 +02:00
ed79b4d22e Examples/Backends: Metal: Added support for large meshes (64k+ vertices) with 16-bits indices, enable 'ImGuiBackendFlags_HasVtxOffset' config flag in back-end. (#2591, #2592) 2019-05-29 19:45:15 +02:00
7755cbbef2 Renamed ImGuiBackendFlags_HasVtxOffset to ImGuiBackendFlags_RendererHasVtxOffset to match naming convention already used in viewport/docking branch. (#2591) + Fix OpenGL3 code missing flag. 2019-05-29 16:29:17 +02:00
b3dd03f582 Examples/Backends: DirectX9/10/11/12, Vulkan, OpenGL3 (Desktop GL only): Added support for large meshes (64k+ vertices) with 16-bits indices, enable 'ImGuiBackendFlags_HasVtxOffset' config flag in back-end. (#2591) 2019-05-29 16:13:38 +02:00
d1e8b698d0 ImDrawList: Added ImDrawCmd::VtxOffset value to support large meshes (64k+ vertices) using 16-bits indices. To enable the feature, the renderer back-end needs to set 'io.BackendFlags |= ImGuiBackendFlags_HasVtxOffset' and honor the ImDrawCmd::VtxOffset field. Otherwise the value will always be zero. This has the advantage of preserving smaller index buffers and allowing to execute on hardware that do not support 32-bits indices.
ImDrawList: Added ImDrawCmd::IdxOffset value, equivalent to summing element count for each draw command. This is provided for convenience and consistency with VtxOffset. (#2591)
2019-05-29 16:13:38 +02:00
40b9e5e0b4 ImDrawList: Store initial flags for the frame in ImDrawListSharedData, reducing code duplication in setting up the flags. 2019-05-29 14:26:03 +02:00
cb7ba60d3f CollapsingHeader: When a close button is enabled, better clip the label to avoid overlap. (#600) 2019-05-28 21:25:28 +02:00
c487bc52a2 Fonts: Added some details about using custom colorful icons. 2019-05-28 20:17:15 +02:00
70d9f79312 Internal: Renamed InnerMainRect to InnerVisibleRect. Printing coordinates in Metrics window. 2019-05-28 11:23:04 +02:00
2742663ad2 Changelog, minor tweaks. (#2585) 2019-05-28 11:23:04 +02:00
c0e690318a Examples: imgui_impl_osx: Added mouse cursor support. (#2585, #1873) 2019-05-28 11:15:59 +02:00
2d68e892a8 Added full "Dear ImGui" prefix to the title of "Dear ImGui Demo" and "Dear ImGui Metrics" windows. Shortened amount of nodes in columns>tree demo. 2019-05-27 18:38:28 +02:00
9c35344175 Comments, todo entries, moved ImGuiSelectableFlagsPrivate in higher ranges to match others. 2019-05-27 16:50:56 +02:00
70a4be07df ColorEdit: Fixed the color picker popup only displaying inputs as HSV instead of showing multiple options. (#2587, broken in 1.69 by #2384). 2019-05-27 14:57:39 +02:00
affa7e2422 Examples: imgui_impl_opengl3: Fix empty printout on shader load. (#2584)
Fixed minor bug in CheckShader and CheckProgram

The log_length reported by 
glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length)
will at least return 1, since the string delimiter is also counted.

The old version would always print and empty string to stderr. This is annoying in the emscripten port, since it prints a red error message to the Javascript console. The new version fixes this behavior.
2019-05-27 10:47:18 +02:00
958d75c00a Style: Added style.WindowMenuButtonPosition (left/right, defaults to ImGuiDir_Left) to move the collapsing/docking button to the other side of the title bar. 2019-05-24 21:54:52 +02:00
6c3697f6f1 Internal: CloseButton takes an upper-left corner + a size to be consistent with similar widgets. 2019-05-24 17:58:21 +02:00
ec3ec24157 Internals: Extracted some of the tab bar shrinking code into a ShrinkWidths() function so columns/table can use it. 2019-05-24 14:32:33 +02:00
3fda90d6a7 Fixed InputScalar, InputScalarN, SliderScalarN, DragScalarN with non-visible label from inserting style.ItemInnerSpacing.x worth of trailing spacing. 2019-05-24 14:32:28 +02:00
7bc03f7155 Internals: Added InnerWorkRect equal to old InnerClipRect, added InnerWorkRectClipped actually clipped. 2019-05-22 23:56:31 +02:00
b85e97137d Version tag is 1.71 WIP oops 2019-05-22 23:56:26 +02:00
a2eec8f5b5 Fix OuterRectClipped not being clipped correctly, which resulted in child window outside visible bound to not be marked with SkipItems. Broken in b50c61c961.
+ Comments on InnerClipRect being misleading. Demo: Tweak to sizing of child window in the Layout->Scrolling section.
2019-05-22 22:14:31 +02:00
34b881eb12 ImFontGlyphRangesBuilder: Fixed unnecessarily over-sized buffer, which incidentally was also not fully cleared. Fixed edge case overflow when adding character 0xFFFF. (#2568) 2019-05-21 12:45:27 +02:00
882d2c3aea Fixed crash when appending with BeginMainMenuBar() more than once and no other window are showing. (#2567) + comments 2019-05-21 12:18:34 +02:00
392ab08580 BeginPopupContextItem(): Skip processing when SkipItems is set as LastItemId is unreliable and we assert when it is zero. + Minor comments on columns. 2019-05-20 16:46:47 +02:00
f242cd4d8a Fixed GCC mem-access warnings (#2565)
+ using "if defined" more consistently for Clang.
2019-05-19 17:15:14 +02:00
31e3e861ef Update changelog, comments, made empty/no-text clipboard return NULL as with other implementation. Minor style tweaks. (#2546)
Fixed IMGUI_DISABLE_WIN32_FUNCTIONS not disabling IME code.
2019-05-18 17:44:09 +02:00
02de498a41 Add native mac copy/paste support to match win32 (#2546) 2019-05-18 17:34:58 +02:00
e6109a9145 Fixed ColorEdit breakage introduced by d3a387c (#2557, #1875, #2034) 2019-05-18 11:18:31 +02:00
679cf7434e Fix undefined behavior (#2561) 2019-05-18 10:43:30 +02:00
fc3c3de551 Fixed uses of IsItemDeactivated(), IsItemDeactivatedAfterEdit() on multi-components widgets and after EndGroup(). (#2550, #1875) 2019-05-13 19:05:41 +02:00
d3a387cc18 Fixed InputFloatX, SliderFloatX, DragFloatX functions erroneously reporting IsItemEdited() multiple times when the text input doesn't match the formatted output value (e.g. input "1" shows "1.000"). It wasn't much of a problem because we typically use the return value instead of IsItemEdited() here. (#1875, #2034) 2019-05-13 19:04:57 +02:00
99a845053a Internal: Renamed fields + minor tweaks (probably shallow break stack-layout pr, sorry!) 2019-05-13 18:26:28 +02:00
64dbd932d2 Internal: Removed GetNextItemWidth(), relying on ItemAdd or NextItemData.ClearFlags() to clear the width data. Amend 5078fa20 and undo some of its effects of imgui_widgets.cpp 2019-05-13 15:29:00 +02:00
632469d2e5 Renamed SetNextTreeNodeOpen() to SetNextItemOpen(). Refactored SetNextItemXXX stuff to match SetNextWindowXXX code closely. 2019-05-13 15:11:25 +02:00
36e714a459 Internal: Storing flags for NextWindowData so that we can clear everything with a single write and remove dummy condition fields. 2019-05-13 14:57:30 +02:00
0b485f12d7 Internal: Minor tidying/reordering of sections within ImGuiContext / window DC. 2019-05-13 14:02:03 +02:00
7355c84701 Tweak EndGroup() to facilitate fixing #2550 later (currently should have no side-effect0. Demo: Add extra widget to status query test. 2019-05-12 21:42:36 +02:00
aca6ee1a91 Cast ImTextureId to void* before printing in Metrics window. (#2548) 2019-05-11 11:34:41 +02:00
87c5356d97 FreeType: Added RasterizerFlags::Monochrome flag to disable font anti-aliasing. (#2545) Combine with RasterizerFlags::MonoHinting for best results. 2019-05-11 10:46:26 +02:00
ef13d95466 IO: changed AddInputCharacter(unsigned short c) signature to AddInputCharacter(unsigned int c).
Examples/Backends: Don't filter characters under 0x10000 before calling io.AddInputCharacter(), the filtering is done in io.AddInputCharacter() itself. This is in prevision for fuller Unicode support. (#2538, #2541)
2019-05-11 10:33:56 +02:00
7c256fbd40 Internal: Extracted some of the Begin code into RenderWindowDecorations(). 2019-05-10 22:45:52 +02:00
72951a1a85 Internal: Extracted some of the Begin code into RenderWindowTitleBarContents(). 2019-05-10 22:45:28 +02:00
b50c61c961 Internal: Begin: Update rectangles before Scrollbar() which now uses them. Fixes 39eeda0. 2019-05-10 22:30:33 +02:00
39eeda0227 Internal: Scrollbar: Further sane simplification (using InnerMainRect instead of duplicating calculations). 2019-05-10 18:52:29 +02:00
37174c85e2 Internal: Scrollbar: Extracted scrollbar code for other uses (eg. table v2 scrolling without using a child window). 2019-05-10 18:52:23 +02:00
9534ef9b26 Separator: Revert 1.70 "Declare its thickness (1.0f) to the layout" change (c5d83d8a). It's not incorrect but it breaks existing some layout patterns. Will return back to it when we expose Separator flags. 2019-05-09 17:52:56 +02:00
e29176df53 Internals: Columns: Renamed fields. Comments and tweak. Moved a demo block. 2019-05-09 13:12:09 +02:00
a4d0b0efa4 Internal: Refactored Separator into SeparatorEx(), exposed ImGuiSeparatorFlags_SpanAllColumns in imgui_internal.h and support without. (#759) + misc comments 2019-05-09 12:55:01 +02:00
b7c2759f95 Columns: Fixed Separator from creating an extraneous draw command. Fixed Selectable with SpanAllColumns flag from creating an extraneous draw command. (#125) 2019-05-09 12:10:36 +02:00
42fc563fed Version 1.71 WIP + fixed minor typo 2019-05-07 16:36:08 +02:00
d1d5075b66 Version 1.70 2019-05-06 14:17:39 +02:00
d88121ff5b Examples: DirectX9/10/11: Taking reference to device + subsequent merge of this in docking will fix DX9 issue #2524 2019-05-06 10:15:22 +02:00
6c196cf432 Examples Readme and Changelog tweaks, added #2527, re-ordered examples/README alphabetically. 2019-05-06 10:02:59 +02:00
5ecc9d5865 Examples: Metal: Add GLFW+Metal example 2019-05-06 09:51:21 +02:00
526e2303bc Window: Fixed SetNextWindowSizeConstraints() with non-rounded positions making windows drift. (#2067, #2530) 2019-05-03 19:09:44 +02:00
9c1f02a42c Misc: Made IMGUI_CHECKVERSION() macro also check for matching size of ImDrawIdx. 2019-05-03 18:42:53 +02:00
e2166db282 Internals: Fixed incorrect repeat delay/rate calculation in IsMouseClicked() with repeat flag leading to involontary but thankfully doubling the rate. Using our standard function, making the multiplicator explicit. 2019-05-03 15:06:06 +02:00
2dc81057ec Selectable: With ImGuiSelectableFlags_AllowDoubleClick doesn't return true on the mouse button releas efollowing the double-click. Only first mouse release + second mouse down (double-click) returns true. Likewise for internal ButtonBehavior() with both _PressedOnClickRelease | _PressedOnDoubleClick. (#2503) 2019-05-03 14:31:12 +02:00
86f92fe756 Demo: Improved trees in columns demo. (#2136) 2019-05-02 21:32:36 +02:00
ce19cb465f Internals: Rename GetContentRegionMaxScreen() -> GetWorkRectMax(). At this point this is mostly useful to facilitate merge of other branches. 2019-05-02 16:29:40 +02:00
a1c432d1ad Internals: SettingsHandlerWindow_ReadLine uses context parameter. 2019-05-02 14:30:35 +02:00
ae405b83a4 Examples: Added missing per-renderer local changelogs. (#2037, #1639, #2452) 2019-04-30 22:28:29 +02:00
7c6ba3a1da ImDrawCallback_ResetRenderState: Added Metal. 2019-04-30 22:18:25 +02:00
5c1cd5c8c7 ImDrawCallback_ResetRenderState, Examples: Added support for reset render state callback. (#2037, #1639, #2452) 2019-04-30 22:15:59 +02:00
3fbc0b7a9e Obsoleted GetContentRegionAvailWidth(), use GetContentRegionAvail().x instead. Kept inline redirection function. 2019-04-29 18:33:08 +02:00
db2d58a68b Drag and Drop: Fixed drag source with ImGuiDragDropFlags_SourceAllowNullID and null ID from receiving click regardless of being covered by another window (it didn't honor correct hovering rules). (#2521) 2019-04-29 16:34:02 +02:00
0f2852806c Amend 48a09a7 with changelog, breaking changes, tweak demo code for spacing. (#2518) 2019-04-29 12:44:17 +02:00
4c0f34fd5d Improved algorithm for mitre joints on thick lines 2019-04-29 12:07:03 +02:00
4dec744795 Tidying up BeginMenu() code + comments. 2019-04-29 00:02:02 +02:00
842a720e72 Popups: Closes popup at the time of FocusWindow(). Fixes right-click from closing all popups instead of aiming at the hovered popup level (regression in 1.67's ae76a1fd). 2019-04-28 22:33:58 +02:00
bda2cde68e Popups: Closing a popup restores the focused/nav window in place at the time of the popup opening, instead of restoring the window that was in the window stack at the time of the OpenPopup call. (#2517)
Among other things, this allows opening a popup while no window are focused, and pressing Escape to clear the focus again.
2019-04-28 22:18:51 +02:00
3276b12765 Internals: Added DataTypeApplyOp, DataTypeApplyOpFromText to imgui_internal.h 2019-04-28 20:55:51 +02:00
09db2f6dec Fix 61d9258 when there is not scrollbar "Window: Fixed contents region being off by WindowBorderSize amount on the right when scrollbar is active." 2019-04-28 18:50:51 +02:00
4e81b2d093 Internals: Renaming. Renamed ImGuiPopupRef to ImGuiPopupData for consistency and added constructor. 2019-04-28 17:15:08 +02:00
3d363c91fd Internals: Exposed ImGuiDataTypeInfo, DataTypeGetInfo(), DataTypeFormatString(). Comments. 2019-04-28 15:27:18 +02:00
00b3c830db Internals: Begin: Moved OuterRectClipped/InnerMainRect/InnerClipRect computation higher up in the function, next to ContentsRect/WorkRect code. Removed commented out debug drawing code which is now available in Metrics window. 2019-04-26 23:33:09 +02:00
61d92580aa Window: Fixed contents region being off by WindowBorderSize amount on the right when scrollbar is active. 2019-04-26 23:32:29 +02:00
5d799d76ea Internals: Nav scrolling uses InnerMainRect instead of InnerClipRect. 2019-04-26 23:31:51 +02:00
c5d83d8af2 Separator: Declare its thickness (1.0f) to the layout, making items around separator more symmetrical. 2019-04-26 23:31:31 +02:00
56c3aaf6bd Nav: Fixed Drag/Slider functions going into text input mode when keyboard CTRL is held while pressing NavActivate. 2019-04-25 17:50:40 +02:00
dd15b44230 Internals: TempInputText: Tidying up DragScalar / SliderScalar / TempInputTextScalar. 2019-04-25 17:50:40 +02:00
0ca1675ff9 Internals: TempInputText: Rename InputScalarAsWidgetReplacement() -> TempInputTextScalar(), ScalarAsInputTextId -> TempInputTextId, small tidying up in affected functions. 2019-04-25 16:03:47 +02:00
59a3f0476d Internals: Using more explicit PushOverrideID() helper + renamed equivalent internal tree helper. 2019-04-25 15:21:22 +02:00
1ca6e5b59f Examples: Glut: Added note about missing cursor support. (#2375, #2465) 2019-04-25 12:01:01 +02:00
4dc4ace864 Window: Fixed window with the AlwaysAutoResize flag unnecessarily extending their hovering boundaries by a few pixels (this is used to facilitate resizing from borders when available for a given window). One of the noticeable minor side effect was that navigating menus would have had a tendency to disable highlight from parent menu items earlier than necessary while approaching the child menu.
+ Changelog fixed unfinished sentence and tweaks,
2019-04-25 11:50:28 +02:00
16b18b265e MenuItem, BeginMenu: Fix undesirable tall frames in horizontal layout context, which would be visible when trying to use rounded selectable/menus.
PushStyleVar: Added comments in the assert message.
Minor tweaks.
2019-04-25 11:34:07 +02:00
6db0766564 Misc comments, internal renaming, added disable indentation option to Columns demo section. 2019-04-24 17:40:07 +02:00
6789ea3482 Examples: SDL: Gamepad support minor amend. Fixes ImGuiBackendFlags_HasGamepad not being set. Enable in Emscripten demo. Tweaks. (#2509, #2484). 2019-04-23 12:38:59 +02:00
994a92d79d Added support to use controllers via SDL_GameController. (#2509)
Updated sdl examples to use SDL_INIT_GAMECONTROLLER flag
2019-04-23 12:14:05 +02:00
16e9b8191b Increased IMGUI_VERSION_NUM arbitrarily, help narrowing down reports that don't include a commit hash. Add comments. 2019-04-22 11:16:17 +02:00
f159eb35fb Examples: SDL: Removed unused code. (#2484) 2019-04-22 10:43:14 +02:00
59f012d656 Internals: ImHashStr() default parameter. 2019-04-19 19:48:51 +02:00
5078fa208b Added SetNextItemWidth() helper to avoid using PushItemWidth/PopItemWidth() for single items. 2019-04-18 18:29:28 +02:00
8d53f834ee Demo: Documents: Fix misusage of ListBoxHeader(). 2019-04-18 18:24:51 +02:00
0e46d65b03 Misc: Fixed PushItemWidth(-width) (for right-side alignment) laying out certain items (button, listbox, etc.) with negative sizes if the 'width' argument was smaller than the available width at the time of item submission, 2019-04-18 15:46:13 +02:00
a1cf7d636d Internals: Rework CalcItemWidth / CalcItemSize but make their similarities and their differences more obvious. (#2449) 2019-04-18 15:46:13 +02:00
f355a40367 Added commentary about ContentRegion functions. Added internal GetContentRegionMaxScreen() to facilitate internal code at the moment. 2019-04-18 15:46:13 +02:00
9d4a893a77 Internals: Moved CalcItemSize next to CalcItemWidth, added comments to clarify their respective intent. Should have no side effect. 2019-04-18 15:46:12 +02:00
240dddff87 Combo, Slider: Improve rendering in situation when there's there's very little space available. 2019-04-18 15:46:12 +02:00
1aeee9d40f Internals: Columns: Tweaks, renaming. Metrics: Show rectangles for child windows.
Renamed SameLine() first parameter.
2019-04-17 22:12:17 +02:00
1d3ebef364 Columns: Fixed boundary of clipping being off by 1 pixel within the left column. 2019-04-17 21:51:13 +02:00
74a3878be4 emscripten: replace shell_minimal.html with 'soft fullscreen' version 2019-04-17 11:59:26 +02:00
1f25cdd6b4 Clarified asserts comments + todo entries. (#2500) 2019-04-17 09:59:03 +02:00
7baf45cffa Metrics: Added "Show windows rectangles" tool to visualize the different rectangles. 2019-04-16 22:02:56 +02:00
742b5f4c68 Merged a bunch of small changes from Docking branch to reduce the difference between branches.
Noticeable: horizontal alignment of CloseButton. Menu fill take account of border. Various stylistic tweaks to accomodate other changes in Docking.
2019-04-16 13:07:43 +02:00
311469e9d6 Internals: Columns: Some renaming, extracted code into GetColumnsID(). 2019-04-16 11:58:54 +02:00
8130fd9816 Examples: DirectX10/11/12, Allegro, Marmalade: Render functions early out when display size is zero (minimized). (#2496) 2019-04-15 18:47:36 +02:00
1fe6533192 Examples: Emscripten: Tweaks for size. (#2494) 2019-04-15 17:18:31 +02:00
35cbf9c052 Examples: Visual Studio: Updated default platform toolset+sdk in vcproj files from v100+sdk7 (vs2010) to v110+sdk8 (vs2012). This is mostly so we can remove reliance on DXSDK_DIR for the DX10/DX11 example, which if existing and when switching to recent SDK ends up conflicting and creating warnings. 2019-04-15 15:48:38 +02:00
eeea7da3d0 Examples: Emscripten: Fixed error in shell template. (#2494) 2019-04-15 01:46:34 +02:00
c1848b185c Examples: Emscripten: Switched to WebGL1/ES2, Added Changelog, Updated links, Added ignore list, Fixed warning with older versions. Removed reliance on C++11 (would warn on some compiler). Improved html template, removed undesirable options, reduced log size. Tweaked main.cpp. (#2494) 2019-04-15 01:28:44 +02:00
882d480b5e Examples: Removed unused variable (will be used in docking branch tho, undo when merging!) 2019-04-15 01:01:39 +02:00
622556719e Merge branch 'standalone-emscripten' of https://github.com/nicolasnoble/imgui 2019-04-15 00:36:56 +02:00
a936d0669c Adding standalone Emscripten example. 2019-04-13 22:39:42 +02:00
e805ca29d8 Internals: Moved resize grips and borders to nav layer 1 so that testing system doesn't attempt to scroll to get them inside the InnerRect. 2019-04-13 18:51:32 +02:00
fb2626c21b Tests: Added hook/tweaks for imgui-test engine. + Fixed warnings. 2019-04-13 00:29:27 +02:00
30d81f53cb PlotLines, PlotHistogram: Ignore NaN values when calculating min/max bounds. (#2485) 2019-04-12 22:16:59 +02:00
ee02cdbf03 Internals, Docs: Added a bunch of clarification about ButtonBehavior in the form of a table (and to facilitate writing tests) 2019-04-12 17:49:40 +02:00
07a70dc972 Internals: Merge minor things from range_select branch. Added ImGuiButtonFlags_NoHoveredOnNav. Added IsItemToggledSelected() - unused here. Renaming. 2019-04-11 15:40:36 +02:00
570d0bbbda Demo: Comments, tweaks, removed some uses of ImColor helpers. 2019-04-11 15:23:54 +02:00
b8fe0df7df Examples: Null: Added Makefile. 2019-04-08 19:16:45 +02:00
1391904fd2 Internals: Selectable: Added ImGuiSelectableFlags_AllowItemOverlap in imgui_internal.h (~ #684, #2341) 2019-04-08 17:59:25 +02:00
b53630813e Internals: Tweak ItemSize calls. Added todo items. 2019-04-08 16:13:51 +02:00
42423d5ea4 Examples: Makefile: Tweaks so they are more consistent with each others. Added -g./opt/local includes for MacPorts on Mac OS X. (#297) 2019-04-07 23:02:07 +02:00
1295205cd4 Examples: Vulkan: Fixed warnings. (#2480) 2019-04-07 22:27:45 +02:00
ccca76fdea Merge branch 'vulkan_fix_master' 2019-04-07 16:22:47 +02:00
302af7b2c9 FAQ tweaks. Add missing entries in imgui.cpp (which until now where only in the README). 2019-04-07 16:22:41 +02:00
c43dab2414 Vulkan: Fix not incrementing semaphore index. (#2472, #2071) 2019-04-07 15:57:07 +02:00
e099a7dc74 Vulkan: Bits. Using IM_ALLOC/IM_FREE instead of new[] / delete[]. 2019-04-05 20:27:46 +02:00
c8fd4afd75 Misc: Added IM_MALLOC/IM_FREE macros mimicking IM_NEW/IM_DELETE so user doesn't need to revert to using the ImGui::MemAlloc()/MemFree() calls directly. 2019-04-05 20:20:24 +02:00
bd351e9ac5 Misc: Added IM_MALLOC/IM_FREE macros mimicking IM_NEW/IM_DELETE so user doesn't need to revert to using the ImGui::MemAlloc()/MemFree() calls directly. 2019-04-05 20:20:08 +02:00
6bc47dfe48 Vulkan: Removed superfluous vkInstance parameters being passed along. 2019-04-05 18:24:28 +02:00
452047c7ca Vulkan: Removed requirement for user to pass their own render buffer storage to ImGui_ImplVulkan_RenderDrawData(), this is managed internally. 2019-04-05 18:24:28 +02:00
ec76722d2d Vulkan: Added ImageCount to InitInfo structure (!= MinImageCount) will be needed for viewports. Renamed FramesQueueSize -> ImageCount. (#2472, #2071) 2019-04-05 17:22:24 +02:00
a45840746e Vulkan, Viewports: Fix for resizing viewport windows crashing. (#2472) 2019-04-05 17:04:12 +02:00
0034e65c26 Vulkan: Renaming demo/helper structures. Tidying up examples main.cpp. 2019-04-04 23:40:28 +02:00
4f54a527ab Vulkan: Renaming, we want InitInfo to source MinImageCount which is the "source" value (so viewport creation can use this). Made ImGui_ImplVulkan_DestroyFrameRenderBuffers public. (#2071) 2019-04-04 23:13:31 +02:00
86f5945f49 Vulkan: Storing user info into a single g_VulkanInitInfo structure to simplify code. 2019-04-04 23:13:31 +02:00
66f4be2e13 Vulkan: Added extra parameter to ImGui_ImplVulkan_RenderDrawData(). User is in charge of owning/storing 1 ImGui_ImplVulkan_FrameRenderBuffers per in-flight rendering frame. Removed ImGui_ImplVulkan_SetFramesQueueSize. (#2461, #2348, #2378, #2097, #2071, #1677) 2019-04-04 22:27:29 +02:00
6bf981c85c Vulkan: More renaming. Comments. 2019-04-04 22:20:01 +02:00
f586764cdd Examples: Vulkan: Merged helpers into ImGui_ImplVulkanH_CreateWindowData. Removed ImGui_ImplVulkan_InvalidateFrameDeviceObjects from API. Comments. (#2071) 2019-04-04 22:12:16 +02:00
54b8a65d9e Examples: Vulkan: Renamed QueuedFramesCount to FramesQueueSize. Moved Framebuffer, Backbuffer to FrameData structure. (#2071) 2019-04-04 22:12:15 +02:00
317859a3da Examples: Vulkan: Updated Changelog, removed debug code, tweaked code, made GLFW/SDL match each others. Initialize FrameDataForRender fields. Added Assertion. Clearing fields on DestroyFrameData(). (#2071) 2019-04-04 22:11:13 +02:00
c7eef99a33 Examples: Vulkan: Fixed tabs->space, removed extraneous braces and empty lines. (#2071) 2019-04-04 22:10:43 +02:00
b88a3b2711 Examples: Vulkan: Added calls to supports runtime changing back buffer count. (#2071) 2019-04-04 22:10:43 +02:00
1c3311e4d6 Vulkan: Avoid passing negative coordinates to vkCmdSetScissor, which debug validation layers do not like. 2019-04-04 22:09:26 +02:00
fc52364652 Tabs to Spaces, comments. 2019-04-03 17:25:02 +02:00
cdb109f617 Renamed freeglut vcxproj files + Comments, Changelog (#2465) 2019-04-03 16:25:35 +02:00
ece322ff12 freeglut -> glut rename 2019-04-03 07:19:31 -07:00
3fad375f5f ifdef freeglut extensions properly 2019-04-03 07:19:31 -07:00
81f70e5b7c Fixups for OSX 2019-04-03 07:19:31 -07:00
a402f5b9a9 Add makefile for freeglut 2019-04-03 07:19:31 -07:00
5c4cc370bb Examples: Vulkan: Added shader sources/references in the .cpp source. 2019-04-03 11:23:54 +02:00
8dab7ac021 InputText: Made Shift+Tab consistently do nothing regardless of whether the back-end emits both char and keys or just keys. (#2467, #1336) 2019-04-03 11:14:34 +02:00
da035ced97 InputText, Examples/SDL: Emulate \t input if back-end doesn't provide it. (#1336, #2467)
+ Fix some output filename in SDL build batch files.
2019-04-03 11:04:00 +02:00
01e29a3933 InputText: Fixed ImGuiInputTextFlags_AllowTabInput leading to two tabs characters being inserted if the back-end provided both Key and Character input. (#2467, #1336) 2019-04-03 10:45:51 +02:00
4a57507f75 InputText: Work-around for buggy standard libraries where isprint('\t') returns true. (#2467, #1336)
Not using isprint. + todo items.
2019-04-03 10:40:14 +02:00
e3cd6b1cbb Examples: Vulkan: Using IM_ARRAYSIZE() where possible. 2019-04-02 15:34:16 +02:00
3a737e665a Examples: Vulkan: Added missing support for 32-bit indices (#define ImDrawIdx unsigned int). + demo typo 2019-04-02 10:36:35 +02:00
d9568c717d Silencing -Wstack-protector (#2459) 2019-03-31 01:35:03 -07:00
e21bbee311 Examples: DirectX9: Fixed erroneous assert in ImGui_ImplDX9_InvalidateDeviceObjects(). FreeType: Fixed suggested code to not require an initial build call.. (#2454) 2019-03-29 18:32:57 +01:00
163779da51 Examples: DirectX12: Various tidying up. 2019-03-29 16:23:37 +01:00
512d39d031 Examples: OpenGL3: Minor tweaks, clarifications + not calling glBindBuffer more than necessary in the render loop. 2019-03-29 16:17:30 +01:00
9a0e71a6ec Internals: Renamed the ImGuiWindow HiddenFrameXXX fields to decorrelate them from resizing behavior, as those values are set by other logic. 2019-03-28 15:41:49 +01:00
20188b19d6 Comments (#2441) + Freeglut fixes (#2430) 2019-03-26 12:16:23 +01:00
cf1b02e54e Rearrange code in UpdateMouseWheel(). (#2424, #1463) + Fix old io.FontAllowUserScaling feature (probably should be made obsolete, but until then best fixed) 2019-03-25 19:40:19 +01:00
1963cc59be Implement horizontal scrolling with Shift+Scroll
This is standard scrolling behaviour in most applications.
2019-03-25 19:09:40 +01:00
3d8ea352d1 InputText: Fixed selection background starts rendering one frame after the cursor movement when first transitioning from no-selection to has-selection. (Bug in 1.69) (#2436) [@Nazg-Gul] 2019-03-25 16:06:30 +01:00
abb7d7b18a InputText: Simplify read-only code path. 2019-03-25 15:50:23 +01:00
d9f6ba3035 IsWindowHovered() made change which should have no effect in master but fix result of IsWindowHovered(ImGuiHoveredFlags_ChildWindows) over multiple viewport in docking branch. (#2432) 2019-03-25 15:39:11 +01:00
a53c57152b Mention Julia binding in README (#2446)
Thank you!
2019-03-23 19:32:19 -07:00
221bf93a55 Comments, todo list, remove trailing spaces. 2019-03-17 00:56:21 +01:00
857381b9ca GetMouseDragDelta(): also returns the delta on the mouse button released frame. Verify that mouse positions are valid otherwise returns zero. Removed obsolete comment. Tweaked demo. (#2419) 2019-03-15 15:03:37 +01:00
ff03ae503b Examples: OpenGL: Added a dummy GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early, and help users understand what they are missing. (#2421) 2019-03-15 13:09:07 +01:00
cf2c52282d Version 1.70 WIP 2019-03-15 13:07:30 +01:00
ebe79bbed0 Demo: Custom rendering: Minor sizing issue fix. 2019-03-13 15:44:23 +01:00
55c02099c5 Version 1.69, comments, typos 2019-03-13 15:29:43 +01:00
a26085ed53 Internals: Fixed Navigation from reaching ImGuiItemFlags_Disabled items (#211) + Examples comments 2019-03-12 22:23:56 +01:00
53e0c13be2 TabBar: Reworked scrolling policy (when ImGuiTabBarFlags_FittingPolicyScroll is set) to teleport the view when aiming at a tab far away the visible section, and otherwise accelerate the scrolling speed to cap the scrolling time to 0.3 seconds. 2019-03-12 20:57:02 +01:00
99d8425173 TabBar: Fixed Tab tooltip code making drag and drop tooltip disappear during the frame where the drag payload activate a tab. 2019-03-12 18:56:19 +01:00
cfa8f672f6 Examples: GLFW, SDL: Preserve DisplayFramebufferScale when main viewport is minimized. (This is particularly useful for the viewport branch because we are not supporting per-viewport frame-buffer scale. It fixes windows not refreshing when main viewport is minimized.) (#2416) 2019-03-12 18:27:14 +01:00
495065f790 Fixed Clang and PVS warnings. 2019-03-12 12:08:51 +01:00
f254168335 InputText: Fixed c779fbb leading to display of the wrong buffer when resizing a buffer. (#2400, #2006, #1443, #1008). 2019-03-12 11:56:40 +01:00
897badec7a Demo: InputText: Demonstrating use of ImGuiInputTextFlags_CallbackResize. (#2006, #1443, #1008). 2019-03-12 11:24:49 +01:00
a92c587c75 Added GetGlyphRangesVietnamese() helper. (#2403) 2019-03-11 22:02:59 +01:00
65c2220049 Internal: Removed unused fields from ImGuiMenuColumns. 2019-03-11 20:14:56 +01:00
6767b0a1b0 Examples: Win32+DirectX: moved helper functions below main. 2019-03-11 16:00:18 +01:00
b5d57a6615 Fix typos. (#2413) 2019-03-09 10:10:17 +01:00
17c567c3a9 Don't use const qualified parameters in declarations.
This fixes warnings from clang-tidy like this:

    parameter 'v_max' is const-qualified in the function declaration;
    const-qualification of parameters only has an effect in function definitions

Since values (rather than references or pointers) don't need to be
const, they don't need to be marked that way in the function declaration.
2019-03-08 18:21:11 +01:00
79bb4ce128 Added ImGuiColorEditFlagsFlags_InputHSV. (#2383, #2384) 2019-03-08 18:16:41 +01:00
8e0e91827f ColorEdit: Fixed tooltip not honoring the ImGuiColorEditFlags_NoAlpha contract of never reading the 4th float in the array (value was read and discarded). (#2384) 2019-03-08 18:16:41 +01:00
66936880ba Moved placeholder sections to match Docking branch. Comments. 2019-03-08 18:16:41 +01:00
3b11505481 Fix typos. (#2411) 2019-03-08 17:52:32 +01:00
f717df4eb6 Internal: Columns: Allow to use BeginColumns(1) so code designed for variable number of columns can still call NextColumn etc. (#125) 2019-03-07 18:22:28 +01:00
e9651aaa77 TabBar: Fixed ImGuiTabItemFlags_SetSelected being ignored if the tab is not visible (with scrolling policy enabled) or if is currently appearing. 2019-03-07 17:45:59 +01:00
1c23981782 Made ImS8 and ImS16 explicitly signed in case some crazy SDK decide to flip the signedness over. (#2408) 2019-03-07 16:10:44 +01:00
8464df1f6e Internals: ColorEdit: Minor optimizations. Initialize internal arrays as static const, avoid unnecessary HSV->RGB conversion. 2019-03-06 19:30:34 +01:00
ea8158acdf Demo: Renamed ShowHelpMarker() -> HelpMarker(). Fixed minor PVS warning. Removed unnecessary casts. 2019-03-06 18:24:07 +01:00
510342f024 Examples: DirectX9: Minor changes to match the other DirectX examples more closely. (#2394) 2019-03-06 18:00:04 +01:00
c779fbb651 InputTextWithHint: Fix for Password fields. Update changelog, demo. (#2400) 2019-03-06 17:33:24 +01:00
ab80ee6453 Added InputTextWithHint() (#2400)
Squashed commit of the following:

commit 1970d84051d3878f8c1354d9c33c795d9c66143f
Author: Lucas Lazare <lazarelucas@yahoo.fr>
Date:   Tue Mar 5 12:20:39 2019 -0500

    Removing sneaky tabulations #2 (why, editor T-T)

    I should update my settings, I guess

commit 219bdfcb7fbd17edf3048cb0edfde2532e4d6ac3
Author: Lucas Lazare <lazarelucas@yahoo.fr>
Date:   Tue Mar 5 12:17:27 2019 -0500

    Removing useless check introduced in b0d172

commit 8afd7a2b459df0eb14eca88d832d2bebd1e684e6
Author: Lucas Lazare <lazarelucas@yahoo.fr>
Date:   Tue Mar 5 11:49:24 2019 -0500

    Removing sneaky tabulations

commit 8e0490863126d63cafc782a6aac8707e44f95653
Author: Lucas Lazare <lazarelucas@yahoo.fr>
Date:   Tue Mar 5 11:45:13 2019 -0500

    Moving InputTextHinted code to InputTextEx

commit b0d1723a2fb02d17ba15b9c1e679dedbbe3c17fd
Author: Lucas Lazare <lazarelucas@yahoo.fr>
Date:   Tue Mar 5 00:23:02 2019 -0500

    C++11 to C++98

commit 9afeae399826015357962607b4aeb0109fde698e
Author: Lucas Lazare <lazarelucas@yahoo.fr>
Date:   Mon Mar 4 23:43:28 2019 -0500

    Added InputTextHinted
2019-03-06 17:33:05 +01:00
fe48368cb2 InputText: Moving some code in anticipation of supporting hint display with password. This commit is aimed at having no visible side effect. (#2400) 2019-03-06 15:45:11 +01:00
344140004b Fixed IsItemDeactivated()/IsItemDeactivatedAfterEdit() from not correctly returning true when tabbing out of a focusable widget (Input/Slider/Drag) in most situations. (#2215, #1875)
+ Minor renaming of a local variable in widget code.
2019-03-05 22:09:25 +01:00
26328fc9fe Internal: Tabbing/Focus: Tidying up old code, moved some state to context instead of window. Storing new data will allow us to fix the bug mentioned in #2215 (probably in next commit). 2019-03-05 19:51:27 +01:00
9c45072cb0 Demo: Added flags to InputTextMulttiline() demo. 2019-03-05 19:25:07 +01:00
076be7ec41 MenuItem, Selectable: Fixed disabled widget interfering with navigation (fix c2db7f63 in 1.67). 2019-03-05 19:00:19 +01:00
ce4e62649a Internal: Tabbing: Tweaks to FocusableItemRegister and using the standard mechanism to allow/block Tab being interpreting by tabbing instead of InputText() widget. 2019-03-05 18:24:59 +01:00
1ed3c4cf4a Internal: Text: Extracted TextUnformatted into TextEx over which we can freely atter the signature. Clarified current large text behavior of TextUnformatted with explicit ImGuiTextFlags_NoWidthForLargeClippedText flag (always set). 2019-03-05 17:35:45 +01:00
622a27506a Text: Fixed large Text/TextUnformatted call not declaring its size when starting below the lower point of the current clipping rectangle. Somehow this bug has been there since v1.0! It was hardly noticeable but would affect the scrolling range, which in turn would affect some scrolling request functions when called during the opening frame of a window. 2019-03-05 15:23:11 +01:00
ac4842fa17 Nav: Fixed Ctrl+Tab keeping active InputText() of a previous window active after the switch. (#2380) 2019-03-05 12:03:54 +01:00
f4dd990e38 Comments and Issue Template 2019-03-05 11:03:32 +01:00
94e794f81b Renamed GetOverlayDrawList() to GetForegroundDrawList() for consistency. Kept redirection function (will obsolete). (#2391)
Demo: Using GetBackgroundDrawList() and GetForegroundDrawList() in "Custom Rendering" demo.
2019-03-04 16:35:50 +01:00
96b13760d4 Added GetBackgroundDrawList() helper to quickly get access to a ImDrawList that will be rendered behind every other windows. (#2391) 2019-03-04 16:10:51 +01:00
beb3062dc5 Examples: OpenGL: Fix to be able to run on ES 2.0 / WebGL 1.0. [@rmitton, @gabrielcuvillier] 2019-03-03 23:34:28 +01:00
9d1a392d7d Examples: OpenGL: Comments about versions and loaders. (#2393, #2351) 2019-03-03 23:25:51 +01:00
1c67d09c0b ColorPicker: Fix assertion when running in a collapsed window and dragging its title bar (#2389) 2019-03-01 00:06:36 +01:00
1d0b4df3d9 Misc: Asserting in NewFrame() if style.WindowMinSize is zero or smaller than (1.0f,1.0f). Internal: ImHash functions tweaks. Added InputText() to query status section. 2019-02-28 22:57:22 +01:00
f02705fbaa InputInt, InputScalar: +/- buttons now respects the natural type limits instead of overflowing or underflowing the value. 2019-02-27 18:59:17 +01:00
736d3e2654 DragScalar, InputScalar, SliderScalar: Added support for u8/s8/u16/s16 data types. We are reusing function instances for larger types to reduce code size. (#643, #320, #708, #1011) 2019-02-27 18:16:03 +01:00
525a53a86b Comments 2019-02-27 17:26:18 +01:00
ac47710db7 Internal: InputText: Tweaks to make PVS static analyzer relax a little with its false positive. 2019-02-27 16:49:55 +01:00
6de09a5e48 Renamed ColorEdit/ColorPicker's ImGuiColorEditFlags_RGB/_HSV/_HEX flags to respectively ImGuiColorEditFlags_DisplayRGB/_DisplayHSV/_DisplayHex. This is anticipation of adding new flags to ColorEdit/ColorPicker functions which would make those ambiguous. (#2384) [@haldean] 2019-02-27 16:45:58 +01:00
8a2f6866a6 add _Show prefix to color flags that control inputs, rename __InputsMask to __ShowMask
This is anticipation of changing __InputsMask to control the format of
input colors, and adding _InputRGB and _InputHSV to change how input
colors are interpreted.
2019-02-27 16:24:15 +01:00
688035b5f4 Added px_render_imgui.h (#1935) 2019-02-27 15:06:11 +01:00
cef77098ab Update README.md 2019-02-27 15:00:41 +01:00
75641926e1 Merge branch 'allegro-touch' of https://github.com/dos1/imgui into dos1-allegro-touch
# Conflicts:
#	examples/imgui_impl_allegro5.cpp
2019-02-27 14:39:41 +01:00
def723b6b6 Plot: Fixed error in 5e3a1de (#2387) 2019-02-27 14:34:11 +01:00
5e3a1de4e6 Plot: Fixed divide-by-zero in PlotLines() when passing a count of 1. (#2387) [@Lectem] 2019-02-27 14:25:37 +01:00
cf3cb7cf7e InputText: Fixed various display corruption related to swapping the underlying buffer while a input widget is active (both for writable and read-only paths). Often they would manifest when manipulating the scrollbar of a multi-line input text. 2019-02-26 12:50:44 +01:00
b7b82520b4 Internal: InputText: Minor changes (intended to have side-effect but clarify next commit, however there is rarely such a thing as zero side effect in InputText land!) 2019-02-26 12:28:27 +01:00
439f726945 InputText; Disabled rendering selection when inactive (it kinda work but I'm not sure this is desirable especially for single-line input, was not intended to be active). 2019-02-24 23:31:00 +01:00
5d7bd2309b Fixes warning caused by a missing switch/case. (#2382, #2381) 2019-02-24 23:19:36 +01:00
c3ea1748dc Fix -Wconversion warning (#2379)
The warning was caused by implicit conversion from pointer type which
NULL has to non-pointer type, e.g. if ImTextureID is long int
2019-02-24 18:35:52 +01:00
6f80179a1d InputText: Fixed deactivated but-last-active InputText instance holding on displaying the last active version of the text and not reflecting change in the source. Fix/amend 2e9a175. [+test] 2019-02-23 17:04:54 +01:00
6cbf4b8121 Fixed uninitialized variable (leading to asserts in the docking branch). (#2376, #2371) 2019-02-23 17:00:59 +01:00
9558e327d2 Log/Capture: Fixed extraneous leading carriage return. Fixed an issue when empty string on a new line would not emit a carriage return. 2019-02-23 16:22:55 +01:00
cd67d4d3c1 Log/Capture: Fixed LogXXX functions 'auto_open_depth' parameter being treated as an absolute tree depth instead of a relative one. Fixed CollapsingHeader trailing ascii representation being "#" instead of "##". Minor tidying up the of code. 2019-02-23 16:07:01 +01:00
2cd7de5666 Internal: Log/Capture: Rework to add an internal LogToBuffer() function which is useful for writing automated tests. Clarified logging state by adding an enum. 2019-02-23 15:57:06 +01:00
3eba840053 Nav: Fixed a tap on AltGR (e.g. German keyboard) from navigation to the menu layer. (follow and extend on e.g #369, #370) 2019-02-23 14:50:36 +01:00
9da48c16c5 TabBar: Added extra mis-usage error recovery. Past the assert, common mis-usage don't lead to hard crashes any more, facilitating integration with scripting languages. (#1651) 2019-02-22 12:27:41 +01:00
0f83145aa8 TabBar: Fixed a crash when using BeginTabBar() recursively (didn't affect docking). (#2371)
Added ImPool::Contains() helper.
2019-02-22 12:24:27 +01:00
f988618ebe Internal: InputText: Tweaks (including a large indentation change, compare ignoring space) to make next commit more digestible. 2019-02-21 23:06:26 +01:00
be593f2c16 Internal: InputText: refactor the flow to easily decorrelate rendering of selection vs cursor, which would allow us to render selection on inactive items, and generally makes the code clearer. + Some renaming. 2019-02-21 22:56:09 +01:00
332f8f2462 Internal: InputText: Made clipboard copy/cut use its own temporary buffer (like paste) so we can guarantee that TempBuffer if not altered and can be preserved. Renamed TempBufferA to TextA to celebrate this. 2019-02-21 19:55:37 +01:00
81a8730022 Internal: InputText: Renamed is_editable to !is_readonly, Hopefully more explicit. Renamed internal member. Shuffled some code. Added comments, assert (_will_ trigger on !readonly > readonly edge, old bug). 2019-02-21 19:55:36 +01:00
cc3be5d428 InputText: Fixed an edge case crash that would happen if another widget sharing the same ID is being swapped with an InputText that has yet to be activated. 2019-02-21 19:55:36 +01:00
2e9a175057 Internal: InputText: Refactor to clarify access pattern to the InputTextState (we are now accessing via a pointer which can be NULL, shortened its name while we are at it) + added an assert to track an issue that existed already before. 2019-02-21 19:55:36 +01:00
677e64e71e Internal: InputText: Comments. Renamed internal member. Renamed ImGuiStb->ImStb. 2019-02-20 21:34:08 +01:00
79f7778e48 Moved binaries to dearimgui.org/binaries 2019-02-20 15:11:18 +01:00
2068dd509c Examples: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if the OpenGL headers/loader happens to define the value. (#2366, #2186) 2019-02-20 14:31:19 +01:00
782b747a17 InputText: Renamed some local variables to clarify code. Should be a no-op functionality wise. TODO items. 2019-02-20 00:45:45 +01:00
7c51cba74f InputInt, InputFloat, InputScalar: Fix to keep the label of the +/- buttons centered when style.FramePadding.x is abnormally larger than style.FramePadding.y. Since the buttons are meant to be square (to align with e.g. color button) we always use FramePadding.y. (#2367) 2019-02-20 00:20:11 +01:00
257f5d204e Version 1.69 WIP 2019-02-20 00:11:36 +01:00
93b06e6e7c Internal: Changed Scrollbar() signature. Using GetScrollbarID() in InputTextMultiline().
Removed multiple semi-colons (#2368)
2019-02-20 00:08:21 +01:00
91cc32379d Updated binaries (now auto-generated by a script! next step would be to slowly transition all this stuff into a public repo) 2019-02-19 20:27:47 +01:00
d0c98bf880 Examples: VS: Made project paths independant of SolutionDir so they can be built aside from the solution. 2019-02-19 20:13:06 +01:00
77833003ff Fixed unused argument warning when compiling with IM_ASERT() evaluating to an empty macro. 2019-02-19 17:32:14 +01:00
3c15dffc94 Version 1.68 2019-02-19 12:50:46 +01:00
f5bf6e38d2 Font: Fixed assert when specifying duplicate/overlapping ranges within a same font. (#2353, #2233) 2019-02-18 12:11:46 +01:00
db40699990 imgui_freeetype: Updated suggested test code. 2019-02-18 12:08:19 +01:00
d972533d09 Examples: Vulkan: Rewrote scissor processing to match other examples more closely. Removed extraneous +1 of scissor extent height. 2019-02-16 12:33:38 +01:00
dd14adc731 Examples: Vulkan: Support draw_data->FramebufferScale correctly matching a79785c for on Metal/GL2/GL3. (#2306, #1676) 2019-02-16 12:32:44 +01:00
f977871854 ImFont: Minor adjustment to the structure.
Examples: Removed unused variable.
2019-02-15 18:56:08 +01:00
76dbff37cd Selectable: Tweaks for #2347 (demo, changelog, member position) 2019-02-14 20:29:50 +01:00
b277cfffc8 Selectable: add support for specifying text alignment on selectables (#2347)
Adds a style variable to Selectable that allows clients to specify the
text alignment within Selectables, adds a section in the demo to
demonstrate selectable text alignment, and a pair of sliders in the
style editor to change selectable alignment on the fly.

In terms of implementation, this one is extremely simple: Selectable was
already calling an API that supports text alignment, but had hard-coded
it to top-left. This changes that to just pass the style variable
straight through to RenderTextClipped. Backwards-compatibility is
preserved by defaulting the text_align parameter to (0, 0), i.e.,
top-left.

This also fixes a bug with selectable text rendering that caused
right-aligned text in a selectable to be clipped incorrectly, because
the wrong clipping rectangle was being used.
2019-02-14 19:38:57 +01:00
93d1179805 Examples: Extracted gamepad code into ImGui_ImplGlfw_UpdateGamepads(). Renamed matching Win32 function for consistency.
Added more link to nothing's oversample document. Spacing bits.
2019-02-14 19:29:09 +01:00
3c07ec6a61 Made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame).
Causing too many subtle side-effect, e.g. IsNavInputPressed() would return true multiple times in a row.
2019-02-14 17:14:29 +01:00
2206df9e7a Demo: Added Auto-Scroll option in Log/Console. Comments. Removed some ImColor() uses. 2019-02-14 14:08:36 +01:00
8522a4bbea Fixed Clang warning ("multi-line comment"). XCode also also "space between \ and carriage return". Perhaps it would work with 2 spaces? Adding a dot for now.. 2019-02-14 14:08:00 +01:00
0236bc246f Scrollbar: Fade out and disable interaction when too small, in order to facilitate using the resize grab on very small window, as well as reducing visual noise/overlap. (+1 squashed commits)
Internals: Added GetScrollbarID(). (#1185)
2019-02-14 14:07:59 +01:00
57a586b4f1 Font: Moved functions to internal block (not enforced). Made ConfigData pointer const. Added link to stb's notes. 2019-02-13 18:21:21 +01:00
fcdf704dfa Changelog: Added changelog from 1.40 to 1.47 (pasted from the Releases section) + some wrapping. 2019-02-13 14:55:28 +01:00
cbc8e57410 Update README.md - change imgui-sfml link (#2345)
Changed link from https://github.com/EliasD/sfml to https://github.com/eliasdaler/sfml (no redirect + more reliable)
2019-02-13 11:50:14 +01:00
417cf2237f Font: Fixed high-level ImGui::CalcTextSize() used by most widgets from erroneously subtracting 1.0f*scale to calculated text width. Among noticeable side-effects, it would make sequences of repeated Text/SameLine calls not align the same as a single call, and create mismatch between high-level size calculation and those performed with the lower-level ImDrawList api. (#792) 2019-02-12 22:43:56 +01:00
0640b6e67c Shallow tweaks 2019-02-12 22:15:19 +01:00
cc80d8e118 Examples: Metal: Compilation fix. 2019-02-12 10:30:09 +01:00
169e3981fd Examples: OpenGL2: Added #define GL_SILENCE_DEPRECATION to cope with newer XCode warnings. 2019-02-11 19:09:54 +01:00
d16dbc5b87 Examples: SDL: Using the SDL_WINDOW_ALLOW_HIGHDPI flag. (#2306, #1676) [@rasky] 2019-02-11 18:52:08 +01:00
a79785c0b9 ImDrawData: Added FramebufferScale field (currently a copy of the value from io.DisplayFramebufferScale).
This is to allow render functions being written without pulling any data from ImGuiIO, allowing incoming multi-viewport feature to behave on Retina display and with multiple displays. If you are not using a custom binding, please update your render function code ahead of time, and use draw_data->FramebufferScale instead of io.DisplayFramebufferScale. (#2306, #1676)
Examples: Metal, OpenGL2, OpenGL3: Fixed offsetting of clipping rectangle with ImDrawData::DisplayPos != (0,0) when the display frame-buffer scale scale is not (1,1). While this doesn't make a difference when using master branch, this is effectively fixing support for multi-viewport with Mac Retina Displays on those examples. (#2306) Also using ImDrawData::FramebufferScale instead of io.DisplayFramebufferScale.
Examples: Clarified the use the ImDrawData::DisplayPos to offset clipping rectangles.
2019-02-11 18:52:08 +01:00
ef7940699e Examples: Metal: Removed unnecessary loop. Fixed OSX Clang warning in imstb_truetype. (#1929, #1873) 2019-02-11 17:38:34 +01:00
4b41d3b280 ImFont: Rearranged members toward an optimal CalcTextSize() loop. Removed comments from destructor. Made constructor more explicit. 2019-02-09 15:54:47 +01:00
539f69b950 Updated STB libraries to latest (drift has been reduced with nothings/stb as most of our changes were merged). Using [DEAR IMGUI] markers when changed. 2019-02-08 15:24:59 +01:00
00c637961b Demo: Font selector allow selecting fonts with same debug name. (#2332) 2019-02-08 14:59:09 +01:00
afc36cf802 Window: Fixed initial width of collapsed windows not taking account of contents width (broken in 1.67). (#2336, #176) 2019-02-08 14:34:42 +01:00
1b63ded8fa Tabs: Fixed border (when enabled) so it is aligned correctly mid-pixel and appears as bright as other borders. 2019-02-07 12:07:53 +01:00
29d38b59d0 ListBox/InputTextMultiline: Better optimized when clipped / non-visible. 2019-02-06 14:46:14 +01:00
62084aac0f DragScalarN, SliderScalarN, InputScalarN: Removed unnecessary string id after the integer PushID() calls. 2019-02-06 14:39:00 +01:00
f366828dd2 Minor tweaks to reduce false positive of PVS Studio static analyzer. 2019-02-06 13:16:52 +01:00
5bdc7d7a6f Menus: Tweaked horizontal overlap between parent and child menu (to help convey relative depth) from using style.ItemSpacing.x to style.ItemInnerSpacing.x, the later being expected to be smaller. (#1086) 2019-02-06 12:32:10 +01:00
e3dd95d335 Added IsItemActivated() as an extension to the IsItemDeactivated/IsItemDeactivatedAfterEdit functions which are useful to implement variety of undo patterns. (#820, #956, #1875) 2019-02-06 11:52:42 +01:00
c59611a3b3 InputText: Fixed redo buffer exhaustion handling (rare) which could corrupt the undo character buffer. (#2333) 2019-02-05 23:38:57 +01:00
97ed97b8ce Plot: Register an ID to take the click the same way as other framed widgets. Set HoveredId in the FramePadding zone (between inner_bb and frame_bb). 2019-02-05 21:17:04 +01:00
cef4e086ba Internals: Selectable: Fixed rendering width miscalculation when starting pos is not line start pos, which would generally be unnoticeable. Could affect group lock X with a smaller SetCursorPos value but that's unlikely to be used. 2019-02-05 21:17:00 +01:00
b8c24aff4c Internals: EndGroup: Removed unnecesary parameter to ItemSize() 2019-02-05 21:16:54 +01:00
521470b3cd Internals: Removed unnecessary code. 2019-02-05 21:16:32 +01:00
5a95c77388 Merge branch 'master' of https://github.com/ocornut/imgui 2019-02-05 13:53:09 +01:00
b980e0077a Tabs: Moved Tab List Popup to left-side to match docking button. Highlight selected tab. (#261, #351) 2019-02-05 13:39:48 +01:00
d38f4dc143 Tabs: Non-docking tab bars are storing names to allow tab list button + whole style scaling. Added ImGuiTabBarFlags_TabListPopupButton flag to show a popup button on manual tab bars. Locking FramePadding for the scope of a tab-bar to avoid sheering/clipping of tab item. Made scaling of tab ellipsis less awkward. (#261, #351) 2019-02-05 13:23:44 +01:00
d93e3c17fc ImGuiTextBuffer: Fix size() to allow using ImGuiTextBuffer with resize(0) patterns. 2019-02-05 13:16:23 +01:00
65c972e9e4 Update README.md 2019-02-05 11:45:19 +01:00
f7c879eb60 RadioButton: Fixed label horizontal alignment to precisely match Checkbox(). + Internals: Checkbox, RadioButton: Single call to ItemSize() for flow layout purpose. 2019-02-04 23:34:32 +01:00
0b05ba18df Internals: DragScalar, SliderScalar: Calling ItemSize before ItemAdd as with every other widgets so we can more easily rearrange the signature of ItemXXX functions (toward allowing non-rounded sizes for scaling and flow layout). 2019-02-04 23:34:27 +01:00
8e44aacc8e Fonts: Fixed crash if FontGlobalScale is zero. Correctly debug naming default font if not 13 px. Demo: Moved PopupRounding along with other rounding values. Metrics: Displaying indexes with idx to be correct / less misleading. 2019-02-04 23:34:20 +01:00
c23a19c26f Internals: Exposed internal SetWindowPos to imgui_internal.h (for imgui-test) 2019-02-03 17:29:51 +01:00
ac6d474103 Removed io.DisplayVisibleMin/DisplayVisibleMax (which were marked obsolete and removed from viewport/docking branch already). 2019-02-01 16:37:07 +01:00
5fc6899dc2 Examples: OpenGL3: Using GLSL 4.10 shaders for any GLSL version over 410 (e.g. 430, 450). (#2329) [@BrutPitt] 2019-02-01 15:13:54 +01:00
5cb7040f66 Internals: Tracking dummy select scope id (currently always zero) to facilitate merging of the range_select branch. (#1861) 2019-02-01 12:14:38 +01:00
d5945aa25b Internals: Minor changes to TreeNodeBehavior() and Selectable() for the benefit of fhe range_select branch. (#1861) 2019-02-01 12:14:38 +01:00
0d4a2a2cd0 Internals: Track ActiveIdHasBeenPressed (similar to ActiveIdHasBeenEdited). This is currently mostly for the benefit of the range_select branch. (#1861) 2019-02-01 12:14:37 +01:00
52a9f8bd3e Merged from Docking branch: Various small changes, comments, typos fixes, moved blocks. To reduce overall drift. Should be no-op. 2019-02-01 10:26:08 +01:00
699e945a82 Merged from Docking branch: non-const ImVec2[] operator. 2019-02-01 10:22:46 +01:00
2d363fa315 Fixed doc typo (#2326) 2019-01-31 14:19:15 +01:00
16c0a0217c Updating supporter list. 2019-01-31 13:45:46 +01:00
1fb57c97c6 Internals: InputScalarAsWidgetReplacement: Fixed seemingly unnecessary calling of SetActiveID/SetHoveredID every frame, which in turns allow us to remove the g.ActiveIdAllow/Block settings duplicated. 2019-01-30 15:41:20 +01:00
fb4f1ff7f6 InputText: Fixed a bug where ESCAPE would be first captured by the Keyboard Navigation code. (#2321, #787) 2019-01-30 15:16:09 +01:00
158995f271 InputText: Fixed a bug where ESCAPE would not restore the initial value in all situations. (#2321) [@relick] 2019-01-30 13:15:14 +01:00
0a233a505d imgui-test: Added extra item info callbacks. Using nav_bb for interactions when possible. Comments, Demo tweaks. 2019-01-30 12:53:01 +01:00
aacf993ee1 ImStrncpy: Fixed -Wstringop-truncation warning on GCC8 (#2323) 2019-01-30 10:19:40 +01:00
ed240c910b Demo: Fixed "Log" demo not initializing properly, leading to the first line not showing before a Clear. (#2318) [@bluescan] 2019-01-29 14:36:55 +01:00
8a4422b2fa Fixed CloseCurrentPopup() on a child-menu of a modal incorrectly closing the modal. (#2308) 2019-01-27 23:54:17 +01:00
13ca2fe845 Silence XCode static analysis false positive (#2309) 2019-01-27 23:30:44 +01:00
8a605354ef Replacing one of the third-party Python bindings. (#2312)
Removing the unmaintained CyImGui (only 7 commits, last one made in 2015) and replacing it with bimpy.
2019-01-27 21:59:48 +01:00
b26ac92a12 Revert "Added PushID(size_t sz) helper (may not be useful/meaningful for non C/C++ languages)."
This reverts commit 20bc06af70.
2019-01-27 16:43:56 +01:00
f56d9b74cc Nav: Removed unnecessary test (always failing). 2019-01-27 16:37:02 +01:00
4e8e177cac Persistently fixing some PVS-Studio static analyzer false positive warnings. 2019-01-27 16:35:48 +01:00
ee3b4f2bf1 Using IM_UNUSED() macro. 2019-01-27 16:23:23 +01:00
c3c2cd1e82 Fix various XCode and PVS-Studio static analyzer warnings (#2309) 2019-01-27 16:18:23 +01:00
20bc06af70 Added PushID(size_t sz) helper (may not be useful/meaningful for non C/C++ languages). 2019-01-27 16:18:23 +01:00
e55678adec Update README.md (changed e-mail address) 2019-01-24 18:31:31 +01:00
a8277ca873 Reoder Python bindings 2019-01-23 20:04:08 +01:00
c362a96a3f When resizing from an edge, the border is more visible and better follow the rounded corners. Border rendering moved to RenderOuterBorders so it can be called in a different order for docking. (#1495, #822) 2019-01-23 19:21:25 +01:00
ab9cd44c89 Examples: DirectX9: Fix Clang warning. 2019-01-22 13:47:15 +01:00
f14f93ef6e Fixed range-version of PushID() and GetID() not honoring the ### operator to restart from the seed value. 2019-01-21 16:50:27 +01:00
28901dd104 Internals: Tweaks. Comments about PushID/GetID public function. 2019-01-21 16:50:27 +01:00
f994b8aab8 ImHash: Moved crc32 table out of the function so it can be shared, also avoid cases were compiler tries to makes its initialization thread-safe. 2019-01-21 16:50:27 +01:00
1e4cf67a53 avoid floating point exception when _EM_OVERFLOW is enabled (#2303) 2019-01-21 16:43:07 +01:00
ea7206fd4f Fixed using imgui_freetype.cpp in unity builds. (#2302) 2019-01-21 13:58:29 +01:00
54ba8a643e Removed trailing spaces from text files. (#2038, #2299) 2019-01-20 22:23:29 +01:00
00ffdb9fa9 ImGuiTextBuffer: Added append() function (unformatted). 2019-01-20 22:21:26 +01:00
259f3c78a2 Examples: OpenGL2: Added (yet another) comment/instruction against using opengl2 with modern OpenGL. (#2297) 2019-01-20 18:13:39 +01:00
2c38b32db1 Removed trailing spaces (#2038, #2299) 2019-01-20 17:56:17 +01:00
e837099b67 Update for stb_ files. (#2038) 2019-01-20 17:51:51 +01:00
f94ba546ba Added checks for "zero-as-null-pointer-constant" warnings for older Clang (#2299, followup to #2277) 2019-01-20 17:46:00 +01:00
8a63c72ac4 Fix the year for screenshot gallery part 7 and 8 links (#2298) 2019-01-19 20:45:17 +01:00
fcd61e0c59 Comments about DLL boundaries and using TLS variables for GImGui. (#2292) 2019-01-18 23:04:45 +01:00
92d29531fa Qt links 2019-01-18 11:34:25 +01:00
295ada0364 Examples: Win32: Using wc.lpszClassName instead of duplicating the literal. + tweak README format. 2019-01-17 18:30:15 +01:00
b8020032f9 Examples: Win32: Added support for mouse buttons 4 and 5 via WM_XBUTTON* messages. (#2264) 2019-01-17 16:55:23 +01:00
bebb07f12d ImFontAtlas: Added 0x2000-0x206F general punctuation range to default ChineseFull/ChineseSimplifiedCommon ranges. (#2093) 2019-01-17 16:48:11 +01:00
872477548b Examples: Win32: Using IsChild() to be compatible with windows created within a parent. (#1951, #2087, #2156, #2232) 2019-01-17 11:45:32 +01:00
14c40242db Examples: DirectX9: Explicitly disable fog (D3DRS_FOGENABLE) before drawing in case user state has it set. (#2288, #2290) 2019-01-17 11:39:40 +01:00
f2c92808f8 EditorConfig: Further tweaks (#2038) 2019-01-16 22:02:42 +01:00
83810039d1 Add editor config for 4 spaces instead of tab. 2019-01-16 22:00:33 +01:00
8cbb91261e ImDrawList: Fixed AddCircle(), AddCircleFilled() angle step being off, which was visible when drawing a "circle" with a small number of segments (e.g. an hexagon). (#2287) [@baktery]
+ Demo tweaks
2019-01-16 17:47:49 +01:00
06aaf23877 Various tweaks and fixes as suggested by PVS Studio (thanks PVS Studio!) 2019-01-16 16:10:51 +01:00
882f1bc135 Examples: DirectX12: Targeting 10.0.14393.0 instead of 10.0.16299.0 (available on AppVeyor, and higher version doesn't seem necessary). 2019-01-16 15:10:31 +01:00
09f1cb642b FreeType: Minor tweaks previous commit (#2285) 2019-01-15 21:50:43 +01:00
daac9c7559 By default ImGuiFreeType will use ImGui::MemAlloc()/MemFree().
ImGuiFreeType::SetAllocatorFunctions() can be used to specify custom allocator.
2019-01-15 21:47:46 +01:00
f435aa193b Examples: Win32: Added support for XInput games (if ImGuiConfigFlags_NavEnableGamepad is enabled). 2019-01-15 21:19:02 +01:00
133f112af0 Examples: Win32: Using GetForegroundWindow() instead of GetActiveWindow() to be compatible with windows created in a different thread. (#1951, #2087, #2156, #2232) [many people] 2019-01-15 20:27:32 +01:00
95ee99e6aa Version 1.68 WIP 2019-01-15 20:19:05 +01:00
d38d7c6628 TODO update + internals: changed order or ImGuiLayoutType enums to allow using them for indexing. 2019-01-15 15:06:24 +01:00
b8c6e31c2d Fixed cursor issue caused by 6890e08b when calling BeginChild/EndChild multiple times to reappend into a same child window. (#2282) 2019-01-15 15:05:56 +01:00
7a5058e3bf Version 1.67 2019-01-14 17:41:44 +01:00
1da40df279 DragFloat: Fixed broken mouse direction change with power!=1.0. (#2174, #2206) [@Joshhua5] 2019-01-14 17:38:19 +01:00
6e41745f31 Added a bunch of diagnostic ignore to cope with Clang -Weverything being absurd. Also fixed two legit warnings. (#2277) 2019-01-13 18:57:46 +01:00
abdd39b700 Merge branch 'atlas_fixes' 2019-01-13 14:19:07 +01:00
7e78865613 Demo: Fixed bounds of DragFloat in Clipping section to avoid passing zero-sized to InvisibleButton(). 2019-01-12 19:48:07 +01:00
49994ceb6e FAQ entry, moved ImTextureId, Gallery links. 2019-01-12 19:48:07 +01:00
8df8482ef4 imgui_freetype: Fixed redundant FT_Load_Glyph() calls, unused parameters, and compilation warning/error. (#2270) 2019-01-12 11:45:58 +01:00
651130002f ImFontAtlas: Fixed allocating for last bit (would only affect is that last codepoint is a multiple of 32). (#2270) 2019-01-11 15:25:43 +01:00
21828b08a0 ImFontAtlas: Rewrote FreeType based builder.
- Fixed abnormally high atlas height. (#618)
- Fixed support for any values of TexGlyphPadding (not just only 1). (#618)
- Atlas width is now properly based on total surface rather than glyph count (unless overridden with TexDesiredWidth). (#618)
- Fixed atlas builder so missing glyphs won't influence the atlas texture width. (#2233, #618)
- Fixed atlas builder so duplicate glyphs (when merging fonts) won't be included in the rasterized atlas. (#618)
2019-01-10 22:30:34 +01:00
9a9712807e ImFontAtlas: Rewrote stb_truetype based builder.
- Atlas width is now properly based on total surface rather than glyph count (unless overridden with TexDesiredWidth).
- Fixed atlas builder so missing glyphs won't influence the atlas texture width. (#2233)
- Fixed atlas builder so duplicate glyphs (when merging fonts) won't be included in the rasterized atlas.
2019-01-10 22:23:05 +01:00
e3ccc96789 Internals: Added ImBoolVector helper. 2019-01-10 16:10:02 +01:00
56caf7da29 imgui_freetype: Minor tweaks and comments. 2019-01-10 16:10:02 +01:00
7ed8e55fc7 ImVector: Added size_in_bytes() helper. 2019-01-10 16:10:02 +01:00
e4c19f5af1 ImFontGlyphRangesBuilder: Using 32-bits fields for storage instead of 8-bit ones, comments, todo. 2019-01-10 16:00:26 +01:00
7ffbcfe467 ImVector: Made reserve() another silly one-liner. It's not longer than other functions and our weird obsessions deserve to be carried with stringent consistence. + Comments 2019-01-10 15:51:09 +01:00
1f6e0b2f98 ImVector: Made a struct. Using T/T* in the code instead of value_type/iterator. Renamed index_from_pointer() to index_from_ptr() (was not documented, added in 1.63, users not supposed to use ImVector, hopefully not a big deal). 2019-01-10 15:51:08 +01:00
81eaa49773 Internals: Added comment index in imgui_internal.h 2019-01-10 15:51:08 +01:00
289569ef27 Update link to Magnum bindings. (#2269)
The various community projects that integrated Dear ImGui into Magnum
were merged together and are now an official part of the engine.
2019-01-10 14:58:59 +01:00
61a99f994e Minot internal tweaks, comments 2019-01-08 23:11:54 +01:00
9ad341902d ImDrawList: Optimized some of the functions for performance of debug builds where non-inline function call cost are non-negligible. 2019-01-08 17:37:22 +01:00
f53cd3ee0f Internals: LowerBound: Use raw pointer typedefs, we never use iterator anywhere else in the codebase.
Demo: Typo.
C98 fix.
2019-01-08 17:37:07 +01:00
57b1622afc Added IMGUI_USE_STB_SPRINTF (undocumented) (#1038) 2019-01-08 15:28:33 +01:00
b33977bc15 Tests: Reworking hook prototypes for imgui-test to be faster and multi-context friendly. 2019-01-07 23:59:05 +01:00
c2db7f63bd Selectable() should have an ID even though they are disabled, to be consistent with other widgets. Not sure of the reasoning ~1.41 which made this turn to 0. 2019-01-07 23:48:50 +01:00
3997e8b555 Fixed animated window titles from being updated when displayed in the CTRL+Tab list. + Adding overkill helpers for reusing buffers. (#787) 2019-01-07 22:46:42 +01:00
1ae7f88495 Tabs: Added ImGuiTabBarFlags_NoTooltip flag. (#261, #351) + added helpful assert 2019-01-07 18:07:09 +01:00
50faccf764 Demo: Log: Comments. Using clipper. Not linking with rand() anymore. 2019-01-07 17:33:02 +01:00
acfa4050ec Tweak changelog + tweak internal render helper functions. 2019-01-07 16:43:55 +01:00
5cb7ce2085 Renamed ImFont::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Keep redirection typedef (will obsolete). 2019-01-06 16:59:51 +01:00
1353c74dcf Comments/formatting on obsolete stuff 2019-01-06 16:37:57 +01:00
c3af134cc8 IO: Renamed InputCharacters[], marked internal as was always intended. AddInputCharacter() goes into a queue which can receive as many characters as needed during the frame. This is useful for automation to not have an upper limit on typing speed. Will later transition key/mouse to use the event queue later. 2019-01-06 16:37:42 +01:00
1705a81efb Moved ImVector higher up in imgui :( because we will need it in ImGuiIO. 2019-01-06 16:29:40 +01:00
8b5f635624 Added alternative Rust bindings 2019-01-06 14:43:43 +01:00
9ba202821f Nav: Fixed an keyboard issue where holding Activate/Space for longer than two frames on a button would unnecessary keep the focus on the parent window, which could steal it from newly appearing windows. (#787) 2019-01-04 19:03:56 +01:00
d223d1e951 Added bindings in Readme. Added internal IMGUI_DEBUG_LOG() helper. Comments, missing breaking changes note relative to imgui_impl_xxxx changes, not really part of core but worth adding in the imgui.cpp breaking change section. 2019-01-04 18:01:43 +01:00
4483320f0a Examples: Allegro 5: Properly destroy all globals on shutdown. (#2262) 2019-01-04 13:30:55 +01:00
6777544855 Added sanity check to debug parent/child ordering issues (they would generally manifest with an assert/crash in EndFrame bu tthis assert will catch some earlier). 2019-01-03 21:42:36 +01:00
ca6ac34f9d Natvis: Added Hidden info about ImGuiWindow. 2019-01-03 18:38:41 +01:00
25ac85f15d Examples: Downgrading projects to xcode 9.2 (maybe 8.0) (#2134)
* example_apple_opengl2: The deployment target was set to 10.12 from XCode 9.2.
* imgui_impl_metal: header not found by XCode 9.2.
* example_apple_metal: The deployment target was set to 10.12 from XCode 9.2.
2019-01-03 14:01:14 +01:00
64c66529ae Moving issue/pr template to docs/. Added links in README. 2019-01-03 13:35:53 +01:00
237109caa5 Internals: Extracted code out of EndFrame() into UpdateMouseMovingWindowEndFrame() 2019-01-02 23:08:32 +01:00
b3469fa94b Alternative fix for bug introduced in d845135 (#1651), fix CTRL+Tab and fallback tooltip. 2019-01-02 23:08:32 +01:00
3e30bfd6c9 Revert "Fixes crash/assert bug introduced in d845135 (#1651): would assert when showing the CTRL+Tab list and or fallback "...." tooltip."
This reverts commit 1b0e38df47.
2019-01-02 22:56:17 +01:00
1b0e38df47 Fixes crash/assert bug introduced in d845135 (#1651): would assert when showing the CTRL+Tab list and or fallback "...." tooltip. 2019-01-02 22:14:28 +01:00
d9a4cbc429 Examples: Comments about GLFW/SDL versions 2019-01-02 16:04:13 +01:00
c017a4fb5f Moved guidelines to issue #2261 to Pin and increase visibility for now. 2019-01-02 14:28:49 +01:00
acacd93836 Renamed extra_flags to flags in InputXXX parameters. 2019-01-02 11:08:14 +01:00
c738f9ef92 InputFloat: When using ImGuiInputTextFlags_ReadOnly the step buttons are disabled. (#2257) 2019-01-02 11:03:56 +01:00
6b97ded438 Happy new year! & comments 2019-01-02 10:57:57 +01:00
e21bc44684 Comments: fixed missing line in the "how a simple rendering function may look like" section (#2258) 2019-01-02 09:57:25 +01:00
d845135273 Error recovery: Extraneous/undesired calls to End() are now being caught by an assert in the End() function itself at the call site (instead of being reported in EndFrame). Past the assert, they don't lead to crashes any more. Missing calls to End(), pass the assert, should not lead to crashes any more, nor to the fallback/debug window appearing on screen. (#1651). 2018-12-23 18:00:37 +01:00
a9a60a24c1 Tweaked asserts 2018-12-23 17:51:50 +01:00
2889a14f86 Build fix for master. 2018-12-21 16:45:24 +01:00
b1cd52b674 Examples: SDL: Avoid testing for SDL_GetKeyboardFocus() on Android and iOS (like Emscripten). (#421) 2018-12-21 16:41:29 +01:00
d5b22fb635 Examples: Setting up style before bindings, so in complex binding (vulkan/dx12) it isn't miles away from the context creation. 2018-12-20 22:58:34 +01:00
b471813f54 Made it illegal to call Begin("") with an empty string. This somehow accidentally worked before but had various undesirable side-effect as the window would have ID zero. In particular it is causing problems in viewport/docking branches. 2018-12-20 20:01:02 +01:00
39dde66b21 IO: Realigned all fields, very minor comments change. This is nearly a no-op if you don't ignore Spaces. 2018-12-20 11:48:52 +01:00
5691385a33 IO: Added BackendPlatformUserData, BackendRendererUserData, BackendLanguageUserData void* for storage use by back-ends. (#2004 + for cimgui) 2018-12-20 11:41:24 +01:00
8399fb5071 Changed ImGuiCol_ChildBg to (0,0,0,0) in Dark style instead of (1,1,1,0), to match other styles. Shouldn't have any effect for the end-user. 2018-12-19 15:20:18 +01:00
6890e08bc5 Fixed using SetNextWindowPos() on a child window (which wasn't really documented) position the cursor as expected in the parent window, so there is no mismatch between the layout in parent and the position of the child window. Demo tweak and adding some child window stuff 2018-12-19 15:19:31 +01:00
89ac0ea7c1 Various user-facing comments 2018-12-19 11:19:55 +01:00
84d1ce3958 Tidying up README, moved entries to FAQ, updated screenshots, removed comma in title. 2018-12-18 16:17:27 +01:00
ca953f0fee Fix merge issue on master. 2018-12-18 15:11:11 +01:00
ae76a1fda7 Window, Focus, Popup: Fixed an issue where closing a popup by clicking another window with the _NoMove flag would refocus the parent window of the popup instead of the newly clicked window. 2018-12-18 15:01:15 +01:00
510ca373a2 Moved setting up NavHideHighlightOneFrame from lower-level ClosePopupToLevel() to CloseCurrentPopup() with an explanation. (Followup on 68d3e139a7) 2018-12-18 14:59:22 +01:00
1a6ec208cc Docs: various updates, rewording, clarifying the purpose of a PR. 2018-12-18 12:02:55 +01:00
65dac02171 Internals: Popups: Renamed CurrentPopupStack to BeginPopupStack which is much less ambiguous. 2018-12-14 18:44:17 +01:00
f6f5c51106 Internals: Popups: EndMenu() calls ClosePopupToLevel(g.CurrentPopupStack.Size) which is more correct. 2018-12-14 18:42:28 +01:00
f1c7596409 Internals: Popup related comments. Renamed the misleading internal ClosePopup() function. Added bool* test to BeginPopupModal in demo. 2018-12-14 18:42:22 +01:00
587506dd57 Tests: Changed prototype of ImGuiTestEngineHook_ItemAdd to match functions called in same spot. Made ButtonBehavior submit fallback item info if ItemAdd() was not called (for resize grips, resize borders, scrollbar, columns, etc.) 2018-12-14 11:27:02 +01:00
8497948ba0 Comments, minor tweaks. 2018-12-13 19:17:36 +01:00
1b263f6ab0 Tabs: Fixed support for drag and drop ImGuiButtonFlags_PressedOnDragDropHold. (#261) incorrectly missing from the merge from Docking branch. 2018-12-11 19:37:22 +01:00
febc3e6aa1 Internals: Windows hidden with HiddenFramesRegular (but NOT HiddenFramesForResize) preserve their SizeContents, so restoring a auto-resize window after it's been hidden by tabs won't reset its size for a frame. Arguable. Let's see how it goes. (Followup to b48e295bddbf965d7382ec5578ed05d2fe601114) 2018-12-11 19:19:12 +01:00
d9a84de9d9 Contents size is preserved while a window collapsed. Fix auto-resizing window losing their size for one frame when uncollapsed. 2018-12-11 19:08:06 +01:00
ccce47c6a2 Demo: Using Tabs in Style Editor and Simple Layout example. + Adding missing early out in About and Documents examples. 2018-12-11 18:10:43 +01:00
5a6b8e00db BeginTabBar: Fix to push the expected ID into the ID stack (instead of a hash's hash). (#261) 2018-12-11 15:22:10 +01:00
95dcc534ed Demo: Fix collateral damage of 54a60aa 2018-12-11 13:25:16 +01:00
54a60aaa40 Added BETA api for Tab Bar/Tabs widgets. (#261, #351) (merged this feature from the from Docking branch so it can be used earlier as as standalone feature)
- Added BeginTabBar(), EndTabBar(), BeginTabItem(), EndTabItem(), SetTabItemClosed() API.
- Added ImGuiTabBarFlags flags for BeginTabBar().
- Added ImGuiTabItemFlags flags for BeginTabItem().
- Style: Added ImGuiCol_Tab, ImGuiCol_TabHovered, ImGuiCol_TabActive, ImGuiCol_TabUnfocused, ImGuiCol_TabUnfocusedActive colors.
- Demo: Added Layout->Tabs demo code.
- Demo: Added "Documents" example app showcasing possible use for tabs.
2018-12-11 12:36:47 +01:00
cc1283fb78 Added ImGuiWindowFlags_UnsavedDocument window flag to append '*' to title without altering the ID, as a convenience to avoid using the ### operator. (merged from Docking branch) 2018-12-11 12:20:48 +01:00
15447f5b7b Using named flags instead of 0 + shallow formatting tweaks from other branches. 2018-12-11 12:14:27 +01:00
9476e07d5a Added io.ConfigWindowsMoveFromTitleBarOnly option. Still is ignored by window with no title bars (often popups). This affects clamping window within the visible area: with this option enabled title bars need to be visible. (#899)
Tweaked default value of style.DisplayWindowPadding from (20,20) to (19,19) so the default style as a value which is the same as the title bar height.
2018-12-10 16:05:30 +01:00
59f3c4fc20 Renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges and removed its [Beta] mark. Resizing windows from edge is now enabled by default (io.ConfigWindowsResizeFromEdges=true). Note that it only works _if_ the back-end sets ImGuiBackendFlags_HasMouseCursors, which the standard back-end do. 2018-12-10 15:41:01 +01:00
d20e3ee710 Tests: Adding imgui-test engine hooks (experimental) to provide missing widget state to the testing system. 2018-12-10 14:30:41 +01:00
125e62491e Internals: Nav: Added ImGuiNavLayer_ to clarify semantic of previously integer NavLayer values, and not pretend that increment/decrement operators on them super flexible. + Storage tweaks. 2018-12-04 14:34:49 +01:00
b58bd5b311 Version 1.67 WIP + todo notes 2018-12-04 13:49:29 +01:00
fb6ef8b1db Comments, tweak 2018-12-03 23:50:59 +01:00
eb311abc92 Fixed IMGUI_API tag on ImFontAtlas::IsBuilt() preventing to build as DLL on some setups. (#2226) 2018-12-03 17:49:38 +01:00
8d58055a54 Examples: DirectX10/11/12: Made imgui_impl_dx10/dx11/dx12.cpp link d3dcompiler.lib from the .cpp file to ease integration. 2018-12-03 17:47:10 +01:00
10e13dd6bb Version 1.67 WIP (again, this time IMGUI_VERSION_NUM has leeway for another hot-fix). 2018-12-03 12:19:23 +01:00
801645d350 Version 1.66b (will revisit how to change IMGUI_VERSION_NUM across versions, this commit reduces the numerical IMGUI_VERSION_NUM compared to the commit on Nov 22). 2018-12-03 10:17:17 +01:00
84238240d6 Fixed a text rendering/clipping bug introduced in 1.66 (on 2018-10-12, commit ede3a3b9) that affect single ImDrawList::AddText() calls with single strings larger than 10k. Text/TextUnformatted() calls were not affected, but e.g. InputText() was. 2018-11-30 23:47:23 +01:00
48f6fdb349 Fixed typo. 2018-11-30 18:30:21 +01:00
7658035e5a About, IO: Added io.BackendPlatformName, io.BackendRendererName for informational/QA purpose. 2018-11-30 18:30:21 +01:00
3849def253 Added ShowAboutWindow(), About Window now showing various config/build information. 2018-11-30 18:30:21 +01:00
3335e6688f Include <alloca.h> also on macOS (and osxcross) (#2218) 2018-11-30 16:57:09 +01:00
b2e7a3806a Examples: Allegro5: Add touchscreen support 2018-11-30 16:54:30 +01:00
1bfcf8f339 Separator: Fixed Separator() outputting an extraneous empty line when captured into clipboard/text/file. 2018-11-30 16:42:32 +01:00
baf67d393f When the focused window become inactive don't restore focus to a window with the ImGuiWindowFlags_NoInputs flag. (#2213) 2018-11-29 23:25:29 +01:00
4a94b251fd Comments 2018-11-29 22:00:17 +01:00
4105cc7e97 Added ImGuiConfigFlags_None, ImGuiBackendFlags_None for good measure. 2018-11-27 19:46:14 +01:00
1fa2cb8748 imgui.h: Comments 2018-11-27 14:10:40 +01:00
ce07d55d1b imgui.h: Moved ImGuiListClipper 2018-11-27 14:01:07 +01:00
8495c931c0 mgui.h: Moved ImGuiInputTextCallbackData,, ImGuiSizeCallbackData, ImGuiPayload structures so they are not in the "Helpers" section. 2018-11-27 14:01:07 +01:00
35d648341b Examples: SDL: changed the signature of ImGui_ImplSDL2_ProcessEvent() to use a const SDL_Event*. (#2187) 2018-11-23 18:12:37 +01:00
0c4dee083c Internals: Added ImPool helper data structure (used by testing system, and already in docking branch) 2018-11-22 18:59:57 +01:00
d27ffefbd4 Version 1.67 WIP 2018-11-22 18:59:57 +01:00
da3c4330c1 Version 1.66 2018-11-22 15:11:52 +01:00
c00a3bd98f Examples: SDL2+Vulkan: Fixed application shutdown which could deadlock on Linux + Xorg. (#2181) 2018-11-21 18:43:25 +01:00
a5cf227503 Added link to experimental imgui_scoped.h PR/thread (#2197, #2096) 2018-11-21 18:31:22 +01:00
be66f94639 Examples: OpenGL3: More explicit testing for == GL_UPPER_LEFT in case glGetIntegerv(GL_CLIP_ORIGIN is not honored properly. (#2186, #2195) Fix f52f0a5277 2018-11-21 18:24:24 +01:00
cc4b1f9e47 Nav: Fixed explicit directional input not re-highlighting current nav item if there is a single item in the window and highlight has been previously disabled by the mouse. (#787) 2018-11-21 16:07:04 +01:00
b9ae9bb1e3 Internals: Using GetOverlayDrawList(ImGuiWindow*) to match syntax of viewport/master branches. Fixed compiling with IMGUI_DEBUG_NAV_RECTS 2018-11-21 15:37:29 +01:00
50c43d1c8e Removed unnecessary ImGui:: prefixes. 2018-11-15 16:43:05 +01:00
6b4443755d Internals: Added FindWindowByID() helper. (#2190) 2018-11-15 16:41:48 +01:00
aa668c410a Nav: Fixed an assert in certain circumstance (mostly when using popups) when mouse positions stop being valid. (#2168) + adding a else block to make NavCalcPreferredRefPos() more explicit. 2018-11-15 13:56:27 +01:00
f52f0a5277 Examples: OpenGL3: Added support for GL 4.5's glClipControl(GL_UPPER_LEFT). (#2186) 2018-11-13 18:54:02 +01:00
19b4fcdacb Made IsWindowFocused() work outside of NewFrame()-EndFrame() and added comments about how ImGuiFocusedFlags_AnyWindow should NOT be used in place of io.WantCaptureMouse. (#2185) 2018-11-13 11:23:15 +01:00
5b1394c5ac Update README.md 2018-11-09 15:02:19 +01:00
6c1ae6cc71 Internals: DragBehavior: Added support for ImGuiDragFlags_Vertical to implement a vertical drag widget (no frontend function provided). 2018-11-09 14:41:40 +01:00
6d7677534f Internals: SliderBehavior: Using axis indexing. 2018-11-09 14:31:14 +01:00
772354377b Examples: GLFW: User previously installed GLFW callbacks are now saved and chain-called by the default callbacks. (#1759) 2018-11-08 16:24:41 +01:00
9d155c73bc Examples: Misc comments mainly related to GLFW callbacks. (#1759) 2018-11-08 16:06:22 +01:00
a419d46205 Examples: OpenGL3+GLFW/SDL: Made main.cpp compile with IMGUI_IMPL_OPENGL_LOADER_CUSTOM (may be missing init). (#2178) 2018-11-08 15:14:09 +01:00
131bf5ee4a Examples: SDL: Tweaked Windows instructions and batch files. (#2175) 2018-11-06 09:51:21 +01:00
f388216ff0 Examples: GLFW: VS2015 project link with legacy_stdio_definitions.lib in order to link with the precompiled VS2010 GLFW3.lib we provide. (#2010, #2043, #2091) 2018-11-05 17:28:09 +01:00
c808eb92c6 Config: Added IMGUI_DISABLE_WIN32_FUNCTIONS to disable linking with _any_ Win32 function, as a general forward compatible measure. 2018-11-05 17:28:00 +01:00
eb592bf7d3 ListBox(): Fixed frame sizing when items_count==1 unnecessarily showing a scrollbar. (#2173). Tweaked frame sizing so list boxes will look more consistent when FramePadding is far from ItemSpacing. 2018-11-05 14:49:17 +01:00
1441756a0f Doc: Fixed comments referring to LoadFromFileTTF() instead of AddFontFromFileTTF() (#2153) 2018-11-05 14:17:51 +01:00
2e6e1bec58 Examples: Add missing include guards (#2166) 2018-11-01 20:56:36 +01:00
ed0f7004d0 Examples: Vulkan: Avoid unreferenced parameter warning. (#2162) 2018-10-30 21:15:30 +01:00
7fa3e71abb Internals: Moved the FocusableItemUnregister() outside of InputScalarAsWidgetReplacement(), it should not be here and doesn't facilitate reusing InputScalarAsWidgetReplacement(). (cc #2155) 2018-10-30 10:48:21 +01:00
Hui
e6db078eda gladLoadGL() return 0 to indicate failure (#2157) 2018-10-29 15:51:32 +01:00
f3e642322f Demo: Removed one level of indentation in the ShowDemoWindowXXX functions (6 kb worth of spaces!). Will break some merge/PR. 2018-10-25 23:40:33 +02:00
eed1fba157 Demo: Split the contents of ShowDemoWindow() into smaller functions as it appears to speed up link time with VS. (#2152) 2018-10-25 23:34:05 +02:00
faecf90383 SliderAngle: Added optional format argument to allow users customize precision and make localization. (#2150) 2018-10-25 22:29:29 +02:00
12c72d2893 Fixed OpenGL texture loading example in comment + Discourse link to root of discourse 2018-10-25 21:32:29 +02:00
a72d5ada61 Misc comments improvements 2018-10-25 19:02:43 +02:00
ac9aaf4b6e Comments in demo and opengl code + Internals: Added HoveredIdNotActiveTimer tracking hovering time unless the item is active, which is a commonly useful pattern. 2018-10-25 17:45:48 +02:00
e610afeea3 Font readme: Added OpenFontIcons, tweaks, links, removed spaces (#2141) 2018-10-22 11:54:57 +02:00
82873c7ad4 Update README.md 2018-10-18 10:44:14 +02:00
745f01022e Examples: Downgraded Xcode project object version (50->48) to support Xcode 9.2 (last version supported on macOS 10.12) (#2133, #1929) 2018-10-17 10:48:53 +02:00
31fd6c585a Removed unnecessary ImGui:: qualifiers in internal code. 2018-10-17 10:47:27 +02:00
b4488d4f48 Examples: Downgraded Xcode project object version (50->48) to support Xcode 9.2 (last version supported on macOS 10.12) (#2133) 2018-10-17 10:46:49 +02:00
000c1fc221 Demo: Added comments / tweaks related to the popups. 2018-10-16 10:25:32 +02:00
5be915d6ab Added ImGuiWindowFlags_NoMouseInputs which is basically the old ImGuiWindowFlags_NoInputs (essentially we have renamed ImGuiWindowFlags_NoInputs to ImGuiWindowFlags_NoMouseInputs). Made the new ImGuiWindowFlags_NoInputs encompass both NoMouseInputs+NoNav, which is consistent with its description. (#1660, #787) 2018-10-15 18:23:18 +02:00
90b50bd4c3 Window: Added ImGuiWindowFlags_NoBackground flag for consistency and to ease creating new flag combinations. Added ImGuiWindowFlags_NoDecoration helper flag which is essentially NoTitleBar+NoResize+NoScrollbar+NoCollapse. (#1660) 2018-10-15 18:16:49 +02:00
8606d9fa11 Fix Clang/GCC's null-conversion warning: (#2081)
The warning is "implicit conversion of NULL constant to 'unsigned int' [-Wnull-conversion]". Happens when ImTextureID is not a void*, but unsigned int, for example.
2018-10-15 17:07:06 +02:00
b039dbc62e Update README.md 2018-10-15 08:34:42 +02:00
edb06a6c4d Fixed typo in misc/README.txt (#2131) 2018-10-14 08:43:06 +02:00
ca753829cb Revert using wchar_t functions (9cf94d5 + 2eaf5b0). Big mistake, wchar_t is not guaranteed to be 16-bits. 2018-10-12 15:48:38 +02:00
28953208d4 Tests: Added imgui-test engine hooks (experimental). 2018-10-12 15:47:15 +02:00
ede3a3b92d Fixes crash introduced in previous commit 9cf94d5. 2018-10-12 13:29:13 +02:00
9cf94d5dd6 RenderText(), InputTextMultiline(): Optimization for large text by using memchr, wmemchr, wcschr when appropriate. 2018-10-12 12:34:47 +02:00
0fe48cbb61 Renamed misc/stl/imgui_stl.h,.cpp to misc/cpp/imgui_stdlib.h in prevision for other files.(#2035, #2096)
Added misc/README file.
2018-10-12 11:16:51 +02:00
74c0309126 InputText: Clarified comments around ImGuiInputTextFlags_CallbackResize and other callbacks. (#2006, #1443, #1008) 2018-10-12 10:34:58 +02:00
ed4dcd9072 Shutdown: Unlock font atlas before destroying context, so we can destroy a context between NewFrame and EndFrame if we wait (facilitate main loop structures). Internals: GetWindowScrollMaxX(), GetWindowScrollMaxY() 2018-10-11 22:38:26 +02:00
cf0afb48ac TextUnformatted: Using memchr(), fixed not properly testing for text_end bound + comments.
Internals: Added ImStreolRange() + used in LogRenderedText() + comments.
2018-10-11 12:53:10 +02:00
d02b11dfbd ImGuiTextBuffer: Avoid heap allocation when empty. 2018-10-11 12:08:09 +02:00
1efafa1d29 Comments + internal using Tab Stop terminology (ImGuiItemFlags_NoTabStop instead of !ImGuiItemFlags_AllowKeyboardFocus) 2018-10-10 12:09:06 +02:00
3fcc178c23 Update README.md 2018-10-08 11:37:13 +02:00
dd748f0e39 Update README.md 2018-10-08 11:22:33 +02:00
500a60debc Examples: OpenGL3: Cast compile/link status to GLboolean (#2112, #2125)
Some OpenGL loaders/bindings do not allow comparisons between GLints and GLbooleans.
2018-10-07 18:14:24 +02:00
02afbaeef0 Examples: imgui_imp_opengl3.cpp explicit casting for overly aggressive glbinding compatibility. (#2112) [@hesiod] 2018-10-06 11:35:05 +02:00
a3b0e0acfa Examples: DirectX10, DirectX11: Removed seemingly unnecessary calls to invalidate and recreate device objects in the WM_SIZE handler. (#2088) 2018-10-05 11:36:49 +02:00
084c26aa41 Fix spacing in imgui_imp_sdl example (#2111) 2018-10-05 10:04:10 +02:00
3c427e284f Update pull_request_template.md 2018-10-04 12:49:48 +02:00
fbfe193fcd Window, Inputs: Fixed resizing from edges when io.MousePos is not pixel-rounded by rounding mouse position input. (#2110) 2018-10-02 18:49:55 +02:00
ae7f833c69 Window: Resizing from edges (with io.ConfigResizeWindowsFromEdges Beta flag) extends the hit region of root floating windows outside the window, making it easier to resize windows. Resize grips are also extended accordingly so there are no discontinuity when hovering between borders and corners. (#1495, #822, #2110) 2018-10-02 18:43:10 +02:00
76e31bd51a Fixed typo. (#2108, #2083) 2018-10-01 17:56:06 +02:00
e623be998d Drag and Drop: Added GetDragDropPayload() to peek directly into the payload (if any) from anywhere. (#143) 2018-10-01 15:53:18 +02:00
3dcd552628 Fixed extraneous static attribute. (#2105) 2018-09-27 13:01:51 +02:00
9aae21483a Fix missing IMGUI_API and mismatching namespace internal's CreateNewWindowSettings (#2105) 2018-09-27 12:59:22 +02:00
61d94ff88e Renamed SetScrollHere() to SetScrollHereY(). Kept redirection function (will obsolete). 2018-09-26 21:30:37 +02:00
a7d3ae8937 BeginChild(): Fixed BeginChild(const char*, ...) variation erroneously not applying the ID stack to the provided string to uniquely identify the child window. This was undoing an intentional change introduced in 1.50 and broken in 1.60. (#1698, #894, #713) + reworked the Begin/BeginChild comments in imgui.h. 2018-09-26 21:24:42 +02:00
781a7950d7 ImVector: Fixed a oddly unqualified return type in the assignment operator (I assume C++ handles it nicely as this never warned anywhere, but it is completely unintentional). 2018-09-24 11:33:26 +02:00
788febf044 Examples: Vulkan: Fixed some minor discrepency in the SDL+Vulkan example to match the Glfw+Vulkan example. (cc #2097) 2018-09-24 10:13:01 +02:00
5719b23e01 ImDrawList: Fixed AddConvexPolyFilled() undefined behavior when passing points_count smaller than 3, in particular, points_count==0 could lead to a memory stomp if the draw list was previously empty. 2018-09-21 10:00:26 +02:00
7c3b9172ad Examples: Referring to missing gamepad support in back-end that are missing it. 2018-09-20 10:37:55 +02:00
3d318a6577 ArrowButton(): Fixed arrow shape being horizontally misaligned by (FramePadding.y-FramePadding.x) if they are different.
Demo: Added extra usage of AlignTextToFramePadding() in a more visible section.
2018-09-20 10:24:29 +02:00
0b190f11b9 Contributing, Issue Template 2018-09-18 18:04:32 +02:00
571676ebd2 Added Fonts readme details and links to Sweet16 font. (#2085) 2018-09-17 13:16:32 +02:00
4b353ce482 Fix file names (#2083) 2018-09-15 21:41:07 +02:00
c12da2a607 BeginMenu(): Fixed menu popup horizontal offset being off the item in the menu bar when WindowPadding=0.0f. 2018-09-14 11:28:08 +02:00
ca5dc0c019 ColorPicker: Replaced the Separator with a Spacing call. (#2068) 2018-09-14 10:05:53 +02:00
1afd29d382 Examples: Using "dear imgui" terminology in all examples headers/comments + fix minor typo. 2018-09-13 16:50:13 +02:00
ec04e8bb05 Fix MSVC's C4312 warning about casting user texture type to void* in ImageButton (#2080) 2018-09-12 22:58:45 +02:00
9cc63ba279 Internals: Replace unsigned short with ImWchar when dealing with character storage (missing cases) + in imgui_impl_ file keep using neutral type everywhere, added missing explicit cast in three bindings. (#2078) 2018-09-11 22:00:57 +02:00
201fcfd2e5 Internals: Replace unsigned short with ImWchar when dealing with character storage. (#2078) 2018-09-11 22:00:57 +02:00
d014d0285a DragFloat: Disabled using power curve when one edge is FLT_MAX (broken in 1.61). Disabled setting a default drag speed when one edge is FLT_MAX. (#2024) 2018-09-11 11:15:06 +02:00
af6cf25255 DragFloat: Fixed a situation where dragging with value rounding enabled or with a power curve erroneously wrapped the value to one of the min/max edge. (#2024, #708, #320, #2075). 2018-09-11 10:55:52 +02:00
e2436ca625 Nav, Focus: Fixed ImGuiWindowFlags_NoBringToFrontOnFocus windows not being restoring focus properly after the main menu bar or last focused window is deactivated. 2018-09-10 20:40:21 +02:00
7eadcf7d7d example_glfw_vulkan was missing a reference to imgui_widgets.cpp (#2071, #2036) 2018-09-09 21:09:58 +02:00
062b1f0463 Fixed calling SetNextWindowSize()/SetWindowSize() with non-integer values leading to accidental alteration of window position. We now round the provided size. (#2067) 2018-09-07 22:30:46 +02:00
2eaf722fd7 Fixed calling DestroyContext() always saving .ini data with the current context instead of the supplied context pointer. (#2066) 2018-09-07 17:24:56 +02:00
eb7033e75b Version 1.66 WIP 2018-09-06 21:44:59 +02:00
e0cab5664a Version 1.65 2018-09-06 15:58:58 +02:00
5a679a45cc Renamed stb_truetype.h to imstb_truetype.h, stb_textedit.h to imstb_textedit.h, and stb_rect_pack.h to imstb_rectpack.h. (#1718, #2036)
If you were conveniently using the imgui copy of those STB headers in your project, you will have to update your include paths.
The reason for this change is to avoid conflicts for projects that may also be importing their own copy of the STB libraries. Note that imgui's copy of stb_textedit.h is modified.
2018-09-06 15:58:25 +02:00
e58bc3d5b7 Refactor: Tweaked and improved the sectioning to facilitate grepping/moving around and applied to all files. (#2036) 2018-09-06 11:36:00 +02:00
0b18c11440 Refactor: Moved ImFile functions. (#2036) 2018-09-06 11:36:00 +02:00
ab64e8f993 Refactor: Moved one indentation level in the bulk of the ShowMetricsWindow() function. Should appear as a small diff if whitespaces changes are ignored. (#2036) 2018-09-06 11:36:00 +02:00
bb3184af74 Refactor: moved low-layout helpers to imgui_widgets.cpp (Spacing, Dummy, NewLine, Separator, etc.) (#2036) 2018-09-05 20:54:28 +02:00
cbdce80837 Internals: Refactor: Moved render functions to their own section. (#2036) 2018-09-05 20:46:57 +02:00
65876f348a Nav: Removed the [Beta] tag from various descriptions of the gamepad/keyboard navigation system. Although it is not perfect and will keep being improved, it is fairly functional and used by many. (#787) 2018-09-05 17:33:00 +02:00
77ba883f23 Renamed io.OptCursorBlink/io.ConfigCursorBlink to io.ConfigInputTextCursorBlink. (#1427) + changed ImGuiIO layout. 2018-09-05 17:29:47 +02:00
bbcc976739 Demo: Added a "Configuration" block to make io.ConfigFlags/io.BackendFlags more prominent. 2018-09-05 17:29:47 +02:00
b944aa623c Minor mostly inconsequential merges from Viewport + LoadIniSettingsFromMemory() entirely skip lines starting with ';' 2018-09-05 11:52:48 +02:00
40db2ca098 Fixed a build issue with non-Cygwin GCC under Windows. 2018-09-04 18:58:20 +02:00
5451cb7e1e Readme, Changelog (#2059) 2018-09-04 11:48:08 +02:00
f8b7e4d94f Examples: imgui_impl_opengl3 Fix GLAD error condition (#2059, #2002)
`gladLoadGL` returns 0 on fail, not the other way around.
2018-09-03 19:36:02 +02:00
d07f494305 Internals: Exposed SliderBehaviorT, DragBehaviorT, RoundScalarWithFormatT, SliderCalcRatioFromValueT. (#2036)
Renamed RoundScalarWithFormat -> RoundScalarWithFormatT.
Renamed SliderBehaviorCalcRatioFromValue -> SliderCalcRatioFromValueT
2018-09-03 14:49:13 +02:00
bcb1441ce7 Version 1.65 WIP 2018-09-03 14:38:04 +02:00
767649afb1 Fix missing include on some systems to use intptr_t. (#2036, #2054) 2018-08-31 18:07:47 +02:00
5d40d295b3 Comments, readme updates 2018-08-31 11:37:14 +02:00
be6ea86f8d OSX: Added imgui_widgets.cpp to xcode project files. 2018-08-31 11:29:25 +02:00
9174958b43 imgui_stl: Comments (#2035) 2018-08-31 10:53:38 +02:00
36435b43c7 Merge branch 'master_164' 2018-08-31 10:12:49 +02:00
48db5713d6 Version 1.64 2018-08-31 10:00:03 +02:00
38cfcf9fbc Tweak comments and indexes 2018-08-31 09:59:58 +02:00
8a216fe756 Refactor: Internals: Moved Tooltip functions in imgui.cpp in their own section + comments. (#2036) 2018-08-30 21:15:12 +02:00
fd2bfb7e07 Refactor: Internals: Moved Popup functions in imgui.cpp in their own section. (part 3) (#2036) 2018-08-30 21:00:51 +02:00
064b949bc2 Refactor: Internals: Moved Popup functions in imgui.cpp in their own section. (part 2) (#2036) 2018-08-30 20:59:24 +02:00
2a0d26e603 Refactor: Internals: Moved Popup functions in imgui.cpp in their own section. (part 1) (#2036) 2018-08-30 20:58:36 +02:00
df37a156e8 Refactor: Moved Scrollbar function from imgui.cpp to imgui_widgets.cpp, added file index (#2036) 2018-08-30 20:51:57 +02:00
728b2ef026 Refactor: Internals: Moved Navigation functions in imgui.cpp in their own section. DONE! (part 9) (#2036, #787) 2018-08-30 19:23:11 +02:00
cda45737ab Refactor: Internals: Moved Navigation functions in imgui.cpp in their own section. (part 8) (#2036, #787) 2018-08-30 19:23:11 +02:00
acf3cc4c3f Refactor: Internals: Moved Navigation functions in imgui.cpp in their own section. (part 7) (#2036, #787) 2018-08-30 19:23:11 +02:00
8a6fd237f6 Refactor: Internals: Restored new lines in NavUpdate() ... (part 6) (#2036, #787) 2018-08-30 19:23:11 +02:00
84eb2682b7 Refactor: Internals: Moved Navigation functions in imgui.cpp in their own section (moved NavUpdate which would not diff properly unless empty lines were removed, hence the previous patch). (part 5) (#2036, #787) 2018-08-30 19:23:11 +02:00
73052dc00c Refactor: Internals: Removing new lines from NavUpdate solely because I couldn't find another way to get a neat diff/patch when moving it. (part 4) (#2036, #787) 2018-08-30 19:23:11 +02:00
6bda59e5b7 Refactor: Internals: Moved Navigation functions in imgui.cpp in their own section (extracted some code out of NavUpdate()). (part 3) (#2036, #787) 2018-08-30 19:23:11 +02:00
60ee4de56d Refactor: Internals: Moved Navigation functions in imgui.cpp in their own section. (part 2) (#2036, #787) 2018-08-30 19:23:10 +02:00
ce58795bdf Refactor: Internals: Moved Navigation functions in imgui.cpp in their own section. (part 1) (#2036, #787) 2018-08-30 19:23:10 +02:00
f2926f910f Refactor: Internals: Moved Logging functions in imgui.cpp in their own section. (#2036) 2018-08-30 19:23:10 +02:00
15172f0742 Refactor: Internals: Moved Settings functions in imgui.cpp in their own section. (#2036) 2018-08-30 19:23:10 +02:00
98f618ed18 Refactor: Internals: Moved various functions in imgui.cpp (#2036) 2018-08-30 19:23:10 +02:00
5afd4b61f2 Refactor: Moved README, ChangeLog, TODO files to docs/ folder + update Changelog. (#2036) 2018-08-30 19:23:09 +02:00
2714f8fa23 Refactor: Moved Slider/Drag/Input functions + support DataType stuff from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 15:40:46 +02:00
c25f48b902 Refactor: Moved InputText functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 15:40:46 +02:00
ad0bfdcd95 Refactor: Moved ColorEdit/ColorPicker/ColorButton/etc. functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 15:40:45 +02:00
5dc954f5d7 Refactor: Moved Tree/Selectable functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 15:40:45 +02:00
a265c62636 Refactor: Moved Plot/Value functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 15:40:45 +02:00
0e9577d0da Refactor: Moved Menu functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 15:40:44 +02:00
f26b8c1e07 Refactor: Moved Combo/ListBox functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 14:55:27 +02:00
6468a3c0ce Refactor: Moved Button/Image/Checkbox/RadioButton/Bullet/ProgressBar functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 14:50:32 +02:00
3eaa063984 Refactor: Moved Text functions from imgui.cpp to imgui_widgets.cpp (#2036) 2018-08-30 14:50:32 +02:00
52c115fb2c Refactor: Added imgui_widgets.cpp headers to easily merge in the functions in all our branches. (#2036) 2018-08-30 14:50:32 +02:00
01586d33f3 Refactor: Added empty imgui_widgets.cpp + updated project files / makefiles etc. accordingly (#2036) 2018-08-30 14:29:11 +02:00
f2aa124eb8 Version 1.64 WIP 2018-08-30 14:25:23 +02:00
1c4008aa97 Changelog tweaks/typos 2018-08-29 17:34:08 +02:00
9e0f24dcb6 Version 1.63 2018-08-29 16:20:25 +02:00
ac0fcbca46 Changelog: fixed inconsistent white space before list items. 2018-08-29 16:20:02 +02:00
92edb7a4e3 Internals: Tidying up, moving helpers to imgui_internal.h (in prevision of 1.64 refactor) 2018-08-29 16:12:54 +02:00
ec148988f0 Reordered some declarations in imgui.h (in prevision of 1.64 refactor) 2018-08-29 16:12:23 +02:00
2598d26c73 ColorEdit4: Fixed a bug when text input or drag and drop leading to unsaturated HSL values would erroneously alter the resulting color. (#2050) 2018-08-29 13:30:46 +02:00
f9634feb66 Internals: Merged some changes to facilitate 1D->2D transition for some elements, and merging the stack layout PR (#846) 2018-08-28 19:10:59 +02:00
220e6a55b7 Travis: Fix (still not sure there is a way to test those files). (#1044) 2018-08-28 18:40:51 +02:00
1b61b6b208 Examples: Vulkan: Minor tweaks. 2018-08-28 18:22:36 +02:00
db790dab4c Travis: Added xcode build for the OSX+Metal example. (#1044) [@petmac] 2018-08-28 18:15:22 +02:00
b127027cbd Examples: OpenGL: Added support for glew and glad OpenGL loaders out of the box. (#2001, #2002). Changelog, tweaks, applied changes to SDL+OpenGL3 example. 2018-08-28 16:08:04 +02:00
e476b7e727 WIP on configurable OpenGL loader. (#2001, #2002) 2018-08-28 16:07:58 +02:00
af50ebe7b6 Documentation 2018-08-27 09:36:15 +02:00
4dea0327e7 Examples: Vulkan: Fixed handling of VkSurfaceCapabilitiesKHR::maxImageCount = 0 case. Tweaked present mode selections. 2018-08-25 21:16:08 +02:00
a082692b0a ImFontAtlas Comments (#2042) + added ImGuiFontAtlas_None for consistency. 2018-08-25 20:06:17 +02:00
06e917f135 Internals: Renaming of non-user facing parts from ValueChanged to Edited terminology. (#2034, #820, #956, #1875) 2018-08-23 13:47:37 +02:00
042f88e5f0 Removed obsolete redirection functions: CollapsingHeader() variation with 2 bools - marked obsolete in v1.49, May 2016. 2018-08-23 13:40:38 +02:00
3612885dea Comments, demo 2018-08-23 13:37:06 +02:00
0810d57819 Renamed IsItemDeactivatedAfterChange() to IsItemDeactivatedAfterEdit() for consistency with new IsItemEdited() API. Kept redirection function (will obsolete fast as IsItemDeactivatedAfterChange() is very recent). (#820, #956, #1875, #2034) 2018-08-23 13:26:14 +02:00
e28b1078f5 Added IsItemEdited() to query if the last item modified its value (or was pressed). This is equivalent to the bool returned by most widgets. It is useful in some situation e.g. using InputText() with ImGuiInputTextFlags_EnterReturnsTrue. (#2034) 2018-08-23 13:21:01 +02:00
abaa274592 Internals: Wired a ImGuiItemStatusFlags_ValueChanged into ItemStatusFlags, for an hypothetical IsItemValueChanged() function. (#2034) 2018-08-22 22:31:51 +02:00
102d5e6de6 Rearrange header comments to find enums easily + fixed inconsistent sorting. 2018-08-22 22:13:05 +02:00
7011d87bf8 InputText: Improved sturdiness if the ResizeCallback purposefully modify data->BufTextLen or data->BufSize. (#2006, #1443, #1008) 2018-08-22 21:27:27 +02:00
7d9d9bc34e InputText: Fix ResizeCallback callback on restoring initial value with Escape key. Avoid over-allocating for InitialText storage. (#2006, #1443, #1008) 2018-08-22 21:11:55 +02:00
7268c65d73 Examples: imgui_impl_vulkan: Comments (re) 2018-08-22 17:59:58 +02:00
3fdfac3377 Examples: imgui_impl_vulkan: Comments 2018-08-22 16:43:29 +02:00
ea9f5d7600 Added optional misc/stl/imgui_stl.h wrapper to use with STL types (e.g. InputText with std::string). (#2035, #2006, #1443, #1008) 2018-08-22 13:25:08 +02:00
8d639ec60d InputText: callback InsertChars() support resize callbacks correctly (followup to 24ff259) + fixed demo to use those functions. (#2006, #1443, #1008). 2018-08-22 13:09:44 +02:00
ea1906004b InputText: Fixed a few pathological crash cases on single-line InputText widget with multiple millions characters worth of contents. Because the current text drawing function reserve for a worst-case amount of vertices and how we handle horizontal clipping, we currently just avoid displaying those single-line widgets when they are over a threshold of 2 millions characters, until a better solution is found. 2018-08-22 12:46:47 +02:00
5122c76441 InputText: Fixed not tracking the cursor horizontally When modifying the text buffer through a callback. 2018-08-22 12:46:47 +02:00
68448c5faa ImDrawList: Large text passed to AddText() are being scanned for their end in order to avoid pre-reserving too many vertices. 2018-08-22 12:46:47 +02:00
975b5a7310 ImDrawList: Fixed clipping of leading lines above the clipping rectangle from counting in the worst case vertices reservation. (fix code added in #200!) 2018-08-22 12:46:47 +02:00
2dc5ec95d7 Internals: InputText: Renaming. Comments. 2018-08-22 12:46:46 +02:00
9f393c38e9 InputText: Renamed ImGuiTextEditCallback to ImGuiInputTextCallback, ImGuiTextEditCallbackData to ImGuiInputTextCallbackData for consistency. Kept redirection types (will obsolete). 2018-08-22 12:46:45 +02:00
24ff259816 InputText: Added support for buffer size/capacity changes via the ImGuiInputTextFlags_CallbackResize flag. (#2006, #1443, #1008). 2018-08-21 21:36:07 +02:00
4de6e1f7e4 InputText: Internal renaming of some fields + final copy uses edit_state.CurLenA+1 instead of buf_size. 2018-08-21 15:14:10 +02:00
0fd6e9bc0d InputText: Fixed minor off-by-one issue when submitting a buffer size smaller than the initial zero-terminated buffer contents. 2018-08-21 14:27:57 +02:00
e6c78f9470 InputText: (Breaking change) removed ImGuiTextEditCallbackData::ReadOnly since it is a duplication of (ImGuiTextEditCallbackData::Flags & ImGuiInputTextFlags_ReadOnly) (#211) 2018-08-21 14:27:57 +02:00
5942c08143 Added IMGUI_VERSION_NUM for easy compile-time testing. (#2025) 2018-08-21 14:27:57 +02:00
f23d29b481 Added links to Discourse forums. 2018-08-20 10:45:10 +02:00
4910629f6a Internals: Moved code out of SliderBehaviorT to reduce code bloat and also because caller may have use for the grab_bb for styling purposes. 2018-08-20 09:59:51 +02:00
73fa5c29f4 Update README.md 2018-08-17 16:44:23 -07:00
bb2de30e3e Internals: Added ImTextCountUtf8BytesFromChar() helper. 2018-08-17 11:33:45 -07:00
ac39c4b2a8 SplitterBehavior: Fix for when the sizes are already under the minimum desired size. 2018-08-17 11:33:40 -07:00
341ebd961b Fixed assertion when transitioning from an active ID to another within a group, affecting ColorPicker (broken in 1.62). Made ActiveIdIsAlive track the actual ID to avoid incorrect polling in BeginGroup/EndGroup when the ID changes within the group. (#2023, #820, #956, #1875). 2018-08-16 13:33:16 -07:00
8972ebae73 Metrics: Added io.MetricsActiveAllocations, moving away from the cross-context global counters than we previously used. (#1565, #1599, #586) 2018-08-15 16:28:39 -07:00
4e33aeed82 Selectable: Added ImGuiSelectableFlags_Disabled flag in the public API. (#211) 2018-08-14 16:07:01 -07:00
caaa746424 Nav: NavWindowingList doesn't save to .ini file. TODO entries. 2018-08-13 17:29:20 -07:00
d4cd121ae1 TODO + added missing _None enum for some internals flags. 2018-08-09 21:03:17 +02:00
fda9dc8e18 Internals: Extracted RenderMouseCursor() out of EndFrame(). Moved to imgui_draw.cpp along with RenderArrowPointingAt(). Comments. (#2013) 2018-08-09 18:07:49 +02:00
421dc19798 Examples: Cast to ImTextureID instead of void* when assigning to TexId. Applied to all examples. (#2015) 2018-08-09 17:49:48 +02:00
9c0805010f imgui_impl_dx12: Cast to ImTextureID instead of void* to enable redefinition of ImTextureID (#2015, #301) 2018-08-09 17:44:29 +02:00
d5793102db imgui_impl_opengl3: Advertised as a ES2/ES3 renderer. Defaults to ES3 on Android. Default on "#version 300 es" on ES 3. (#2002, #1873) 2018-08-09 17:42:53 +02:00
34203d5008 imgui_impl_win32: Don't redefine WIN32_LEAN_AND_MEAN if already defined (#2014) 2018-08-09 17:32:31 +02:00
e3eb4111cc Examples: Fix 'How to build' instructions for SDL2 examples (#2012) 2018-08-08 18:55:09 +02:00
35124cdd07 imgui_impl_opengl3.cpp Using GLES3 on IOS instead of gl3w. (#2002, #1873)
Not modifying the main.cpp yet because we need to test GL ES 3 context creation on iOS (only imgui_impl_opengl3.cpp was tested).
2018-08-08 17:41:30 +02:00
0065fe16a2 Nav: Made CTRL+TAB skip menus + skip the current navigation window if is has the ImGuiWindow_NoNavFocus set. (#787)
While it was previously possible, you won't be able to CTRL-TAB out and immediately back in a window with the ImGuiWindow_NoNavFocus flag.
2018-08-08 16:03:13 +02:00
9d8a0374d3 Use literals in place of LLONG_MIN, LLONG_MAX ULLONG_MAX if they are not available. Amend 498c0dcb4c. We prefer using the defines if available in limits.h because they somehow tend to work without warnings when enabling strict C++03 compilation. The 3 literals are fallbacks.. (#1926). 2018-08-06 13:07:19 +02:00
0905202f44 Internals: Minor renaming for consistency. 2018-08-05 18:13:24 +02:00
9e9c8a8991 Update to Contributing, and Issue/PR templates. 2018-08-05 18:13:15 +02:00
bc6ac8b2ae Metrics: Changed io.MetricsActiveWindows to reflect the number of active windows (!= from visible windows), which is useful for lazy/idle render mechanisms as new windows are typically not visible for one frame.
Metrics: Added io.MetricsRenderWindow to reflect the number of visible windows.
2018-08-03 18:12:36 +02:00
00e29832d4 Examples: OpenGL2: Disabling/restoring GL_LIGHTING and GL_COLOR_MATERIAL to increase compatibility with legacy OpenGL applications. (#1996) 2018-08-03 15:04:35 +02:00
498c0dcb4c Using limits.h LLONG_MIN etc. to increase old-compiler compatibility (as ll and ull prefixes were not standard). Not tested much on old compilers, relying on Clang/GCC warnings. 2018-08-03 11:41:07 +02:00
fd2a90ee60 Update CONTRIBUTING.md 2018-08-02 16:53:51 +02:00
d69b2a1c1d Changelog for #1989 2018-08-01 12:23:59 +02:00
6011ddf1e5 imgui_impl_dx11: Using ID3D11Factory instead of ID3D11Factory1 (#1989) 2018-08-01 12:22:04 +02:00
cc64bd9e3c Comments 2018-08-01 11:54:54 +02:00
87e2fea09d Renamed io.OptResizeWindowsFromEdges to ConfigResizeWindowsFromEdges, io.OptCursorBlink to io.ConfigCursorBlink, io.OptMacOSXBehaviors to ConfigMacOSXBehaviors for consistency. (#1427, #1495, #822, #473, #650)
Demo: Exposed flags in Demo.
2018-08-01 11:50:57 +02:00
b1fc988c6b imgui_impl_glfw, imgui_impl_sdl: Workaround for Emscripten which doesn't seem to handle focus related calls. (#1941) 2018-08-01 11:34:17 +02:00
b217251a63 Added Visual Studio 2017+ build cruft to Ignore List (.vs/ folder) 2018-07-31 18:48:24 +02:00
671e516377 Demo: Fix using ambiguous InputFloat() call which redirect to obsolete version. (#1990) 2018-07-31 18:38:15 +02:00
65b46f62ef Fixed PushID() from keeping alive the new ID Stack top value (if a previously active widget shared the ID it would be erroneously kept alive) (drag and drop demo could soft-lock the UI until pressing Escape!) 2018-07-31 17:28:18 +02:00
7e1678ff00 Drag and Drop: Elapse payload as soon as delivery is made. (#153) 2018-07-31 17:28:08 +02:00
faf2c34149 Drag and Drop: Added ImGuiDragDropFlags_SourceAutoExpirePayload flag to force payload to expire if the source stops being submitted. (#1725, #143). 2018-07-31 13:46:19 +02:00
79ae6d3bf6 Drag and Drop: Clear payload buffers more consistently in ClearDragAndDrop() + BeginDragDropTargetCustom() can't succeed with hidden contents. (#143) 2018-07-31 13:45:25 +02:00
e13e5982ff Drag and Drop: Payload stays available and under the mouse if the source stops being submitted, however the tooltip is replaced by "..." + moved FrameScopeActive = false at the bottom of EndFrame() for safety. (#1725) 2018-07-31 12:11:18 +02:00
f88bf9cea3 InvisibleButton: Added an assert to catch common type of passing zero-sized dimensions. (#1983) 2018-07-30 18:48:10 +02:00
067edd09f9 imgui_impl_opengl3: Comments. (#1987) 2018-07-30 18:44:58 +02:00
a7ac9e8346 Made assertion more clear when trying to call Begin() outside of the NewFrame()..EndFrame() scope. (#1987) 2018-07-30 18:20:25 +02:00
d5400d9517 Fixes for pre-C++11 compilers.
That said, I think we can consider upgrading requirement to an early VS-friendly subset of C++11. The thing I would like the most from C++11 are forward-declared enum (from VS 2012 onward).
2018-07-30 17:42:27 +02:00
4d5dcdb57a Internals: Changed signature of ShadeVerts functions to remove pointers. (#1286, #1700, #1986) 2018-07-30 17:24:04 +02:00
f05aede098 Revert "Assert that fmt != NULL before calling vsnprintf (#1969)"
This reverts commit 84183f5bb6.
2018-07-30 16:50:47 +02:00
80db2383d8 Speculative va_copy() fix for old versions of GCC/Clang. (cannot repro) (#1085) 2018-07-30 16:01:06 +02:00
2a67aeaa3d Visual Studio: calling into _vsnprintf. (#1085) 2018-07-30 16:01:06 +02:00
81562b2b5a Examples: imgui_impl_opengl3.cpp Using #ifdef GL_SAMPLER_BINDING instead of if (glBindSampler) (#1985) 2018-07-30 15:38:13 +02:00
15a93d6fe3 Internals: Fixed HoveredIdTimer so it is safe to call SetHoveredId() multiple times without altering the timer. 2018-07-30 14:36:33 +02:00
6d78045ff8 Demo: Added extra demo in the Basic Horizontal Layout section. (#1977) + PR guidelines 2018-07-30 14:33:27 +02:00
b5b972d0ef ImFontAtlas::AddFontDefault: Made it possible to override glyph ranges. (#1965) 2018-07-30 14:18:20 +02:00
faa7dad537 Examples: imgui_impl_osx: Fix for incorrect DeltaTime calculation on mac OS. (#1978) 2018-07-30 14:15:24 +02:00
544db70852 Examples: OpenGL3: Tweaks, added changelog. (#1941) 2018-07-30 14:00:53 +02:00
fc737d2333 Examples; imgui_impl_opengl3.cpp to work with Emscripten (#1941)
* Add some ifdefs to add emscripten specific params and includes

* Update imgui_impl_opengl3.cpp

* Update imgui_impl_opengl3.cpp

* Update imgui_impl_opengl3.cpp

* replace __EMSCRIPTEN_BUILD__ with __EMSCRIPTEN__

* replace GLFW_INCLUDE_ES3 with direct header

* removing useless glfw include

* Making call to glPolygonMode() optional
2018-07-30 13:52:18 +02:00
f9e8b5c652 CollapseButton: Added hovering highlight + minor consistency tweaks. 2018-07-27 13:32:33 +02:00
6211f40f3d Internals: Drag and Drop: default drop preview use a narrower clipping rectangle (no effect here, but other branches uses a narrow clipping rectangle that was too small so this is a fix for it) + Comments 2018-07-27 12:39:42 +02:00
28c1a9857e Internals: Changed SplitterBehavior() signature to be consistent with other similar signatures. (#319). 2018-07-26 23:50:05 +02:00
63df9d6311 Internals: Extracted part of Begin into UpdateWindowParentAndRootLinks(). Useful to call to keep state updated immediately (namely useful for docking) + small tidying up of imgui_internal.h 2018-07-26 23:49:36 +02:00
84183f5bb6 Assert that fmt != NULL before calling vsnprintf (#1969)
In the case of Visual Studio 15.6 + Windows SDK 10.0, vsnprintf() with NULL format string appears to corrupt the stack...
2018-07-26 22:26:50 +02:00
dd0d5debef Internals: Child windows that are clipped or part of a collapsed parent are not marked as collapsed anymore, but just a separate hidden marker set. We distinguish hiding for size measurement vs hiding for other reasons. Cleaned a little the end of Begin. 2018-07-26 19:24:27 +02:00
0b045d8de5 Nav: Tweaked CTRL+TAB to hide visual noise on fast switch + fading out screen dimming and highlight to make the experience less harsh 2018-07-26 19:03:02 +02:00
7adac4ab3e FAQ update 2018-07-26 12:55:40 +02:00
0c88fad6c2 Internals: SplitterBehavior() added hover_visibility_delay parameter which is helpful to reduce visual noise. (#319) 2018-07-25 16:07:05 +02:00
357534e588 Made it possible to move a window by dragging from the Collapse button (past the drag threshold). Extracted some code out to a CollapseButton() function. 2018-07-24 16:45:11 +02:00
3a522b2400 Internals: Renamed one of the arrow functions so their name don't collide. 2018-07-24 16:41:17 +02:00
ff83d0e369 Examples: Using fully qualified "Dear ImGui" name in window titles. 2018-07-23 17:31:13 +02:00
528b50a89f Fixed horizontal mouse wheel not forwarding the request to the parent window if ImGuiWindowFlags_NoScrollWithMouse is set. (#1463, #1380, #1502) 2018-07-22 19:04:15 +02:00
4b8ce24e46 Internals: Extracted part of NewFrame() into a UpdateMouseWheel() function. 2018-07-22 18:57:28 +02:00
4ebd442a24 Added asserts to catch illegal modifications of the font atlas between NewFrame() and EndFrame()/Render(). (#1958) 2018-07-22 18:53:27 +02:00
e07f5d4c78 Changed ImGui::GetTime() return value from float to double to avoid accumulating floating point imprecisions over time. 2018-07-22 18:46:41 +02:00
ec76009bc4 Readme: fixed typo + patron 2018-07-22 18:09:44 +02:00
af38a5c41a Ignore GCC warning (-Wclass-memaccess) in imgui.h (#1959) 2018-07-22 18:05:13 +02:00
fded746d03 Tweaked Contributing guidelines, Issue and PR templates 2018-07-22 17:32:31 +02:00
048add5ef2 ImGuiTextFilter, TextRange: removed cruft from TextRange since it's not a publicly and generic helper at the moment + marked internal stuff + changed a reference to a pointer. (#1879) 2018-07-19 15:22:18 +02:00
d016ef1825 Examples: SDL: Removed SDL_HAS_WARP_MOUSE_GLOBAL in the non-viewport branch. (#1954) (+1 squashed commits) 2018-07-19 12:51:20 +02:00
93321d3280 Nav: Fixed CTRL+TAB windowing list from always showing the implicit Debug window. (#787) 2018-07-17 19:48:53 +02:00
7e59eb026b Fix warning when IMGUI_DEFINE_MATH_OPERATORS is already defined by build system. (#1950) 2018-07-17 17:17:56 +02:00
0c207b7bc9 Demo: Clarified the use of IsItemHovered()/IsItemActive() right after being in the "Active, Focused, Hovered & Focused Tests" section. This will be of more importance with the introduction of tabs. 2018-07-17 11:49:41 +02:00
d3be9185b3 Demo: Fixed spacing from b629f90 change. 2018-07-16 22:24:39 +02:00
73e13a0762 Examples: Tweaked the main.cpp example structure for all examples. (There are a few hidden agendas here: 1) I would like to avoid encouraging people from using the implicit "Debug" window, and promote using Begin/End. In spite of my best attempt, there are a few feature of the upcoming docking system that cannot work 100% properly for the implicit Debug window, so future proof let's not put that feature in the spotlight too much for new users. 2) Moved dumb hardcoded positions into a single spot that can be replaced with a viewport relative position and not affect other demo windows. 3) Calling ShowDemoWindow before anything else, also for the benefit of a specific docking demo which will have an ordering constraint which is not really problematic in a real app but shouldn't be put forward in the demo. 2018-07-16 22:17:34 +02:00
abe7b190dc Examples: DX10, DX11: Fixed unreleased resources in Init and Shutdown functions. (#1944) 2018-07-13 11:25:54 +02:00
badde9a970 Demo: Spacing. 2018-07-12 11:58:50 +02:00
b629f90393 Demo: Re-ordered example app code to match their menu order and forward declaration order + added header to delimitate them. 2018-07-12 11:42:33 +02:00
5e73e969fb Comments, exposed a few things in imgui_internal.h for consistency, added ImQsort wrapper. 2018-07-12 11:08:24 +02:00
23288547ec Revert part of c7016c2 incorrectly renaming ImGuiCol_NavWindowingHighlight to ImGuiCol_NavWindowListHighlight, that was wholly unnecessary (and not documented!). (also invalidate #1939) 2018-07-12 09:53:10 +02:00
59fb3274a7 Examples: include for intptr_t on tdm-gcc + mingw32 (#1936) + mouse buttons comments 2018-07-11 20:03:47 +02:00
9007dff5eb IsItemHovered(): Added ImGuiHoveredFlags_AllowWhenDisabled flag to query hovered status on disabled items. (#1940, #211)
+ shallow changelog tweaks
2018-07-10 19:16:57 +02:00
fff014dfed Examples: OpenGL3: Added shaders more versions of GLSL + made the example app default to GL 3.0 + GLSL 130 (instead of GL 3.2 + GLSL 150) unless on Mac. (#1938, #1900, #1513, #1466, etc.) 2018-07-10 18:29:57 +02:00
b829671df1 Fixed missing value in GetStyleColorName(). (#1939) broken with c7016c2 2018-07-10 16:45:54 +02:00
de13261f1b OpenGL3: Added error output when shaders fail to compile / link. (#1938) 2018-07-10 16:09:34 +02:00
4dfb9ef751 Internals: Extracted StartMouseMovingWindow so we can add code to turn an arbitrary widget into a window mover (will be useful to make the Collapse button a window mover past a mouse drag threshold) + added a couple of _None flags. 2018-07-10 11:16:40 +02:00
dc021f1c23 Internals: Fixed CalcSizeContents() returning negative value on first run (inconsequential afaik, but fixing for sanity) 2018-07-09 21:38:37 +02:00
17f36038e0 Internals: Misc/shallow merge from Docking branch. 2018-07-09 21:10:47 +02:00
7033b2043b Internals: Move IMGUI_CDECL declaration to imgui_internal.h so everyone can profit. 2018-07-09 20:34:12 +02:00
c7016c25e8 Nav: Added a CTRL+TAB window list and changed the highlight system accordingly. (#787) 2018-07-09 19:16:48 +02:00
0708f91617 Internals: Removed RootWindowForTabbing, won't be needed. Nav: Not starting NavWindowingTarget when a modal is active (was not noticeable). 2018-07-09 16:20:14 +02:00
6201cad2b4 Examples: Comments, Demo: Log early out, TODO. (#1553) 2018-07-09 11:43:53 +02:00
17efd7b3b0 Demo: Added basic Drag and Drop demo. (#143, #1931) 2018-07-08 20:06:49 +02:00
bd6097ac6f Drag and Drop: Calling BeginTooltip() between a BeginDragSource()/EndDragSource() or BeginDropTarget()/EndDropTarget() uses adjusted tooltip settings matching the one created when calling BeginDragSource() without the ImGuiDragDropFlags_SourceNoPreviewTooltip flag. (#143) + additional safety checks. 2018-07-08 20:06:49 +02:00
64938178b7 Internals: Moved selectable flags to avoid collision with public flags + rewrote some tests so we can consistently grep for (held && hovered) 2018-07-08 18:23:12 +02:00
a33f0d1f7f Drag and Drop: Fixed ImGuiDragDropFlags_SourceNoDisableHover to affect hovering state prior to calling IsItemHovered() + fixed description. (#143) 2018-07-08 16:38:57 +02:00
vby
3a42eb6620 Fix missing ImmReleaseContext in default Win32 IME handler (#1932) 2018-07-08 15:24:12 +02:00
b0cdfe0ece Generalized d11d211e so regular popups (without the AlwaysAutoResize flag) also have a smaller minimum size, but reduced it to an arbitrary 4.0f instead of 1.0f to ease debugging of faulty situations. (#1909) 2018-07-08 13:27:16 +02:00
c790723cfa Drag and Drop: Fixed an incorrect assert when dropping a source that is submitted after the target (bug introduced with 1.62 changes related to the addition of IsItemDeactivated()). (#1875, #143) 2018-07-08 13:03:39 +02:00
89e2ddf07f Examples: Comments + shallow coding convention tweak to be consistent across examples and with imgui_impl_osx 2018-07-08 11:16:11 +02:00
569e0f07f1 Examples: Removed old example_apple/ + tweak comments (#1873) 2018-07-08 10:57:16 +02:00
839e4d34bd Merge branch 'warrenm_osx' 2018-07-08 10:47:55 +02:00
c3f9220c15 Apple: Fixed example_osx_opengl2, renamed to example_apple_opengl2 + misc comments 2018-07-08 10:47:31 +02:00
d11d211e5d Allow popup from ignoring the style.WindowMinSize values so short menus are not padded. (#1909) Wider generalization of b16603745c. 2018-07-06 18:29:39 +02:00
93950b8c32 Internals: Removed unused ShadeVertsLinearAlphaGradientForLeftToRightText code. 2018-07-06 15:50:07 +02:00
42bf149ac6 Removed per-window ImGuiWindowFlags_ResizeFromAnySide beta flag in favor io.OptResizeWindowsFromEdges=true to enable the feature globally. (#1495) The feature is not currently enabled by default because it is not satisfying enough. 2018-07-06 15:30:21 +02:00
d64157e803 Introduced a new Metal renderer implementation and a new example illustrating usage of Metal on macOS and iOS (partially addresses #1873) 2018-07-05 21:58:15 +09:00
0146f4b456 Internals: BeginChildEx tweaks. 2018-07-05 09:17:16 +02:00
7b2662d245 Examples: Comments, bits of documentation 2018-07-04 19:06:28 +02:00
deb7aa29cd OSX: Various tweaks to imgui_impl_osx courtesy of @warrenm + fix NewFrame position which has been moved recently master. (#1873) 2018-07-04 13:24:16 +02:00
0d7e779b37 Merge branch 'master' into osx
# Conflicts:
#	examples/.gitignore
#	examples/README.txt
2018-07-04 13:13:11 +02:00
665bd1e140 Links and thanks. Comments on using BeginCombo/EndCombo + moved the Combo() implementations closer to each others to maximize user seeing how it is implemented from any of the secondary function body. 2018-07-04 10:29:28 +02:00
a765c83bad Ignore list: added emscripten output 2018-07-03 15:57:34 +02:00
ddb09c6011 Examples: Ignore all *.user files (#1919)
For example `Qt Creator` create `CMakeLists.txt.user` file with user settings.
2018-07-02 19:43:33 +02:00
645ab6633c Fixed a include build issue for Cygwin in non-POSIX (Win32) mode. (#1917, #1319, #276) 2018-07-01 12:25:37 +02:00
c4e34aaace Examples: Comments to clarify how the keyboard data is indexed. 2018-06-30 14:33:45 +02:00
b62cc5c150 Fix include Example_glfw_vulkan cmake (#1916)
Probably got broken because of the refactor.
2018-06-30 10:53:36 +02:00
6e67afc500 Tweaked software mouse cursor offset to match the offset of the corresponding Windows 10 cursors. (followup to #1914) 2018-06-29 16:36:40 +02:00
62b3d7c51e Fixed software Hand cursor from not actually working. Fixed demo from crashing. Fixed typo and extraneous trailing space. Added Changelogs. (#1913, #1914) 2018-06-29 16:36:40 +02:00
ecd9a223e3 add hand cursor support (+11 squashed commit) 2018-06-29 16:36:40 +02:00
004fe8916a Internals: Settings: Simple optimization caching index into the settings buffer, to remove an unnecessary O(N*M) search during saving. (with N=active root windows during the session, M=stored settings which grows over time) 2018-06-28 18:42:38 +02:00
242d7e0b0b ImVector: Added index_from_pointer() helper. 2018-06-28 18:37:38 +02:00
b16603745c Allow menu windows from ignoring the style.WindowMinSize values so short menus are not padded. (#1909) 2018-06-28 11:33:03 +02:00
7adae3299e Double-click on resize grip doesn't need to test HoveredWindow (as button has the flattenchild flag anyway) + double-click on title bar verify that we don't have overlapping items to allow contents in title bar. + Comments 2018-06-27 17:29:31 +02:00
42a919f303 Examples: Apple: Fixed paths of GLFW+GL2 example. (#1906) Update ignore list. 2018-06-27 09:39:52 +02:00
79153cf19f Internals: Various renaming. e.g. NewFrameUpdateHoveredWindowAndCaptureFlags() to UpdateHoveredWindowAndCaptureFlags() + exposed UpdateMovingWindow() in imgui_internal.h. 2018-06-26 12:40:37 +02:00
14ceaaf460 ArrowButton: Fixed to honor PushButtonRepeat() setting (and internals' ImGuiItemFlags_ButtonRepeat). Setup current line text baseline so that ArrowButton() + SameLine() + Text() are aligned properly. 2018-06-26 12:37:20 +02:00
9d67d18d86 Internals: Moved some of the SliderBehaviorT code into SliderBehavior to reduce the amount of instanciated code. 2018-06-25 14:01:21 +02:00
a1ec7723ef Examples: OpenGL3: Remove misleading or unnecessary "#version 150" strings. 2018-06-25 09:50:06 +02:00
c1d8dee6c5 Version 1.63 WIP 2018-06-25 09:40:09 +02:00
fb0106fad2 Demo: Fixed incorrect response to Begin() returning false in overlay demo (which cannot happen since we don't have a title bar, but that doesn't make it a good behaving demo!). 2018-06-25 09:32:55 +02:00
20e89201cb Examples: Fixes. 2018-06-23 09:42:47 +02:00
00418d13e3 Demo: Fixed mismatched TreePush/TreePop in Property Editor, due to incorrect revert in 826d77185e (#1895) 2018-06-22 17:45:03 +02:00
d68633398b Examples: Vulkan: nverted the parameters to ImGui_ImplVulkan_RenderDrawData() to be consistent with other bindings. 2018-06-22 10:02:02 +02:00
1b74e3be02 Version 1.62 2018-06-22 09:41:25 +02:00
f9a5ff7a19 Examples: DirectX12: Moved the ID3D12GraphicsCommandList* parameter from ImGui_ImplDX12_NewFrame() to ImGui_ImplDX12_RenderDrawData() which makes a lots more sense. (#301) 2018-06-21 12:13:04 +02:00
cac4c3f9b8 Examples: The functions in imgui_impl_xxx.cpp are prefixed with IMGUI_IMPL_API (which defaults to IMGUI_API) to facilitate some uses. (#1888) + Comments in imgui.h 2018-06-21 12:04:00 +02:00
528b0b4af6 Examples: SDL+OpenGL2: Fixed Makefile. (#1886) 2018-06-20 11:17:33 +02:00
c44a4bed84 Examples: Fixed bindings to use ImGuiMouseCursor_COUNT instead of old name ImGuiMouseCursor_Count_ so they can compile with IMGUI_DISABLE_OBSOLETE_FUNCTIONS. (#1887) 2018-06-20 11:06:29 +02:00
2ce121b7d0 Readme, Links, Bindings 2018-06-16 10:43:05 +02:00
40845852b9 Fixed warnings + readme 2018-06-16 10:23:11 +02:00
a402edb66c Examples: OSX: Added clipboard support. Fixed ignore list for xcode cruft. Comments about broken keys. (#1873) 2018-06-15 23:01:26 +02:00
b5d385824d Added assert in TreePop() to ease catching ID stack underflow earlier. 2018-06-14 15:11:14 +02:00
826d77185e Revert 640c0566: TreeNode: Fixed nodes with ImGuiTreeNodeFlags_Leaf flag always returning true which was meaningless -> more flexible to keep allowing it by default so it setup an ID scope. 2018-06-14 15:10:46 +02:00
ce0b36ba10 Added _None values to various enum flags, useful for readability and some coding style likes it. (Unfortunately we can't refer to them as default value in imgui.h functions because they need to be declared below). 2018-06-13 23:22:19 +02:00
2a6fbb2197 Speculative fix for Win32 clipboard handler if SetClipboardText() fails + Minor fix for static analyzer + using :: prefix when calling in Win32 functions. 2018-06-13 22:22:52 +02:00
185b4dde87 Examples: Allegro5: Added support for ImGuiConfigFlags_NoMouseCursorChange flag. Added clipboard support. Unindexing buffers ourselves as Allegro indexed drawing primitives are buggy in the DirectX9 back-end. 2018-06-13 19:22:47 +02:00
335f6fde7e Comments + missing changelog bits in 1.52 for SetNextWindowPos, SetNextWindowPosCenter. (obsolete #771) 2018-06-13 14:06:58 +02:00
d57fc7fb97 Added IsItemDeactivatedAfterChange() if the last item was active previously, isn't anymore, and during its active state modified a value. Note that you may still get false positive. (#820, #956, #1875) 2018-06-13 00:10:33 +02:00
be4b8b5615 Internals: Added GetItemID(), GetFocusID() for consistency. Made GetActiveID() inline. Comments, fixed typos, demo tweaks. 2018-06-13 00:02:19 +02:00
3569d74f98 Demo: Moved test of the Hovered/Active/Focused functions to the Widgets section. 2018-06-12 18:51:23 +02:00
cd455a4600 Added IsItemDeactivated() to query if the last item was active previously but isn't anymore. Useful for Undo/Redo patterns. (#820, #956, #1875) 2018-06-12 18:44:33 +02:00
c725710c6d Comments 2018-06-12 18:25:04 +02:00
a48815b870 Comments, changelog 2018-06-12 12:12:56 +02:00
e54b61aa0f Examples: OSX: Fixed obsolete enums. Fixed keyboard mapping. Added missing keyboard modifiers. (#1873) 2018-06-11 21:07:14 +02:00
f96c7fac91 Examples: FreeGLUT: Fixed mapping of Space key. (#801) 2018-06-11 20:03:35 +02:00
cdf51cad2d Comments, documentation 2018-06-11 19:52:40 +02:00
a1b6766d43 Examples: FreeGLUT: Added FreeGLUT bindings. Added FreeGLUT+OpenGL2 example. (#801) 2018-06-11 19:27:57 +02:00
bdb3d72d37 Examples: Win32: Fixed handling of mouse wheel messages to support finer position messages (typically sent by track-pads). (#1874) 2018-06-11 17:36:18 +02:00
7acb46bec5 Examples: Comments to make ImGuiConfigFlags_NoMouseCursorChange more visible (#1027). + Allegro5: Added support for ImGuiConfigFlags_NoMouseCursorChange flag. 2018-06-11 12:33:51 +02:00
fac0c801da Examples: Added imgui_impl_osx.mm bindings (#1870, #281) 2018-06-11 10:19:17 +02:00
6f7b7807ad Fixed Travis path + various paths in comments/documentations 2018-06-10 16:14:43 +02:00
5a13e4dcde Examples: Renamed imgui_impl_sdl2.cpp to imgui_impl_sdl.cpp (#1870) + changelog bits 2018-06-10 15:58:21 +02:00
8d58fbb5ed Examples: Renamed example folders. (#1870) 2018-06-10 15:42:14 +02:00
689ec0bd06 Merge branch 'font_min_max_advance' 2018-06-10 15:07:18 +02:00
85f9694bd4 Big example binding refactor (manually imported from Viewport branch, stripped out of Viewport code). (#1870)
Read examples/README.txt for some details.
ImDrawData: Added DisplayPos, DisplaySize fields honored by all backends (not strictly necessary to honor just now, but doing it to be ahead)
2018-06-08 19:37:33 +02:00
f5bf9f509c ImFontConfig: Added GlyphMinAdvanceX/GlyphMaxAdvanceX settings useful to make a font appears monospaced, particularly useful for icon fonts. (#1869) 2018-06-08 12:52:46 +02:00
8e48ab6b19 Nav: Addendum: only set io.WantSetMousePos if necessary. (#1867) 2018-06-07 18:08:59 +02:00
e3710448ae Nav: Removed an unnecessary assertion that could fail when using Mouse and Keyboard simultaneously with the NavEnableSetMousePos flag. (#1867) 2018-06-07 18:04:44 +02:00
929529a0db SliderFloat(): When using keyboard/gamepad and a zero precision format string (e.g. "%.0f"), always step in integer units. (#1866) 2018-06-07 13:29:54 +02:00
b3a5b8debd Popup: Improved handling of (erroneously) repeating calls to OpenPopup() to not fully close/re-open the popup so its child popups won't get closed. (#1497, #1533, #1865).
Followup/fix the change made in deab2ab015
2018-06-06 19:25:49 +02:00
f63a404df0 Added missing IMGUI_API markers in non-inline section of the IMGUI_DISABLE_OBSOLETE_FUNCTIONS block: old Begin(), InputFloat(). 2018-06-06 15:40:40 +02:00
5a288b2d3a Readme, FAQ tweaks (#1807) 2018-06-06 13:02:19 +02:00
d44faa165a Added GetGlyphRangesChineseSimplifiedCommon() helper that returns a list of ~2500 most common Simplified Chinese characters. Renamed GetGlyphRangesChinese() to GetGlyphRangesChineseFull() to distinguish other variants and discourage using the full set. (#1859)
Changed the accumulative encoding to remove the implicit +1 which only saved a little space and made things more confusing.
2018-06-06 12:35:36 +02:00
2a56105f85 TreeNodeEx(): The helper ImGuiTreeNodeFlags_CollapsingHeader flag now include ImGuiTreeNodeFlags_NoTreePushOnOpen. The flag was already set by CollapsingHeader(). The only difference is if you were using TreeNodeEx() manually with ImGuiTreeNodeFlags_CollapsingHeader and without ImGuiTreeNodeFlags_NoTreePushOnOpen. In which case you can remove the ImGuiTreeNodeFlags_NoTreePushOnOpen flag from your call (ImGuiTreeNodeFlags_CollapsingHeader & ~ImGuiTreeNodeFlags_NoTreePushOnOpen). (#1864) 2018-06-06 11:39:29 +02:00
21f553fa55 stb_textedit, InputText(): Fixed Undo after pasting large amount of text (Redo will still fail when undo buffers are exhausted, but text won't be corrupted).
See issue 620 in nothings/stb/
2018-06-05 23:29:06 +02:00
67b139ccae Updated stb_textedit 1.09 + patches --> 1.12 + minor patches. (#715) 2018-06-05 23:27:42 +02:00
916528080e InputTextMultiline(): Fixed double navigation highlight when scrollbar is active. (#787) 2018-06-05 16:16:54 +02:00
512ffa37bd Nav: Fixed clipped scoring when exiting a NavFlattened child back to a parent item (clipping not desirable then). (followup and fix to c665c15). (#787) 2018-06-05 16:12:46 +02:00
6d98c0323b Nav: Added support for PageUp/PageDown (explorer-style: first aim at bottom/top most item, when scroll a page worth of contents). (#787) 2018-06-05 15:49:33 +02:00
2bdf0b54a2 Changelog formatting update, Todo, comments. Tweak Child demo. Shuffle some code in NavUpdate(). 2018-06-05 15:34:22 +02:00
c665c15a7d Nav: When entering into a NavFlattened child we only consider the visible items for scoring (note that this only work assuming the NavFlattened child window has interactive items). Fixes accidentally hoping into a NavFlattened child. (#767) 2018-06-04 18:18:12 +02:00
f4120e20d5 Nav: NavFlattened: Fixed navigation miscrolling parent window when the current window is scrolling enough to keep the item in view. Fix feature added in e11610d6, typically affect large navigation steps (used by PageUp/PageDown). + comments (#787) 2018-06-04 18:18:11 +02:00
5a7e98c7cf Internals: Nav: Removed ParentID from move result (unused, would need to be full-filled for PageUp/PageDown code) + FAQ typo fix. 2018-06-04 15:43:33 +02:00
948009a8b2 Intensive FAQ answer for the million of people asking the same questions over and over again. (#1848, #1791, #1840, #1493, #1295) 2018-05-30 16:31:34 +02:00
0903a12c2a Fixed documentation example (#1847) 2018-05-30 10:28:27 +02:00
a2198bcf6b Made mouse drag distance calculation more robust to invalid mouse position. (#1845) 2018-05-29 10:47:18 +02:00
08e20ae465 Internals: Reintroducing LastActiveIdTimer because it is useful and to reduce merge conflicts. (#1537) 2018-05-28 21:48:25 +02:00
d4b151076c Internals: Added BeginDragDropTooltip() internal function to convey semantic (drag and drop tooltip doesn't get clipped within display boundaries). Revert part of 3218666fb9. (#1739, #143). 2018-05-28 21:40:09 +02:00
3218666fb9 Made drag source tooltip display at the same position as a regular tooltip to avoid discontinuity where dynamically swapping tooltip at the target site. Made drag source tooltip override previous tooltip if any. (#1739, #143). 2018-05-28 21:24:03 +02:00
92b7d6bc4f Added ImGuiDragDropFlags_AcceptNoPreviewTooltip flag to disable drag source tooltip from the target site (#143) 2018-05-28 20:57:41 +02:00
7fd9199a1d Internals: Selectable: Renamed variables. Todo update. 2018-05-28 17:13:40 +02:00
f843facba4 Internals: PushItemFlag() flags are inherited by BeginChild(). 2018-05-28 15:30:42 +02:00
0e83d74698 Documentation: FAQ, ID Stack, Fonts (#1839, #1840), #1842) 2018-05-27 22:32:46 +02:00
929522febe Missing examples changelog bits and todo list 2018-05-25 12:51:24 +02:00
9770c8b21d Examples: OpenGL3: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state. (#1836) 2018-05-25 12:09:14 +02:00
251f178a6f Drag and Drop: Source doesn't report as hovered (at a lower-level). Source disable AllowOverlap flag if any set. (#143) 2018-05-24 18:05:50 +02:00
5fd23eeb74 Examples: iOS: Fixed missing call to CreateContext() + various shallow coding style tweaks. (#1835) 2018-05-24 17:42:50 +02:00
b88fbd69cc Drag and Drop: BeginDragDropSource(): Offset tooltip position so it is off the mouse cursor, but also closer to it than regular tooltips, and not clamped by viewport. (#1739) 2018-05-23 23:19:01 +02:00
09ea376a6a BeginCombo(), BeginMainMenuBar(), BeginChildFrame(): restore modified style at end of Begin instead of End so doesn't affect child windows, BeginTooltip() etc.. (allowed since 7b6b7038c5) 2018-05-23 23:05:26 +02:00
bef0a13283 Examples: Comments about GLSL version not being the same as GL context version. (#1828) 2018-05-21 11:28:30 +02:00
663e2c9237 Examples: GLFW: Made it possible to Shutdown/Init the backend again (by reseting the time storage properly). Changelog. Added to Vulkan example. (#1827) 2018-05-21 10:36:50 +02:00
e8a72d3e72 Examples: GLFW* Make subsequent window creation possible. 2018-05-21 10:34:17 +02:00
bf56b6b9a5 ColorEdit3, ColorEdit4, ColorButton: Added ImGuiColorEditFlags_NoDragDrop flag to disable ColorEditX as drag target and ColorButton as drag source. (#1826) 2018-05-21 10:13:21 +02:00
7c7e96e1aa ImVector: added erase(it first, it last) helper. Added erase_unsorted(it) helper. + todo fixes/additions 2018-05-18 23:00:48 +02:00
6c684ae39b Fixed GCC pre-8 build. (#1822) + added bonus the non-ASCII character pasted from GCC breaks my SourceTree/Git combo 2018-05-17 18:10:20 +02:00
64b1645deb Disabled GCC 8.1.0 warnings -Wclass-memaccess (#1822) 2018-05-17 14:19:20 +02:00
d5c8f404b2 Remove trailing white spaces. 2018-05-17 14:12:37 +02:00
ede5059e69 Internals: Forward declaring and commenting internal structures. Renamed ImGuiDrawContext to ImGuiWindowTempData, but kept .DC member name for backward compatibility purpose 2018-05-17 10:48:15 +02:00
86f8cdbd98 Comments + Internals: Selectable: decoupled internal flags and removed their menu / menu-item semantic as upcoming changes are requiring more flexibility. 2018-05-16 18:03:37 +02:00
640c056602 TreeNode: Fixed nodes with ImGuiTreeNodeFlags_Leaf flag always returning true which was meaningless. Tweak demo. 2018-05-14 23:36:37 +02:00
99ff6fc7e4 Nav: Draft internal api to forward move request with loop/wrap options. Will rework for parallel scoring of two paths (as a generalization of the NavFlattened concept). (#787) 2018-05-14 23:07:35 +02:00
e11610d6ff Nav: To keep the navigated item in view we also attempt to scroll the parent window as well as the current window. (#787) 2018-05-14 19:50:48 +02:00
036dce634e Version 1.62 WIP 2018-05-14 19:19:19 +02:00
721ca97d95 ImVector: Tweaked reserve() flow to avoid calling MemFree(NULL) which is unnecessary. (#1796) 2018-05-14 17:52:29 +02:00
19544629be Examples: OpenGL3: Trying to make the call to glBindSampler optional to make the example code easier to use/share with different context version. (#1806) 2018-05-14 17:47:22 +02:00
78b28d545f Version 1.61 + todo additions 2018-05-14 12:34:47 +02:00
d7cc4bc317 Demo: Tweaked custom rendering custom, added a Thickness drag. Clarified use of vertical/horizontal line. Add a single pixel demo (wowow) 2018-05-13 23:42:19 +02:00
3f29ed6fd5 ColorEdit: Fixed not being able to pass the ImGuiColorEditFlags_NoAlpha or ImGuiColorEditFlags_HDR flags to SetColorEditOptions(). Demo tweak. 2018-05-13 23:41:43 +02:00
725c13ca68 Fix for atof with glibc. 2018-05-13 22:43:43 +02:00
2a2bb8970d Added ImAtof, ImCeil, ImFloorStd to IMGUI_DISABLE_MATH_FUNCTIONS for consistency. Configuration comments. 2018-05-13 22:31:29 +02:00
ff033f431b Added IMGUI_DISABLE_MATH_FUNCTIONS in imconfig.h to make it slightly easier to redefine wrappers to std maths functions such as fabsf(), fmodf(), etc. Comments. 2018-05-13 21:04:07 +02:00
f8ca7f45c4 Comments about AddConvexPolyFilled(), PathFillConvex() requiring a clockwise order path. (#1811) 2018-05-13 15:55:15 +02:00
e61b224b24 Update README.md 2018-05-12 19:20:54 +02:00
d53bae4c14 Demo: Fixing build due to using INT_MAX, UINT_MAX, LLONG_MAX, ULLONG_MAX. 2018-05-12 18:58:59 +02:00
8adbf081af Demo: Renamed "fixed overlay" to "simple overlay" because it's not fixed any more! 2018-05-12 18:07:22 +02:00
a7a1b3b0a7 Demo: Added demo for DragScalar(), InputScalar(), SliderScalar(). (#643) 2018-05-12 17:53:34 +02:00
7475c1e7dd Data types: DragScalar: Fixed speed of integer values tweaking with keyboard/gamepad when speed < 1. Enforce min/max bounds when power curves are used. SliderScalar: Fixed integer/slow tweaking. (#643) 2018-05-12 17:39:34 +02:00
fc7fc83f9e Data types: DragScalar, InputScalar: default parameters. Added IM_STATIC_ASSERT(). Comments. 2018-05-11 19:27:27 +02:00
0dc18a6ca6 Documentation tweaks, comments 2018-05-11 16:54:50 +02:00
8149408408 Merge branch 'data_types'
# Conflicts:
#	CHANGELOG.txt
#	imgui.cpp
2018-05-11 16:48:50 +02:00
14f575ff76 Scrolling: Fixed a case where using SetScrollHere(1.0f) at the bottom of a window on the same frame the window height has been growing would have the scroll clamped using the previous height. (#1804) 2018-05-10 14:31:04 +02:00
91e39e72a3 Combo: Horizontally offset items using WindowPadding instead of Indent, for consistency. 2018-05-09 23:12:35 +02:00
773d484009 Internals: Made ContentsRegionRect absolute to reduce confusion. Renamed InnerRect to InnerMainRect, renamed WindowRectClipper to OuterRectClipped. 2018-05-09 23:12:34 +02:00
f83f566530 Internals: Nav: Extracted code into a NavClampToVisibleAreaForMoveDir() + fix debug code + inline some functions, removed obsolete EndChild() comment. 2018-05-09 21:48:03 +02:00
39f4761ff7 TODO list update + Changelog and comments for #1803. 2018-05-09 15:48:33 +02:00
895647a240 Fixed clipboard paste memory leak in SDL examples. (#1803) 2018-05-09 15:48:33 +02:00
4cabf599c4 Data types: Fix format srtings with leading blanks. Fix ColorEdit4() to not use obsolete formats (when using IMGUI_DISABLE_OBSOLETE_FUNCTIONS) (#643) 2018-05-08 23:41:46 +02:00
ad2927888b Apply fix from data_types branch, some widgets broken when format string doesn't contains a %. Broken by 92f0165f85. Data_types branch fix c5fb929555. 2018-05-08 20:07:25 +02:00
5f464877ed Internals: Declaring DragBehavior, SliderBehavior in there (no warantee given) as they may be useful to custom widgets. 2018-05-08 19:52:56 +02:00
8da0d42ef2 Moved DragScalar, InputScalar, SliderScalar to imgui.h as well as ImGuiDataType (#320, #643, #708, #1011) 2018-05-08 19:52:55 +02:00
c5fb929555 Data types: Fixed empty format string (or no % specifier) breaking the parsing back of values. 2018-05-08 19:52:55 +02:00
280c05e4f8 Fix to allow compiling in unity builds where stb_rectpack/stb_truetype may be already included in the same compilation unit. 2018-05-08 11:02:38 +02:00
f13f10e725 Settings: Comments (#923, #993) 2018-05-07 22:37:10 +02:00
0bf43b3a1b Settings: Added LoadIniSettingsFromDisk(), LoadIniSettingsFromMemory(), SaveIniSettingsToDisk(), SaveIniSettingsToMemory(), io.WantSaveIniSettings. (#923, #993) 2018-05-07 22:18:45 +02:00
023cc25c7c Internals: Removed unnecessary allocation indirection for g.LogClipboard (this only made sense when there was a global context instance) 2018-05-07 22:15:25 +02:00
35e74c72ab imgui_freetype: skip missing glyphs as well to match our stb loader (#1671, #1703) 2018-05-07 20:32:17 +02:00
6eda9ed3fb Skip missing font glyphs V2 revert changes to stb_truetype.h ( 2018-05-07 19:57:53 +02:00
787a475650 Skip missing font glyphs to 1) avoid using space for missing glyphs and 2) allow merging fonts with overlapping ranges. Demo: Fixed displaying ? instead of greyed out empty box. (#1671, #1703) 2018-05-07 18:03:00 +02:00
807c4f0ea4 Ran a spell checker for sanity. 2018-05-07 14:44:35 +02:00
4310bad32a Examples: DirectX9: Comments, updated changelog, notes about usage of imconfig.h (#1790, #1687) 2018-05-07 11:52:48 +02:00
d0051ce5cb add renderstate D3DRS_SHADEMODE for Dx9 impl
add backuping transform for Dx9 impl
(#1790, #1687)
2018-05-07 11:52:48 +02:00
3e8087458d SliderScalar, VSliderScalar(): Support for any data types. Tested with various ranges/limits. Note that Drag/Slider/Input currently fail if the format string doesn't preview the actual value. Will fix next. (#320, #643, #708, #1011) 2018-05-04 20:55:51 +02:00
944f414cc6 Internals: A few selected math helpers are now using template to handle all supported types. Added ImPow() to wrap float/double in a standard manner without calling pow(double) when not needed in Drag code. 2018-05-04 18:14:59 +02:00
f4c16fbb99 Internals: Data types: Made format string optional. DragBehavior: Moved a bit of code outside of the template. Slider tidying up. Removed unnecessary call to fabsf(). 2018-05-04 17:57:47 +02:00
dcd26f1295 DragFloat, DragInt: Default format string is none is passed to the function. Fixed demo using old style %.0f. 2018-05-04 16:41:48 +02:00
dbe16b6a70 Made IMGUI_DISABLE_OBSOLETE_FUNCTIONS exceptionally not affect the layout of ImGuiIO. (#1695) 2018-05-04 14:55:38 +02:00
f47c756755 Internals: Missing const, some renaming. Tweak legacy fast path. 2018-05-03 22:12:55 +02:00
0699ae161f DragInt, DragScalar: Actually made the fast-past handle the now-most-common case.. 2018-05-03 21:49:38 +02:00
7640439747 DragInt: Patch old format strings to replace %f by %d when using the DragInt() entry point. (#320, #643, #708, #1011) 2018-05-03 21:35:04 +02:00
17d3c6305e Ran a spell checker for sanity. 2018-05-03 21:11:53 +02:00
069b284f17 Internals: Tidying up internal helpers. Fixed a case ImParseFormatTrimDecorations() can return an off by one (out of bound) pointer if the format string is invalid. Extracted ImParseFormatFindEnd() out of TrimDecorations so we can use it to find the format type and replace the %f in old Int apis. 2018-05-03 20:22:29 +02:00
086c3925c4 Internals: Fixed DragInt* default format string. InputScalar(), InputScalarN(), removed InputFloatN(), InputInt(). Note that DragInt2/3/4 will %f format strings will currently be broken. (#320, #643, #708, #1011) 2018-05-03 19:42:35 +02:00
6c932479f2 Internal: DragScalar(), InputScalar() now support signed/unsigned, 32/64 bits, float/double data types. (#320, #643, #708, #1011) 2018-05-03 17:34:38 +02:00
93b8580a8d Internals: DragFloat: Fixed power handling. Use an temporary accumulator and no absolute values so we will be able to manipulate double as well as 64-bit integers. (#1011, #708, #320) 2018-05-03 17:34:33 +02:00
3f04fd0644 Internals: DragFloat: Removed DragSpeedScaleFast/DragSpeedScaleSlow since it's not yet usable and Nav version doesn't have an equivalent. 2018-05-03 17:34:29 +02:00
4780ac1ca4 Internals: Data types: Added s64, u64 data types. Added support in InputScalar(). Removed internal.h InputScalarEx() to InputScalar(). Removed cheap-relative-operators support in recently added U32 data path, since this is heading toward being legacy code. + Fixed InputDouble parsing code. (#1011, #320, #708) 2018-05-03 17:34:22 +02:00
d9fa1f869e Comments about using "power curves". Demo tweaks. (#648) 2018-05-03 17:34:15 +02:00
8a370f6491 SliderFloat: Fixed grab size and steps with %g format. (#642, #1301) 2018-05-03 17:34:09 +02:00
10e3f17235 DragFloat/SliderFloat internal InputScalar trim leading/trailing spaces emitted from the format string when presenting an edit box to the user. (#648)
Follow up to 6881d065b8
2018-05-03 17:34:02 +02:00
a62f195e83 Internals: Renamed IsCharIsSpace() to IsCharIsBlank*() to match standard terminlogy and added ascii/u16 variations. 2018-05-03 17:33:55 +02:00
ef05141a06 Internals: InputScalarEx: Tweak internals so there is a fast path for the simple case.
(in particular because it makes it clear what the extra code is for, so people tempted to create their own InputText data transform/handler understand how little is actually needed)
2018-04-30 20:12:14 +02:00
ed756d474e Internals: Added ImGuiDataType_Uint32 data type which is usable with InputScalarEx(). 2018-04-30 20:02:33 +02:00
7df985bc5c Nav: Fixed hovering a Selectable() with the mouse so that it update the navigation cursor. Fixed c8b9b2c6 which was incorrect (#787) 2018-04-30 19:40:25 +02:00
a1da7f9860 Internals: Tweaked ParseFormatPrecision(), clarified its more limited purpose, allowing 2-digits precisions since it makes (some) sense for doubles. (#648) 2018-04-30 16:52:16 +02:00
92f0165f85 DragFloat, SliderFloat: Rounding scalar using the provided format string instead of parsed precision. (#648) 2018-04-30 16:44:57 +02:00
6881d065b8 DragFloat/SliderFloat internal InputScalar trip trailing decoration off the format string when presenting an edit box to the user. (#648) 2018-04-30 15:59:59 +02:00
d7e24416dd DragFloat/SliderFloat internal InputScalar relies on the user supplied format string to format and parse value. (#648)
The trailing text after the format will be displayed in the InputText but not affect back parsing. Ideally we can try to strip it later.
2018-04-30 15:21:51 +02:00
429f48bb4f Clarified usage of ListBoxHeader() before we rename those functions + fixed demo code that didn't honor it correctly. (#1783) 2018-04-29 12:20:22 +02:00
f2e9dddeca DragDrop: Removed const qualifier from ImGuiPayload 's void* data, easing casting on user side. 2018-04-28 10:43:15 +02:00
d317951b37 Demo: Fixed demo from using obsolete functions. 2018-04-28 10:33:48 +02:00
f80314754c InputFloat,InputFloat2,InputFloat3,InputFloat4: Added variations taking a more flexible and consistent optional "const char* format" parameter instead of "int decimal_precision". This allow using custom formats to display values in scientific notation, and is generally more consistent with other API. Obsoleted functions using the optional "int decimal_precision" parameter. (#648) 2018-04-28 00:11:40 +02:00
73445ff248 Renamed all "display_format" arguments to "format" to emphasis that they also affect rounding of values. (#648, #642) 2018-04-27 23:44:27 +02:00
8a38271a7c SliderFloat, DragFloat: Fix to allow input of scientific notation when Ctrl+Clicking a slider or drag, matching the change done in c19b2781 for InputFloat(). (#648, #1011) 2018-04-27 23:18:28 +02:00
066550de68 DragFloat, DragInt: Cancel mouse tweak when current value is initially past the min/max boundaries and mouse is pushing in the same direction (keyboard/gamepad version already did this). 2018-04-27 19:15:25 +02:00
a84aff1875 Internals: DragBehavior: tweaks internals. 2018-04-27 18:22:10 +02:00
1d99b5f963 Internals: Reordered parameters of DataTypeFormatString() internal helper functions and shallow tweaks. 2018-04-27 18:19:59 +02:00
101f9b42b7 InputText: Fixed returning true when edition is cancelled with Esc and the current buffer matches the initial value. 2018-04-27 17:32:03 +02:00
28edece04f Comments, minor tweaks 2018-04-27 17:32:03 +02:00
f8c9c33d33 Fixed static analyzers warnings with bool literals (#1775)
* Use `false` instead of `0` for a bool literal.
* Simplify calls to RadioButton to not need bool literals.
2018-04-26 09:51:46 +02:00
27ac9f4761 Comments (#1695) 2018-04-25 22:16:16 +02:00
eb1c36fdfb Added IMGUI_CHECKVERSION() macro to compare version string and data structure sizes in order to catch issues with mismatching compilation unit settings. (#1695, #1769) 2018-04-25 22:07:14 +02:00
711a63befc Misc: Stop moving window if mouse position becomes invalid. Flagged menus are _NoMove for sanity. 2018-04-25 17:58:54 +02:00
d317d90610 Misc: NavCalcPreferredRefPos selects between mouse and nav reference position + added sanity assert (merged from viewport branch to minimize branch drift). 2018-04-25 17:58:54 +02:00
9cbca8c127 Begin: Shuffled some code, _should_ have no side-effect. Clear NextWindowData in one call and more consistently. (merged from viewport branch to minimize branch drift). 2018-04-25 17:58:54 +02:00
e3453d0dc4 Misc: Comments and shallow/small changes (merged from viewport branch to minimize branch drift). 2018-04-25 17:58:53 +02:00
b28535d1da ImGuiTextBuffer::appendfv needs to va_end the args_copy. 2018-04-25 17:40:39 +02:00
01fa934222 Internals: Removed unecessary Pos/PosFloat separation, only reason appears to be mostly pre-1.0. The only piece of code that I expected sub-pixel window position to matter actually already round its delta (wrongly so, will fix later/separately if we want). 2018-04-25 15:24:26 +02:00
7ebdadf92b Fix various typos. 2018-04-25 09:40:14 +02:00
46698c96c5 Removed presumably obsolete MovingWindow tests which prevent move/merge logic in viewport branch from working in all situations (e.g. docking away when ActiveId is the ID of a tab) 2018-04-24 16:48:26 +02:00
dc03c93164 Internals: Removed misleading ImRect::FixInverted + fix minor formatting in Readme.
Demo: Fixed Overlay: Added a context menu item to enable freely moving the window.
2018-04-24 14:19:10 +02:00
7b6b7038c5 Window: Relaxed the internal stack size checker to allow Push/Begin/Pop/.../End patterns to be used with PushStyleColor, PushStyleVar, PushFont without causing a false positive assert. (#1767) 2018-04-23 17:58:49 +02:00
22773e03a2 InputText: On Mac OS X, support Cmd+Shift+Z for Redo. Cmd+Y is also supported as major apps seems to default to support both. (#1765) 2018-04-23 11:15:13 +02:00
e2f831c80e InputText: tweaks, minor refactoring, renaming + comments (#1695) 2018-04-23 11:09:16 +02:00
037d5a7e98 Columns: Fixed a bug introduced in 1.51 where columns would affect the contents size of their container, often creating feedback loops when ImGuiWindowFlags_AlwaysAutoResize was used. (#1760) 2018-04-20 16:03:21 +02:00
49a451d247 Window: Fixed windows using the ImGuiWindowFlags_NoSavedSettings flag from not using the same default position as other windows. (#1760) 2018-04-20 15:40:12 +02:00
f93dce9513 InputText: Tweak to make the if statement more readable + update Changelog (#1747) 2018-04-19 16:21:32 +02:00
1554d97492 on OSX, ignore text input when CMD key is down 2018-04-19 16:17:57 +02:00
6beafe555c Update issue template so that removing the carriage return doesn't merge the user's text with the list/bullet item. 2018-04-19 14:47:29 +02:00
f5700f238d Documentations for Github users. Metrics: Fixed display of NavRectRel, added display of ParentWindow. 2018-04-19 11:08:20 +02:00
bcac02809f Examples: Allegro 5: Renamed bindings from imgui_impl_a5.cpp to imgui_impl_allegro5.cpp. 2018-04-18 21:55:12 +02:00
3913297384 Examples: Allegro 5: Added support for 32-bit indices setup via defining ImDrawIdx, to avoid an unecessary conversion (Allegro 5 doesn't support 16-bit indices). 2018-04-18 21:51:14 +02:00
6d6f4a85f6 Fixed DisplaySafeAreaPadding not affecting popups/tooltips/menus at it should have (partly broken in 2e5577f44f). 2018-04-18 17:40:38 +02:00
6a0b2627ad BeginMainMenuBar: Followup to 1e41bad9. Removed public window flag. DisplaySafeAreaPadding defaults to (3,3) instead of (4.4). Comments, tab to spaces, Changelog. (#1439) 2018-04-18 17:37:35 +02:00
1e41bad90f Added DisplaySafeAreaPadding to MainMenuBar height and fixed starting x position. Fixes main menu bar problems with TVs. (#1439) 2018-04-18 15:13:09 +02:00
7241dc61d4 Fixed default proportional item width lagging by one frame on resize + miscellaneous minor tweaks. 2018-04-17 23:36:59 +02:00
83d97d4a9b Fix typos KeyDown => KeysDown 2018-04-14 10:28:10 +02:00
d1c16d4ccd Documentation bits. Misc comments. 2018-04-13 22:23:34 +02:00
58fd8ea303 Fix minor error in doc
Not a big deal.
2018-04-12 13:18:26 +02:00
d1d2bbf86a Internals: Popup: Moved popup/menu/tooltip positioning code (viewport branch needs it organized in a different manner, so we are pushing the bulk of it here to minimize differences). 2018-04-11 17:01:19 +02:00
bfc0efaae9 Internals: Window: Aggregating ImDrawList into the ImGuiWindow structure. 2018-04-11 12:43:38 +02:00
84fe711bdf Settings: Fixed saving an empty .ini file if CreateContext/DestroyContext are called without a single call to NewFrame(). (#1741) 2018-04-11 10:08:23 +02:00
296f03374b NewFrame: Prevent division by zero in frame rate calculation if io.DeltaTime is continuously zero. (#1740, #881) 2018-04-10 23:48:27 +02:00
928a4ad315 Begin: moved tooltip position code in an else block. Misc comments 2018-04-10 16:51:16 +02:00
52cac135c9 Internals: Renamed GetFrontMostModalRootWindow() to GetFrontMostPopupModal() and exposed in imgui_internal.h (#1738) 2018-04-10 15:04:36 +02:00
9117632bf0 Misc: IM_DELETE() helper function added in 1.60 doesn't clear the input _pointer_ reference, more consistent with expectation and allows passing r-value. 2018-04-09 20:42:49 +02:00
660c157880 Examples: Added missing calls for ::DestroyWindow, glfwDestroyWindow() + fix old comments. 2018-04-09 19:16:47 +02:00
6f1f5cbc20 Version 1.61 WIP 2018-04-09 14:02:32 +02:00
dd079fe6e6 Version 1.60 (missed the string). Will retag. 2018-04-09 13:52:24 +02:00
54fca1d1b8 Fixed erroneous call to io.Fonts->ClearInputData() + ClearTexData() that was left in DX10 example but removed in 1.47 (Nov 2015) in every other back-ends. (fixes 6cee2fca94) (#1733, ~#1731) + assert 2018-04-09 13:13:06 +02:00
8acda84202 Nav: Fixed comment. (#1599) 2018-04-08 12:27:11 +02:00
3a29ddbcfa Version 1.60 2018-04-08 00:45:02 +02:00
6d0c720451 Internals: Removed unused internal variant of ArrowButton(). 2018-04-07 23:06:06 +02:00
82b7a39f31 Fixed a few zealous warnings. 2018-04-07 10:38:01 +02:00
c712f7275d Fixed unused variable warning. 2018-04-07 10:25:51 +02:00
c2fc978983 Style: Default style is now StyleColorsDark()! Toward a 1.60 release :) (#707) 2018-04-06 23:25:25 +02:00
0734a12d25 IO: ImGuiConfigFlags_NoMouse disable hovering so it is not destructive. Amend 2464e62a1a 2018-04-06 23:05:53 +02:00
e88fb10d7c NewFrame: Extract some code into a NewFrameUpdateHoveredWindowAndCaptureFlags() which can be of use with touch-based inputs systems. 2018-04-06 19:36:15 +02:00
c1bdab6d5b Comments about io.WantCapture flags + todo entries. 2018-04-06 19:36:14 +02:00
ac2027c415 NewFrame: Extract some code into a NewFrameUpdateMouseInputs function. Moved settings saving higher up in the function so it is next to its peers. 2018-04-06 19:36:14 +02:00
2464e62a1a IO: Added ImGuiConfigFlags_NoMouse to force clear/disable mouse inputs in NewFrame(). 2018-04-06 19:36:13 +02:00
72b7f48870 Renamed ImGuiConfigFlags_NoSetMouseCursor to ImGuiConfigFlags_NoMouseCursorChange. Followup to 75c3793db5 two weeks ago. (#787, #1495, #1202) + comments 2018-04-06 18:12:21 +02:00
18a243bef0 Columns: Fixed calling Columns() again with the same number of columns. (#125) 2018-04-06 17:50:50 +02:00
5f4001a811 Contribution guidelines 2018-04-04 20:48:49 +02:00
fc30462f18 Hide new windows for one frame until they calculate their size. Also fixes SetNextWindowPos() given a non-zero pivot. (#1694) 2018-04-04 19:35:08 +02:00
5aa3f99b4c Internal: using more consistent comparaison with HiddenFrames to not imply it could be -1. Tweaked comments. 2018-04-04 17:21:36 +02:00
4649967112 Added extra comments and assertions to avoid user combining ImGuiCond flags. (#1694) 2018-04-04 15:01:01 +02:00
cd1e6e384f Tooltip windows uses PopupBorderSize (#1697) + commented out debug stuff. 2018-04-04 12:39:48 +02:00
2fa113c895 README.md: add link to Gallery Part 6 2018-04-04 00:09:35 +02:00
1e116e6c17 Removed need for -Wnocast-qual on modern Clang/Xcode as a token of good behavior. Unfortunately the old stb_ decompress code is a little const clunky. + warning fix in stb_textedit which is already in master afaik. 2018-04-03 23:18:43 +02:00
84fbc49403 BeginChild: named child don't include the full id inside their name (#1698) 2018-04-03 22:13:35 +02:00
78610a54d2 Fixed Clang zealous cast-call warning (on par with GCC) which decided to warn against explicit C-style casts now. 2018-04-03 20:55:30 +02:00
77e234d9df Comments 2018-04-03 20:22:44 +02:00
c461401b21 Comments, FAQ 2018-04-03 20:05:59 +02:00
664ab85f76 Examples: Tweak comments. (#1704, #1708). 2018-04-02 17:31:51 +02:00
ca39070ca0 Examples: Win32: Fixes for MingW which doesn't support a 2007 define? I have no idea why people still use MingW (#1704, #1463) 2018-03-28 23:32:02 +02:00
cc96477b1c Comments (#1695) 2018-03-25 14:45:40 +02:00
cd602b8832 Examples: SDL: Note about SDL breaking the IME under Windows (I can't seem a way SDL2 Windows IME implementation can possibly work, the functions are never called/referenced). 2018-03-23 12:03:57 +01:00
b69dc45f6e Internals: Removed ImGuiDataType_Float2. 2018-03-22 20:14:31 +01:00
c19b27813d Added InputDouble() function. We use a format string instead of a decimal_precision parameter to also for "%e" and variants. (#1011) May transition the other InputXXX function to use format strings as well. 2018-03-22 18:58:40 +01:00
c796960ff9 InputFloat: Scientific input. InputText: Added ImGuiInputTextFlags_CharsScientific to add 'e' 'E' to list of characters that can be input. (later useful for #1011) 2018-03-22 17:49:53 +01:00
21ac470a8a Nav: Fixed a crash with IMGUI_DEBUG_NAV_SCORING enabled + added info to Metrics. 2018-03-22 16:37:21 +01:00
94116f1143 Examples: GLFW: Don't alter cursor mode if GLFW_CURSOR input mode is GLFW_CURSOR_DISABLED. (#1202) [@PhilCK] 2018-03-20 22:41:05 +01:00
75c3793db5 IO: Added ImGuiConfigFlags_NoSetMouseCursors. Added ImGuiBackendFlags_HasMouseCursors, ImGuiBackendFlags_HasSetMousePos. (#787, #1495, #1202) 2018-03-20 21:19:23 +01:00
dcf7c3d188 Added ImGuiBackendFlags for backend to expose its capabilities. Added ImGuiBackendFlags_HasGamepad. (#787, #1542) 2018-03-20 20:39:44 +01:00
170f44e6f0 IO: Renamed io.WantMoveMouse to io.WantSetMousePos (was added in 1.52, _not_ used by core and only honored by some binding ahead of merging the Nav branch) + internal renaming (#787) 2018-03-20 20:12:34 +01:00
fe5347ef94 imconfig: Added IMGUI_STB_TRUETYPE_FILENAME, IMGUI_STB_RECT_PACK_FILENAME + documenting IMGUI_DISABLE_STB_XXX flags and hiding IMGUI_STB_NAMESPACE which is misleading.
Fixed typos in todo list.
2018-03-20 18:25:37 +01:00
74b7dce394 Examples: Renamed applications to emphasis on use of GLFW as a platform framework + minor local tweaks 2018-03-20 16:00:59 +01:00
70d500502a ImVector: Fixed insert() helper using the = operator (followup to be consistent with 4186c2c2b1) 2018-03-20 11:35:10 +01:00
d1c45db9e8 Fixed enum typo. 2018-03-19 22:47:10 +01:00
4485e56e02 Examples: Vulkan: Fix missing subpass dependency
Without a dependency between pWaitDstStageMask (COLOR_ATTACHMENT_OUTPUT)
and the render-pass, the UNDEFINED -> COLOR_ATTACHMENT_OPTIMAL transition
might happen before the image is ready to be used.
2018-03-19 16:48:03 +01:00
a73f6d06e0 Examples: Vulkan: Using VK_PRESENT_MODE_MAILBOX_KHR. Disable IMGUI_UNLIMITED_FRAME_RATE by default. Fixed warnings. (#1042) 2018-03-19 16:47:28 +01:00
166411287f Demo: Added more complete Combo demo. (#1658) 2018-03-19 14:44:37 +01:00
62e94717eb Nav: InputText: Allow editing text input fields with NavActivate (space). Not sure about that, on one hand it feels more consistent but you can't finish the editing with space to double space (activate + input space) could feel inconsistent. (#787) 2018-03-19 13:20:25 +01:00
33ad8b2f0c Nav: Track nav input source more generally (gamepad vs keyboard) (#787) + update todos and demo tweaks 2018-03-19 13:20:18 +01:00
d8d93f6360 imgui.h: Various comments and tweaks. 2018-03-18 12:24:28 +01:00
6fe22e6297 imgui.h: Moved columns lower in the file. Various spacing changes and minor comments. 2018-03-18 12:23:33 +01:00
6bda816ffe ImVector: Added copy/assign operators as helpers to ease cloning of data. 2018-03-17 21:18:14 +01:00
1e296453ef ImDrawList: Added Clone() helper function. 2018-03-17 21:18:14 +01:00
4186c2c2b1 ImVector: resize() / push_back() use memcpy() as we are not supposed to be constructor/destructor/operator aware at all. (If we do need to rework ImVector). In turn this will allow us to define assign/copy operators. 2018-03-17 20:42:56 +01:00
d68be086b2 ImVector: Using value_type consistently. Spacing. 2018-03-17 18:08:12 +01:00
533c86a7a3 Update TODO list, minor fix in Readme, comments, Clang -Weverything warning fix in imgui_draw.cpp under Windows. 2018-03-17 17:29:58 +01:00
0e3a6ef4f7 Moved IM_NEW, IM_DELETE helpers to imgui.h for convenient use by back-ends and user code. 2018-03-13 16:18:40 +01:00
7b833dabc8 ImVector: Spacing, assert tweaks 2018-03-13 16:18:40 +01:00
26296bb4c1 Misc: Fix 111ea7af77, GetStyleColorName() would assert, removed removed ImGuiCol defines (too much risk/complexity trying to silently ignore it). 2018-03-13 11:53:12 +01:00
f93a22ae6e Contributing: tweaks, mention screenshots more prominently. 2018-03-13 11:47:57 +01:00
111ea7af77 Misc comments, todos + reintroduced removed ImGuiCol defines under !IMGUI_DISABLE_OBSOLETE_FUNCTIONS wrap. 2018-03-12 17:24:15 +01:00
37cb177745 Examples: Vulkan: Only resize swap chain and framebuffer once. (#1042) 2018-03-12 14:47:41 +01:00
1c18d65313 Examples: Renamed glfw error callback for clarity. 2018-03-12 14:43:37 +01:00
b2453d7e8f Fixed resize window validation errors with removing frame prerender once and present last but one frame functionality. Frame rate is still similar. 2018-03-12 14:34:36 +01:00
887712a6f1 Updated templates, added pull request template. 2018-03-12 14:20:39 +01:00
e7670c0bcc Style: CloseButton() now display a proper cross. Using Button colors for background. Removed ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered as the closing cross uses regular button colors now. (#707) 2018-03-12 11:48:04 +01:00
b9ac127b0b Internals: Columns renaming fields 2018-03-12 11:03:27 +01:00
1f6ad7a894 ImFont: Added FindGlyphNoFallback. Fixed MergeMode broken by 1ef1acbd8d 2018-03-10 10:33:12 +01:00
351b3fa7b0 Updated Changelog following merge of #1619 + fixed entry added to wrong version Changelog in 1ef1acbd8d 2018-03-09 10:29:41 +01:00
5fdde52444 Merge branch '2018-03-font_offset' into master2 2018-03-09 10:29:22 +01:00
a3d5f92214 Merge branch 'master' into font_offset 2018-03-08 16:49:39 +01:00
1ef1acbd8d Font: Fixed MergeMode adding duplicate glyphs data instead of reusing existing (broken by 072d6d8cb5) 2018-03-08 16:47:41 +01:00
3dfac93ebe Fonts: Fixed debug name not being zero-terminated if longer than storage buffer + made buffer slightly longer as well. 2018-03-08 15:58:56 +01:00
642c6748ac Comments, Changelog 2018-03-08 11:15:27 +01:00
a1f3949d71 Drag and Drop: Increased payload data type to 32 characters. (#143) 2018-03-08 10:42:51 +01:00
7fd62baa42 Examples: Added Makefile for SDL+OpenGL2 example. (#1668) 2018-03-07 11:50:56 +01:00
6190d794d4 Update README.md 2018-03-07 10:01:20 +01:00
a2ed3ee2cf Examples: OpenGL3: Added a way to override the glsl version number through the Init call. (#1667, #1466) 2018-03-06 19:48:30 +01:00
cea7492bab Render: Removed the code that disable render if style.Alpha is 0.0f, it is both incorrect (as style Alpha can be modified mid-frame), not really necessary (just tested that full Alpha = 0 will lead to empty draw lists!) and misleading (bulk of the work was already done). 2018-03-05 22:47:53 +01:00
945f4d1ecd Removed redundant semi colons. (#1653) 2018-03-05 16:16:27 +01:00
51afaf7117 Fixed type cast warning. 2018-03-05 13:15:15 +01:00
0ec356eb6e Comments, FAQ update. 2018-03-05 13:05:47 +01:00
5ed45d0aec Columns: Fixed destructive small resize. (#1656). The OffsetNorm clamp introduced by #913 was ok as it didn't write back into the storage, which #1499 started doing making it destructive. Right now I don't think the clamp is needed at all. It had uses (eg: hide the issue fixed by bf7481eba0). 2018-03-04 17:55:59 +01:00
bf7481eba0 Columns: Extent stop at the right-most clipped pixel. The right-most column might appear a little wider but it's usable space matches the others. (#125). +9 Internal: Store InnerClipRect. 2018-03-04 17:44:17 +01:00
968a8d2a3f Columns: Clamping MaxX above MinX. This shouldn't have much of a benefit / affect, but the internal values are more sane this way. (#125) 2018-03-04 16:58:24 +01:00
ee770af72c Columns: Adding per-window display in Metrics. Tidying up, removing old code/comments. (#125, #1499, #1656) 2018-03-04 16:56:21 +01:00
69e700f869 Renamed ImGuiStyleVar_Count_ to ImGuiStyleVar_COUNT for consistency with other enums. Added 2018-03-03 20:15:10 +01:00
8a4093f38b Added ArrowButton(). Exposed ImGuiDir. 2018-03-03 20:08:03 +01:00
1549c5cf5e BeginCombo(): Added ImGuiComboFlags_NoArrowButton and ImGuiComboFlags_NoPreview flags + hover color matches drag and sliders. 2018-03-03 19:43:31 +01:00
ad7ff7504e Merge branch 'patch-1' of https://github.com/stfx/imgui into stfx-patch-1 2018-03-03 19:34:47 +01:00
839cdd37a3 Combo: Arrow button isn't displayed over frame color, so color is consistent with other button + the button doesn't have inner rounding. 2018-03-03 19:23:48 +01:00
11f13ab24f Internal: renamed RenderTriangle() to RenderArrow(). 2018-03-03 19:08:22 +01:00
df8a9c49eb Allow user to override ImTextureId. (#1641) 2018-03-01 16:29:32 +01:00
b37ef20c5c Makefile: updated sdl_opengl3_example with all changes from #885. 2018-03-01 15:54:12 +01:00
124d8522b1 Do not store compiled objects outside the project tree. 2018-03-01 15:50:39 +01:00
b6f251103b Define SOURCES instead of OBJS in Makefiles.
OBJS is still deduced from SOURCES, but this change gives better control
over where the object files get actually written.
2018-03-01 15:46:43 +01:00
d4f63c3844 Use make variables $@ and $^ where appropriate. 2018-03-01 15:45:34 +01:00
551932697d Ensure make clean is idempotent.
Prior to this, `make clean` would fail if the project was not already
fully built, and a second invokation would always fail.
2018-03-01 15:45:23 +01:00
6797ee4b68 Nav: Added links to PNG/PSD files for PS4 and Switch. Fixed suggested Joy-con mapping as per typical Nintendo-style mapping. (#787) 2018-03-01 13:03:12 +01:00
c994796e26 Internal: Moved IM_NEWLINE helper to imgui_internal.h 2018-02-28 21:45:02 +01:00
b3594a6407 Added ImGuiConfigFlags_IsSRGB, ImGuiConfigFlags_IsTouchScreen (strictly for user storage) 2018-02-28 21:16:47 +01:00
2c9f45bbe7 Renamed ImGuiNavFlags io.NavFlags to ImGuiConfigFlags io.ConfigFlags. (#787) 2018-02-28 18:51:40 +01:00
a869e944b0 README.md typo fix 2018-02-26 17:43:41 +01:00
c7835dd189 ImRect: Removed misleading IsFinite() function used by some Nav code. 2018-02-26 16:35:46 +01:00
5427eca960 Compacted some old Breaking Changes notes (Pre July 2015 stuff) 2018-02-25 19:05:31 +01:00
bd267ad739 Changelog: Added all change infos since 1.53 up to the current version. 2018-02-25 14:15:38 +01:00
133f06d658 Changelog: Added Changelog with info from 1.48 to 1.53. Haven't added 1.53..current yet. 2018-02-25 14:15:37 +01:00
27667fc035 TreeNode: Renamed Beta ImGuiTreeNodeFlags_NavCloseFromChild to ImGuiTreeNodeFlags_NavLeftJumpsBackHere. (#1079) 2018-02-25 14:15:37 +01:00
403b2d7d59 ImDrawList: Better looking non-AA rectangle (lower-right corner and rounding). (#1646) 2018-02-25 14:15:37 +01:00
d7f97922b8 Examples: Fix d749d49903 missing the deletion code. (#1217) 2018-02-23 22:46:14 +01:00
d749d49903 Examples: OpenGL3: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context. (#1217) 2018-02-23 12:37:49 +01:00
6662fe7b18 stb_truetype: Fixed unused variable warnings for configuration where asserts are disabled. (#1642) 2018-02-23 11:07:51 +01:00
79969931e6 ImDrawList: PushTextureID(): Removed unnecessary param by reference. 2018-02-23 00:01:34 +01:00
288351a801 Examples: DirectX12: Tweaked assertion to more accurately represent what it wants to say. (#301) 2018-02-23 00:00:43 +01:00
a1a36e762e Merge branch 'podgorskiy-master' 2018-02-22 23:24:44 +01:00
8040cf1425 Merge branch 'master' of https://github.com/podgorskiy/imgui into podgorskiy-master 2018-02-22 23:22:16 +01:00
63be3e7c82 Update README.txt 2018-02-22 23:20:37 +01:00
7e24ce0956 Examples: DirectX12: Fixed shutdown issue. (#301) 2018-02-22 23:04:28 +01:00
9be7d048c8 Examples: DirectX12: Merge, various styling tweaks, update for 1.60 wip, synchronized Win32 features with other examples. (#301) 2018-02-22 23:03:47 +01:00
913f3692a2 Examples: DirectX12: Removed from current solution which is meant to be VS2010 compatible for now (will change soon). 2018-02-22 22:38:22 +01:00
0d063585e8 Merge branch 'jdm3_master' 2018-02-22 17:04:15 +01:00
94466745bb A tiny optimization to ImLineClosestPoint. Removed unnecessary sqrtf call.
ab_lenSqr -> ab_len_sqr
Moved line where ab_len_sqr is computed after the first return
2018-02-22 10:57:20 -05:00
b28995b667 Nav: Internals: Exposed NavMoveRequestCancel in imgui_internal.h (#1640) 2018-02-22 15:39:49 +01:00
f43068c543 Examples: DirectX10, DirectX11: Simplified main example code. 2018-02-22 13:15:16 +01:00
493ec0bc98 Simplified .gitignore list 2018-02-21 23:13:53 +01:00
9b9d9321cf Examples: SDL: Using %SDL2_DIR% in the .vcproj instead of %SDL_DIR%, the earlier is more standard. 2018-02-21 22:46:49 +01:00
2c3c5125b3 Drag and Drop: BeginDragDropSource(): temporarily removed the optional mouse_button=0 parameter because it is really usable in typical conditions at the moment. (#143, #1637) 2018-02-21 21:33:58 +01:00
16ff9faf51 Update issue_template.md 2018-02-21 13:12:13 +01:00
9c20a40b36 Examples: OpenGL: Cast call to glPolygonMode(). (#1628). 2018-02-20 15:49:17 +01:00
201408a119 Update .travis.yml 2018-02-20 15:12:17 +01:00
32bbd8be96 Update .travis.yml 2018-02-20 15:07:34 +01:00
3186acdf8c Trying to download and build GLFW since APT repository are unreliable 2018-02-20 14:56:43 +01:00
98c2ca557c Update .travis.yml PPA source for glfw in the end of getting a newer version of GLFW 2018-02-20 14:40:12 +01:00
daddd09cd5 Examples: Mouse cursor handling comments/tweaks to homogenize. (#1495) 2018-02-20 14:23:22 +01:00
d534207622 Examples: GLFW: Added support for mouse cursors (ImGui::GetMouseCursor() value and WM_SETCURSOR message handling). (#1495) 2018-02-20 14:18:02 +01:00
11b12488e8 Examples: GLFW*: Renamed GLFW callbacks exposed in .h to not include GL2/GL3/Vulkan in their name. 2018-02-20 14:09:46 +01:00
7e2e0535dd Examples: DirectX 9,10,11: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value and WM_SETCURSOR message handling). (#1495) 2018-02-20 13:55:09 +01:00
7cbcccd96b Update Breaking Change section with moved misc/fonts/ (#1631) 2018-02-20 12:08:37 +01:00
7ee2bc8f5e FAQ about backslashes in string literal since the one in main.cpp isn't being noticed enough. (#1397) 2018-02-20 10:24:31 +01:00
b33f0e215f Initialization happens during CreateContext(), which makes it easier for platform layers to interact with the context during their initialization. 2018-02-18 23:28:56 +01:00
1399c9c8a9 Merged a bunch of small inconsequential things from my work branch, to reduce the diff noise. 2018-02-18 20:21:21 +01:00
bdb27366e7 Nav: Tweak windowing highlighting for full viewport windows. 2018-02-17 00:19:04 +01:00
f5f3730b16 Examples: GLFW+GL2/GL3: Added glPixelStorei() calls borrowed from SDL examples. 2018-02-16 23:19:38 +01:00
9e713b115f Examples: Renamed .sln file. 2018-02-16 22:38:19 +01:00
243fd67b1c Examples: Vulkan: Fix for empty draw data (init time) + fixed warning. 2018-02-16 22:37:46 +01:00
10752423ec Examples: Vulkan: Added .vcproj files. 2018-02-16 22:37:41 +01:00
31158e575f Examples: SDL: Fixed minor warning. 2018-02-16 22:37:29 +01:00
00b24f27c2 Examples: SDL: Added .vcproj files. 2018-02-16 22:37:24 +01:00
03a44acf6f Examples: SDL: Minor stylistic tweaks. Fixed handling of ImGuiMouseCursor_None so it doesn't underflow array. Fixed harmless uninitialized pointer. (#1626) 2018-02-16 19:55:16 +01:00
7c75835200 Renamed misleading ImGuiMouseCursor_Move to ImGuiMouseCursor_ResizeAll. SDL: Fixed cursor. (#1626) 2018-02-16 19:49:33 +01:00
ffb6e89f30 Use SDL system cursors in SDL examples. (#1626)
(Squashed 4 commits)
2018-02-16 19:41:27 +01:00
63332d152a Obsoleted the io.RenderDrawListsFn callback, you can call your graphics engine render function after ImGui::Render(). Use ImGui::GetDrawData() to retrieve the ImDrawData* to display..(#1599)
Examples: Updated examples.
2018-02-16 19:18:16 +01:00
0cefd40888 Examples: Added Changelog to make updates easier. 2018-02-16 17:20:18 +01:00
20c14f9589 Fixed GCC zealous warnings (#1623) 2018-02-16 15:43:28 +01:00
1cbfe0700c Plot: plot a flat line if scale_min==scale_max (#1621) 2018-02-16 14:34:49 +01:00
ff5f56dd21 Updated to stb_truetype 1.19 (include minor fix for #1622) 2018-02-16 11:59:23 +01:00
41ecebff5a Examples: SDL: Added Changelog at the top of the imgui_impl files. (#1618) 2018-02-15 11:11:31 +01:00
c433bbcd8e ImFont: stb_truetype now rounding Ascent/Descent the same way as freetype does, they seem to vertically align better this way. 2018-02-15 10:47:20 +01:00
30c469f7c5 ImFont: DisplayOffset.y defaults to 0 instead of +1. 2018-02-15 10:46:28 +01:00
6668e80bed Update README.md 2018-02-15 10:33:22 +01:00
024e23c4d7 Comments, moved ImFontAtlas::Flags to "public" area. 2018-02-14 12:04:21 +01:00
fed0a884f7 ImFontAtlas: Added ImFontAtlasFlags_NoPowerOfTwoHeight, ImFontAtlasFlags_NoMouseCursors flags. (#1613) 2018-02-14 11:58:52 +01:00
42bf6a4d03 Update .travis.yml 2018-02-14 11:33:46 +01:00
c0af35098a Update .travis.yml 2018-02-14 11:29:49 +01:00
06e823e116 Update .travis.yml 2018-02-14 11:26:08 +01:00
26d4d32d67 Travis: testing without adding external apt repositories (which frequently fails), may be unnecessary today 2018-02-14 11:20:22 +01:00
0a0142adab Update README.md 2018-02-14 11:15:14 +01:00
6bc3e7b043 ImFontAtlas: if stbtt_PackBegin() because of failing allocation we return a little more nicely. (keeps Coverity static analyzer happy!) 2018-02-13 21:57:15 +01:00
df32b60b37 Update README.md 2018-02-13 21:52:27 +01:00
1a381dcaf6 Update README.md 2018-02-13 21:13:23 +01:00
4ec931853e Demo: Fonts; Added Font Offset. 2018-02-13 21:03:30 +01:00
9263bd68db Fixed legacy forward function IsRootWindowOrAnyChildHovered() broken by a63fbbca8b 2018-02-13 21:03:30 +01:00
faa3c66154 Update README.md 2018-02-13 20:49:36 +01:00
f33440bbc2 Update README.md 2018-02-13 20:42:01 +01:00
e2aba3cf5f Update README.md 2018-02-13 20:17:34 +01:00
f44a7115ca Update README.md 2018-02-13 19:22:34 +01:00
1adeaed000 Update README.md 2018-02-13 19:09:19 +01:00
f0a3dfa0dd Added sample gif, removed section about performances (unnecessary) 2018-02-13 18:57:42 +01:00
7e603ea469 Update README.md 2018-02-13 18:14:17 +01:00
fee6022f0c Fixed warning: variable ‘L1’ set but not used [-Wunused-but-set-variable] 2018-02-13 11:17:55 +01:00
24b1c30644 Update issue_template.md 2018-02-12 22:07:05 +01:00
a265837876 Update issue_template.md 2018-02-12 21:44:22 +01:00
9b4e674688 Update issue_template.md 2018-02-12 17:19:24 +01:00
4a8871f4f9 Create issue_template.md 2018-02-12 17:17:29 +01:00
ace22168e0 Contributing guidelines for issues 2018-02-12 17:11:14 +01:00
242bf9d9e2 Create issue_template.md 2018-02-12 17:06:04 +01:00
eb1d481915 Comments (#1230, #1611) 2018-02-12 15:38:04 +01:00
d8d1da27fd Merge branch 'master' of https://github.com/RandyGaul/imgui into RandyGaul-master 2018-02-12 15:35:16 +01:00
ed9d4a2d85 stb_rect_pack: update to 0.11 (minor changes) 2018-02-12 15:30:37 +01:00
2c4a761982 __cdecl markup for non-standard calling conventions via MSVC 2018-02-12 00:50:40 -08:00
64e0666803 Internals: Moved some of NewFrame() into UpdateMovingWindow(). 2018-02-11 22:48:30 +01:00
7cc1bc7635 Added IsAnyMouseDown() helper.
Examples: DirectX9/10/11: Using IsAnyMouseDown() instead of local function.
2018-02-10 16:50:19 +01:00
febde0eb21 Update README.md 2018-02-10 15:44:46 +01:00
5641115568 Update README.md 2018-02-09 12:08:53 +01:00
f38979b266 Update README.md 2018-02-09 11:57:23 +01:00
3b163ac35b Internals: Clarified internal storage for RootWindow with specific semantic (the Docking branch will need to introduce finer differenciation there.) 2018-02-08 23:11:51 +01:00
88dcbeb7ff Styles: Comments and re-ordered. 2018-02-08 21:14:57 +01:00
8099f8c270 Comments 2018-02-06 23:19:53 +01:00
35804b4438 Update README.md 2018-02-06 21:05:49 +01:00
1d5a5ca12e README update, updated binaries, sponsors 2018-02-06 21:04:12 +01:00
2493f609ef Examples: Vulkan: Fix (something changed in GLFW not including vulkan.h, was unwillingly relying on that) 2018-02-06 20:57:33 +01:00
d17d21da1b Warning fix. (#1565) 2018-02-06 20:21:29 +01:00
7c16d52f72 Updated version to 1.60 WIP to emphasis on the addition of required calls CreateContext/DestroyContext + merged the massive Navigation branch (#1565, #787) 2018-02-06 20:20:34 +01:00
f0364aa359 Merge branch 'context'
# Conflicts:
#	examples/allegro5_example/main.cpp
#	examples/directx10_example/main.cpp
#	examples/directx11_example/main.cpp
#	examples/directx9_example/main.cpp
#	examples/marmalade_example/main.cpp
#	examples/opengl2_example/main.cpp
#	examples/opengl3_example/main.cpp
#	examples/sdl_opengl2_example/main.cpp
#	examples/sdl_opengl3_example/main.cpp
#	examples/vulkan_example/main.cpp
2018-02-06 20:16:03 +01:00
07ee539017 Merge branch 'navigation' 2018-02-06 20:13:55 +01:00
4e5b7612ae Nav: Documentation tweaks. (#787) 2018-02-06 20:10:05 +01:00
ae30efc0fd Nav: Examples: Added commented out io.NavFlags |= ImGuiNavFlags_EnableKeyboard to all examples. (#787) 2018-02-06 19:58:23 +01:00
3171f90a1a Nav: Keyboard is now automatically mapped based on io.KeyDown[]. (#787) 2018-02-06 19:54:30 +01:00
9e3a807813 Removed comments 2018-02-06 19:34:09 +01:00
057807f4a7 Added ImGuiKey_Space, mapped in every examples. Will be required for navigation. (#787) 2018-02-06 19:29:31 +01:00
7e32fc7109 Nav: Toward automatically mapping keyboard input. Renamed ImGuiNavInput_PadXXX to ImGuiNavInput_XXX. Renamed ImGuiNavInput_KeyXXX to ImGuiNavInput_KeyXXX_ (internal). (#787) 2018-02-06 19:23:12 +01:00
ed4bbc4fd4 Nav: Comments, guides. 2018-02-06 18:48:31 +01:00
cea8017e0b Merge branch 'master' into context 2018-02-06 18:04:44 +01:00
3b7bd4563a ImVec2: added [] operator. This is becoming desirable for some types of code, better added sooner than later. 2018-02-06 16:35:32 +01:00
ad09396672 ImVec2: added [] operator. This is becoming desirable for some types of code, better added sooner than later. 2018-02-06 16:32:51 +01:00
db071184a0 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2018-02-06 13:51:09 +01:00
b50dce54ea Drag and Drop: TreeNode as drop target displays rectangle over full frame. Added optional internal storage for item display rect. Will expose later. (#1597, #143) 2018-02-06 13:46:14 +01:00
c6ba7c8231 Internals: TreeNode: Renaming local to be more consistent with other widgets. 2018-02-06 13:41:46 +01:00
e6926d9f7c Internals: Refactored bool LastItemRectHovered into flags. (#1597) 2018-02-06 13:34:41 +01:00
ce2b8d3255 Nav: Comments, removed extraneous parameter. 2018-02-06 13:16:44 +01:00
0c0d811859 Nav: SetItemDefaultFocus() doesn't make the navigation cursorr highlight visible. Renamed NavInitResultExplicit to NavInitRequestFromMove. (#787) 2018-02-05 23:53:40 +01:00
4b49f03a40 Examples: SDL+GL3: Added Navigation keyboard mapping. (#787) 2018-02-05 23:16:40 +01:00
7e1496e994 Merge branch 'master' into navigation 2018-02-05 23:14:42 +01:00
fcf1c9d151 Examples: SDL: Using SDL_GetPerformanceCounter() / SDL_GetPerformanceFrequency() to handle framerate over 1000 fps properly. Noticed bad inputs artefacts in Nav branch at 2000 fps without this. (#996) 2018-02-05 23:13:53 +01:00
60fb7d31fd Examples: SDL2: Enabling vsync. Using scancode consistently, fixed keyboard weirdness. 2018-02-05 22:35:29 +01:00
73d493c780 Examples: Organized header files to make available features more visible. 2018-02-05 20:34:11 +01:00
fb9fecea5e Nav: Sliders and Drags are toggle activated instead of requiring user to cross Cross/Space. (#787) 2018-02-05 20:16:38 +01:00
4932303e62 Nav: DragBehavior: Tweaks (to take the noise out of the next commit). 2018-02-05 20:15:31 +01:00
e5e3cc617e Nav: Maintaining a NavActivatePressedId field that widget can conveniently use along with NavActivateDownId. 2018-02-05 19:37:29 +01:00
fb7cf4a475 Nav: Removed old unnecessary ifdefs. 2018-02-05 18:25:03 +01:00
f35734c925 Nav: Debugging code. (#787) 2018-02-05 17:02:30 +01:00
92ee6b1185 Nav: Sets io.WantCaptureKeyboard when navigation is active. This is a little agressive but probably the best default and also a good way to get feedback. Added ImGuiNavFlags_NoCaptureKeyboard to disable this behavior. Comments. (#787) 2018-02-05 16:07:54 +01:00
348c46d21e Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-02-05 15:50:28 +01:00
5c83b55d04 Nav: Added ImGuiWindowFlags_NoNav shortcut, comments. (#787) 2018-02-05 15:49:35 +01:00
11d0fc8220 Tooltip: BeginTooltip() sets NoInputs flag. 2018-02-05 15:10:07 +01:00
1dedbf8091 Style: Fixed missing style.MouseCursorScale initialization (#939), messed up original commit badly. 2018-02-05 15:07:25 +01:00
533fe8cb55 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-02-05 14:55:57 +01:00
8ad88f725c Nav: Minor tidying up. (#787) 2018-02-05 14:53:22 +01:00
3f297e74e4 Merging the minor/shallow changes from Navigation branch. 2018-02-05 14:52:28 +01:00
bed55a41e1 Internals: ImRect: Added IsInverted() helper. 2018-02-05 14:51:28 +01:00
2081fc15b5 Added assert in BeginChild(ImGuiId id). 2018-02-05 13:42:34 +01:00
223be68d77 Nav: Debugging stuff. 2018-02-05 13:42:33 +01:00
cf6b39600b imgui_freetype: comments about correct blending and sRGB (#618, #578) 2018-02-05 11:22:09 +01:00
a33b86dac7 Removed root .gitignore. (#1594) 2018-02-05 09:14:33 +01:00
b76cf9cc87 Merge pull request #1594 from gerryhernandez/fix-apple-example
Examples: Apple: Fix iOS code; fixes entire XCode build for Apple example
2018-02-05 09:12:51 +01:00
4786321754 Fix iOS code; fixes entire XCode build for Apple example 2018-02-04 21:47:08 -05:00
66ff820eaa Nav: Ensure g.NavScoringRectScreen is always finite and not inverted. (#787) 2018-02-04 18:30:46 +01:00
e2654a097b ImRect: added IsInverted() helper. 2018-02-04 18:30:37 +01:00
0bd15b52a6 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-02-04 13:16:13 +01:00
7b005bd7de imgui_freetype: Documentation, tweaks. (#618) 2018-02-04 13:13:06 +01:00
e9a617b22a Moved imgui_freetype from imgui_club (#618) 2018-02-04 12:35:17 +01:00
147ec8d1e2 Style Added style.MouseCursorScale, may remove (#939). 2018-02-04 12:17:35 +01:00
648de2fc00 Nav: Press Left on a child with ImGuiTreeNodeFlags_NavCloseFromChild moves you to parent node instead of closing it immediately. More standard. (#787, #1079) 2018-02-02 18:38:18 +01:00
ce9d7baaba Nav: TreeNode: Added ImGuiTreeNodeFlags_NavCloseFromChild flag, allow closing a TreeNode() from any of child. The explicit flag is not great, perhaps allowing some form of inheritance would help. (#787, #1079) 2018-02-02 17:47:05 +01:00
9120938200 Nav: Revert 5c9ea4d53a with comments. (#787) 2018-02-01 23:53:00 +01:00
6a83a9152f Natvis: Showing some flags for ImGuiWindow. 2018-02-01 23:39:23 +01:00
96ddfbc973 Nav: Modal windows can't be closed with Nav PadCancel. (#787) 2018-02-01 23:36:22 +01:00
efbd8cebe7 Nav: Comments (#787) 2018-02-01 22:53:08 +01:00
c4fc879508 CloseButton: Fixed cross positioning. 2018-02-01 22:33:48 +01:00
942c140710 CloseButton: Fixed cross positioning. 2018-02-01 22:32:52 +01:00
68d3e139a7 Nav: When focusing a parent window while closing a popup, hide its highlight for one frame to avoid potential double highlight and flicker with the common pattern of menu items leading to the opening other windows. (#787) 2018-02-01 22:28:58 +01:00
950f260a32 Nav: Fixed Selectable/MenuItem Nav Highlight from using rounding when outer highlight stays square. (#787) 2018-02-01 22:25:25 +01:00
c7b7b181b5 Nav: CloseButton reacts when clipped. (#787) 2018-02-01 22:13:25 +01:00
5c9ea4d53a Nav: Fixed press Left on sub-menu when parent wasn't a menu - we were just checking at the wrong level. (#787) 2018-02-01 21:33:23 +01:00
eb737e0a42 Nav: Child window is restored on focus follow up. Fix bdd868704f. (#787, ~#727) One visible issue was pressing Left to leave a child menu. 2018-02-01 21:27:46 +01:00
95f9c74b9a Metrics: Displaying some of the important internal window flags. 2018-02-01 21:27:45 +01:00
79ff3c2d49 Merge branch 'master' into navigation 2018-02-01 18:33:40 +01:00
07163804df Internals: Renamed CloseInactivePopups() to a better ClosePopupsOverWindow(). Exposed in imgui_internal.h 2018-02-01 18:31:41 +01:00
5812d0b751 Nav: Using CTRL+TAB / PadFocusNext/Prev to Focus a window closes the previous window popups. (#787) 2018-02-01 18:29:30 +01:00
fd6d8863f7 Nav: SetFocusID() clears NavInitRequest for consistency (repro would a same frame interaction / race condition). (#787) 2018-02-01 18:19:36 +01:00
ef2c3bcdee Nav: Fixed InitRequest leaking when changing window (repro was to navigate inside File->Options->[Child] then press Left and notice how we would land on parent window on the fist item after the current one). (#787) 2018-02-01 18:02:55 +01:00
8cc2dbc3bd Internals: Nav: Extracted code into IsWindowNavFocusable(). (#787) 2018-02-01 14:56:56 +01:00
bdd868704f Nav: Child window is restored on focus when returning to layer 0 or refocusing. This is a little experimental and potentially error-prone right now. (#787, vaguely relate to ~#727) Ideally we should maintain a non-sorted last-focused list that include childs windows. 2018-02-01 00:50:42 +01:00
7b22a91578 Nav / Slider: Fixed reaching edge of integer slider with navigation input, bug introduced on January 25 in Nav branch 10a4a77b27. (#787) 2018-02-01 00:08:13 +01:00
eaa6f490a2 Merge branch 'master' into navigation
# Conflicts:
#	imgui_demo.cpp
2018-01-31 23:38:05 +01:00
9bc5c089b6 Internal: Avoid needlessly bringing parent of front-most child back to front. This is mostly to reduce flicker/confusion in Metrics when traversing windows. We could aim at separating the child windows from non-child windows at some point. 2018-01-31 23:37:05 +01:00
dbdbf01b9f Demo: Tweaked the Child demos, added a menu bar to the second child to test some navigation functions. 2018-01-31 23:35:54 +01:00
76d8af4036 Nav: when browsing a window that has no activable items (scroll only) we keep a highlight on the child. (#787) 2018-01-31 21:25:52 +01:00
aa2dda7610 Nav: Tweak code to be easier to follow + updated todo list after clarifying an issue. 2018-01-31 21:06:47 +01:00
38d45ee73f Demo: Tweaked the Child demos, added a menu bar to the second child to test some navigation functions. 2018-01-31 19:13:20 +01:00
e6c0b212e8 Nav: Fixed initial movement (which sends an InitRequest) from clearing NavDisableHighlight and fully enabling Nav feedbacks. (#787)
NB: Setting g.NavInitResultExplicit = false on InitRequest match was added in initial commit c2cb2a6928
2018-01-31 18:53:15 +01:00
9c8fb804ed Log: Comments and extraneous assets to clarify intent. (#1584) 2018-01-31 17:41:26 +01:00
27980d9688 Merge branch 'master' into context 2018-01-31 16:02:26 +01:00
47e81a6194 Merge branch 'master' into navigation 2018-01-31 16:00:25 +01:00
cd3dd886de Moved extra_fonts/ to misc/fonts/. Moved .natvis file to misc/natvis/ (#1569) 2018-01-31 16:00:07 +01:00
23c11e9764 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-31 15:43:19 +01:00
dd41a1650a Comments 2018-01-31 15:41:48 +01:00
6c38aa2dc7 Examples: Apple: Tweak code and sync with other examples better (untested). 2018-01-31 00:16:44 +01:00
cca9c3e3da Examples: Using Dark theme by default. (#707). Tweaked demo code. 2018-01-31 00:15:47 +01:00
596b6d6de2 Style: Enable window border by default. (#707) 2018-01-31 00:03:11 +01:00
955d86199f Examples: Tweaks formatting. 2018-01-30 23:55:23 +01:00
bebe03db05 Metrics: Minor formatting tweaks 2018-01-30 21:17:27 +01:00
bd579e5429 Nav: Removed io.NavUsable --> io.NavActive, io.NavActive --> io.NavVisible. (#787). NavActive takes account of NavFlags enable flags. 2018-01-30 20:07:12 +01:00
22f7de0fbd Nav: Updated TODO list. 2018-01-30 19:20:20 +01:00
9fc6f5907b Nav: Fixed NavRectRel being cleared for one frame when restoring layer 0 with Alt/Menu key or Escape. Maybe was inconsequential. (#787) 2018-01-30 18:34:32 +01:00
1ed7bce3ed Nav: Removed old unused code. (#787) 2018-01-30 18:34:17 +01:00
a8763d14c5 Internals: Renaming. 2018-01-30 15:08:53 +01:00
38197a236d Internals: Renaming. 2018-01-30 15:07:20 +01:00
a7ad5134e5 Nav: window that are filling the entire display/viewport gets their windowing highlight clamped within. (#787) 2018-01-30 15:05:46 +01:00
acf21ee429 Nav: Windows with ImGuiWindowFlags_NoBringToFrontOnFocus flag aren't temporarily displayed on the front when using CTRL-TAB. (#787) 2018-01-30 15:05:32 +01:00
bed6ef03f5 Nav: workaround to kindly handle ALT-TAB without detecting TAB-release on backends that clear all keys on unfocus. (#787) 2018-01-29 23:59:47 +01:00
c851b33352 Nav: Added proper version of ImGuiWindowFlags_NavFlattened that handles scrolling nicely. Marked as private as I'm not happy with the name. (#787) 2018-01-29 23:59:46 +01:00
b40dc5c4f2 Nav: NavScoreItem uses g.CurrentWindow and not g.NavWindow. This was changed as part of b3cba62b80 when first trying to implement the NavFlattenedFlag. As it turns out we won't need it. Committing separately for safety. (#787) 2018-01-29 23:59:43 +01:00
020b153d35 Nav: calling NavMoveRequestCancel() more consistently when hijacking a request. Not strictly necessary. (#787) 2018-01-29 23:59:43 +01:00
c8d8dc7f0a Nav: Internals: Renamed RootNavWindow to NavRootWindow (#787) 2018-01-29 23:59:43 +01:00
72485a5d04 Nav: Refactor NavMoveResult** flags into ImGuiNavMoveResult structure as we are going to want two instances of it. (#787) (+1 squashed commits)
+ store window inside result.
2018-01-29 23:59:42 +01:00
1cf38d0334 Internals: Nav: Renamed ImGuiNavForward enum (#787) 2018-01-29 18:12:32 +01:00
2933e6765c Merge branch 'master' into navigation 2018-01-29 17:42:39 +01:00
4654040bcb Nav: Comments, added enum to clarify NavForward code. (#787) 2018-01-29 17:35:36 +01:00
c8b9b2c6bd Nav: Mouse hovering selectable / menu items only activate them if they are on the active NavLayer. (#787) 2018-01-29 15:46:41 +01:00
21771adb94 Nav: Debug overlay uses default font. (#787) 2018-01-29 15:35:51 +01:00
6a25a8720a Examples: Using #include "imgui.h" instead of <imgui.h> appear correct-er as per standard? xcode+clang are very nitpicky there. 2018-01-29 14:38:46 +01:00
91d77be36e Examples: Makefile leave CXX alone, instead leave commented out options. (nb: codeship doesn't seem have clang++) 2018-01-29 00:55:16 +01:00
3cdd2096ec Examples: Use Clang in old Makefile. 2018-01-29 00:48:21 +01:00
ddff378daf Examples: Synced Makefile comments. Added build/ folder into git ignore list/ 2018-01-29 00:38:00 +01:00
858d75ab59 Examples: Apple: Fixed filenames in OSX xcode project. 2018-01-28 23:24:57 +01:00
66d5712a8a Examples: Vulkan: FIxed warnings in 32-bit modes (vulkan uses VkDeviceSize which is always 64-bit long) 2018-01-28 20:03:41 +01:00
94090eb08f Added IMGUI_USER_CONFIG to define a custom configuration filename. (#255, #1573, #1144, #41) 2018-01-28 17:47:28 +01:00
3571ab8b88 imconfig.h comments 2018-01-28 17:40:48 +01:00
578016d08b ImVector comment (#1577) 2018-01-27 17:26:59 +01:00
3ded262776 Merge branch 'master' into navigation 2018-01-26 16:07:43 +01:00
2d9d7a10ca Scrollbar: Fix for ScrollbarY enable check after ScrollbarX has been enabled. (#1574) Looks like a bug introduced in c36e586cce. 2018-01-26 11:43:43 +01:00
1f3b66b10a Scrollbar: Fix ScrollbarX enable test subtracting WindowPadding.x. This has been here since 65a191c005 (#246) tho at the time it is possible that SizeContents wasn't calculated as evenly.
Test: auto-resize with: ImGui::Begin("Test", NULL, ImGuiWindowFlags_HorizontalScrollbar); ImGui::Button("##xxx", ImVec2(500,500)); ImGui::End();
2018-01-26 11:43:31 +01:00
10a4a77b27 Nav: Drag, Slider: When already past a limit and pushing in the direction of the limit, we don't clamp values again. (#787) 2018-01-25 20:39:34 +01:00
04d5783ffd Nav: Cleaning up + using ImGuiInputSource source enum instead of a silly bool. (#787) 2018-01-25 19:36:38 +01:00
d088bd86ad Nav: Added keyboard moving and resizing via the CTRL-TAB windowing mode. (#787) 2018-01-25 19:25:30 +01:00
486f0a8ba0 Fixed potential warning (forward declaration and definition didn't match signature. forward declaration only here for consistency) 2018-01-25 19:07:35 +01:00
f2d5300408 Nav: Keyboard: Added CTRL+TAB (and CTRL+Shift+TAB) style window selection. (#787) 2018-01-25 19:03:47 +01:00
ed088b00be Nav: Style: Improved display of windowing highlight (for focus selection via PadMenu or Ctrl+TAB). (#787, #707) 2018-01-25 18:50:30 +01:00
827f4b17d3 Nav: Examples: Glfw+GL3: Added basic gamepad mapping code when io.NavFlags & ImGuiNavFlags_EnableGamepad is set. (will iterate/tweak before spreading to other examples). (#787) 2018-01-25 16:18:57 +01:00
e9070e768e Nav: Fixed renaming of c09016b12a that were incorrect. ImGuiNavInput_PadLeft -> PadDpadLeft, _PadScrollLeft -> PadLStickLeft. (#787) 2018-01-25 16:17:36 +01:00
3967ff58b2 Nav: Examples: DirectX11, Glfw+GL3: Basic code to map keyboard inputs when io.NavFlags & ImGuiNavFlags_EnableKeyboard is set. (will iterate/tweak before spreading to other examples). (#787) 2018-01-25 16:02:33 +01:00
5d31e1696f Fix SetNextWindowContentSize() with 0.0f on Y axis (or SetNextWindowContentWidth()) overwriting the contents size. Broken in eab6333a0b. (#1363) 2018-01-25 15:37:24 +01:00
8bf0c89c0d Internals: ImRect::Contains(ImRect&) include boundaries (whereas Contains(ImVec2) should not). 2018-01-25 14:24:57 +01:00
194850db31 Merge pull request #1572 from rainbru/build-examples-fix
Fix building instruction in a couple of README
2018-01-25 13:58:27 +01:00
94ed44b5cb Fix allegro5_example build instructions 2018-01-25 13:33:35 +01:00
c226e02ca0 Fix sdl_opengl2_example filename in README.md's build instructions 2018-01-25 13:27:57 +01:00
2c7324da56 TODO list, added uSynergy README 2018-01-25 12:38:15 +01:00
5f7f27c8de Nav: Comments. (#787) 2018-01-24 20:07:35 +01:00
d404b93b6b Nav: Mouse clicking on a window (to select/move) disables hides nav highlight. (#787) + comments 2018-01-24 19:57:39 +01:00
89b0ca1f8f Nav: FocusWindow() doesn't reset NavRectRel (which was flickering e.g. when returning to a parent menu). This was added in the initial nav branch commit and I don't see a reason for it. (#787) 2018-01-24 19:55:56 +01:00
c8def61f5c Merge branch 'master' into navigation 2018-01-24 19:36:48 +01:00
f3776055d6 Merge branch 'master' into context 2018-01-24 19:31:11 +01:00
8c57d8cc1e Natvis: Fix ImRect expanded height display being broken and dumb. (#1569) 2018-01-24 19:10:09 +01:00
6f27d6b5b8 Natvis: Made ImGuiWindow display shorter. 2018-01-24 18:52:26 +01:00
c2e92ab61b Added imgui.natvis helper for visual studio users. Added to examples projects. 2018-01-24 18:40:54 +01:00
277f6e7842 Examples: Comments 2018-01-24 18:40:23 +01:00
6f366fff6b Demo: Tweaked example menu with colors + menu items, was currently particularly inconvenient for Nav. Will rework later. (#787) 2018-01-24 17:41:47 +01:00
455989b8b1 Nav: Added io.NavFlags to hold various options. Added ImGuiNavFlags_EnableGamepad and ImGuiNavFlags_EnableKeyboard for bindings to use (#787) 2018-01-24 17:41:47 +01:00
28671aa821 Nav: Internals: Moved some enums and functions to internals, renamed ImGuiNavReadMode to ImGuiInputReadMode as well. (#787) 2018-01-24 17:41:47 +01:00
8227176c17 Nav: Menus: Fix for using Left direction inside a menu with widgets layed out horizontally. Left to close is now handled as a fallback inside EndMenu(). (#787) 2018-01-24 17:41:47 +01:00
c09016b12a Nav: Renamed ImGuiNavInput_PadLeft / etc. to ImGuiNavInput_PadLStickLeft. Renamed ImGuiNavInput_PadScrollLeft to ImGuiNavInput_PadRStickLeft, aka removing trying-too-hard semantic from the enums. (#787) 2018-01-24 17:41:47 +01:00
bd278e958e Nav: Added ImGuiNavInput_KeyLeft/Right/Up/Down set so we can differenciate gamepad/keyboard inputs. (#787) 2018-01-24 17:41:47 +01:00
680162eb32 Merge branch 'master' into navigation 2018-01-24 17:41:14 +01:00
5148937d4d Fixed old Begin() calling SetNextWindowBgAlpha() with negative values. (#1567, #1568) 2018-01-24 17:39:21 +01:00
37ee99983f Clear BgAlphaCond properly after consuming it. Fixes 9a76fd30fd (#1567) 2018-01-24 15:09:02 +01:00
823e1f0b94 Nav: Reordered NavInput enums to match directional order of ImGuiDir_ and ImGuiKey_ + comments (#787) 2018-01-24 10:43:57 +01:00
64b786c2aa Nav: Tweak/fixed popup positioning when using nav without the io.NavMovesMouse flag (it was always assuming a mouse cursor and allocating space for it) (#787)
Note that this bit include badly hardcoded sizes, expecting an improvement later.
2018-01-24 10:31:54 +01:00
cea78cc576 Nav: Update hovered logic, so IsItemHovered and ButtonBehavior are more consistent with each other. The known case this fixes is nav focusing on a color button, tooltip appears, mouse move: previously tooltip would stay up. (#787) 2018-01-24 10:24:41 +01:00
eb7ec781dc Nav: Tweak GetNavInputAmount(). Split debug defines. 2018-01-23 21:56:15 +01:00
f6ee8d30fb Comments (#1567) 2018-01-23 19:21:17 +01:00
d500113f1d Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_demo.cpp
2018-01-23 19:16:43 +01:00
9a76fd30fd Added SetNextWindowBgAlpha() helper. (#1567) particularly helpul with the marking of the old 5-parameters version of Begin() as obsolete. 2018-01-23 19:13:49 +01:00
2645ab5f7f Comments + added legacy renamed GetItemsLineHeightWithSpacing() as stated in the doc, fixes 6190ab0084 2018-01-23 17:25:59 +01:00
13c407591e Nav: Comments, tweaks 2018-01-23 16:45:46 +01:00
db2ba13154 Internals: Exposed SetCurrentFont() in imgui_internal.h 2018-01-23 16:33:06 +01:00
9076366c17 Style: Exposed ImGuiStyleVar_WindowTitleAlign, ImGuiStyleVar_ScrollbarSize, ImGuiStyleVar_ScrollbarRounding, ImGuiStyleVar_GrabRounding + added an assert to reduce accidental breakage. (#1181) 2018-01-23 09:57:49 +01:00
1acb155419 Internals: Moved unnecessary MovingWindowMoveId field. 2018-01-22 14:31:20 +01:00
5097368bd5 Tweaked FAQ. 2018-01-22 12:01:24 +01:00
2026e792cd Context: NewFrame() asserts (#1565) 2018-01-21 21:12:52 +01:00
dd89c9ea59 Examples: Made the Win32 proc handlers not assert if there is no active context yet, to be more flexible with creation order. (#1565) 2018-01-21 20:58:50 +01:00
9edf211c0e Merge branch 'master' into navigation 2018-01-21 20:46:50 +01:00
3ed2ddbfbe Metrics: Removed context size display. 2018-01-21 20:32:05 +01:00
d3e826c247 Examples: Updated for reorganized context functions. Calling CreateContext(), DestroyContext() in example code. Removed Shutdown() from binding code. (#1565, #586, #992, #1007, #1558) 2018-01-21 20:16:55 +01:00
5e2aa6185c Reorganized context handling to be more explicit,
- YOU NOW NEED TO CALL ImGui::CreateContext() AT THE BEGINNING OF YOUR APP, AND CALL ImGui::DestroyContext() AT THE END.
- removed Shutdown() function, as DestroyContext() serve this purpose.
- you may pass a ImFontAtlas* pointer to CreateContext() to share a font atlas between contexts. Otherwhise CreateContext() will create its own font atlas instance.
- removed allocator parameters from CreateContext(), they are now setup with SetAllocatorFunctions(), and shared by all contexts.
- removed the default global context and font atlas instance, which were confusing for users of DLL reloading and users of multiple contexts
(#1565, #586, #992, #1007, #1558)
2018-01-21 20:16:54 +01:00
7e4d28a49d Context: Renamed SetMemoryAllocators() to SetAllocatorFunctions(). Tweaked comments. (#1565, #586, #992, #1007, #1558) 2018-01-21 20:16:54 +01:00
e45d7a7060 Context: Added IMGUI_DISABLE_DEFAULT_ALLOCATORS to disable linking with malloc/free. (#1565, #586, #992, #1007, #1558) 2018-01-21 20:16:54 +01:00
5a301c29dc Context: Removed allocator parameters from CreateContext(), they are now setup with SetMemoryAllocators() and shared by all contexts. (#1565, #586, #992, #1007, #1558) 2018-01-21 20:16:54 +01:00
ac5b7a1bdf Comments 2018-01-21 20:10:23 +01:00
8b64d50cc4 Merge pull request #1564 from PanosK92/master
Simplified return of ImGui::IsKeyReleased().
2018-01-21 17:20:44 +01:00
7c8a19978d Simplified return of ImGui::IsKeyReleased() 2018-01-21 16:02:09 +00:00
5eb293c879 ImFontAtlas: Added TexUvScale (= 1.0f / (float)TexWidth, 1.0f / (float)TexHeight) 2018-01-20 20:32:23 +01:00
cd1409f4bf ImFontAtlas: Moved mouse cursor data out of ImGuiContext, fix drawing them with multiple context. Also remove the last remaining undesirable dependency on GImGui in imgui_draw.cpp, finishing the work recently done with ImDrawListSharedData. Hurra! (#939) 2018-01-20 20:25:12 +01:00
7e7c017b75 Examples: Simplified mouse wheel handling. (#1463) 2018-01-20 12:45:31 +01:00
7dea158175 Examples: Allegro, Apple, DirectX9/10/11, Glfw+Vulkan :Added support for horizontal mouse wheel. (#1463) 2018-01-20 12:36:59 +01:00
0b1fecb792 Horizontal mouse wheel: renamed io.MouseHorizWheel to io.MouseWheelH. Reorganized the code in NewFrame(). Examples: Updated GLFW+GL and SDL+GL accordingly. (#1463) 2018-01-20 12:36:16 +01:00
6f6b6194b2 Merge branch 'tseeker/20171127-feature-horiz-wheel' of https://github.com/tseeker/imgui into tseeker-tseeker/20171127-feature-horiz-wheel
# Conflicts:
#	examples/sdl_opengl2_example/imgui_impl_sdl_gl2.cpp
#	examples/sdl_opengl3_example/imgui_impl_sdl_gl3.cpp
2018-01-20 12:06:06 +01:00
d4bf9b4686 Renaming for consistency. 2018-01-19 15:47:10 +01:00
8877622fa8 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-19 15:42:28 +01:00
e5a6e85f6d Basic undocumented/unsupported combination of Child+Tooltip. The full feature needs substancially more work but this is enough for simplest cases. (#1345) 2018-01-19 15:37:25 +01:00
42a612d7c9 Begin: Removed asserts that got in the way of some flags combination. (#1345) 2018-01-19 15:33:35 +01:00
0978f00911 MovingWindow: Track click offset based on root window (undo 514d30d8cd). This should not affect the patch used for #1345 as the RootWindow for Child+Tooltip window points to itself now. 2018-01-19 15:14:53 +01:00
f3e510a9bf Examples: SDL: Using SDL_CaptureMouse() to retrieve coordinates outside of client area when dragging. (#1559)
Digging into sdl window/mouse stuff will also be useful for multi-viewport work.
2018-01-19 10:46:54 +01:00
00351ee2ab Examples: SDL: Minor renaming. 2018-01-19 09:55:49 +01:00
ba99900023 Examples: GLFW+GL2: Renamed imgui_impl_glfw.* to imgui_impl_glfw_gl2.* for consistency and to emphasis on GL2-ness. 2018-01-19 09:50:58 +01:00
79dca9d5e6 Examples: SDL+GL2: Renamed imgui_impl_sdl.* to imgui_impl_sdl_gl2.* for consistency and to emphasis on GL2-ness. 2018-01-19 09:50:58 +01:00
15fd5b6c4c Examples: SDL: Minor renaming. 2018-01-19 09:43:28 +01:00
ce17e0f274 Examples: SDL: Using SDL_WINDOW_INPUT_FOCUS instead of SDL_WINDOW_MOUSE_FOCUS (which is ~~hovered). We should use SDL_CaptureMouse + SDL_WINDOW_MOUSE_CAPTURE_FLAG which requires SDL 2.0.4 will give it a try shortly. (#1559) 2018-01-19 09:25:31 +01:00
74dc70c543 DragFloat: Fix/workaround for backends which do not preserve a valid mouse position when dragged out of bounds. (#1559) 2018-01-19 09:16:26 +01:00
c2ffce3e5a Drag and Drop: Fix comment. Removed IMGUI_PAYLOAD_TYPE_DOCKABLE from master branch. (#143) 2018-01-18 17:39:40 +01:00
63d47e8328 Drag and Drop: Increased payload type string to 12 characters instead of 8.(#143) 2018-01-18 17:32:34 +01:00
932d3f0198 NewFrame(): Added an assert to detect incorrect filling of the io.KeyMap[] array earlier. (#1555) + comments. 2018-01-18 10:06:58 +01:00
60d5dc7902 Examples: SDL: Fixed mapping of Insert key (#1555, fix bug introduced in #1541) 2018-01-18 10:01:36 +01:00
d1f726cd9d Comments about Begin/End pair and handling of return value. 2018-01-17 12:46:07 +01:00
cc15512bfc InputText: Minor tweak. 2018-01-17 12:15:24 +01:00
7ccbb765e2 InputText: Cursor X position not lost when clicking outside on an item that's submitted after the InputText(). It was only noticeable when restoring focus programmatically. (#1418, #1554) 2018-01-17 12:15:00 +01:00
2f15cc0855 Nav: Fixed popup wrap-around logic for windows with scrolling. (#787) 2018-01-15 21:55:32 +01:00
05885b2e6d Merge fix. 2018-01-15 20:18:01 +01:00
a221d253f3 Nav: Comment. 2018-01-15 20:13:49 +01:00
472ba1394c Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-15 20:13:42 +01:00
28a76af185 Internal: DrawData: Tidying, renaming. 2018-01-15 20:12:48 +01:00
a77913054f Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2018-01-15 18:02:58 +01:00
1182174d81 Internals: DrawData: We don't need an intermediate layer for popups. 2018-01-15 18:00:13 +01:00
0c06b43e6b Metrics: Tweaks to hover-window-drawlist to see window bounding box. 2018-01-15 17:55:38 +01:00
038453258e Internals: DrawData: Refactored chunks into a ImDrawDataBuilder we can reuse. 2018-01-15 17:48:32 +01:00
061d8df033 MIssing IMGUI_API for a type with non-inline methods. 2018-01-15 17:48:32 +01:00
06eef2ce6f Internals: DrawData: renamed fields only (committing separately so that next commit is less nosiy). 2018-01-15 17:48:32 +01:00
6eff21ee5e Revert "Nav: Fixed RenderNavHighlight() clipping, essentially revert 6ea90af6b7. (#787)"
This reverts commit 03f5cd6ca1.
2018-01-15 16:19:01 +01:00
514d30d8cd MovingWindow: Track click offset based on MovingWindow and not its RootWindow. Followup to 3849bb4470. Comments + adding a local to ease patch #1345. 2018-01-14 14:13:54 +01:00
8b432cf590 Merge pull request #1551 from Crunkle/master
Fix incorrect header name on Linux MinGW systems.
2018-01-14 11:26:03 +01:00
daa38f2ad0 Fix cross compilers 2018-01-14 03:31:22 +00:00
db63e71f13 Internals: Exposed SetCurrentFont() in imgui_internal.h 2018-01-12 20:07:01 +01:00
1493de4f81 Internals: Merge of harmless stuff from Navigation stuff. Added GetHoveredID() internal helper. 2018-01-12 19:53:27 +01:00
c85d7d6e49 Nav: Remove GetItemID(), hide ActivateItem() before this feature is unfinished and has issue (full feature is on hold). Undo part of 59c6f35bf6 (#787) 2018-01-12 19:28:37 +01:00
c9be7d7254 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2018-01-12 19:21:12 +01:00
0a98202714 Nav: Standardized FIXME-NAV marker. 2018-01-12 19:13:15 +01:00
16285603f2 Internals: Initializing fields in same order as declaration order + fixed uninitialized DragDropAcceptIdCurrRectSurface (was harmless) 2018-01-12 19:11:11 +01:00
cc173d7619 Begin: FIx previous commit - no need to call on collapsed window. Handle manual resize (grip, border, gamepad) before setting up window DrawList main clipping rectangle. Sane (and required for viewport code). (#822, #1542) 2018-01-11 23:21:24 +01:00
5e9ae92ae9 Begin: Handle manual resize (grip, border, gamepad) before setting up window DrawList main clipping rectangle. Sane (and required for viewport code). (#822, #1542) 2018-01-11 23:17:34 +01:00
f7b10fc954 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-11 18:18:44 +01:00
6a1011cf53 MovingWindow: Proper fix for 651538e attempt, without altering MovingWindow which has side-effects. Clicking on a window with the ImGuiWIndowFlags_NoMove flags takes an ActiveId so we can't hover something else. (ref #1381, #1337) 2018-01-11 18:16:16 +01:00
b74f24c3e5 Revert "Clicking on a window with the ImGuiWIndowFlags_NoMove flags takes an ActiveId so we can't hover something else. (ref #1381, #1337)"
This reverts commit 651538e13b.
2018-01-11 18:08:14 +01:00
1c95dea88c Merge branch 'master' into navigation 2018-01-11 17:37:02 +01:00
7d2a068dea Begin: Shuffling bits of code around. 2018-01-11 17:33:37 +01:00
cd7e178eac Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-11 16:49:59 +01:00
651538e13b Clicking on a window with the ImGuiWIndowFlags_NoMove flags takes an ActiveId so we can't hover something else. (ref #1381, #1337) 2018-01-11 16:43:03 +01:00
a8bbb0b7dd Demo: Using IM_COL32() instead of ImColor() in ImDrawList centric contexts. 2018-01-11 15:47:07 +01:00
12aa3cb09e Demo: Tweaks format. 2018-01-11 15:22:33 +01:00
398a4e1865 Made obsolete IsAnyWindowHovered()/IsAnyWindowFocused() static inline. static only tends to trigger warnings. (#1382) 2018-01-11 13:58:25 +01:00
a63fbbca8b Added ImGuiHoveredFlags_AnyWindow, ImGuiFocusedFlags_AnyWindow. Obsoleted IsAnyWindowHovered()/IsAnyWindowFocused() in favor of IsWindowHovered(ImGuiHoveredFlags_AnyWindow)/IsWindowFocused(ImGuiFocusedFlags_AnyWindow). Added to demo. (#1382) 2018-01-11 13:51:18 +01:00
67671c0ab5 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-10 23:11:26 +01:00
1eee10778b Internals: Begin: Refactor some code into an UpdateManualResize() function. 2018-01-10 23:06:51 +01:00
483f9b0d07 Internals: Begin: Moved DrawList setup code below, the viewport system will need to push the outer clipping rectangle as late as possible. 2018-01-10 22:55:29 +01:00
03f5cd6ca1 Nav: Fixed RenderNavHighlight() clipping, essentially revert 6ea90af6b7. (#787) 2018-01-10 18:58:55 +01:00
919fc548ad Merge branch 'master' into navigation 2018-01-10 18:58:26 +01:00
6c583315e6 Begin: Moving some code around for the benefits of the wip viewport branch. 2018-01-10 18:56:51 +01:00
f610e25682 Internals: Using ImFloor().when appropriate. 2018-01-10 18:33:29 +01:00
0cabd81071 Internals: Rect: Added ClipWillFull helper + comments on variations. 2018-01-10 14:43:08 +01:00
92d75c44bc Internals: ImVec2 versions of ImMin, ImMax inline float version for a faster full-on-debug-no-inline experience. 2018-01-10 14:43:02 +01:00
fe919995da Merge branch 'master' into navigation 2018-01-08 16:35:12 +01:00
933ee6cd5d InputText: Added alternative clipboard shortcuts: Shift+Delete (cut), Ctrl+Insert (copy), Shift+Insert (paste). (#1541) 2018-01-08 16:01:30 +01:00
fd4d63a0c5 InputText: Moved code for checking clipboard shortcut so we can expand on it. (#1541) 2018-01-08 15:56:01 +01:00
ce95b84825 Added ImGuiKey_Insert for future use. Setup in all example bindings. (#1541) 2018-01-08 15:30:39 +01:00
39cb56c39e Examples: OpenGL3+GLFW: Using 3.2 context + GLSL version 150 (#1466) 2018-01-07 19:09:34 +01:00
7484c63449 Examples: OpenGL3+SDL: Changed GLSL shader version to 150 (#1466, #1504) 2018-01-07 19:09:33 +01:00
168200f915 Popups: Comments, reorganize bits of the header section, renamed parameters. 2018-01-07 18:17:47 +01:00
a8e5542d78 BeginPopup: Exposed extra_flags publicly. (#1533) 2018-01-07 18:13:01 +01:00
3f4eccf154 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-07 16:22:09 +01:00
3fc7cf190d OpenPopup(): Always reopen existing popup. Removed OpenPopupEx() bool reopen_existing which is always true. This also makes the public API on par with OpenPopupEx(). (#1497, #1533) 2018-01-07 16:20:02 +01:00
deab2ab015 Popups: Gently handle the user mistakenly calling OpenPopup() every frame. (when reopen_existing is true). (#1497) 2018-01-07 16:15:54 +01:00
69ff65f054 Internals: Popup: Renaming fields. 2018-01-07 16:11:25 +01:00
3678307cd9 Popup, Menus: Tweaks and comments. 2018-01-07 15:56:14 +01:00
369189b675 Internals: Popup: Explicitely setting up ImGuiPopupRef reduces confusion. 2018-01-07 15:40:46 +01:00
e09852fc49 Popups: Revert aca23fd3f0 (Oct 20, 2017). Because 1) I can't seem to find a default. 2) The if is definitively faulty and would have been all true. 3) It looks like possibly the following commit 6ab737a4bb could have made this unnecessary. Not absolutly certain. (~#439) 2018-01-07 15:34:15 +01:00
63e4677b81 Popup: BeginPopupContextItem(), BeginPopupContextWindow(), BeginPopupContextVoid(), OpenPopupOnItemClick() all react on mouse release instead of mouse click. Note that they don't use the full ButtonBehavior() or tracking aabb on both click and release. Applications I've tried seems to behave inconsistently there but on-release-without-tracking is both fairly common and doesn't require extra code for the id tracking. (~#439) 2018-01-07 15:23:57 +01:00
c337cdcfd3 Internal: ButtonBehavior: Tweak to update g.ActiveIdClickOffset more consistently 2018-01-07 15:02:09 +01:00
7ad169fa09 Merge branch 'master' into navigation + fix previous merge
# Conflicts:
#	imgui.cpp
2018-01-07 14:33:44 +01:00
d730a763f6 Internal: Reworked FocusFrontMostActiveWindow() so it fits the Nav branch usage as well. 2018-01-07 14:32:42 +01:00
66b2ee6ea2 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-07 14:25:05 +01:00
a34490239c Internals: Popup: Separating MousePosOnOpen and PopupPosOnOpen. They are equal in the master branch but different in the navigation branch. 2018-01-07 14:03:56 +01:00
5fd19f037f Internals: renamed FocusPreviousWindow() to FocusfrontMostActiveWindow() 2018-01-07 12:48:11 +01:00
2874aabb93 Internals: BringWindowToFront() iterate front to back, faster in majority of use cases. 2018-01-07 12:48:11 +01:00
3d24a9eb40 Examples: DirectX9/10/11: Comments about CS_DBLCLKS + formatting tweaks. (#1538) 2018-01-05 22:32:27 +01:00
65dd55cb2b Merge pull request #1538 from ndandoulakis/ndandoulakis-CS_DBLCLKS-patch
Examples: DirectX9,10,10: Support for CS_DBLCLKS by treating double-click down messages are regular down. (#1538, #754)
2018-01-05 22:27:40 +01:00
407955d9fb Examples: Using IM_OFFSETOF macro. + Comments 2018-01-05 22:05:02 +01:00
bfc25bc8a3 CS_DBLCLKS support for DirectX 11 2018-01-05 22:28:27 +02:00
583e97b297 CS_DBLCLKS support for DirectX 10 2018-01-05 22:25:30 +02:00
20ae6439ea CS_DBLCLKS support for Directx9 2018-01-05 22:16:35 +02:00
95b773370f Revert "Internals: Added LastActiveId, LastActiveIdTimer. (#1537)" Will come up with a better design later.
This reverts commit 007f4034c9.
2018-01-05 17:40:51 +01:00
007f4034c9 Internals: Added LastActiveId, LastActiveIdTimer. (#1537) 2018-01-05 15:33:24 +01:00
4c90529c62 Examples: Visual Studio projects: Disabled extraneous function-level check in Release build. 2018-01-04 11:42:05 +01:00
ecbfdd3143 Added extraneous initialization to NULL. (#1527). 2018-01-04 11:06:12 +01:00
29c194b2a4 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2018-01-03 20:47:42 +01:00
4fc9f44073 Merge of minor left-overs from private work branch to reduce drifts. Should be functionally a no-op. 2018-01-03 20:46:54 +01:00
4b1240b2e1 Fixed non-popup child windows not honoring the HiddenFrames flag (can't see a reason). Docking relies on this. 2018-01-03 20:45:24 +01:00
b2ec0741f1 Internals: Settings api tweaks 2018-01-03 20:45:17 +01:00
2b8224692e Merge branch 'master' into navigation 2018-01-03 20:26:24 +01:00
0a0b252bb6 DragDrop: Removed IsDragDropActive() (introduced a few days ago, revert 06bea369c0) as our use case doesn't need it anymore. Will add it if there is a real need. 2018-01-03 17:02:51 +01:00
a7deb3a394 Demo: Minor tweaks. 2018-01-03 15:36:51 +01:00
9fbecac87e Demo: Improved Selectable() examples. (#1528) 2018-01-03 15:11:14 +01:00
33f7769d85 Columns: Clear offsets data when columns count changed. (#1525) 2018-01-03 14:38:01 +01:00
f9b2058d5a Internals: Renamed ImGuiSimpleColumns to ImGuiMenuColumns to avoid confusion. Reduced internal buffer size (we only use 3 slots). 2018-01-03 14:35:11 +01:00
79d38e5ade Updated copyright date for 2018 2018-01-03 14:32:16 +01:00
05ec0b0736 Casing tweaks + clarify license copyright (simpler/safer?) (#1346) 2018-01-03 14:32:16 +01:00
96ccc484f9 Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2018-01-03 12:33:27 +01:00
3c6fbe0849 Renamed ImGuiSizeConstraintCallback to ImGuiSizeCallback, ImGuiSizeConstraintCallbackData to ImGuiSizeCallbackData. 2018-01-03 12:31:56 +01:00
7fcbd45500 Internals: NextWindow: Renamed, moved functions to member. 2018-01-03 12:28:16 +01:00
e339949de1 Internals: NextWindow: Using ImGuiCond for consistency. 2018-01-03 12:22:02 +01:00
04b44398eb Internals: refactored g.SetNextWindow fields into g.NextWindow. structure (so it can be more easily transported/copied) 2018-01-03 12:12:41 +01:00
856ee17ed8 Fixed Android clang warning. 2018-01-03 10:29:37 +01:00
7e03ee8d85 Merge branch 'master' into navigation 2018-01-02 17:21:49 +01:00
bfc9c5216a Merge pull request #1529 from unprompted/master
Fix a memory leak of ImGuiColumnsSet's Columns vector.  ImVector doesn't call destructors.
2018-01-02 17:21:17 +01:00
561e9f286e Fix a memory leak of ImGuiColumnsSet's Columns vector. ImVector doesn't call destructors. 2018-01-02 10:46:20 -05:00
170bcb2d7c Internals: NewFrame: Shuffled some code around (to minimize upcoming patches) 2018-01-02 12:48:38 +01:00
4af84ac781 ImFontAtlas: Handle stb_truetype failure more gracefully, GetTexDataAsRGBA32() won't crash during conversion. (#1527) 2017-12-30 23:10:11 +01:00
7a15fc8de5 Merge branch 'master' into navigation 2017-12-29 18:28:23 +01:00
6ec00a366a Internals: ImRect: Minor formatting tweaks. 2017-12-29 18:28:04 +01:00
fbf2435f38 Exposed IM_OFFSETOF() helper in imgui.h 2017-12-29 18:16:19 +01:00
eef9120e07 Reorganized comments in the IMGUI_DISABLE_OBSOLETE_FUNCTIONS function. Added an IM_ASSERT(0). 2017-12-29 18:14:36 +01:00
2dd2ca0096 Removed CalcItemRectClosestPoint() which was weird and not really used by anyone except demo code. If you need it it's easy to replicate on your side.
Removed internal corresponding ImRect::GetClosestPoint() for now.
Essentially revert dcaafffe0e.
2017-12-29 17:59:13 +01:00
9f8632b131 Examples: Comments about invalid mouse pos. 2017-12-29 15:03:36 +01:00
c4e6d622c1 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-12-29 13:39:07 +01:00
4fbdb50dca MenuBar: Fixed menu bar pushing a clipping rect outside of its allocated bound (usually unnoticeable). 2017-12-28 23:53:36 +01:00
4ba2e85744 Demo: Tweak. Comments. Metrics: Added some Drag and Drop info. 2017-12-28 23:53:27 +01:00
90ff4ae5d1 BeginPopupModal(): the conditional test for SetNextWindowPos() was polling the wrong window, which in practice made the test succeed all the time. 2017-12-28 23:52:47 +01:00
e985baa35d Combo: When peeking into the popup window for alignment we check if the window was active, which is more correct. (no known issue in current codebase, but we'll need that change for later) 2017-12-28 23:52:42 +01:00
06bea369c0 DragDrop: Added IsDragDropActive() helper which is useful for binding to decide how to handle mouse inputs. 2017-12-28 23:52:37 +01:00
563d04fdb1 TreeNode: node with the ImGuiTreeNodeFlags_Leaf flag correctly disable highlight when DragDrop is active. (#143, #581) 2017-12-28 23:52:31 +01:00
49eed6e2d1 Version 1.54 WIP 2017-12-28 15:17:35 +01:00
6e30c33642 Demo dinaries update 2017-12-26 21:04:17 +01:00
7fd805497a Update README.md 2017-12-26 20:30:22 +01:00
436cad4bca Merge branch 'master' into navigation
# Conflicts:
#	imgui.h
2017-12-26 15:37:31 +01:00
d9034bf2d8 ListBox() changed signature of ListBox() to match Combo(). Still not very happy about not using const char** anymore. (#931) 2017-12-26 15:36:55 +01:00
149523a101 Fixing error: declaration of ‘size’ shadows a member of 'this' [-Werror=shadow] 2017-12-25 22:27:32 +01:00
9511f22e8b Demo: Console: More friendly to text color changes. 2017-12-25 18:47:44 +01:00
e916310b2e Version 1.53 2017-12-25 17:41:41 +01:00
3d48f5b8c2 Demo: BeginCombo() demo code 2017-12-25 17:41:02 +01:00
ed2105d4a2 Merge branch 'master' into navigation 2017-12-25 16:45:27 +01:00
3849bb4470 Moving window doesn't use accumulating MouseDelta so straying out of boundaries keeps moved window at the same spot. 2017-12-25 16:03:58 +01:00
78f48bb795 Examples: DirectX10,DirectX11: Moved call to OMSetRenderTargets() in main loop so example code can integrate more nicely with other code. 2017-12-25 14:54:54 +01:00
de5c304b49 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-12-24 18:59:40 +01:00
8d54b1b7af Misc comments, removed duplicated IM_ARRAYSIZE macro in imgui_demo.cpp (it is now declared in imgui.h) 2017-12-24 18:59:14 +01:00
3a4a2bb27c Examples: Vulkan: Tweak 2017-12-24 18:49:19 +01:00
ce13426a1a Examples: Comments, synched some minor drift between examples + stronger suggestion to use StyleColorsDark(). 2017-12-24 18:45:11 +01:00
1b86e7343f Renamed the emblematic ShowTestWindow() function to ShowDemoWindow(). Kept redirection function (will obsolete). 2017-12-24 18:16:22 +01:00
cead207535 Comments 2017-12-24 17:58:41 +01:00
67191badc2 Merge branch 'master' into navigation 2017-12-23 23:10:41 +01:00
bb8dfe4a34 Fixed incorrect IM_DELETE macro (9cda86d55a) (#1517, #484, #504) 2017-12-23 23:10:26 +01:00
b1930c5672 Merge branch 'master' into navigation 2017-12-23 20:37:53 +01:00
e9ceef4762 ImVector: Revert 6172e93272 actually problematic with our current use (because we don't construct the instances). 2017-12-23 20:37:36 +01:00
6c63c7a8b1 Various zealous warning fixes (thanks Clang). (Navigation branch) 2017-12-23 16:40:12 +01:00
ffb4f6ca8c Merge branch 'master' into navigation 2017-12-23 16:27:48 +01:00
d976e4ea23 Internals: Missing IM_DELETE usage (#1517) 2017-12-23 16:27:16 +01:00
9cda86d55a Internals: Added IM_NEW, IM_DELETE helper macros (#1517, #484, #504) 2017-12-23 16:24:33 +01:00
a5739a0aa3 Fixed warning with Clang+MSVC using __int64 to define the helper ImU64 type (#1184) 2017-12-23 15:28:49 +01:00
983d8f5f8e Various zealous warning fixes (Clang). 2017-12-23 15:28:49 +01:00
53b24ff79a Removed reliance on ImU64 type for the ImDrawList assert. (#1184) 2017-12-23 15:02:36 +01:00
69879dd4f3 ImVector: Spacing. 2017-12-23 14:55:22 +01:00
8e8b5498f7 ImVector: insert() uses grow_capacity() - had inconsistent resize policy 2017-12-23 14:51:28 +01:00
6172e93272 ImVector: Added assignments and = operators + comments. 2017-12-23 14:49:23 +01:00
b263bc5689 Examples: DirectX: Using IM_ARRAYSIZE() 2017-12-23 14:07:27 +01:00
1f26652944 Various zealous warning fixes (thanks Clang). 2017-12-23 14:07:03 +01:00
cf9b893841 Examples: Added null_example/ which is helpful for quick testing on multiple compilers/settings without relyong on graphics library. 2017-12-23 13:40:01 +01:00
1c1e490316 Merge branch 'master' into navigation 2017-12-22 20:21:54 +01:00
46dcd9aa50 Columns: Made PixelsToOffsetNorm() properly symetrical to OffsetNormToPixels() (#125) 2017-12-22 20:21:35 +01:00
471bcf8b5e Columns: Fixed dragging when using a same of columns multiple times in the frame. (#125) 2017-12-22 20:21:02 +01:00
e1a103b251 Drag and Drop: Disable tracking mouse button ownership when an external drag source is active, to make it easier to achieve drag and drop over multiple OS windows. (#143) 2017-12-22 20:20:52 +01:00
8d21ee56d2 ImDrawList, Font: Fixed bug introduced in 531c11d5c7 (#1519) 2017-12-22 20:19:48 +01:00
287380261c Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-12-21 19:55:21 +01:00
c8c872c753 Internals: String functions uses size_t in their signature 2017-12-21 19:49:54 +01:00
996dfb21cf ImDrawList: Added ImDrawListFlags for AA settings. ImDrawList doesn't directly depends on GImGui anymore. 2017-12-21 19:49:54 +01:00
d139bd088d Begin: Moved modal darkening draw block 2017-12-21 19:49:54 +01:00
14cb8177d0 ImDrawList: Removed 'bool anti_aliased = true' final parameter of ImDrawList::AddPolyline() and ImDrawList::AddConvexPolyFilled(). Anti-aliasing is controlled via the regular style.AntiAliased flags. 2017-12-21 19:01:53 +01:00
531c11d5c7 ImDrawList: Small refactor toward removing dependency on GImGui + PushClipRectFullscreen now correctly uses data provided by imgui which can takes account of DisplaySize + Removed static variable in PathArcToFast() which caused linking issues to some. 2017-12-21 18:52:34 +01:00
230f826ef5 ImDrawList: Comments 2017-12-21 18:48:09 +01:00
4c2514dc29 Merge branch 'master' into navigation 2017-12-21 11:18:42 +01:00
6193f46af2 Active Modal window always set the WantCaptureKeyboard flag (#744) 2017-12-21 11:18:30 +01:00
b366dd9322 BeginPopup: Moved flags into individual BeginPopupXXX calls/implementations and outside of BeginPopupex(). Removed _NoResize flag which is extraneous with AlwaysAutoResize. 2017-12-20 17:40:58 +01:00
7fed4eb82d Merge branch 'ibachar-master' 2017-12-20 16:25:21 +01:00
55c0d2b9ab InputText: renamed ImGuiInputTextFlags_DisableUndo to ImGuiInputTextFlags_NoUndoRedo (#1506, #1508) 2017-12-20 16:25:03 +01:00
abaf347deb Added a flag for text input to disable undo / redo 2017-12-17 15:27:56 +02:00
b1d90b565d Columns: Fixed previous commit (wrong chunk commited) (#125) 2017-12-15 17:09:41 +01:00
b9391d1692 Columns: Internal: Columns have their no set of flags so NoResize can be setup by internal code. (#125) 2017-12-15 17:06:47 +01:00
6497f5dc1b Merge branch 'master' into navigation
# Conflicts:
#	imgui.h
2017-12-15 11:59:50 +01:00
0c6e260f73 Drag and Drop: Added ImGuiDragDropFlags_SourceExtern to facilitate interfacing with WM_DROPFILES (#143) 2017-12-15 11:17:21 +01:00
6effcf21d6 Drag and Drop: Source can also inhibit the preview on target, useful for extern sources that only exists for one frame. (#143) 2017-12-15 11:17:21 +01:00
51433e26af Drag and Drop: Renamed to ImGuiDragDropFlags_SourceNoAutoTooltip to ImGuiDragDropFlags_SourceNoPreviewTooltip (#143) 2017-12-15 10:15:51 +01:00
eefea0588a Using the ImGuiWindowFlags_NoScrollWithMouse flag on a child window forwards the mouse wheel event to the parent window, unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set. (#1380, #1502) 2017-12-14 18:42:41 +01:00
ac8e708c3e Fixed unused variable warning. 2017-12-14 18:14:43 +01:00
07ed9f8451 TODO list update 2017-12-14 11:08:16 +01:00
fa68cb5364 Demo: Console: Tweak. 2017-12-13 23:07:07 +01:00
45bca7851d Added ImGuiHoveredFlags_RootAndChildWindows helper for consistency with focused flags. (#1382) 2017-12-13 22:30:16 +01:00
5f39758202 Minor tweaks, comments, spacing fixes 2017-12-13 22:21:49 +01:00
cc3192f347 Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2017-12-13 22:09:08 +01:00
f265e16b84 Revert "Scrollbar: Minor simplication of the code using InnerRect data." > Introduced sheering on the scrollbar rectangle because InnerRect isn't setup at this point.
This reverts commit 7ac1583411.
2017-12-13 22:07:18 +01:00
3905816082 Added ShowFontSelector(), ShowStyleSelector(). (#707) 2017-12-13 21:59:16 +01:00
ddbcda8c1b Columns: Column width data is no longer lost while dragging toward the right side. (#1499, #125) 2017-12-13 21:51:23 +01:00
ba71e1c0e4 Columns: Minor stylistic fixes. (#125) 2017-12-13 21:48:56 +01:00
f7c5f420e7 BeginChild() fix using negative sizes as window position because of erroneous clamping. It was hard to notice until we added asserts for it. (#1500) 2017-12-13 19:45:03 +01:00
e8e84a6ad6 Columns: Added internal tracking of a few flag temporarily, to facilitate the work of third-parties who have columns patches. (#125) 2017-12-13 19:26:04 +01:00
4ae5c7e227 Columns: Refactor: Moved ColumnsSet[] to window out of DC as they are persistent data for most + fix for pre C++11 compilers. (#125, #1499) 2017-12-13 19:21:21 +01:00
b016215c80 Columns: Refactor: Not using statestorage lookup anymore. (#125, #1499) 2017-12-13 19:07:09 +01:00
3a31a75e3b Columns: Refactor: Renamed all members. (#125, #1499) 2017-12-13 18:42:06 +01:00
78320aa633 Columns: Refactor: Moved columns data into their own data structure. Minimum changes now to ease diffing. (#125, #1499) 2017-12-13 18:41:51 +01:00
027ffd91ea IsWindowFocused(): oops, that was bound to happen with loosely typed enums (this is sort of why I made both values identical - no direct side effects). 2017-12-12 23:49:04 +01:00
16fb58984f Merge branch 'master' into navigation 2017-12-12 23:41:48 +01:00
90d0b8b58b Navigation: minor sync to reduce drifts between changes 2017-12-12 23:41:20 +01:00
8b59ed0708 Drag and Drop: Exposed some internals. 2017-12-12 23:37:27 +01:00
90788a1242 ImVector: Added ImVector::contains() helper 2017-12-12 23:36:42 +01:00
7c7a7baf76 Merged miscellaneous small stuff (from nav/dock branches). 2017-12-12 23:36:25 +01:00
b174fcc9af Added IsAnyWindowFocused() (from Nav branch). 2017-12-12 23:35:04 +01:00
fa9327ccf8 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
#	imgui_draw.cpp
#	imgui_internal.h
2017-12-12 20:44:12 +01:00
d0a1be0de0 Merge branch 'drag_and_drop' 2017-12-12 20:39:52 +01:00
ab049c6fc0 Drag and Drop: Fix merge for IMGUI_DISABLE_OBSOLETE_FUNCTIONS 2017-12-12 20:34:16 +01:00
7faa5b16bb Tweak 2017-12-12 19:15:00 +01:00
3ea5e67ba2 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_demo.cpp
2017-12-12 18:47:23 +01:00
02e0a078f4 Begin: Tidying up code to make it more readable. 2017-12-12 18:46:42 +01:00
28bbf1ade6 Fixed ParentWindow setup which broke Modal windows (fix c65124f415) 2017-12-12 18:45:57 +01:00
d561a43a4d Drag and Drop: Drop target infer a fallback ID from the rectangle. Avoid Preview being accepted on drop frame when drop target has no ID. (#143) 2017-12-12 18:17:37 +01:00
ef1a683ebe Removed use of obsolete ImGui API. 2017-12-12 17:59:09 +01:00
e98df91dc4 Drag and Drop: Added ImGuiCol_DragDropTarget (#143, #707) 2017-12-12 15:44:22 +01:00
7ec934f439 Drag and Drop: Comments 2017-12-12 15:33:26 +01:00
052b6021dd Merge branch 'master' into drag_and_drop
# Conflicts:
#	imgui.cpp
#	imgui.h
#	imgui_internal.h
2017-12-12 15:02:05 +01:00
0a3db267c3 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
#	imgui_demo.cpp
#	imgui_internal.h
2017-12-12 14:58:53 +01:00
6190ab0084 Renamed GetItemsLineHeightWithSpacing() to GetFrameHeightWithSpacing() 2017-12-12 14:14:58 +01:00
c22657985a Added GetFrameHeight() function (used to be SmallSquareSize internally) 2017-12-12 14:12:49 +01:00
ee7f1921e8 Internals: Added GetSmallSquareSize() 2017-12-12 14:08:58 +01:00
08b72eb5c0 IsWindowFocused() refactor will flags. (#1382)
Marked IsRootWindowFocused() as obsolete in favor of using IsWindowFocused(ImGuiFocusedFlags_RootWindow).
Marked IsRootWindowOrAnyChildFocused() as obsolete in favor of using IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows).
2017-12-12 14:07:12 +01:00
8d8f4934fb Demo: mouse dragging demo tweaks 2017-12-12 13:11:40 +01:00
fa179d0ad8 Reordered ImGuiHoveredFlags to match upcoming ImGuiFocusedFlags (#1382) 2017-12-12 12:52:24 +01:00
de4a851f95 Font documentation update (#1498) 2017-12-12 12:50:43 +01:00
c65124f415 Internals: ParentWindow is now NULL for non-child windows and means what everyone expects. 2017-12-12 12:50:43 +01:00
f42d7b89e2 Internals: Removed misleading GetWindowParent() function. + renaming to clear confusing. 2017-12-12 12:50:42 +01:00
4a555d35f0 IsWindowHovered(): split ImGuiHoveredFlags_FlattenChild into separate ChildWindows and RootWindow flags. Allowing more combination and a better symetry with IsWindowFocused() flags. (#1382) 2017-12-12 12:50:42 +01:00
185c1eaaf3 Alignment + removed comments 2017-12-11 22:55:28 +01:00
f93945540f Renamed ImGuiTreeNodeFlags_AllowOverlapMode to ImGuiTreeNodeFlags_AllowItemOverlap. (#600, #1330) 2017-12-11 22:42:12 +01:00
45f440bb7d Internals: Renamed ImGuiButtonFlags_FlattenChilds -> ImGuiButtonFlags_FlattenChildren, ImGuiButtonFlags_AllowOverlapMode -> ImGuiButtonFlags_AllowItemOverlap 2017-12-11 22:39:10 +01:00
6b168b43ff Comments (#822) 2017-12-11 19:47:23 +01:00
2b9d8ab91d Merge branch 'master' into drag_and_drop
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-12-11 16:39:27 +01:00
38bfdb357e Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-12-11 16:28:47 +01:00
f06f68f3ce Obsoleted old functions: SetScrollPosHere (marked obsolete in 1.42, July 2015). GetWindowFont(), GetWindowFontSize() (marked obsolete in 1.48, March 2016) 2017-12-11 16:22:52 +01:00
9fd15defe4 Added an implementation of SetItemDefaultFocus() in the master branch for combo patterns to use and be more forward-compatible. (#787) 2017-12-11 16:19:37 +01:00
6d93011fdf alloca fix to allow Clang with Microsoft CodeGen path 2017-12-11 10:25:44 +01:00
e67f3809ed Replaced obsolete function with new one. 2017-12-11 09:57:05 +01:00
d1db229907 Merge branch 'master' into navigation
# Conflicts:
#	imgui_demo.cpp
2017-12-10 19:01:59 +01:00
71296910a0 Demo: Tweaks and spacing. Stopped using rand() function in demo code. 2017-12-10 18:49:47 +01:00
4b8857d536 Demo: About box tweaks. 2017-12-10 18:45:05 +01:00
1096e14356 ImFont: Added GetDebugName() helper. 2017-12-10 18:34:32 +01:00
e3e0326ea9 Exposed BeginCombo() publicly. 2017-12-10 18:08:59 +01:00
080f61858f Sorted typedefs/enumations forward declarations in imgui.h 2017-12-10 17:57:27 +01:00
eab6333a0b SetNextWindowContentSize() adjust for client->window size, but the fate of borders isn't really clear for now (until now we always tried to make borders not affect layout, so if we want a 200x200 fully visible space with borders and zero window padding user need to include the borders) (#1490) 2017-12-10 17:36:30 +01:00
7ac1583411 Scrollbar: Minor simplication of the code using InnerRect data. 2017-12-10 17:27:37 +01:00
a9b01600ac Internals: window->InnerRect includes removal of borders so it'll be easier to use from other locations. 2017-12-10 17:24:10 +01:00
20ba79aa56 Demo: Added "No close" option. 2017-12-10 17:02:41 +01:00
b75acc21b0 Fix for border under title bar when WindowBorderSize == 0 and FrameBorderSize > 0 2017-12-10 16:48:18 +01:00
0872020c5c Comments 2017-12-10 16:11:29 +01:00
f72b002da8 Removed SetNextWindowContentWidth(), prefer using SetNextWindowContentSize(). Kept redirection function (will obsolete). (#246, #519, #1444) 2017-12-10 16:05:47 +01:00
e23083a080 Fixed warning: logical ‘and’ of equal expressions 2017-12-10 12:15:29 +01:00
0365c524a2 ColorPicker4: Fixed returning true when holding mouse button on the sat/value/alpha locations. (#1489) 2017-12-09 21:25:20 +01:00
a8c7b1a2a2 ColorEdit4: Made IsItemActive() return true when picker popup is active. (#1489) 2017-12-09 21:17:27 +01:00
871a5cecc1 Merge branch 'master' into navigation 2017-12-08 18:32:46 +01:00
c9f0275e22 Combo: Removed ImGuiWindowFlags_ComboBox flag. Moved internal window flags. 2017-12-08 18:32:12 +01:00
457011660e Mouse wheel scrolling doesn't change speed inside Combo box (uses to slow down from 5 to 3) but instead slow down on window that are smaller than the scroll speed. 2017-12-08 18:28:17 +01:00
a263dce2f2 Combo: Cleanup. Removed unrequired uses of the _ComboBox flag (the test in EndChild() is from commit no 1!). We could remove ImGuiWindowFlags_ComboBox soonish. 2017-12-08 17:21:45 +01:00
9ce51ad9f6 Fix bad merge 2017-12-08 15:11:35 +01:00
a6f37287d8 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-12-08 15:06:37 +01:00
7ac5f11b29 Standardizing the casing/format of internal window names + Misc comments. 2017-12-08 15:04:06 +01:00
befc58771c Combo: Recycling windows by using a stack number instead of a unique id, wasitng less windows. 2017-12-08 15:03:37 +01:00
e998c7d3e3 Combo: Moved functions (untouched). 2017-12-08 15:03:32 +01:00
a5e9392140 Combo: Added flags to BeginCombo() new api, removed explicit height, default to 8 instead of 7 items, allow popup height constraints via SetNextWindowSizeConstraints(), width expand if contents doesn't fit, popup reposition policy if it doesn't fit. 2017-12-08 15:03:26 +01:00
d9d231dc6b Internals: Renamed CalcSizeFullWithConstraint() to CalcSizeAfterConstraint() which is more appropriate + added explicit parameter to CalcSizeAutoFit() so it can be used externally. 2017-12-08 15:02:17 +01:00
74f42baf3e Fixed scrollbar issue, source size when explicit was read before applying custom size constraints (followup to cc2c023880 etc.) 2017-12-08 15:00:56 +01:00
541dfd7901 Combo: Comments + fixed missing lower window padding. 2017-12-08 15:00:02 +01:00
9872297a84 Internals: Renamed FindBestPopupWindowPos() to FindBestWindowPosForPopup() 2017-12-08 14:59:49 +01:00
a4863e8084 Demo: Picker with palette demo supports drag and drop. (#143, #346) 2017-12-08 12:49:35 +01:00
7bf85db6c4 Drag and drop: Added COL3F payload for color without alpha overwrite. Exposed standard color payload types in imgui.h (#143) 2017-12-08 12:48:53 +01:00
b6b940c8ee Merge branch 'master' into navigation + removed extraneous g.NavDisableMouseHover test in IsItemHovered()
# Conflicts:
#	imgui.cpp
2017-12-08 09:35:23 +01:00
e118239f69 IsItemHovered() comments (#1382) 2017-12-08 09:34:05 +01:00
553b0fcf8f Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-12-07 21:20:16 +01:00
ca0bb000ad Begin: Factored out a bit of code to CalcSizeContents() 2017-12-07 21:14:54 +01:00
f658edc72a Begin: Remove unnecessary usage of window_is_new flag, as both fields are zero on window creation. 2017-12-07 21:14:49 +01:00
45466a8cf9 Internals: BeginCombo() added dummy ImGuiComboFlags. 2017-12-07 21:14:41 +01:00
97edd42fc0 Indent(), Unindent(): Allow passing negative values. 2017-12-07 21:14:25 +01:00
7f2b9ea4c0 Begin: Minor refactor following fcf652f8ee7267055e331bf7a0133ed477816f27. Merging the if (Collapsed) block with the main one. 2017-12-07 21:14:13 +01:00
8dcc1a8a20 Begin: Sizing fixes regarding uses SetNextWindowSize() on individual axises. 2017-12-07 21:14:00 +01:00
e045eddd77 Minor tweaks. Using ImGuiAxis defines. 2017-12-07 21:13:23 +01:00
92f7bd3605 Fixed 64-bit warnings. 2017-12-07 21:06:15 +01:00
cc2c023880 Fixed scrollbar issue, followup to beda5fc5a0 and 2df8fa95df. 2017-12-07 17:04:53 +01:00
e6215b6ca0 Merge branch 'master' into navigation + merge fix
# Conflicts:
#	imgui.cpp
2017-12-07 16:42:52 +01:00
3c9f9a455e Internals: Cleanup FindBestPopupWindowPos() to be more digestible, since we are bounds to rework the logic there. No functional changes intended. FIXED TYPO. 2017-12-07 16:36:07 +01:00
8959c64b33 Internals: Cleanup FindBestPopupWindowPos() to be more digestible, since we are bounds to rework the logic there. No functional changes intended 2017-12-07 13:29:14 +01:00
abe5ad3c7a Demo: Added display for IsMouseDragging() function. 2017-12-07 13:27:55 +01:00
94bf12f14b Demo: Display better mouse cursor info for debugging backends. 2017-12-07 13:27:49 +01:00
20c7aab60c Exposed GetOverlayDrawList(). (~#545, ~#530) 2017-12-07 12:49:52 +01:00
6deb865f78 Nav: Merge fix. 2017-12-06 17:48:28 +01:00
2fc6a82665 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-12-06 17:44:40 +01:00
8f41508c52 Begin: Move the code that update the Appearing flag above the BeginDocked() branch. 2017-12-06 17:42:28 +01:00
2fc9a2e6e7 Fixed nav branch merge issue. 2017-12-06 15:20:36 +01:00
beda5fc5a0 Fixed scrollbar enable/disable calculation when size is modified programmatically. This is the generalization of the fix in 2df8fa95df. 2017-12-06 15:13:45 +01:00
ecacaf7f2d Lower-right resize grip only appears when hovered. (#822) 2017-12-06 15:13:45 +01:00
3b7e4eaf38 Comments about ImGuiWindowFlags_ResizeFromAnySide. Removed hovering color. May need its own color. (#822) 2017-12-06 15:13:45 +01:00
531e559e49 Windows can be resized from their borders when ImGuiWindowFlags_ResizeFromAnySide is set. (#822) The interaction is currently unsatisfying because we can only reach a window from its inner rectangle (because of HoveredWindow filtering). 2017-12-06 15:13:45 +01:00
e103fe8c1f Tweak four-corners resize grip code. Added ImRect::FixInverted() helper. (#822) 2017-12-06 15:13:45 +01:00
90ae1c59c4 Added ImGuiWindowFlags_ResizeFromAnySide flag and code to resize from any of the 4 corners (only 2 corners enabled). (#822) 2017-12-06 15:13:45 +01:00
fe2cf231a8 Update README.md 2017-12-06 11:18:17 +01:00
729333293c Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-12-05 22:56:35 +01:00
0f119865a6 Comments about ImGuiWindowFlags_ResizeFromAnySide. Removed hovering color. May need its own color. (#822) 2017-12-05 22:53:58 +01:00
5686c72bbd Windows can be resized from their borders when ImGuiWindowFlags_ResizeFromAnySide is set. (#822) The interaction is currently unsatisfying because we can only reach a window from its inner rectangle (because of HoveredWindow filtering). 2017-12-05 22:47:20 +01:00
b9dc0caee3 Tweak four-corners resize grip code. Added ImRect::FixInverted() helper. (#822) 2017-12-05 22:44:52 +01:00
2ca4f9e862 Added ImGuiWindowFlags_ResizeFromAnySide flag and code to resize from any of the 4 corners (only 2 corners enabled). (#822) 2017-12-05 22:42:57 +01:00
364251146b Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-12-05 16:15:05 +01:00
77d1a4b636 Fixed a one frame glitch, when window claiming focus themselves on appear, the title bar wouldn't use the focused color on that frame. 2017-12-05 16:12:45 +01:00
16d9fa30b2 Merge branch 'master' into drag_and_drop 2017-12-05 09:21:07 +01:00
5f7cd7fb1c Internals: Splitter Behavior doesn't show a border. (#319) 2017-12-01 17:39:50 +01:00
be6384eb2a Style: Tweaked default WindowRounding value from 9 to 7 (#707) 2017-12-01 17:39:31 +01:00
c860a0a85c Internals: ImRect: Added IsFinite() helper. 2017-12-01 17:39:13 +01:00
aea3fe41b9 Style: Tweaks Dark and Light styles. (#707) 2017-11-30 23:15:55 +01:00
6ea744d8f4 Drag and Drop: Added DragSource from color square. Added DragTarget on ColorEdit4 widget. (#143) 2017-11-30 16:54:39 +01:00
81cbaef806 Merge branch 'master' into navigation 2017-11-29 23:49:17 +01:00
0d53c8d480 Demo: Console: Fixed incorrect positioning which was hidden by a minor scroll issue (this would affect people who copied the console code as is) 2017-11-29 23:48:32 +01:00
b513fdce48 Scrolling: SetScrollFromPosY() tweak to match change in a0d53fee81084a547bf21f46e736ea89f79fffb5 with similar desirable jump/discontinuity at each limit to skip the (ItemSpacing>WindowPadding) difference (followup to 0e5b64ecd2, #150) 2017-11-29 23:48:32 +01:00
c36e586cce Style, Scrolling: Fixed padding and scrolling asymetry where lower/right sides of a window wouldn't use WindowPadding properly + causing minor scrolling glitches. 2017-11-29 23:48:32 +01:00
a20fe279c5 Demo: Layout: Removed unnecessary BeginChild/EndChild calls 2017-11-29 23:48:32 +01:00
25c159fac8 Internals: Removed unnecessary duplicate scrolling code + added extra infos to Metrics window. 2017-11-29 21:10:59 +01:00
52e475230f Settings: Internals: Renaming. 2017-11-28 23:16:09 +01:00
2e1013a0c6 Settings: Internals: Simplifying code a bit. Creating Settings structure during first save. Windows where ImGuiWindowFlags_NoSavedSettings was late toggled will save settings correctly. (#1000) 2017-11-28 21:04:38 +01:00
7ae71e4984 Settings: Internals: Added FindSettingsHandler() 2017-11-28 21:04:38 +01:00
35eb5c5c99 Settings: Internals: Exposed FindWindowSettings(). Simplified some code. 2017-11-28 21:04:38 +01:00
963259d128 Settings: Internals: Renamed ImGuiSettingsWindow to ImGuiWindowSettings. 2017-11-28 21:04:38 +01:00
63712d5f5c Merge branch 'master' into drag_and_drop 2017-11-28 17:28:45 +01:00
9191b17218 Merge branch 'master' into navigation 2017-11-28 17:28:08 +01:00
4a43632163 Build fix 2017-11-28 17:27:54 +01:00
1a8a7c9d17 Settings: Import old style .ini file 2017-11-28 16:23:46 +01:00
c8b5b569da Examples: DirectX9: Call EndFrame(), fix for assert added in 9a44d447cd 2017-11-28 11:26:14 +01:00
e5ebe42207 Settings: Make ImGuiWindow settings always first in the list. 2017-11-28 10:49:43 +01:00
4c4f1b0224 ImVector: Added ImVector::push_front helper. 2017-11-28 10:49:43 +01:00
f3ec608c19 Settings: Initializing ImGuiSettingsWindow so external users don't end up with uncleared data. Exposed MarkIniSettingsDirty() in imgui_internal.h 2017-11-28 10:49:43 +01:00
e000ee0116 Examples: DirectX9: Handle loss of D3D9 device (D3DERR_DEVICELOST). (#1464) 2017-11-28 10:48:01 +01:00
7e2d0d734c Settings: basic refactor so that additional data structures can be loaded/saved. Parser/saver is still the minimum viable poor-man parsing. 2017-11-27 23:57:11 +01:00
d552cabd15 Settings: Internal renaming of structure and fields names. 2017-11-27 23:57:10 +01:00
77a310736d Horizontal mouse wheel support
This patch adds support for the horizontal mouse wheel in ImGui. It
affects windows that can be scrolled, as long as the Ctrl key is not
being pressed.

The scrolling speed has been set empirically so that it matches the
scrolling speed on the Firefox browser when the horizontal wheel is
used.

Internally, it adds a MouseHorizWheel to ImGuiIO, which is then used in
NewFrame to scroll the current window.

The SDL/GL2, SDL/GL3, GLFW/GL2 and GLFW/GL3 examples has been modified
to use it.
2017-11-27 20:59:05 +01:00
ade09b9e3c Settings: Basic internal refactor to have functions for saving from/to memory (not exposed) 2017-11-27 19:02:40 +01:00
532f564fd3 ImGuiTextBuffer: Renamed append() helper to appendf(), appendv() to appendfv(). Added reserve(). 2017-11-27 19:02:00 +01:00
0f955b818d Fixed DroidSans font link (#1460) 2017-11-26 11:44:52 +01:00
d9c5d72962 ImGuiStorage: Added BuildSortByKey() helper to rebuild storage from stratch. 2017-11-24 16:56:17 +01:00
46e994de4e Nav: Do not clear last navigation id stored in a hidden child window. (#787) 2017-11-24 16:55:57 +01:00
4e3c7f1557 Nav: Exposed NavInitWindow() in imgui_internal (#787) 2017-11-24 16:55:49 +01:00
f5c47faee8 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-11-24 16:55:31 +01:00
ef5dd30625 Sisyphus says: tweaked comments about not using old-style OpenGL examples (#1459, #1394 etc.) 2017-11-24 09:27:45 +01:00
6bd3b45b34 Sisyphus says: tweaked comments about not using old-style OpenGL examples (#1459, #1394 etc.) 2017-11-24 09:23:17 +01:00
6d3cfba834 Add Slider hover color just like Drag
I feel like there should be hover color options for each different control instead of the grouped frame color to make it usable for everyone. This also would not reduce performance as all controls already check for hover state as required by the ImGUI::IsHoveredItem() API.
2017-11-23 12:37:11 +01:00
7763ab3fcc Menu bar: better software clipping to handle small windows, in particular child window don't have the minimum constraint added in e9a7e73bba so we need to render clipped menus better. 2017-11-22 15:58:20 +01:00
06a32a2b00 Merge pull request #1455 from elect86/patch-3
Update imgui_draw.cpp, fixed light colors order
2017-11-22 13:21:33 +01:00
1b2ec35b8d Update imgui_draw.cpp 2017-11-22 12:58:11 +01:00
b618629d99 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-11-22 12:34:59 +01:00
7d09a0ae99 Menu bar: better software clipping to handle small windows, in particular child window don't have the minimum constraint added in e9a7e73bba so we need to render clipped menus better. 2017-11-22 12:33:59 +01:00
aafa6cece5 Tweak expression to be less weird (how did that ever happen?) 2017-11-22 11:26:16 +01:00
3141df1459 Merge pull request #1454 from elect86/patch-2
Tweak
2017-11-22 11:24:20 +01:00
21b456e567 Update imgui.cpp 2017-11-22 11:19:52 +01:00
68b26b4867 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-11-22 11:04:00 +01:00
176d8fbe74 Fixed unreferenced variable warnings. 2017-11-22 11:02:42 +01:00
302757447a Internals: Added SplitterBehavior(). (#319) 2017-11-20 19:41:17 +01:00
195abc3d17 Begin: Fix border size latch when rounding uses Child or Popup value. (#707) 2017-11-20 15:19:54 +01:00
2543807e56 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-11-20 13:54:06 +01:00
3f5b2a3fe3 Exposed ImDrawCornerFlags, replaced occurences of ~0 with an explicit ImDrawCornerFlags_All. Inversed BotLeft (prev 1<<3, now 1<<2) and BotRight (prev 1<<2, now 1<<3). 2017-11-20 13:53:16 +01:00
31683cfe34 ImDrawList::AddImageRounded: removed PrimDistributeUV declaration, fixed coding style, restored argument order from original PR. (#845) 2017-11-20 13:31:40 +01:00
3c5e64db78 Demo: Tweaked Image() code. 2017-11-20 13:30:25 +01:00
7f447c8270 Color picker: Tweak vertex shading code, since we aren't shading between PrimReserve and PrimVert the code can be expressed more naturally. (#346) 2017-11-20 13:16:57 +01:00
ba095f81a5 Merge branch '2016-08-rounded-image' of https://github.com/thedmd/imgui into thedmd-2016-08-rounded-image 2017-11-20 13:07:14 +01:00
8c0f2e4946 Added comment to help people dealing with 58345b11e1 breakage (#707) 2017-11-20 13:05:50 +01:00
e996286c38 Todo list update 2017-11-20 12:40:38 +01:00
79f07f6ff0 Add AddImageRounded() to ImDrawList 2017-11-19 21:56:46 +01:00
8b2d449b16 Add ShadeVertsLinearUV() 2017-11-19 21:56:36 +01:00
dc2768503f Fix for drag and drop branch. 2017-11-19 16:24:17 +01:00
92212b17aa Merge branch 'master' into drag_and_drop 2017-11-19 16:23:37 +01:00
9848a7023b Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_demo.cpp
2017-11-19 16:21:21 +01:00
28a31997b7 Style Editor: Simplified settings also show PopupBorderSize as a checkbox. (#707, #1019) 2017-11-19 16:03:42 +01:00
abbf836fd0 Style, Begin: removed ImGuiWindowFlags_ShowBorders window flag. Borders are now fully set up in the ImGuiStyle structure (see e.g. style.FrameBorderSize, style.WindowBorderSize). Use ImGui::ShowStyleEditor() to look them up. (#707, fix #819, #1031, ref #1019, ref #447) 2017-11-19 15:56:51 +01:00
c433bc971f Reorder fields for consistency. 2017-11-19 14:58:10 +01:00
f7fe824805 Style: Tweaked border settings to homogenize a little how they look over different backgrounds. (#707) 2017-11-19 13:55:38 +01:00
39137ccc3e Style: renamed ImGuiCol_ChildWindowBg to ImGuiCol_ChildBg. (#707) 2017-11-19 13:52:40 +01:00
022f8c2342 fixed incomplete replacement of unsigned short with ImWchar in interface of ImFont::FindGlyph 2017-11-19 12:44:23 +01:00
9886b09a0a Minor tweak, removed extraneous empty destructor. 2017-11-19 12:42:17 +01:00
e605f21797 TreePush with zero arguments was ambiguous. Resolved by making it call TreePush(const void*) 2017-11-19 12:36:14 +01:00
9a44d447cd NewFrame() now asserts if neither Render or EndFrame have been called. Exposed EndFrame(). Made it legal to call EndFrame() more than one. (#1423 etc.) 2017-11-19 12:06:45 +01:00
538a704143 NewFrame(): using literal strings in the most-frequently firing IM_ASSERT expression to increase the odd of programmers seeing them (especially those who don't use a debugger). 2017-11-19 12:00:07 +01:00
9289e8055c Merge pull request #1445 from franciscod/uninitialized_o3_werror
ImFontAtlas: Fix maybe-uninitialized warning.
2017-11-19 00:53:35 +01:00
4cdd998be8 Demo: Fix warning "format not a string literal and no format arguments" for over-zealous compilers settings. (#1450, #1451) 2017-11-19 00:49:23 +01:00
d323e8cca2 Fixed Style merge for nav branch (#707, #787) 2017-11-19 00:47:00 +01:00
d211a0e338 Merge branch 'master' into navigation (with style breakable)
# Conflicts:
#	imgui.cpp
#	imgui_draw.cpp
2017-11-19 00:39:37 +01:00
4022ada843 Merge branch 'master' into drag_and_drop 2017-11-19 00:36:32 +01:00
4daf377c9b Added comment about TextUnformatted(). (#1450) 2017-11-19 00:32:47 +01:00
8a7f03cbf9 Combo: Offset popup position by border size so that a double border isn't so visible. (#707) 2017-11-19 00:29:59 +01:00
d7af1a218e Style: Added PopupRounding setting. (#1112) 2017-11-19 00:29:29 +01:00
067605052d Fix IsItemHovered() returning true for non-title bar hidden items that are clipped due to window collapsing logic. Fix 27fd1b913b. (#823) 2017-11-19 00:29:29 +01:00
6f7b1bf2e1 Internals: Renamed ImGuiWindow::Accessed to WriteAccessed. 2017-11-19 00:29:29 +01:00
0e4f1df1a4 Style: Made changes to Classic style (!!!). Tweaked Dark style. (#707) 2017-11-19 00:29:29 +01:00
0a61b7195c Style: Added a default StyleColorsLight(). (#707) 2017-11-19 00:29:29 +01:00
e7e81b265d Demo: Tweaks. 2017-11-18 23:44:16 +01:00
58345b11e1 Style: Removed ImGuiCol_ComboBg in favor of combo boxes using ImGuiCol_PopupBg for consistency. (#707) 2017-11-18 23:44:16 +01:00
1c41603b31 Style Editor: Using local storage so Save/Revert button made some more sense without code passing its storage. Tweaked layout, added horizontal scroll bar, Fixed Save/Revert button to be always accessible. (fix #1211) 2017-11-18 23:44:16 +01:00
c1b5eab868 Style Editor: Sneakily adding a combo box to change colors (#707) 2017-11-18 23:18:18 +01:00
331eac511e Style: Dark: Tweaks + setting BorderShadow correctly. 2017-11-18 19:08:52 +01:00
29e0078b66 Internals: Window minor internal renaming + added WindowRounding latch. 2017-11-18 19:06:11 +01:00
bd4bc929ce Style: renamed style.ChildWindowRounding to style.ChildRounding, ImGuiStyleVar_ChildWindowRounding to ImGuiStyleVar_ChildRounding. 2017-11-18 18:28:21 +01:00
4e62118b61 Merge pull request #1448 from codecat/minor-fixes
Examples: DirectX: fix wrong comment in dx implementation headers
2017-11-18 14:22:53 +01:00
979fe30a6f Fix wrong comment in dx implementation headers 2017-11-18 13:56:59 +01:00
da2be7bbdc Style: ScaleAllSizes() helper rounds down every values so they are aligned on integers. 2017-11-17 21:29:37 +01:00
f5871c0b92 fix uninitialized atlas packing context 2017-11-16 21:45:21 -03:00
834fa52c8e Columns: Added ImGuiColumnsFlags_GrowParentContentsSize to internal API to restore old content sizes behavior. (#1444, #125) 2017-11-16 17:34:34 +01:00
7746dd104c Merge branch 'master' into drag_and_drop 2017-11-16 13:28:22 +01:00
44c590393c Merge branch 'master' into navigation 2017-11-16 13:28:10 +01:00
29d962069d Internals: Updating condition/allow flags with a function. 2017-11-16 13:28:01 +01:00
4ad414c8d4 Internals: Window: Store whether the windows has a close button (we need that info for window/tabs dropping preview calculation) 2017-11-16 13:23:50 +01:00
7c4be0a000 Internals: Added BringWindowToFront(), BringWindowToBack() helpers. 2017-11-16 13:11:49 +01:00
6817f3a3d9 Merge branch 'master' into navigation 2017-11-15 23:44:50 +01:00
e9a7e73bba Windows with MenuBar have a larger minimum height to avoid artefacts (I fixed most of the vertical/horizontal artefacts, but the ones in rounded corners were too hard to fix). 2017-11-15 23:42:18 +01:00
f36037b384 Menu: Fixed minor rendering issues on the right size with rounded window when resizing a window small. 2017-11-15 23:38:17 +01:00
9b82d9fbef Scrollbar: Minor graphical fix for when scrollbar don't have enough visible space to display the full grab. 2017-11-15 23:14:23 +01:00
f5bdf443c9 Minor comments, tweaks 2017-11-15 22:37:43 +01:00
5ea6e80da1 Make it possible to use SetNextWindowPos() on a child window. Useful internally. 2017-11-15 22:23:33 +01:00
5027311e7f Drag and drop: Standardizing payload types as defines. (#143) 2017-11-15 22:23:21 +01:00
44b761b308 Merge branch 'master' into drag_and_drop 2017-11-15 14:41:27 +01:00
27fd1b913b Made it guaranteed by API that after calling Begin() the last Item represent the title bar. (#823) 2017-11-15 14:35:45 +01:00
ae060b1d67 Merge branch 'master' into drag_and_drop 2017-11-15 10:24:54 +01:00
64031852de Merge branch 'master' into navigation 2017-11-14 23:17:58 +01:00
64e79035d5 Scrollbar flicker fix for menus/popups (fixes 4d00dd8326 and 2df8fa95df). Hopefully right this time. 2017-11-14 23:17:28 +01:00
6001d9c7a4 Columns: Clipping columns borders on Y axis on CPU because some GPU drivers appears to be unhappy with triangle spanning large regions (not sure why tbh). (#125)
Demo: Columns: Adding a billion of extra lines and using clipper.
2017-11-14 22:41:54 +01:00
0858c3d7cb Demo: Custom Rendering: Fixed clipping rectangle extruding out of parent window. 2017-11-14 22:21:38 +01:00
ffad688fc8 Drag and Drop: Added payload->IsPreview() to user can render their custom preview while handling overlapping drop targets. (#143) 2017-11-14 22:11:43 +01:00
852ece3a0e Fixed build (3e06450d27 not meant for master branch, but ok) 2017-11-13 16:04:03 +01:00
2275cb8b83 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-11-13 15:19:43 +01:00
3e06450d27 Internals: Added ArrowButton() helper. 2017-11-13 15:18:31 +01:00
7908cce25f Drag and Drop: Added internal BeginDragDropTargetCustom() convenient to avoid submitting dummy ItemAdd. (#143) 2017-11-13 15:17:41 +01:00
4d00dd8326 Fixed scrollbar flickering on/off when uncollapsing a window (fixes 2df8fa95df) 2017-11-13 15:15:48 +01:00
30bf40195b io.OptNoCursorBlink -> io.OptCursorBlink (#1427) 2017-11-12 16:06:44 +01:00
669498ff26 Added io.OptNoCursorBlink option to disable cursor blinking. (#1427). Renamed io.OSXBehaviors to io.OptMacOSXBehaviors. Should affect users as the compile-time default is usually enough. (#473, #650) 2017-11-12 16:03:09 +01:00
a1c736fa6a Update README.md 2017-11-11 18:22:00 +01:00
631bd8a9f8 Added bindings 2017-11-11 18:12:33 +01:00
161670418b Update documentation for extra fonts 2017-11-11 16:20:34 +01:00
9daac64ff8 Clean g.WindowsById storage on shutdown. 2017-11-11 10:01:50 +01:00
06075f20ba Merge branch 'master' into navigation 2017-11-10 11:42:08 +01:00
ba09de3a39 Begin: Fixed appending into a child window with a second Begin() from a different window stack querying the wrong window for the window->Collapsed test. 2017-11-10 11:38:01 +01:00
8451855a30 ButtonBehavior: Fixed ImGuiButtonFlags_AllowOverlapMode to avoid temporarily activating widgets on click before they have been correctly double-hovered. (#319, #600) 2017-11-09 20:20:02 +01:00
4b94738c7e Drag and Drop: Drop target rectangle goes out of clipping range (#143) 2017-11-09 20:18:17 +01:00
b1653cd361 Drag and Drop: Allow NULL payload (since type only can be useful). (#143) 2017-11-09 20:18:05 +01:00
a297cbafdb Merge branch 'master' into navigation 2017-11-08 23:17:14 +01:00
2df8fa95df Fixed vertical scrollbar flickering/appearing, typically when manually resizing and using a pattern of filling available height (e.g. full sized BeginChild). THIS IS A GREAT FIX, this glitch was nasty and annoying (and yet somehow nobody reported it?). Hopefully haven't broken anything else... 2017-11-08 23:17:08 +01:00
a4cc3d4637 Minor tweaks/comments. Note that the reordering the one subtraction caused subtle havoc before the patch in 9ac8820ee2. 2017-11-08 22:36:31 +01:00
9ac8820ee2 Fixed non-pixel aligned bounding box of window resize grip, / which triumphally led to any re-arrangement of operations inside the resize grip code outputting non-exact size_target values which led to unstable window position because clamping code uses size in a subtraction, etc etc. Lovely how a whole system can be made to act weird with a single bad input. 2017-11-08 22:32:22 +01:00
b6504b8eee Drag and drop: Handle overlapping drag target priorities given their surface, which appears to make most sense for drag and drop operations. 2017-11-08 15:47:52 +01:00
2ab27be3de Child window with MenuBar use regular WindowPadding.y so layout look consistent in child or in a regular window. 2017-11-07 22:23:20 +01:00
41862b8c0e ButtonBehavior: Fixed ImGuiButtonFlags_NoHoldingActiveID from incorrectly setting ActiveIdClickOffset, which probably have no known effect, but it is more correct this way. (#1418) 2017-11-07 16:41:58 +01:00
aae52522c3 Internals: Remove requirement to define IMGUI_DEFINE_PLACEMENT_NEW (#1103) 2017-11-07 14:06:02 +01:00
1870738880 LowerBound() minor tweaks 2017-11-07 14:05:48 +01:00
571b08f315 Internal: FindWindowByName() faster and doesn't touch every windows 2017-11-07 13:59:55 +01:00
8e6adc78af Examples: Constrained Resize: Added more test cases (for #1417) 2017-11-07 11:38:39 +01:00
2c7ba21417 Fixed auto-resize allocating too much space for scrollbar when SizeContents is bigger than maximum window size (fixes c0547d358d) (#1417) 2017-11-07 11:37:38 +01:00
0d4c320f88 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
#	imgui_draw.cpp
2017-11-06 23:58:28 +01:00
f0b4097c54 Begin: Simplified code and fixed a bug where appending into a window a second time (from a remote window) would incorrectly overwrite RootWindow with the current window in the stack. Our docking code uses this pattern. 2017-11-06 23:55:40 +01:00
de1e7dc088 Drag and Drop: Moved internal fields out of public sight. (#143) 2017-11-06 20:04:10 +01:00
8b725c94cb Drag and Drop: Rework internal to allow overlapping targets (#143) 2017-11-06 19:39:23 +01:00
16a5da9521 RenderTriangle() minor tweak to align Left/Right and Up/Down arrow extents visually 2017-11-03 20:20:25 +01:00
553bdeedf7 Drag and Drop: Made it legal to not call SetDragDropPayload() between BeginDragDropSource() and EndDragDropSource(). (#143) 2017-11-02 18:30:46 +01:00
3461a2f296 Merge branch 'master' into drag_and_drop 2017-11-02 18:06:04 +01:00
982ce50b37 IsWindowHovered() returns true when moving window (#1382, #1404) 2017-11-02 16:44:32 +01:00
ff4d4ca651 IsWindowHovered(): Added ImGuiHoveredFlags_FlattenChilds flag. Made IsRootWindowOrAnyChildHovered() obsolete in favor of IsWindowHovered( ImGuiHoveredFlags_FlattenChilds) (#1382, #1404) 2017-11-02 16:44:24 +01:00
803ac3a5c6 IsWindowHovered() Fix behavior when an item is active to use the same logic as IsItemHovered() (#1382, #1404) 2017-11-02 16:23:03 +01:00
1e7cc23867 Merge branch 'elect86-patch-1' 2017-11-02 10:41:31 +01:00
2a3a25e792 Reordered fields in other Style functions (#1409) 2017-11-02 10:41:21 +01:00
c547b97e4e Merge branch 'patch-1' of https://github.com/elect86/imgui into elect86-patch-1 2017-11-02 10:40:01 +01:00
78f9511f4d Merge pull request #1410 from elect86/master
Fixed a comment
2017-11-01 17:58:42 +01:00
6fb43f2011 Update imgui.h 2017-11-01 17:56:03 +01:00
66f42324ad Drag and Drop: Added ImGuiDragDropFlags_SourceNoHoldToOpenOthers flag. 2017-11-01 17:25:42 +01:00
db190c16f6 Update imgui_draw.cpp 2017-11-01 16:48:56 +01:00
63f6f2dd13 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-11-01 15:09:23 +01:00
fba704bf5d Examples: Added a bunch of comments/referencs related to io.WantCaptureMouse, io.WantCaptureKeyboard (#1262, #1237, #1219, #635, #1058, #1051, #912, #533, #703, #446, #459, #364, #213, #52, and more) 2017-11-01 14:24:09 +01:00
59323b54da Demo: Comments (#1408) 2017-11-01 12:57:12 +01:00
6ab20ff9bf Minor tweaks to the user guide. 2017-11-01 12:33:58 +01:00
e55caf0b95 Merge pull request #1402 from elect86/patch-1
Minor fix typo
2017-10-30 09:51:49 +01:00
7f06d385a1 Added assertions and comments for incorrect use/understanding of IsWindowFocused() etc. functions 2017-10-30 09:50:54 +01:00
9e3f9fc2dd Update imgui.cpp 2017-10-30 09:35:42 +01:00
5956fff7e2 Drag and Drop: ImGuiButtonFlags_PressedOnDragDropHold focuses the target window. 2017-10-30 00:10:05 +01:00
a810619555 Drag and Drop: Added support for drag and drop hold-long-to-open for CollapsingHeader() and TreeNode(). Open only! 2017-10-30 00:03:04 +01:00
1d7d8f8574 Merge branch 'master' into drag_and_drop 2017-10-29 23:49:24 +01:00
b13d281356 Maintaining ActiveIdTimer and HoveredIdTimer (the later is useful for drag and drop, both will be of course for creators of custom widgets) 2017-10-29 23:49:01 +01:00
d46772b429 Comments 2017-10-29 23:14:17 +01:00
0e775807b4 Drag and Drop: Added a mechanism to allow widgets with no identifiers (such as Text/Image) to be used with BeginDragDropSource() given the explicit ImGuiDragDropFlags_SourceAllowNullID flag. 2017-10-29 23:10:44 +01:00
acf78da742 Drag and drop: moved to imgui.h 2017-10-29 21:37:14 +01:00
b5f714e9f9 Drag and Drop: made BeginDragDropSource() clear the IsItemHovered() by default, added a flag to keep it. 2017-10-29 21:31:49 +01:00
c5536e49ef Drag and drop API experiment 2017-10-29 21:15:02 +01:00
fd88bc270a Merge branch 'nProtect-master' 2017-10-29 11:29:21 +01:00
53f9e28c77 GetGlyphRangesThai(): removed extraneous codepoints (#1396) 2017-10-29 11:28:29 +01:00
ae3dc66214 Merge branch 'master' of https://github.com/nProtect/imgui into nProtect-master 2017-10-29 11:24:25 +01:00
f793562b4e TODO 2017-10-29 11:23:38 +01:00
36f00811b9 Examples: Comments to guide people unfamiliar with the librairies used. 2017-10-28 19:28:22 +02:00
cb38caeda4 Examples: Added more comments near the fonts loading section, to catch common questions and errors (e.g. #1397, #1366, #1341, #1222, #1193, #1115, #951, etc.) 2017-10-28 18:21:44 +02:00
3185a3a697 Add missing thai punctuations 2017-10-28 16:59:39 +07:00
17dd8e7c30 Merge branch 'master' into navigation 2017-10-27 23:01:54 +02:00
b9ebb34a04 Nav: ColorButton: Fixed a case of not using local 'hovered' flag directly, messes with some of my drag and drop work, and I can't find/understand the reason why this was left as is (there _was_ a reason at the time but it appears to be obsolete now?) 2017-10-27 20:54:48 +02:00
f962ca0b01 ColorTooltip: Resize ColorButton to align better with text, now that ColorButton provides a text baseline (0260fdd1c6) 2017-10-27 20:36:51 +02:00
d55b69ad6e Styles: Nav tweaks. 2017-10-27 20:06:45 +02:00
edafbcd630 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-10-27 20:04:51 +02:00
c503a50cff Styles: Moved Classic colors code to imgui_draw.cpp. Sneakily added a StyleColorsDark() function. 2017-10-27 20:01:30 +02:00
77df1ba9e0 Version 1.53 WIP 2017-10-27 19:54:56 +02:00
b422f35872 IO: Tracking extra mouse dragging data which is convenient for implementating various manual drag and drop patterns. 2017-10-27 18:21:30 +02:00
c0b366b316 Merge branch 'master' into navigation
# Conflicts:
#	imgui.h
2017-10-27 17:27:53 +02:00
9f200d10d5 Version 1.52 2017-10-27 17:10:41 +02:00
cc78e9a213 Merge branch 'master' into navigation 2017-10-27 16:46:03 +02:00
267ea506de Begin: Fix for unused "Debug" (fix for 3b83cd24f5 ) 2017-10-27 16:45:56 +02:00
5afee1c6f3 Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2017-10-27 16:42:06 +02:00
8dd7648db2 Comments 2017-10-27 16:41:22 +02:00
ccdb58b17e Internal: Added ImVec4 operators 2017-10-27 16:40:04 +02:00
3b83cd24f5 Begin: Moved some code inside of the big if (first_begin_of_the_frame) scope 2017-10-27 16:39:55 +02:00
3656f2c769 NewFrame: Allow MovedWindow setting the ImGuiWindowFlags_NoInputs after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. 2017-10-27 16:39:23 +02:00
a6edd10ee6 NewFrame: Removed unnecessary call to FindHoveredWindow() and simplified code (went through this multiple times, hopefully haven't broken anything) 2017-10-27 16:38:14 +02:00
6243252d5a Internal: BeginTooltipEx() in imgui_internal.h 2017-10-27 16:21:12 +02:00
f10a1d7b9e Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-10-27 15:53:59 +02:00
d42f6bb6cc Merged a bit of code from Navigation branch to ease further merging (InnerRect is currently not required in the Master branch) 2017-10-27 15:52:45 +02:00
c432fcf2bb Minor renaming. 2017-10-27 12:01:52 +02:00
a6ff14d66e Exposed IM_ARRAYSIZE() in imgui.h 2017-10-26 16:12:53 +02:00
c5027d4fa1 Examples: Extra clarification for the 100th person who insist on using the OpenGL2 code in spite of existing documentation leaning against it. (#1394) 2017-10-25 20:55:15 +02:00
549f9e3f03 Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2017-10-25 16:37:10 +02:00
daef33e268 Comments about mouse setup and clearing HoveredWindow when mouse down isn't owned by imgui (will affect some future hovered test and drag'n drop patterns) (#143, #1382, #1392) 2017-10-25 11:01:41 +02:00
4faf99eff5 Added most basic form of Disabled flag to disable interactions (but visuals aren't altered), in imgui_internals.h, undocumented/unsupported (#211, #1012) 2017-10-25 09:28:54 +02:00
fc25881207 Merge branch 'master' into navigation 2017-10-24 21:13:24 +02:00
efcd53a0c3 Removed direct dependency on sprintf() in imgui.cpp (#1038)
(NB: imgui_demo stills uses it)
2017-10-24 20:57:41 +02:00
1f3372b7f1 ImFormatString, ImFormatStringV(): clarifying specs so that passing a NULL buffer should return the desired length. (#1038) 2017-10-24 20:48:29 +02:00
8fd5620277 Renamed IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS to IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS for consistency. (ref #238, #520, #738) 2017-10-24 20:23:42 +02:00
7d2cd0e6ff Added IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS support in imconfig.h (#1038) 2017-10-24 20:19:32 +02:00
70cb427469 Add missing CloseClipboard call 2017-10-24 20:12:42 +02:00
bc447bc0a4 ImFontAtlas: Fixed memory leak if stbtt_InitFont() returned false. (#1391) 2017-10-24 16:08:05 +02:00
d513546325 Merge branch 'master' into navigation 2017-10-24 15:49:01 +02:00
5b062c4c29 Fixed typos 2017-10-24 15:26:04 +02:00
d2c65aa3e8 Examples: DirectX9/10/11: Tweak usage of SetCapture/ReleaseCapture. (#1375)
ps: DirectX 12 example (#302) may want to adopt that as well.
2017-10-24 14:48:00 +02:00
0260fdd1c6 ColorButton: As a small convenience, provide a text baseline. 2017-10-24 14:38:32 +02:00
e9ff7162bc ColorButton: Fixed rendering color button with a checkerboard if the transparency comes from the global style.Alpha and not from the actual source color. 2017-10-24 10:43:41 +02:00
de72e9cc87 Internals: ImLerp() helper for ImVec4 2017-10-23 17:22:00 +02:00
f6ff373b22 Nav: #define IMGUI_HAS_NAV to ease sharing code across branches of imgui 2017-10-23 14:54:23 +02:00
97bf2131e2 Fixed calling SetNextTreeNodeOpen() on a collapsed window leaking to next frame. 2017-10-23 14:37:47 +02:00
20983773f1 Nav: MainMenuBar now releases focus when user gets out of the menu layer. WindowingTarget when applying focus to a window with only menus automatically sets the layer. (#787)
This is enough for basic mouse/gamepad usage, but 1- previous window gets an unfocused title bar color temporarily, 2- generaly for gamepad and especially keyboard we need much more to get this done right
2017-10-23 12:38:39 +02:00
025d4f0c97 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-10-23 12:34:46 +02:00
e7922b3fa0 Factorized some code (+ declared as static function without namespace, a pattern with the Nav branch has started to use) 2017-10-23 12:34:15 +02:00
2ef2c104a1 Begin: Minor tweaks 2017-10-23 11:36:43 +02:00
be12f8c55d Nav: Fixed handling of ImGuiNavInput_KeyMenu so it doesn't set g.NavWindowingTarget at all, reducing size effects + handling menu layer toggle on Alt Release (#787) 2017-10-23 11:26:52 +02:00
6f0aa766e1 Nav: Added internal ImGuiNavReadMode_Released test for key releases. 2017-10-23 11:26:30 +02:00
d769e2515a Merge branch 'master' into navigation 2017-10-23 10:05:36 +02:00
50f5be9266 Examples: GLFW+GL2/GL3: Minor tweaks, comments. 2017-10-23 10:04:38 +02:00
d6a9956781 Examples: DirectX9/10/11: Added WM_SYSKEYDOWN / WM_SYSKEYUP handlers so e.g. VK_MENU can be read. 2017-10-23 10:01:18 +02:00
c14a66970b Examples: DirectX9/10/11: Renamed WndProc handler to use a generic Win32 name + returning 0 to all messages is more correct. 2017-10-23 09:57:59 +02:00
cb10da02f9 Merge branch 'Gargaj-patch-1' 2017-10-23 09:47:49 +02:00
a96f095deb Examples: DirectX10, DirectX11: Using SetCapture/ReleaseCapture to get correct behavior (#1375)
ps: DirectX 12 example (#302) may want to adopt that as well.
2017-10-23 09:46:49 +02:00
3e0765ee22 Examples: DirectX9: Using SetCapture/ReleaseCapture to get correct behavior (#1375) 2017-10-23 09:43:30 +02:00
e03198bb0f Fixed compilation for #1375 + coding style fixes. 2017-10-23 09:43:30 +02:00
c36e7fae93 Merge branch 'patch-1' of https://github.com/Gargaj/imgui into Gargaj-patch-1 2017-10-23 09:07:01 +02:00
1bc1751670 MenuItem(): Tweaks to mimic exact spacing of BeginMenu() when inside a menu bar, which is a little misleading imho but may be useful. (#1387) 2017-10-22 10:56:37 +02:00
b177f2432d MenuItem(): Tweak to not draw over all horizontal space when in horizontal layout mode. (#1387) 2017-10-22 10:36:22 +02:00
b52e207758 Merge branch 'inolen-atlas_build_clear_font' 2017-10-22 10:25:08 +02:00
7f880674e5 Font: Renamed ImFont::Clear() to ImFont::ClearOutputData() for consistency with what ImFontAtlas does. DisplayOffset is set by constructor but not reset by ClearOutputData. (#1349) 2017-10-22 10:24:56 +02:00
fce41d0b55 Demo: Fixed Fonts "set as default button" not having collading id on collapsed nodes. 2017-10-22 10:21:49 +02:00
08e411c310 Merge branch 'atlas_build_clear_font' of https://github.com/inolen/imgui into inolen-atlas_build_clear_font 2017-10-22 10:17:28 +02:00
5fa81f2a26 Nav: Added ImGuiNavInput_KeyMenu aside from ImGuiNavInput_PadMenu as it is one differenciator between pad and keyboard that's very annoying with the keyboard.
Remove the move/resize behavior that appears than holding the button for a while. (#787)
2017-10-20 22:12:10 +02:00
1c5b3fb1d2 Merge branch 'master' into navigation 2017-10-20 21:17:57 +02:00
f7259e60ee Comments 2017-10-20 21:17:51 +02:00
23b9060468 Nav: Honoring ImGuiItemFlags_NoNav which is used by color picker (#787) 2017-10-20 20:35:39 +02:00
e4bb9102f9 Merge branch 'master' into navigation 2017-10-20 20:32:17 +02:00
6ab737a4bb Popups: Fixed right-click to close popups not handling modal windows properly. (~#439) 2017-10-20 20:31:01 +02:00
aca23fd3f0 Popups: similarly to previous commit, we fix reopening a popup within a popup stack from truncating the whole stack. This is done by properly refocusing the lower level popup. (~#439) 2017-10-20 19:25:34 +02:00
59a89774d7 Popups: fixed CloseInactivePopups() so that right-clicking to close one level of popups in a popups stack won't close the whole stack. This is done by properly refocusing the lower level popup. Fixes 87ae40843c (~#439) 2017-10-20 19:24:12 +02:00
43df7eb5ea Added OpenPopupOnItemClick(); helper which mimic BeginPopupContextItem() but doesn't do the open.
Made the color popups uses this standard function so they handle reopening a context menu.
2017-10-20 18:56:31 +02:00
0ea66dc260 Fixed bad merge from Master 2017-10-20 18:16:53 +02:00
1172ff62e1 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
#	imgui_demo.cpp
#	imgui_internal.h
2017-10-20 18:10:07 +02:00
3cc10d25a9 BeginPopupContextItem(), BeginPopupContextWindow(): Using newly introduced IsItemHovered() flags to allow reopening another context menu (over same or not same item) with right-click. (#439) (+1 squashed commits) 2017-10-20 18:02:52 +02:00
695ea45fca IsWindowHovered(): Changed default behavior to now return false is a widget from another window is active + Added support for ImGuiHoveredFlags_AllowWhenBlockedByActiveItem. (relate to drag'n drop idoms: #143) 2017-10-20 17:59:48 +02:00
564ff2dfd3 IsItemHovered(), IsWindowHovered(): added flags to enable various and more specific behavior. Will enable improvements for popups/context menus and drag'n drop. (relate ~#439, #1013, #143, #925)
The legacy confusing IsItemRectHovered(), IsWindowRectHovered() can be completely removed now.
Changed IsWindowHovered() behavior with default parameter: it now return false is the window is blocked by a popup.
Demo: Added tests for those two functions.
2017-10-20 17:52:22 +02:00
d29a6a5a5a Moved IMGUI_DISABLE_OBSOLETE_FUNCTIONS block lower in the imgui.h file so obsolete functions can use flags. Also sane to quarantine them outside of the respectable area. 2017-10-20 17:29:52 +02:00
e6f06627e9 Made the ImGuiWindowFlags_NoMove flag inherited from parent to child, so in a setup with RootWindow (no flag) -> Child (NoMove flag) -> SubChild (no flag) user won't be able to move the root window by clicking on SubChild. (#1381) 2017-10-20 16:13:13 +02:00
3b485cda51 Fixed a bug allowing to move a _NoMove window from a child that doesn't have the flag. (#1381)
broken by e56eba44fe (#1337)
2017-10-20 16:09:24 +02:00
87ae40843c Popups: popups can be closed with a right-click anywhere, without altering focus under the popup.(~#439) 2017-10-20 13:26:39 +02:00
853018dd4d Popups: Fixed a bug introduced in 1a35766356 which made the BeginPopupContextXXX functions create popups without border. (nb: all that border mess is going away in styling clean up) 2017-10-20 13:21:42 +02:00
5f7299e15a Refactor EndFrame() code that process focusing window with left mouse button. This commit should be no-op. 2017-10-20 13:07:57 +02:00
2a32a2e662 Demos: Tweaks of popups/context/menus section. 2017-10-20 12:38:48 +02:00
e384078d7a IO: reordering some supposedly private fields. 2017-10-19 22:49:36 +02:00
51eed2f257 Merge branch 'master' into navigation 2017-10-19 19:42:27 +02:00
5b699517d4 Internals: PaintVerts** renamed to ShadeVerts**, moved to imgui_draw.cpp and exposed in imgui_internal.h (+1 squashed commits) 2017-10-19 19:42:19 +02:00
22977ffedb Documentation: Extra comments + tweaks to make usage of long-line more bearable. 2017-10-19 19:30:46 +02:00
d3c2e904d8 Internals: Added ImLinearSweep() helper. 2017-10-19 19:29:59 +02:00
938f1b720f Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-10-19 00:04:53 +02:00
370a48c10b Internals: RenderCollapseTriangle() -> RenderTriangle(), takes a ImGuiDir 2017-10-18 23:46:16 +02:00
073dd60b4b Merge branch 'master' into navigation 2017-10-18 19:55:34 +02:00
a03093b2d4 CollapsingHeader(bool*) variant: fixed for IsItemHovered() to work properly in the nav branch.Basically the close button now has to use ItemAdd() to be navable into, which overwrite the IsItemHovered data. (#600, #787) 2017-10-18 19:55:08 +02:00
29a652adee CollapsingHeader(bool*) variant: fixed for IsItemHovered() to work properly in the nav branch.Basically the close button now has to use ItemAdd() to be navable into, which overwrite the IsItemHovered data. (#600, #787) 2017-10-18 19:51:32 +02:00
a126c702d9 Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2017-10-18 13:09:28 +02:00
ef3f87eec5 Internals: ButtonBehavior: made ImGuiButtonFlags_PressedOnClick and ImGuiButtonFlags_PressedOnDoubleClick set the click offset correctly + hold on g.ActiveId so Held state can be reported. Added ImGuiButtonFlags_NoHoldingActiveId flag to disable the later. 2017-10-18 13:08:25 +02:00
1c4af303bf Internals:Helpers: Added ImSwap(int,int), exposed ImStrncpy(). 2017-10-18 13:08:14 +02:00
bf778ebb7e Checkbox: Using checkmark. MenuItem: Tweaked checkmark, thicker. 2017-10-18 13:06:49 +02:00
d96b6ecf88 Merge branch 'master' into navigation
# Conflicts:
#	imgui_demo.cpp
2017-10-17 16:20:35 +02:00
03b76bf05b Begin: Marked 5 parameters version of Begin() as obsolete. Now waiting for a riot to happen! 2017-10-17 16:19:21 +02:00
78a85ba3fe Begin: Work toward obsoleting the 5-arguments Begin() overload. Internal BeginEx() becomes the normal public Begin() again! (4) 2017-10-17 16:15:46 +02:00
2739b6ebcd Begin: Work toward obsoleting the 5-arguments Begin() overload. Removed bg_alpha from internal BeginEx(). (3) 2017-10-17 16:14:20 +02:00
4aa9d2089d Begin: Work toward obsoleting the 5-arguments Begin() overload. Removed size_on_first_use from internal BeginEx(). (2) 2017-10-17 15:51:20 +02:00
55d873875e Begin: Work toward obsoleting the 5-arguments Begin() overload. (1) 2017-10-17 15:47:55 +02:00
839067fda9 Capture/release window in DX9 implementation
This helps a lot when the user drags a slider but carries the cursor offscreen before releasing the button - without the capturing, the slider will "stick" to the mouse cursor even after the button has been released. (This should generally be added to all Windows implementations - I won't mind doing it if you think it's a good idea.)
2017-10-17 12:37:21 +02:00
1a35766356 BeginPopupContextItem() now supports a NULL string identifier and uses the last item ID if available. For interactive items (that have an ID) this works! For non interactive items we assert. 2017-10-16 23:37:12 +02:00
c76f014292 Fix IsItemHovered() issue on child by temporarily reverting 344d48be31. This is not the ideal solution. (Fix #1370) 2017-10-16 16:41:09 +02:00
af565ea828 Nav: InputTextMultiline: Fixed navigation/selection. Disabled selecting all when activating a multi-line text editor. (#787) 2017-10-16 02:41:28 +02:00
7ea52ac1e4 Nav: InputTextMultiline: Fixed navigation/selection. Disabled selecting all when activating a multi-line text editor. (#787) 2017-10-16 02:30:59 +02:00
82a27fd3aa Nav: InputText: Fixed using Up/Down history callback feature when Nav is enabled (#787) 2017-10-16 02:06:42 +02:00
b70c2fa887 Nav: Internals: Moved some internal code to namespace, comments 2017-10-16 00:46:23 +02:00
ae1866c424 Nav: NavProcessItem() updates current NavLayer. Basically we're hearing toward rebuilidng nav info from an id. (#787). 2017-10-16 00:38:42 +02:00
97851f7376 Nav: NavProcessItem() computes window-relative rectangle using own Window rather than NavWindow. Not sure what it may mean for child-flattened-nav (disabled). (#787) 2017-10-16 00:36:31 +02:00
7d14262202 Nav: SetFocusID() update NavWindow and NavRectRel just as we get them. Needed by upcoming commit, committing separately as I'm curious if it has any side-effect. (#787) 2017-10-16 00:33:30 +02:00
633f60cdb2 Update README.md 2017-10-15 21:30:06 +02:00
83416fa5da Merge branch 'master' into navigation 2017-10-15 21:28:17 +02:00
e32569dd5a ImDrawList: Fixed a bug in ChannelsMerge() leading to an extraneous draw call being created, which unexpectly led to more dramatic condition but to faulty draw command merging code. (#1172, #1368) 2017-10-15 21:07:22 +02:00
bebc49bc2a Merge pull request #1368 from ripieces/rendering-issue-1172
ImDrawList: Merging issue fix.
2017-10-15 21:07:05 +02:00
7a8eb5bdc9 Rendering issue fix
Fixes ocornut/imgui#1172
2017-10-15 19:27:53 +02:00
d761825cfb Nav: Renaming a field + Comments. 2017-10-15 17:57:15 +02:00
ce7b04e8b9 Removed apparently unncessary code in InputFloatN() and InputInt(). 2017-10-13 23:59:17 +02:00
251bc6c22c Update README.md 2017-10-13 21:29:31 +02:00
b498856c9d Update README.md 2017-10-13 20:05:50 +02:00
dbab9b248a Update README.md 2017-10-13 20:03:56 +02:00
db5f1b79cd Nav: ButtonBehavior() keep _displaying_ NavId item as howered when refocusing or moving window, which is consistent with IsItemHovered() and reduce noise/flicker (#787) 2017-10-13 19:18:59 +02:00
c42baf392a Reluctantly exposed GetActiveID(), GetHoveredID() in imgui_internal because the demo code will need it. 2017-10-13 16:48:14 +02:00
53780a4fcc Nav: Shallow tweaks. 2017-10-13 16:23:44 +02:00
f852b9a52a Exposed Scrollbar() in imgui_internal.h and removed a bool arg 2017-10-13 13:31:34 +02:00
b667d5a9e7 Nav: Internals: Renamed ImGuiButtonFlags_NoNavOverride to ImGuiButtonFlags_NoNavFocus + fixed a theorically missing test in ButtonBehavior() (#787) 2017-10-13 13:31:34 +02:00
0371219222 Nav: Internals: Renamed SetActiveIDNoNav -> SetActiveID() and old SetActiveID() -> SetFocusID(), both functions needs to be called when both are desirabled. (#787)
May break code relying on imgui_internal.h, relying on nav and not calling ButtonBehavior().
2017-10-13 13:31:34 +02:00
8b095e483b Internals: Moved SetNavID() and renamed casing to be consistent with stuff exposed in imgui_internal.h 2017-10-13 13:31:34 +02:00
4be967823f Exposed Scrollbar() in imgui_internal.h and removed a bool arg 2017-10-13 13:30:28 +02:00
48498b337d Internals: SetActiveID window cannot be NULL 2017-10-13 13:07:07 +02:00
4548bcb5c9 Nav: commiting shallow bits to reduce noise from working copy/upcoming commit. 2017-10-12 02:09:13 +02:00
17519c313a Nav: Extract part of NavUpdate() into a saner NavUpdateWindowingTarget() (#787) 2017-10-11 20:47:41 +02:00
b05b31e690 Nav: Made NavWindow always refresh from NavId so we can lazily retrieve the window for user functions that don't have it. This is not required by current commit but I'd rather test it earlier. Idea: eventually if we switch to 64-bit identifiers we could reserve e.g. 20 bits to store a simplified window identifier so we can always retrieve a window from an id. (#787) 2017-10-11 20:37:45 +02:00
f0d437dd9c Nav: SetActiveId() uses SetActiveIDNoNav() to avoid duplicating logic. (#787) 2017-10-11 20:29:53 +02:00
2047c58efb Nav: Extract part of NavUpdate() into a saner NavScrollToBringItemIntoView() (#787) 2017-10-11 20:28:16 +02:00
7a14d7dfdc Nav: More consistently drawing a (thin) navigation rectangle hover filled frames such as tree nodes, collapsing header, menus. (#787) 2017-10-11 19:05:36 +02:00
3833f1f7a2 Merge branch 'master' into navigation 2017-10-11 15:38:33 +02:00
43b4a81b3e Rnamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete). 2017-10-11 15:36:57 +02:00
578a588c1d Links 2017-10-11 15:26:35 +02:00
4cfec4813e Links 2017-10-11 15:24:54 +02:00
c6e370a77a TreeNode: Added ImGuiTreeNodeFlags_FramePadding flag 2017-10-11 15:16:11 +02:00
69dd895358 Nav: Renaming NavInitDefaultRequest -> NavInitRequest 2017-10-06 15:54:29 -07:00
4d83078885 Nav: Moving code next to its peers 2017-10-06 15:50:32 -07:00
d2975115cd Nav: Caching into g.NavAnyRequest to minimize hot path cost (and so we can add many more request sources) 2017-10-06 15:14:28 -07:00
d91b093be6 Nav: Minor tweaks in NavProcessItem() used by ItemAdd() 2017-10-06 14:56:25 -07:00
c3105919ba Nav: Minor tweaks also toward removing processing from ItemAdd() 2017-10-06 14:51:15 -07:00
d16309ca77 Internal: ItemAdd() minor shallow tweaks 2017-10-06 14:40:53 -07:00
64ce83b9ed Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-10-06 14:27:29 -07:00
042153d254 Internal: ItemAdd(), IsClippedEx(): removed unnecessary indirection for ID parameter 2017-10-06 14:23:18 -07:00
acb6f12d2c Removed extraneous calls to GetCurrentWindowRead() when we already have a ImGuiContext. Internal RenderXXX functions also don't need to write into the Accessed field at all. 2017-10-06 11:48:07 -07:00
6e1199c603 Merge branch 'master' into navigation 2017-10-06 11:24:58 -07:00
335c8dd159 Comments (clarifying whether types are to be considered as flags or regular, non combinable enums) 2017-10-06 11:23:08 -07:00
f451785c9e Nav: Shuffled code in ItemAdd() so that NavProcessItem() may have access to LastItemId (will be required by tabbing) 2017-10-06 10:17:01 -07:00
e12cfa9dfd Nav: Minor midying up and comments, 2017-10-06 09:44:50 -07:00
40df7a5155 Nav: Removed possibly redundant test prior to calling NavProcessItem() from ItemAdd() 2017-10-06 09:40:13 -07:00
a77dd02e8a Nav: Moving code next to its peers 2017-10-05 22:06:46 -07:00
f5bd4663dd Nav: Moving the big chunk of code from ItemAdd() to NavProcessItem() 2017-10-05 22:02:13 -07:00
59c6f35bf6 Added ActivateItem(), GetItemID() functions. 2017-10-05 21:34:01 -07:00
80c4e2fe7b Nav: Tidying up activation mechanism so that setting NavActivateId can trigger buttons. 2017-10-05 21:27:08 -07:00
2f27b733be Nav: Fixed uninitialized context variables for sanity. 2017-10-05 18:33:40 -07:00
518f02f4de Demo: better demo for SetKeyboardFocusHere() 2017-10-05 18:10:59 -07:00
d851775c80 ColorButton: Reduced bordering artefact that would be particularly visible with opaque Col_FrameBg and FrameRounding enabled. 2017-10-05 17:55:27 -07:00
f2c9bd8d4f Nav: Fixed uninitialized context variables for sanity. 2017-10-05 16:39:59 -07:00
726dcf0dd2 TextUnformatted(): minor tweak 2017-10-05 11:03:38 -07:00
a0d724b450 Made AlignFirstTextHeightToWidgets() saner and faster (still disliking its name very much!) 2017-10-05 11:02:23 -07:00
a3d0755181 Merge branch 'master' into navigation 2017-10-05 10:31:37 -07:00
f326fac64a Nav: Menus and popups now have move request wrap around vertically (using the move request forward thing added recently). (#787) 2017-10-05 10:29:17 -07:00
a8788e51a7 SetKeyboardFocusHere() added assert to prevent passing values smaller than -1 as we may have to outlaw them (I think nobody was using that) 2017-10-05 09:53:07 -07:00
63cd2bf9b1 Removed obsolete comment. 2017-10-05 09:40:06 -07:00
b3099d650c Examples: Adding Roboto to the commented-out font list, and removing the unnecessary ProggyClean from there. 2017-10-04 19:28:04 -07:00
3ddcdcf6e7 Merge branch 'master' into navigation 2017-10-04 18:46:09 -07:00
67ac7da30f Styles: Added ImGuiStyle::ScaleAllSizes(float) helper to make it easier to have application transition to e.g. High DPI with a matching style. 2017-10-04 18:13:57 -07:00
89ab4b5e07 TODO update 2017-10-04 15:42:03 -07:00
ae1a6dc075 Merge pull request #1352 from matiTechno/master
Comments: Fixed typo
2017-10-04 20:39:14 +02:00
42ee537be3 Comments 2017-10-04 10:45:35 -07:00
a56b71e866 Nav: Added code to render thin highlight type. (#787) 2017-10-04 10:44:27 -07:00
b36a043bbf typo 2017-10-04 11:09:21 +02:00
6ea90af6b7 Nav: Highlight clipped within host window then extruded out. (#787) 2017-10-03 13:53:17 -07:00
cb4e6c8212 Nav: Selectable(): activating selectable also sets NavId + removed the MouseDelta test (added in 43ee5d73e9, #323) as I don't think it is needed. (#787) 2017-10-03 13:44:48 -07:00
64a51327d3 Nav: Added NavMoveResultParentId internal info to record when the parent/context of a given NavId. Useful for various algorithms (currently looking at range selection stuff) (#787) 2017-10-03 13:25:40 -07:00
2ca1884a39 Merge pull request #1350 from benvanik/patch-2
Fix binary_to_compressed_c tool to return 0 when successful.
2017-10-03 20:52:30 +02:00
6ec50d6bf5 Fix binary_to_compressed_c tool to return 0 when successful
Returning 1 is seen as an error by many tools, making it tricky to integrate this into build systems as-is.
2017-10-03 11:45:25 -07:00
74da533c93 Nav: Added NavJustNavigatedId internal info to record when we land on a given item after a navigation request, useful for various algorithms (currently looking at range selection stuff) (#787) 2017-10-03 11:22:38 -07:00
7f58bb03c1 Changed the internal name formatting of child windows to use slashes as separator, more readable. 2017-10-02 16:07:34 -07:00
cbc9730798 Metrics: Draw window bounding boxes when hovering Pos/Size. List all draw layers, trimming empty commands like Render() does. 2017-10-02 16:07:33 -07:00
c38526d14b Completely clear font when rebuilding atlas.
Previously, IndexLookup was not cleared on each font, causing FindGlyph to return old glyphs when using MergeMode.
2017-10-01 23:40:29 -04:00
491edfd8d8 Nav: Fixed a crash introduced yesterday. 2017-09-30 23:46:23 +02:00
0046c618b0 Nav: Allow to collapse tree nodes with NavLeft and open them with NavRight (#787, #1079) 2017-09-30 00:47:07 +02:00
ecd72cc0c7 Nav: Disabled the final axial check when considering candidates in most situations except menubars.
It's definitively undesirable inside Menu as we want to catch nav request failures reliably.
I think it may be considered as an option if we find this desirable i some circumstances. Right now ideally I'd remove it totally but with current scoring setup, without it we can't easily reach the Window Close button. (#787)
2017-09-30 00:26:55 +02:00
88a354585a Nav: It's now possible to navigate sibling of a menu-bar while navigating inside one of their child. If a Left<>Right navigation request fails to find a match we forward the request to the root menu. (#787, #126)
Currently the sibling menu is isn't automatically opened, that's still left to it (and even that can be anoying in Windows when the first menu-item is a child menu)
2017-09-29 23:39:34 +02:00
587e637db0 Nav: Taking note that we should aim to remove MenuBarAppending later. 2017-09-29 23:37:14 +02:00
1eaa9d0621 Nav: Fixed uninitialized variable (that had no side-effects due to the code/data flow involved) 2017-09-29 23:37:14 +02:00
f4e4c38705 BeginMenu(): fixed logic to distinguish vertical menu from one layed out in a menu bar. Makes MenuItem() in a regular window behave more consistently, and this will be also needed by upcoming menu-navigation changes in the nav branch. (#126, #787) 2017-09-29 23:37:14 +02:00
9912f7eef8 BeginMenu(): fixed logic to distinguish vertical menu from one layed out in a menu bar. Makes MenuItem() in a regular window behave more consistently, and this will be also needed by upcoming menu-navigation changes in the nav branch. (#126, #787) 2017-09-29 22:19:53 +02:00
cf3b21179b Nav: Comments 2017-09-29 20:03:02 +02:00
5a9ebeca9e Nav: Fix typo from 9712a81f85 2017-09-29 19:49:20 +02:00
bfaa426f7f Nav: Minor tidying up (adding local variables to be a little more sane). 2017-09-29 19:48:16 +02:00
8a5a29f0be Nav: Renamed internal field. 2017-09-29 19:28:19 +02:00
9712a81f85 Nav: Rectangle rectangle stored per window and per layer as well. Makes things simpler, allows enable us to visualize more data. 2017-09-29 19:26:03 +02:00
54eb4c485e Nav: Marked misleading/broken code that will never execute. 2017-09-29 19:15:24 +02:00
e3c89aeb10 Nav: Fixed menuitems/selectable on menu layer (layer 1) from storing themselves in wrong layer of LastNavIds when hovered.causing inconsistencies and bugs when hovering menu with mouse then pressing ALT to return to layer 0).
NB: this is not a new bug introduced by the previous commit (which is related to nav layers), bug has been there for a while. (#787)
2017-09-29 18:24:43 +02:00
9737efb2f1 Nav: Store per-window last nav id also per-layer so we can easily query them for menu navigation code. (#787) 2017-09-29 17:58:25 +02:00
8a814487fe Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-09-29 16:30:43 +02:00
fba9353c60 BeginMenu: Shuffling braces around to clarify flow 2017-09-29 16:29:00 +02:00
cf308f4039 Nav: Fixed SetItemDefaultFocus from stealing default focus when we are initializing default focus for a menu bar layer (#787) 2017-09-29 00:20:51 +02:00
f4398226cc Nav: Support for fallback horizontal scrolling with PadLeft/PadRight (nb: fallback scrolling is only used to navigate windows that have no interactive items). (#787) 2017-09-29 00:01:26 +02:00
30b1d85962 Nav: Commiting some better organized Debug helper because this going to stay for a bit. 2017-09-28 23:48:30 +02:00
3b85a8b6a0 Demo: Added an extra test related to baseline and fixed an id collision. 2017-09-28 22:01:08 +02:00
164f22d5b7 Comments 2017-09-28 22:00:49 +02:00
1f7f54e196 Removed extraneous test. 2017-09-28 22:00:17 +02:00
c0cf123e0b Update README.md 2017-09-28 20:39:36 +02:00
df366b230e ColorPicker4: Use nav flag to provide a slighly better experience when using navigation (#787, #346) 2017-09-28 20:22:30 +02:00
7c2926de17 Demo: Added an extra test related to baseline and fixed an id collision. 2017-09-28 20:15:32 +02:00
2d859dee4e Nav: Added ImGuiItemFlags_NoNav item flag 2017-09-28 19:58:01 +02:00
878fa96896 Nav: Re-arranged ItemAdd() to maximize early out (#787) 2017-09-28 19:57:24 +02:00
dd0855de5c ButtonBehavior: Tidying up. 2017-09-28 19:47:45 +02:00
4b4e455c40 Nav: Internal nenaming 2017-09-28 19:41:30 +02:00
50ba543743 Comments 2017-09-28 19:35:10 +02:00
e0a2a832cd Nav: Changed internal flag to NoNavDefaultFocus to be false by allow, and more consistent (#787) 2017-09-28 19:18:41 +02:00
af38749ea1 Nav: Fixed ButtonBehavior mistakenly setting active id when the Activate button is held and we have a new NavId, which affected browsing some popups (#787) 2017-09-28 19:07:52 +02:00
ca4db8c905 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-09-28 17:40:25 +02:00
e8f7c83138 Begin: Shallow tweak to minimize diff with nav branch 2017-09-28 17:37:55 +02:00
926c1cf9a4 Merged from Navigation branch: ImGuiItemFlags_SelectableDontClosePopup flag 2017-09-28 17:02:28 +02:00
f99348711b Added VerticalSeparator() entry point in imgui_internal. Seperator() in an horizontal layout context still does that. 2017-09-28 16:41:01 +02:00
9142002121 Separator(): Tweak Logging so that the separator text is aligned according to tree padding. 2017-09-28 16:40:28 +02:00
d394c7ad0b Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-09-28 15:45:35 +02:00
0106dcbd02 Fixed IsItemHovered() - part of the processing has to be done in ItemAdd() because the widget may alter clipping rectangle temporarily. 2017-09-28 15:43:26 +02:00
2a8eb618dc Nav: Fixed NavDown to open menu from a menu bar (#787) 2017-09-28 00:36:58 +02:00
35f65e05ed Merge branch 'master' into navigation 2017-09-28 00:33:29 +02:00
fafe65a8fc Refactor to move the responsability of SetHovered() to ItemHoverable() - previously IsHovered(). Simpler and the parallel to ItemAdd is clearer with the new name. 2017-09-28 00:21:47 +02:00
2159629e9e Removed another msileading difference between the hovered functions (IsWindowContentHoverable() uses the root window already). Sorry for the commit spam! (making small commit to easily be able to Bisect those in case I make a mistake) 2017-09-28 00:05:35 +02:00
eca74d55c7 IsItemHovered(), IsHovered(): Shallow tweaks, eventually removed all the braces. 2017-09-28 00:05:18 +02:00
2b7d4c713e Internals: Moved IsWindowContentHoverable() in the file 2017-09-27 23:31:03 +02:00
c5a79deb38 IsItemHovered(), IsHovered(): Shallow tweaks to make them more symetrical. Removed one set of braces. 2017-09-27 23:10:46 +02:00
7bcb1d3816 Internals: ButtonBehavior(), IsHovered() moved the responsability of flatten_child higher level to ButtonBehavior() - not super sure about the elegance of this 2017-09-27 22:59:40 +02:00
79ef64430c Nav: Fixed merge cc26db8ec7 2017-09-27 17:27:21 +02:00
cc26db8ec7 Merge branch 'master' into navigation 2017-09-27 17:25:50 +02:00
0adcddac39 IsItemHovered(), ItemAdd(): finishing cleaning up, moved the code to IsItemHovered() so ItemAdd() is more lightweight and the two IsXXXHovered functions are now very similar, making their differences less confusing. 2017-09-27 17:21:50 +02:00
19e22baa06 ItemAdd(): more re-ordering of tests to match IsHovered() + comments 2017-09-27 17:06:07 +02:00
344d48be31 IsItemHovered(), ItemAdd(): Fixed seemingly unnecessary comparaison of root windows, makes IsItemHovered() more consistent with internal IsHovered().
Original test was added in 6e99688fa7 should not have been using RootWindow in the first place.
The difference between public-facing and internal versions would only be noticeable with overlapped child windows, which doesn't really happen anyway
2017-09-27 16:49:25 +02:00
c075786d8b ItemAdd(): re-ordering the tests, submission should now be faster. 2017-09-27 16:29:46 +02:00
99c7622a1b ItemAdd(), not performing computation for IsItemRectHovered() which does them itself, allowing us in the next commit to optimize ItemAdd() and make its logic more consistent with IsHovered(). 2017-09-27 16:20:53 +02:00
e87ad328e4 Moved implementation of Hovered-related functions next to each others + comments, before I attempt to work on them. No functional change here. 2017-09-27 16:07:47 +02:00
842e88a8e3 Examples: Avoid using ImColor() to not tempt newcomers into looking at it 2017-09-27 15:47:08 +02:00
869732c456 Nav: Removed unnecessary combo code (that kept the combo arrow highlighted after reverting to mouse controls). (#787) 2017-09-27 12:34:18 +02:00
a2b2e56e8e Merge branch 'master' into navigation 2017-09-27 12:31:12 +02:00
e56eba44fe Fixed not being able to move a window by clicking on one of its child window (#1337, #635), broken by 313d388bba 2017-09-27 12:25:40 +02:00
8374a454da Removed extraneous ImGui:: prefixes. Declared ColorEditOptionsPopup in imgui_internals.h. Tweaked internal signatures. 2017-09-27 11:39:13 +02:00
09f6f564d9 ImFontAtlas: Fixed calling Clear() and rebuilding (broken in 3fe2ecfd4c) thanks @pdoane @mikesart 2017-09-27 11:21:42 +02:00
bbd6d5d5b5 Combo: Cleaned up, removed unnecessary code (looks like this part went untouched for a long time!). 2017-09-27 00:20:09 +02:00
8fd4beddb8 Merge branch 'master' into navigation 2017-09-26 20:28:40 +02:00
3fe2ecfd4c ImFontAtlas: Added support for CustomRect API to submit custom rectangles to be packed into the atlas / and map them as font glyphs 2017-09-26 20:24:27 +02:00
501e73feed Minor comments 2017-09-26 20:18:14 +02:00
9e1ad7295f ImFont: Renamed (supposedly internal) fields (e.g. XAdvance to AdvanceX). Custom text renderers might be affected if they didn't use the GetCharAdvance() helper function. 2017-09-26 20:05:16 +02:00
10bb9524eb ImFont: Renamed ImFont::Glyph to ImFontGlyph (for consistency and so ImFontAtlas types can use it without ordering half of the file). Left a redirection type. 2017-09-26 19:54:30 +02:00
072d6d8cb5 ImFontAtlas: Refactored internals API to 1) avoid building lookup table multiple times for merged fonts + 2) allow the mapping of custom icons inside fonts (wip, uncommited) 2017-09-26 19:26:16 +02:00
2170b0b278 ImFontAtlas: Comments and minor reorganization of declaration in header file. 2017-09-26 19:10:29 +02:00
529ca279a4 ImFont: Split some building code into a AddGlyph() helper (that custom rect code and imgui_freetype can use) 2017-09-26 18:41:21 +02:00
f1a20ec66d Merge branch 'master' into navigation 2017-09-26 16:54:37 +02:00
be03882a15 Separator(): output vertical separator when used in horizontal layout mode, so it works in menu bars. 2017-09-26 15:43:48 +02:00
c7a606ab7e Horizontal layout does the minimum job to be usable internally - not exposed (#97) 2017-09-26 15:42:55 +02:00
728deff56c Comments, debug code (commented), todo list 2017-09-26 15:33:57 +02:00
99b9f1c93c Fix static misusage error with decent compilers. Error introduced in 4b82759598 2017-09-26 11:23:06 +02:00
82748df71a WantCaptureMouse: Tweaked logic so WantCaptureMouse can stay false when e.g. hovering over void while an InputText() is active. (#621) 2017-09-26 01:12:09 +02:00
69d0d33451 Exposed PushMultiItemsWidths() to imgui_internal.h 2017-09-25 22:45:10 +02:00
9577ebf008 Merge branch 'master' into navigation 2017-09-25 22:14:37 +02:00
24f21bd4d4 Merge pull request #1113 from Urmeli0815/ImGuiSelectableFlags_MenuItem
MenuItem: only activate on Release, not on Click (nb: and not on ClickRelease to allow opening menu and selecting something with a single click. Windows seems to behave the same, allowing to click and hold to e.g. Open then move cursor, release on Save and save gets activated)
2017-09-25 22:13:38 +02:00
7e8069dd23 Merge branch 'master' into navigation 2017-09-25 22:08:38 +02:00
c0547d358d Begin: Fixed auto-fit calculation code that predict the presence of ascrollbar so it works in the case size constraints are used. I actually don't need this fix now, but earlier experiment with BeginCombo() required this fix. 2017-09-25 22:04:39 +02:00
4b2781fe87 Begin: Moving some code into a CalcSizeAutoFit() function. 2017-09-25 21:57:42 +02:00
0d56140b4a BeginCombo(): rework internals a little to make it easier to provide custom combo-like elements relying in BeginCombo().
BeginPopupEx() doesn't enforce AlwaysAutoResize flag anymore.
2017-09-25 21:45:34 +02:00
a34edb810e Demo: Fixed overlay demo keeps resizing (in case, e.g.: font changes) 2017-09-25 21:12:07 +02:00
4b82759598 SetNextWindowPos: added a ImVec2 pivot parameter for positioning a given a center, bottom-right position, etc. As a generalization of SetNextWindowPosCenter() which is now obsolete. This will be useful for combo-like popups as well.
Demo: Simple-overlay window uses the SetWindowPos pivot to select a corner to position itself at.
2017-09-25 18:25:43 +02:00
0a55573288 Begin(): Minor tidying up of flow 2017-09-25 15:48:52 +02:00
9f34925b2a Window: Tweaked ApplySizeFullWithConstraint() -> CalcSizeFullWithConstraint() so it can be used without side-effect 2017-09-25 13:23:25 +02:00
0a5fb24f10 Popups: Exposing a little more of popups internals in imgui_internals.h 2017-09-25 12:52:06 +02:00
3fd5790814 Pass render target format in ImGui_ImplDX12_Init() instead of hard-coded. 2017-09-24 14:57:46 -07:00
f6b6dace9e Pass command list in using ImGui_ImplDX12_NewFrame() instead of ImGui_ImplDX12_Init() 2017-09-24 14:43:46 -07:00
f72b95d73f Merge 'ocornut/master' into 'jdmo3/master' 2017-09-24 14:43:11 -07:00
3dd3d0b248 Examples: DirectX11: allow creating device with feature level 10 sinec we don't really need much for that example. (#1333) 2017-09-24 12:54:49 +02:00
b9c185402e Nav: minor tidying up NavUpdate() to use a local variables, easier to test replacing g.NavWindow with g NavMoveResultWindow for navigation accross flattened child windows. 2017-09-20 23:58:56 +02:00
113b2467cd Minor bits. Reduce usage of GImGui multiple times in same function. 2017-09-20 23:02:06 +02:00
229921541b TODO list 2017-09-20 18:54:36 +02:00
9b2672a99f Update README.md 2017-09-19 18:33:04 +02:00
2fc07c1b7d Update README.md 2017-09-19 18:32:09 +02:00
ba12d37719 Merge pull request #1324 from waywardmonkeys/improve-clang-warnings
FIxes zealous Clang warning.
2017-09-19 18:18:53 +02:00
479e532f18 ColorEdit: fixed weird ternary pattern that makes some compiler warning (fair) 2017-09-18 21:41:49 +02:00
92e55a8a79 Merge branch 'master' into navigation
# Conflicts:
#	imgui.h
2017-09-18 16:06:48 +02:00
d5d825debb Nav/Examples: honoring the io.WantMoveMouse flag in most common examples (#323)
Missing support Vulkan (#549), Apple (#575, #247), SDL (#58, #356),
Allegro, Marmalade (#368, #375)
2017-09-18 16:04:44 +02:00
1ff27d7db8 Added io.WantMoveMouse flags from Nav branch so Examples/Binding can already implement it. (#787) 2017-09-18 16:04:28 +02:00
f24b5f71ca Merge branch 'master' into navigation 2017-09-18 15:35:47 +02:00
79ce9b74d5 BeginTooltipEx() internal tweaks 2017-09-18 15:35:00 +02:00
44e8d94aba Merge branch 'master' into navigation 2017-09-18 15:32:31 +02:00
105f3b14e4 Merge branch 'master' into styles 2017-09-18 15:11:51 +02:00
564c97b87e Comments 2017-09-18 15:11:22 +02:00
f0f86213db ImVector: added resize() variant with initialization value 2017-09-18 15:11:05 +02:00
b409d399c8 Demo: style editor output tweak so it is easier to modify the output code.. + TODO list update 2017-09-18 15:09:11 +02:00
9693fd5351 PushStyleVar/PopStyleVar: internal tweaks 2017-09-18 15:07:22 +02:00
7c9e38f60a Style: Moving code in a function to make incoming diff easier to parse. 2017-09-18 15:06:54 +02:00
709653c330 Merge branch 'master' into styles 2017-09-18 15:03:25 +02:00
6c91a1ef7f Minor comments 2017-09-17 23:35:39 +02:00
2aa9a538c0 Merge pull request #1323 from waywardmonkeys/remove-commas-at-end-of-list
Remove commas after last item in enumeration to stay compatible with older compilers.
2017-09-15 11:52:14 +02:00
c4c042bcec Typo 2017-09-15 01:32:29 +02:00
052999a6ab More consistently uses "Dear ImGui" 2017-09-15 01:31:41 +02:00
83645aa593 More consistently uses "Dear ImGui" 2017-09-15 01:28:30 +02:00
2fcdeb7f12 Remove commas after last item in enumeration.
This brings these enums to match the rest of the code and fixes
2 warnings under clang about using C++11 extensions.
2017-09-14 10:35:30 +07:00
4c794be41d Improve warning configuration for clang.
Clang 4.0 introduced -Wdouble-promotion, so check for and disable
that on clang as we do on gcc.

The old style casts warning is already disabled globally in this file
for clang, so it doesn't need to be re-disabled within this scope.
2017-09-14 10:28:18 +07:00
54d30d758f Implicit "Debug" window uses a "Debug##Default" identifier to allow the user creating such window with custom flags 2017-09-12 13:16:27 +02:00
65632d2682 Fixed alloca include for SunOS (#1319) 2017-09-12 11:55:13 +02:00
3420080a35 Merge pull request #1319 from RyuKojiro/more_portable_alloca_include-ocornut
Simplify alloca.h include condition (fix for NetBSD)
2017-09-11 11:00:23 +02:00
cf6ba9dd2d Don't do a bunch of OS gymnastics. alloca.h is only for glibc, everyone else uses stdlib.h 2017-09-11 00:15:43 -07:00
66a9d4856c Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2017-09-06 20:37:29 +02:00
cb2775ae54 Internals: ImGuiItemFlags comments 2017-09-06 20:36:36 +02:00
62d7fa4324 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-09-06 20:33:39 +02:00
f63c03c464 Internals: moved ButtonRepeat and AllowKeyboardFocus bools/stacks to a generic ItemFlags stack. Merged from Navigation branch. 2017-09-06 20:28:36 +02:00
51fcef0c21 BeginCombo() tweaks, merged from Navigation branch. 2017-09-06 19:31:50 +02:00
38ed66f55e Merge branch 'master' into navigation
# Conflicts:
#	imgui_demo.cpp
2017-09-06 19:25:07 +02:00
9e2f202f05 Demo: Not using the undesirable Begin() overload. 2017-09-06 19:24:08 +02:00
5c4fda0fbc Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-09-06 19:17:51 +02:00
2169bf6895 Fixed WantTextInput from being true when an activated Drag or Slider was previously turned into an InputText(). (#1317) 2017-09-06 17:25:36 +02:00
790605e359 Minor comments + renaming internal fields 2017-09-06 17:20:54 +02:00
8971d70149 Merge pull request #1313 from thevaber/master
Improved ColorPicker hue wheel color interpolation
2017-09-05 18:35:08 +02:00
e1a7aa41cb Improved ColorPicker hue wheel color interpolation 2017-09-05 16:31:54 +02:00
2600b28f5d Begin(): fixed calling Begin() more than once per frame setting window_just_activated_by_user which in turn would set Appearing to true for that frame. 2017-09-04 13:29:57 +02:00
6400f2900a Begin(): renamed locals. 2017-09-04 13:26:46 +02:00
a9c6a0f6ec Begin(): Removed unnecessary code (at the time of 1.18 commit e9e0e36f98, CursorPos was used to compute SizeContentsFit and this was necessary) 2017-09-04 13:24:45 +02:00
89cae37b49 Begin(): Tidying up some code, should be a no-op. 2017-09-04 13:05:20 +02:00
8fbe8709f9 TODO, minor tweak 2017-09-04 13:03:04 +02:00
e8dbf1c795 Combo: Internally split into BeginCombo(), EndCombo(), toward a more flexible combo api. 2017-09-01 22:10:13 +02:00
5658675e9d Combo: Removed unnecessary ClearActiveId() call (from era where active combo stored an id, now we just use popup functionality) 2017-09-01 21:58:58 +02:00
804ee78731 Added IsWindowAppearing(). 2017-09-01 21:55:59 +02:00
fd684ba974 Removed 2 obsolete redirection functions (obsoleted 26+ months ago). 2017-09-01 17:43:56 +02:00
b8ade0b94f Examples: Main: Removed call to SetNextWindowSize() 2017-09-01 17:07:19 +02:00
4abce8af58 Examples: GL2: Renaming, comments. 2017-09-01 17:07:19 +02:00
5665f1d3e3 Merge branch 'nlguillemot-master' 2017-09-01 16:55:36 +02:00
d9016964ad Examples: GL3: Comments, tweaks (#1145) 2017-09-01 16:55:04 +02:00
c47e5fc76a Merge branch 'master' of https://github.com/nlguillemot/imgui into nlguillemot-master 2017-09-01 16:49:36 +02:00
7d1f2c0dc5 Examples: GL2: rename functions to include GL2 in name 2017-09-01 16:45:31 +02:00
d165817880 Merge pull request #1307 from JJscott/dev
Examples: OpenGL: Backup polygon mode, draw with filled polygons, restore state, for clients running opengl with glPolygonMode. closes #798
2017-09-01 22:30:14 +08:00
cf48e28932 Backup polygon mode, draw with filled polygons, restore state, for clients running opengl with glPolygonMode. closes #798 2017-09-01 20:39:12 +12:00
670d40642f Fixed C4267 conversion from size_t to int. 2017-09-01 14:42:49 +08:00
6a1ba317c7 Demo: Minor coding style tweaks so bgfx copy needs less patching. 2017-08-29 19:05:56 +08:00
1a62d46db5 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-08-29 18:47:23 +08:00
97a40e74fb Nav: Fixed bad merge of 6def01be5d so the bug fixed in #840 wasn't fully fixed in Nav branch. 2017-08-29 18:45:58 +08:00
96d2942373 InputText: Merged bits from Navigation branch (inc. g.ActiveIdIsJustActivated is only set on the toggle). 2017-08-29 18:40:14 +08:00
9a0171b803 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-08-29 18:29:44 +08:00
35e4fa7b85 Merged from Navigation branch (DragBehavior) 2017-08-29 18:21:36 +08:00
6cca4025ee Merge from Navigation branch: 6aa8019763 2017-08-29 17:56:53 +08:00
ddf41b0398 Merged from Navigation branch. TAB/Alt-TAB processing now deactivate if holding Ctrl. 2017-08-29 17:27:19 +08:00
550dc09998 Merged from Navigation branch (misc) 2017-08-29 17:12:18 +08:00
aef041f948 Merged from Navigation branch 2017-08-29 17:09:56 +08:00
c9298c2657 Merged from Navigation branch:
f71cdd13b7  Internal tidying up, moved code to CalcNextScrollFromScrollTargetAndClamp() so it can be reused by upcoming nav code.
c816e6c742 Fixed SetScrollX() handling of center ratio (which actually wasn't exposed publicly). (#323, #246)
2017-08-29 17:09:44 +08:00
287a4b6b38 Merged from Navigation branch: 5cac4926c8 fix title bar color of window under a modal window. 2017-08-29 16:52:37 +08:00
a9e1d9aab9 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
#	imgui_internal.h
2017-08-29 16:21:46 +08:00
358e7a194e Added GetKeyPressedAmount() (from Nav branch) to be able to measure fast repeat rate accurately. Added internal CalcTypematicPressedRepeatAmount() function. 2017-08-29 16:13:17 +08:00
1f1e63f705 Merge various minor things (supposedly harmless) from Navigation branch into Master to reduce differences. Some code in NewFrame() has been moved around. (#787) 2017-08-29 16:06:52 +08:00
ee42fae468 Merge various minor things (supposedly harmless) from Navigation branch into Master to reduce differences. (#787) 2017-08-29 16:05:12 +08:00
6752cba4bc Removed duplicate comments 2017-08-29 15:39:11 +08:00
2ee1b70652 Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2017-08-29 15:36:36 +08:00
0ba3cadb88 RenderRectFilledRangeH() can't use cheap acosf() approximation for now. (#1296) 2017-08-29 15:25:05 +08:00
f8eef49575 ProgressBar() fixed rendering when straddling rounded area. (#1296) 2017-08-29 15:23:07 +08:00
01d4bf299a Added overcomplicated RenderRectFilledRangeH() to fix rounded progress bar, which will also help for range widgets and perhaps sliders grabs over rounded areas. (#1296, #76) 2017-08-29 15:22:30 +08:00
f0fa17b5e0 ImDrawList: Minor renaming 2017-08-29 15:10:03 +08:00
7a9ea281be ImSwap() helper. 2017-08-28 19:27:12 +08:00
808d631e35 imDrawList: PathArcTo() returns when passed zero radius. 2017-08-28 16:02:25 +08:00
e1d81f4dc5 ImDrawList: Minor tidying up. 2017-08-28 14:12:55 +08:00
1f51e8f39d Internals: Renamed some ImGuiCorner enums. 2017-08-28 14:11:11 +08:00
7a7327adde ParseFormatPrecision() returns -1 for scientific noation 'e'/'E', RoundScalar() doesn't alter those. 2017-08-28 13:19:36 +08:00
0d4b08a851 Added Go binding link 2017-08-28 12:14:29 +08:00
807322c9a5 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-08-26 18:43:10 +08:00
b295e185ff Updated copyright date for 2017, updated Gallery link 2017-08-26 16:42:40 +08:00
419b22a487 Internals: Split some code out of NewFrame() into an Initialize() function. 2017-08-26 16:35:39 +08:00
5938f1ba61 Added IsMousePosValid() helper. 2017-08-26 15:18:06 +08:00
f72ca6d22c ImFontConfig: Added RasterizerMultiply option to alter the brightness of individual fonts at rasterization time, which may help increasing readability for some. Added RasterizerFlags for custom rasterizer flags (aka imgui_freetype) 2017-08-26 14:11:56 +08:00
304de0ee1b ImFontConfig: Comments, const. 2017-08-26 14:11:41 +08:00
a02210a455 Fixed compilation with IMGUI_DISABLE_OBSOLETE_FUNCTIONS defined 2017-08-26 00:31:44 +08:00
92a6faca6f IO: io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we'll now accept negative mouse coordinates. 2017-08-25 16:43:25 +08:00
37f3a718c6 Marked all fmt + va_list functions with format attribute so GCC/Clang can warn about them. Not ignoring -Wsuggest-attribute=format anymore for GCC/Clang. 2017-08-25 16:10:14 +08:00
40f608ce9b Version 1.52 WIP 2017-08-25 15:12:12 +08:00
55a6209931 Version 1.51 2017-08-25 00:29:59 +08:00
e6ed2f9939 Nav: Tooltip do not appear in navigation focus list. (#1294, #787) 2017-08-25 00:06:57 +08:00
82c3116b4f Demo: Displaying version number in test window. 2017-08-24 17:32:03 +08:00
d213c0eb7e Style: Tweaked default border (undo half-way from original c1e1e015c4) (#707) 2017-08-24 17:30:10 +08:00
b0fc30bd19 Merge branch 'master' into navigation 2017-08-22 20:49:02 +08:00
7c5556c921 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-08-22 20:48:36 +08:00
92efa00bc9 Minor miscellaneous merges from Navigation branch to reduce divergence a little bit 2017-08-22 20:44:39 +08:00
6ed75d3046 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-08-22 20:27:39 +08:00
eb2bbf6f29 Renamed IsItemHoveredRect() to IsItemRectHovered(). Renamed IsMouseHoveringWindow() to IsWindowRectHovered() - follow up to previous commit 6be7d4904e merged from Nav. 2017-08-22 20:25:27 +08:00
52b39af0a0 Style: Added obsolete redirects for ImGuiCol_Columns*** fields. (ref 648f75b245) 2017-08-22 20:23:46 +08:00
6be7d4904e Merge part of 88c1966629 from Nav branch. Renamed IsMouseHoveringAnyWindow() -> IsAnyWindowHovered(), IsMouseHoveringWindow() -> IsWindowHoveredRect() for consistency. Kept inline rediection function. 2017-08-22 20:10:02 +08:00
2e35957a81 Undo reordering of ImGuiKey in Nav branch 2017-08-22 20:02:52 +08:00
8581050002 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-08-22 19:55:59 +08:00
141339e4b7 (internals) Renamed FocusedWindow to NavWindow to match terminology of navigation branch 2017-08-22 19:51:12 +08:00
8e89809078 Merge branch 'master' into navigation 2017-08-22 19:48:01 +08:00
2ad2190d47 Merge 20a0fde012 Tidying up default clipboard handler for non Windows-OS (from Nav branch) 2017-08-22 19:47:52 +08:00
f3ab5e6252 Fixed InputText() bug with ImGuiInputTextFlags_EnterReturnsTrue (in nav branch only) (#787). Thanks @Grouflon 2017-08-22 19:43:49 +08:00
bea06117bb Nav: Fix navigation inside child windows. Removed GetChildID() and storin/g the info within the window. (#1291) 2017-08-22 19:26:21 +08:00
ce7f3d4831 Merge branch 'master' into navigation 2017-08-22 18:27:29 +08:00
444792f75f Merge fixes from ,master branch 2017-08-22 18:27:23 +08:00
50b3a14d0a Merge 2545d75c3b from Nav - Tidying up, removed two unnecessary window flags from being exposed in imgui.h 2017-08-22 18:26:27 +08:00
7de68fbe3d Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-08-22 18:22:41 +08:00
d5b0d51274 Minor miscellaneous merges from Navigation branch to reduce divergence a little bit 2017-08-22 18:13:10 +08:00
9670fe9ca7 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_internal.h
2017-08-22 17:51:20 +08:00
6ee317d26d ImRect::Clip() -> ClipWith() to clarify meaning, going to undo the change in Nav branch. 2017-08-22 17:46:50 +08:00
6c82af2b96 Navigation branch fix (we changed Clip) 2017-08-22 17:44:49 +08:00
543dc2817f Fixed an assert when calling CloseCurrentPopup() twice in a row. 2017-08-21 22:54:20 +08:00
53e73182ff Merge branch 'master' into navigation
# Conflicts:
#	imgui_internal.h
2017-08-21 00:04:45 +08:00
530baee1a7 Removed tabs that slipped through the cracks 2017-08-21 00:03:37 +08:00
9b484d24cd ImDrawList: Added GetClipRectMin(), GetClipRectMax() helpers. Comments. 2017-08-20 23:45:02 +08:00
067127f113 Columns: Caching columns clipping rectangles (#125) 2017-08-20 23:17:59 +08:00
adeaf1cd72 Columns: Moved PushColumnClipRect() to imgui_internal.h 2017-08-20 23:09:43 +08:00
54bdd00df7 Columns: Fix for explicit content width and scrollbar. (#519, #125) 2017-08-20 21:32:18 +08:00
ea493fd8da Merge branch 'ggtucker-master' 2017-08-20 21:09:22 +08:00
83e8d10fab Columns: Columns set resize based on the presence of vertical scrollbar. Not 100% sure about that but it looks like we've fixed enough bugs that this may not cause troubles anymore. (#125, #913, #893, #1138) 2017-08-20 21:08:07 +08:00
1ebd7ec049 Demo: Columns: Added Horizontal Scrolling demo. Tweaked another Columns demo. (#519, #125, #913) 2017-08-20 20:58:24 +08:00
7ff1c149b5 Columns: Fixed another form of shearing made visible by the PreserveWidth option. The code was initially added in c46d5634d4 to fix because we've fixed in e42aaede42eb6d8a47cf104f3afd6057b13a61ee. (#913, #125) 2017-08-20 20:58:24 +08:00
1c83b073c6 Columns: A set of column (and most importantly the right-most column) do not register its content to the parent, not affecting the window contents size. (#519, #125, #913) 2017-08-20 20:58:23 +08:00
7f0063f858 Columns: Added ImGuiColumnsFlags_NoResize flag (internal). (#913, #125) 2017-08-20 19:32:50 +08:00
e70d49ba1f Columns: Fixed one form of shearing during resizing columns with PreserveWidth enabled (there's another issue still). (#913, #125) 2017-08-20 19:32:50 +08:00
9307631c90 Columns: Removed unnecessary/misleading dummy ItemSize(). Was fixed already before, and fixed again in this branch by 3bf2af23e6. (#913, #125). End() calls EndColumns() directly. 2017-08-20 19:32:50 +08:00
a511b00226 Columns: Fixed offset rounding leading to SetColumnOffset() being destructive when ImGuiColumnsFlags_NoPreserveWidths flag is not set. (#913, #125) 2017-08-20 19:32:50 +08:00
3bf2af23e6 Columns: Fixed EndColumns() not repositioning the cursor. (#913) 2017-08-20 18:44:54 +08:00
19a42cb2fd Columns: Moved BeginColumns/EndColumns/flags from #913 to imgui_internals.h + minor shallow tweaks. Removed demo code temporarily. (#125) 2017-08-20 18:44:48 +08:00
bc78535bbf Merge branch 'master' of https://github.com/ggtucker/imgui into ggtucker-master
# Conflicts:
#	imgui.cpp
#	imgui.h
2017-08-20 18:22:34 +08:00
b4eeb4aa8d Renamed GetStyleColName() to GetStyleColorName() for consistency. Extra comments in Api Breaking Changes section. 2017-08-20 17:53:09 +08:00
af2db53780 Added GetStyleColorVec4() 2017-08-20 17:50:25 +08:00
cf84650ee8 GCC warnings fixes 2017-08-20 16:39:43 +08:00
fd394e1e95 Scrollbar: Comments. Fixed potential div-by-zero error which I can repro now, so added an assert to notify us if it's actually ever useful or not. 2017-08-20 16:39:11 +08:00
1065a7b95b ImFontAtlas::AddFontDefault: Made it possible to override size (even if it isn't really recommended) 2017-08-20 15:38:05 +08:00
91d841dd5f Added PushStyleColor(ImGuiCol idx, ImU32 col) overload. (Which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix.) 2017-08-20 15:28:12 +08:00
3b11e73333 Examples: gitignore added patterns for modern MSVC versions 2017-08-20 15:17:37 +08:00
bf0d9c123e Merge branch 'master' into navigation 2017-08-18 00:25:12 +08:00
8be7a60f20 ImFontAtlas: Re-arranging code to simplify implementation of imgui_freetype. (#618) 2017-08-17 21:19:54 +08:00
1086c87767 ImFontAtlas: Re-arranging code to simplify implementation of imgui_freetype. (#618) 2017-08-17 21:13:14 +08:00
4075cc58e9 ImFontAtlas; Re-arranging code to simplify implementation of imgui_freetype (#618) 2017-08-17 20:44:44 +08:00
d970957e2d ImFontAtlas: Draft of an api to submit custom rectangle (not exposed). Atlas default texture chunk using it. (WIP: we are still storing mouse UV outside in GImGui) 2017-08-17 19:36:48 +08:00
24a78767d2 Merge branch 'master' into styles
# Conflicts:
#	TODO.txt
2017-08-17 17:24:33 +08:00
4a7e1ff4d4 ImFontAtlas: Some shallow renaming + added an assert for clarification 2017-08-17 15:35:59 +08:00
52f1a4124c Demo: Tweaked Fonts section. 2017-08-17 13:56:16 +08:00
c569676a7b ImVector: Added a const 2017-08-17 11:46:25 +08:00
0be4f66d89 ImFontAtlas: Shuffling some code inside Build() to make upcoming diffs less confusing (nb: we might break compat with forks of Build() like #618) 2017-08-17 11:46:25 +08:00
34d09f2dc8 Merge pull request #1283 from onqtam/imgui_api
Added missing IMGUI_API to ImGuiTextFilter methods implemented in imgui.cpp
2017-08-16 23:29:52 +08:00
fd9460a087 added missing IMGUI_API to ImGuiTextFilter methods implemented in imgui.cpp 2017-08-16 17:52:11 +03:00
68bf5ecbc1 Marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame. Removed the broken __LINE__ from IMGUI_ONCE_UPON_A_FRAME 2017-08-16 17:51:44 +08:00
a85a14370b OpenPopupEx() internal tweaks to receive an ImGuiID, BeginPopupContextXXX shortening unnecessarily long identifier. 2017-08-16 15:47:10 +08:00
a9915681eb PushID()/PopID() to not need to mark parent window as Accessed (needlessly waking up the root "Debug" window) (#747) 2017-08-16 14:37:54 +08:00
5ea1865fdb (api breaking) changed parameter order for BeginPopupContextWindow(), note that most uses relied on default parameters completely. 2017-08-16 14:24:41 +08:00
638d77c682 Comments (#402) 2017-08-16 14:19:48 +08:00
e8dd435ccd Merge branch 'mkeeter-is-popup-open' 2017-08-16 13:43:02 +08:00
d2259f65e5 Undo part of 32dbe836d0 to keep the same name for both overloads (#891, #799) 2017-08-16 13:42:41 +08:00
f98376d02b Merge branch 'is-popup-open' of https://github.com/mkeeter/imgui into mkeeter-is-popup-open
# Conflicts:
#	imgui.cpp
2017-08-16 13:19:15 +08:00
a83f7083ed BeginPopupEx() uses ImGuiID internally 2017-08-16 13:06:14 +08:00
e682362f35 TODO list update, comments 2017-08-16 12:54:51 +08:00
f827c8448a Merge pull request #1282 from jadwallis/master
ImFontAtlas: Make font atlas padding between packed glyphs configurable
2017-08-16 10:45:07 +08:00
9239e91dc9 Whitespace fix to previous 2017-08-15 14:12:32 +01:00
718f00d651 Make font atlas packing padding configurable 2017-08-15 14:11:04 +01:00
1e162dfc74 PushStyleVar/PopStyleVar: internal tweaks 2017-08-15 19:19:00 +08:00
18f217e631 Style: Moved position of ImGuiCol_TitleBgCollapsed 2017-08-15 19:06:02 +08:00
5429bd892e ColorEdit4: Added "Copy as..." option in context menu (#346) 2017-08-15 18:30:52 +08:00
668a4bf1bc Demo: style editor output tweak so it is easier to modify the output code.. + TODO list update 2017-08-15 17:48:41 +08:00
0f935248e3 Combo, Inputint, InputFloat, ColorEdit4 all use the small size for little square 2017-08-15 17:46:11 +08:00
18b50f8eba Comments 2017-08-15 11:41:36 +08:00
f8f382221c ImVector: added resize() variant with initialization value 2017-08-15 11:41:00 +08:00
032c222d57 Merge branch 'master' into styles 2017-08-15 10:52:38 +08:00
9bf5028fd3 Merge branch 'master' into navigation 2017-08-15 00:50:59 +08:00
01b99bbe09 TODO list update 2017-08-15 00:36:15 +08:00
cd17af0d33 Renamed 2017-08-15 00:09:03 +08:00
03aae93f3e TODO list update (merging a first batch of things I had laying around, +60 entries) 2017-08-14 21:14:42 +08:00
7b7845d764 ImFont::CalcWordWrapPositionA: minor optimization 2017-08-14 21:00:44 +08:00
a6d69f04c0 PlotHistogram: bars are drawn based on the position of zero (#828) 2017-08-14 17:20:05 +08:00
d258287c92 Revert d2c219d #826 + tidying up ImFont::RenderChar() 2017-08-14 16:53:38 +08:00
3d6e037c23 Comments (#1034) 2017-08-14 16:51:14 +08:00
bd3dfc0eba Moved TODO list to TODO.txt 2017-08-14 16:51:14 +08:00
d2c219df84 Merge pull request #826 from swetland/patch
ImFont: add RenderGlyph() to allow rendering of individual glyphs post-query
2017-08-14 16:50:20 +08:00
c26b29b254 Style: Moving code in a function to make incoming diff easier to parse. 2017-08-14 15:14:46 +08:00
2b7fe73a08 Window size can be loaded from .ini data even if ImGuiWindowFlags_NoResize flag is set (#1048, #1056) 2017-08-14 13:27:19 +08:00
c1e1e015c4 Style: Tweaked default border (which is off by default) to be less noticeable (#707, #1019) 2017-08-14 13:07:55 +08:00
97fccbdb73 Demo: Fixed conflicting id introduced in be9628494a . Added tooltip. 2017-08-14 13:05:03 +08:00
648f75b245 Style: renamed ImGuiCol_Columns_*** to ImGuiCol_Separator_*** (BREAKING), Separator() uses this color as well. (#707, #1019) 2017-08-14 13:04:32 +08:00
6a4064e5f2 PathArcToFast: Minor renaming for clarification. Comments. 2017-08-14 12:25:35 +08:00
8c61a4eb4c Fonts: Adding references to the fact that .OTF fonts are supported (but haven't renamed the entry points) 2017-08-14 11:29:54 +08:00
41076188ca Merge pull request #1277 from luk1337/master
ColorPicker: Fix broken ImGuiColorEditFlags_NoAlpha flag check - not restoring Alpha when clicking on reference color.
2017-08-12 12:53:13 +08:00
8352d43a0c Fix broken ImGuiColorEditFlags_NoAlpha flag check
* Fixes warning:
  imgui.cpp:9295:98: warning: enum constant in boolean context [-Wint-in-bool-context]
2017-08-11 22:52:40 +02:00
908b025c3c Fixed (unlikely) Ini saving crash if the ImGuiWindowFlags_NoSavedSettings gets removed from a window after its creation (#1000) + minor FAQ tweaks 2017-08-12 01:23:39 +08:00
0f126a5b07 Update README.md (small wording bits, inspired by #1093) 2017-08-12 01:05:24 +08:00
b4fe5d36a4 Examples: OpenGL3+SDL: Fix types to uses GlEnum (#1147) 2017-08-12 00:46:58 +08:00
048322f3fd Merge pull request #1147 from TinyTinni/master
Examples: OpenGL3+GLFW3: Fix types to uses GlEnum (#1147)
2017-08-12 00:43:34 +08:00
5eef7dd82f Demo: Consoles: Added "Copy" button to demonstrate LogToClipboard 2017-08-12 00:43:55 +08:00
08265bfbd9 RenderArrow(): fix warning. re-orderer lines to match enum order. 2017-08-11 14:44:53 +08:00
e3fae56089 Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
2017-08-11 14:30:17 +08:00
d7cad903aa Documentation tweaks 2017-08-11 14:29:27 +08:00
73f9c9d80c Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui_demo.cpp
2017-08-11 13:44:25 +08:00
7e452ec737 Renamed ImGuiSetCond_XXX type and enums to ImGuiCond_XXX, kept old enums under #ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS 2017-08-11 13:36:28 +08:00
53d1b1e929 ColorPicker: Fixes for when ImGuiColorEditFlags_NoOptions flag is set: always read a default picker type + forward flag to sub ColorEdit widgets. (#346) 2017-08-10 10:25:50 +08:00
fed18d3203 Removed old ValueColor() helpers. (#346) 2017-08-09 23:04:26 +08:00
fc5ab0cb8d RenderCheckMark() tidying up 2017-08-09 22:56:01 +08:00
4fd148f4f9 Added ImFontAtlas::GlyphRangesBuilder helper + doc 2017-08-09 22:42:03 +08:00
43e2abbee3 Comments, FAQ entry (#586, #1105) 2017-08-09 20:27:59 +08:00
55b99d753c Minor string typo 2017-08-08 23:12:23 +08:00
059e838b2c Merge branch 'master' into navigation 2017-08-08 18:04:38 +08:00
be9628494a Demo: Rearranged everything under Widgets in a more consistent way. 2017-08-08 18:04:31 +08:00
453ad17a09 Merge branch 'master' into navigation
# Conflicts:
#	imgui_demo.cpp
2017-08-08 17:50:08 +08:00
d888de4483 Demo: Merged a few demo tweaks from navigation branch to minimize drift. 2017-08-08 17:49:12 +08:00
30d1e5712a Merge branch 'master' into navigation
# Conflicts:
#	imgui.cpp
#	imgui.h
#	imgui_internal.h
2017-08-08 17:30:32 +08:00
a78ef7a369 Comments 2017-08-08 16:07:17 +08:00
942cb0e1f2 Added SetColorEditOptions(). ColorPicker4: context menu to select picker type and alpha bar. Reorganized flags (again!). (#346) 2017-08-08 15:54:20 +08:00
d952a8d3bf Demo: Color widget demo tweaks (#346) 2017-08-08 14:49:45 +08:00
a4012fd5b2 Merge branch 'master' into 2016-02-colorpicker 2017-08-08 11:30:10 +08:00
23fae61109 Merge branch 'master' into 2016-07-navigation
# Conflicts:
#	imgui.cpp
2017-08-08 11:29:54 +08:00
b5ad88627d Merge various documentation tweaks, comments, todos from the Navigation Branch to reduce drift a little 2017-08-08 11:27:48 +08:00
a1bcc8392e Fixed GetScrollMaxX() debug left-over from 7096fd8500 (#1271) 2017-08-08 11:15:34 +08:00
03700ad15e Merge remote-tracking branch 'origin' into 2016-07-navigation 2017-08-07 22:51:18 +08:00
1c991b525a Merge remote-tracking branch 'origin' into 2016-02-colorpicker 2017-08-07 22:34:30 +08:00
0ab722c3c5 Columns: First first column appearing wider than others (#1266) 2017-08-07 22:28:09 +08:00
d43c25d8f4 SetScrollHere() tweak to make the code a little less confusing 2017-08-07 21:54:41 +08:00
e36b41cbd0 Fixed Y scroll aiming when Horizontal Scrollbar is enabled (#665). Tweak log demo. 2017-08-07 21:53:57 +08:00
7096fd8500 Fixes for Vertical Scrollbar not automatically getting enabled if enabled Horizontal Scrollbar straddle the vertical limit. (#1271, #246) 2017-08-07 19:41:22 +08:00
233a6efeba Fixed GetScrollMaxX(), GetScrollMaxY(). Tweak demo to display more data. Using functions in Begin(). (#1271) 2017-08-07 18:35:15 +08:00
6d60e0fc58 Fonts readme tweaks, links 2017-08-07 15:21:21 +08:00
f4c0134f9f Moved ColorEdit, ColorPicker declaration in their own section of imgui.h, minor comments adjustment (#346) 2017-08-06 18:08:58 +08:00
cdea8ca94f Demo: Comment about 'static' and some tweaks (#1267) 2017-08-06 11:07:52 +08:00
46c73cccff Popups window can be moved (if they don't have explicit positions provided by user, or e.g. sub-menu popup) (#1252) 2017-08-05 19:47:52 +08:00
d762f1dbfb Comments, clarification about io.WantCaptureMouse, io.WantCaptureKeyboard flags timing and NewFrame(). (#1262) 2017-08-05 19:15:03 +08:00
95f2706d1c Clipboard: [windows] Fixed not closing win32 clipboard on early return. (#1264) 2017-08-05 16:05:48 +08:00
40ac84d701 DataTypeApplyOpFromText: renamed local variables + comments to avoid confusion about the fact that int and float paths are not totally symetrical. (#671) 2017-08-03 16:41:29 +08:00
f6460970c5 ColorPicker: Hue wheel + SV triangle picker mode (mode selection flags still wip, missing context menu and persistent options). (#346) 2017-07-31 21:20:42 +08:00
fb54dce71c Internals: Added ImLineClosestPoint, ImTriangleClosestPoint helpers. Changing ImVec2 arg to const ImVec2& 2017-07-31 21:11:41 +08:00
1a26d0bc98 Internals: Added ImDot(), ImRotate(), ImLerp(v2,v2,float) helpers. 2017-07-31 18:56:51 +08:00
72da4081f8 Internals: Added ImTriangleBarycentricCoords() helper. Renamed ImIsPointInTriangle() to ImTriangleContainsPoint(), with different arg order. 2017-07-31 17:54:40 +08:00
2f508c7073 ColorEdit: Extract ColorOptionsPopup() function out of ColorEdit4(). (#346) 2017-07-31 17:32:07 +08:00
10ef5a63f0 ColorPicker: Rearrange code to introduce alternate HSV picker/selector with simpler diff. (#346) 2017-07-31 16:50:28 +08:00
cc3cce7567 Comments, minor tidying up. 2017-07-31 16:48:45 +08:00
e63ebd997f Use ~IM_COL32_A_MASK instead of IM_COL32(255,255,255,0) 2017-07-31 12:25:27 +08:00
70ee41b8b3 ColorPicker: Reordered drawing code to match left-to-right display. Extra comments. (#346) 2017-07-31 12:08:20 +08:00
4b2f157fb1 Renamed ImGuiColorEditFlags_ModeMask_ to ImGuiColorEditFlags_InputsModeMask_ (#346) 2017-07-31 11:50:14 +08:00
efbb1ae04e ColorPicker4: Fixed forwarding _HDR flag from ColorPicker4 back to ColorEdit4 components. (#346) 2017-07-30 23:22:48 +08:00
3ee969c3e3 ColorPicker: Alpha bar using a checkerboard. (#346) 2017-07-30 23:11:59 +08:00
3075d8bcd4 ColorEdit4: Preliminary support for ImGuiColorEditFlags_HDR flag (currently only lift limits). (#346) 2017-07-30 23:08:43 +08:00
f6a89779c8 ColorEdit4: Hex input clamps integer components to 0..255 range during printout (#346) 2017-07-30 23:06:07 +08:00
91a4f5df25 Demo: Tweaks 2017-07-30 18:28:59 +08:00
e1a00c3d26 ColorButton: Added frame border when style border are off. (#346) @jdumas 2017-07-30 18:09:34 +08:00
65a27732d8 ImGuiColorEditFlags: Made 0x01 unused for backward compatibility with old bool. Various comments tweaks. (#346) 2017-07-30 17:57:38 +08:00
90fcd4a829 Renamed ImGuiColorEditFlags_NoColorSquare to ImGuiColorEditFlags_NoSmallPreview (#346) 2017-07-30 17:55:42 +08:00
3fe7739b5d ColorPicker: Honor ImGuiColorEditFlags_NoTooltip if for some reason user wants that. (#346) 2017-07-30 17:53:37 +08:00
4d844ffde1 Demo: custom ColorPicker popup example tweaks (#346) 2017-07-30 17:43:19 +08:00
f040547a5f Demo: custom ColorPicker popup example (#346) 2017-07-30 17:37:28 +08:00
3ffcc72f98 ColorPicker: Better cursor/color preview over the color matrix. (#346) 2017-07-30 16:57:44 +08:00
390188dfa9 Comments about parts of imgui_internal.h that will self-destruct. 2017-07-30 16:16:06 +08:00
fef8aac523 ColorPicker4: hue/alpha bars draw arrows that would look right on all background. RenderArrow helper. (#346) 2017-07-30 16:15:52 +08:00
35186a1165 Demo: Comments (#346) 2017-07-29 17:35:24 +08:00
db436b183b Merge branch 'master' into 2016-02-colorpicker 2017-07-29 17:24:06 +08:00
3926bd08e1 ColorPicker: Added ImGuiColorEditFlags_NoSidePreview flag + optional reference color. Added more demo code. (#346) 2017-07-29 17:23:32 +08:00
e84224bcd5 ColorEdit4: Can open context menu from inputs/drags as well (#346) 2017-07-29 17:00:56 +08:00
6c82572a35 ColorEdit4: Fixed not returning true when clicking on the Original/Ref color in Picker spawned from ColorEdit4 + shallow tidying up (#346) 2017-07-29 16:11:20 +08:00
7537dff806 ColorEdit4: Picker spawned from ColorEdit4 has a preview for original/previous color with revert button - WIP not really happy with it being in ColorEdit4 code (#346) 2017-07-29 15:54:45 +08:00
6bc1572d31 ColorPicker: Comments. Single input value mode allow access to context-menu options. (#346) 2017-07-29 15:50:24 +08:00
973d4a361b ColorPicker: Forward AlphaPreview flag to its individual inputs/sliders. Split code into extra lines to make logic more readable. (#346) 2017-07-29 14:32:41 +08:00
cdcda9ff68 ColorEdit4: Store edit options per window. Demo: Letting user change edit mode. (#346) 2017-07-29 14:01:05 +08:00
c36d59a42a ColorEdit, ColorPicker: AlphaPreview, AlphaPreviewHalf are explicit. Updated demo and using in style editor. 3x3 checkerboard more readable in half mode. (#346) 2017-07-27 17:16:46 +08:00
b1cbd87a94 ColorEdit4: Minor tidying up. (#346) 2017-07-27 16:49:57 +08:00
bfec9c657e ColorButton: Pretty much gave up with getting the checkerboard + AA + rounding + blending + offset all working together with every combination under the sun. It works as long as you don't sneeze. (#346) 2017-07-27 16:26:32 +08:00
a9df6bfe86 ColorButton: Fixed rounding corners artefact when there is a single cell. 2017-07-27 14:04:58 +08:00
b7a563276d ColorTooltip: Honor ImGuiColorEditFlags_HalfAlphaPreview flag by calling ColorButton(). Added HalfAlphaPreview to demo. (#346) 2017-07-27 11:07:46 +08:00
c1c2b2400a ColorButton: Undo ce203f99f5 2017-07-27 11:04:39 +08:00
2e37db9002 ColorEdit4: Fix not forwarding ImGuiColorEditFlags_AlphaBar flag to ColorPicker4 (#346) 2017-07-27 10:49:01 +08:00
27e5b09af1 ColorButton: ImGuiColorEditFlags_HalfAlphaPreview flag to render both opaque and alpha-with-checkerboard versions of the peak preview (#346) 2017-07-26 23:07:35 +08:00
69dd1ed583 RenderColorRectWithAlphaCheckerboard() in one layer to shunt out anti-alasing artefacts when rounded. Added ImLerp(int,int,float). (#346) 2017-07-26 22:20:43 +08:00
76bae2f015 ColorEdit, ColorPicker: Fixed broken build due to commiting an undesirable change in 78a8f798c5 (#346) 2017-07-26 17:46:48 +08:00
19c6a9c0e0 ColorButton, ColorPicker: painfully made RenderColorRectWithAlphaCheckerboard more friendly to using Rounding and Border in style, still not perfect :( (#346) + comments 2017-07-26 17:38:33 +08:00
6796e771fd ColorEdit, ColorPicker: added ImGuiColorEditFlags_NoAlphaPreview flag (#346). Reorder flags again. 2017-07-26 16:28:01 +08:00
d29a4c5e5c Demo: Removed the color button from the context menu example because it is misleading now that our color widget have tooltip/context menus themselves. (#346) 2017-07-26 16:00:47 +08:00
c84acf3f56 Comments 2017-07-26 15:59:57 +08:00
ce203f99f5 ColorButton: Push a text baseline offset if higher than g.FontSize. (#346) 2017-07-26 15:52:17 +08:00
78a8f798c5 ColorEdit, ColorPicker, ColorButton: Display grid under transparent colors (WIP) (#346) 2017-07-26 15:24:09 +08:00
df56879883 imDrawList::PathRect() uses ImGuiCorner_ enums. Should fully promote this to imgui.h at some point. 2017-07-26 14:53:15 +08:00
9d0e5beaa7 GetColorU32(ImGuiCol): avoid using GImGui twice since some implementation make it a TLS-ish variable with non-trivial accessors. 2017-07-26 14:35:50 +08:00
95fe11b5bf Added GetColorU32(u32) variant that does the style alpha multiply without a floating point round trip. Not 100% sure about that before the signature may seem ambiguous? But also make using imgui+drawlist more consistent in end-user extensions. 2017-07-26 14:34:59 +08:00
6e04cedd5f Updated link to binaries 2017-07-25 20:06:18 +08:00
f39cd61bf0 Reorder ImGuiColorEditFlags_ (#346) 2017-07-23 19:08:58 +08:00
4f1f251bd2 ColorEdit, ColorPicker: Context / options menu allows to toggle between u8 and float display. Using short words to avoid localization. (#346) 2017-07-23 19:02:26 +08:00
8d32e8dae6 ColorPicker: Handle out of 0..1 range colors when displaying the cross hair. (#346) 2017-07-23 18:48:45 +08:00
7b2d79cffd ColorEdit: Added ImGuiColorEditFlags_Float flag to display and edit drag values in 0.0..1.0 range instead of 0..255. (#346) 2017-07-23 18:44:32 +08:00
4def2ce339 ColorPicker: Demo tweaks (#346) 2017-07-23 17:55:39 +08:00
645875a240 Examples: Enable vsync by default in example applications (#1213, #1151) 2017-07-23 16:13:17 +08:00
166e8f6261 Examples: OpenGL2+GLFW/SDL: Added commented out glUseProgram(0) in main.cpp for visibility (#1116) 2017-07-23 15:57:39 +08:00
c8794c246e Examples: Vulkan: Batch file builds both debug and release 2017-07-23 15:22:21 +08:00
a8b202782f ColorPicker,ColorButton: Honor Border/Shadow style settings (#346) 2017-07-22 19:37:13 +08:00
790d0eb5be ColorPicker: Added ImGuiColorEditFlags_AlphaBar option (#346) 2017-07-22 19:24:39 +08:00
4355b2e422 ColorPicker: Honor ImGuiColorEditFlags_NoColorSquare flag + comments (#346) 2017-07-22 19:04:10 +08:00
91bf8fd689 ColorPicker,ColorEdit: Demo code (#346) 2017-07-22 18:01:29 +08:00
15be7e1a71 ColorPicker: new prototype for ColorButton() .Added _NoTooltip, _NoLabel flags. Changing _Alpha flag to _NoAlpha makes so much much sense and allow to revert default parameters to zero. ColorEdit4/Picker4 don't attempt to read/write fourth component, making ColorEdit3/Picker3 shorter/faster. Tooltip and Picker called from ColorEdit can have a title. Picker shows colored square. Moved ColorTooltip() to imgui_internal.h (#346) 2017-07-22 18:01:16 +08:00
dd9c2f97a8 ColorPicker: Renamed _NoSliders to _NoInputs (#346) 2017-07-22 17:38:38 +08:00
eba33deaf3 ColorPicker: Longer white line for hue/alpha selection, scale down according to ItemInnerSpacing. (#346) 2017-07-22 17:35:18 +08:00
1edeea2f5a ColorPicker: Removed extraneous ImGui:: prefixes + minor comments (#346) 2017-07-22 16:58:28 +08:00
e79d7553b0 ColorPicker: Don't use Alpha setting when enabling all 3 sliders (#346) 2017-07-22 16:52:41 +08:00
97bedd704c Better, unified color tooltip (#346) 2017-07-21 03:06:25 +08:00
c8553817d9 Merge branch 'master' into 2016-02-colorpicker 2017-07-21 02:34:19 +08:00
138a9dbaeb Tooltip: SetTooltip() is expanded immediately into a window, honoring current font / styling setting. Add internal mechanism to override tooltips (not exposed in BeginTooltip yet because bools are evil) (#862) 2017-07-21 02:21:48 +08:00
100d30a0a1 Comments about IMGUI_DISABLE_TEST_WINDOWS (#1240, #169) 2017-07-20 23:12:58 +08:00
e4007f7145 Internals: Move GetVisibleRect() a few functions above so it gets to hang out with its peers. 2017-07-20 22:30:56 +08:00
85d9c8fb46 Internals: renaming IndexWithinParent to OrderWithinParent 2017-07-20 21:25:31 +08:00
25f3717a1c Removed IsPosHoveringAnyWindow() which was severaly broken and misleading (most people want to use io.WantCaptureMouse). Added dummy function with assert for now. (#1237) 2017-07-20 20:57:46 +08:00
3e4cb40d45 Merge branch 'master' into 2016-02-colorpicker 2017-07-19 14:53:25 +08:00
d1145e990d Comments tweak (#1231) 2017-07-16 13:07:11 +08:00
41f944238b Comments about GlyphExtraSpacing (#1192) 2017-07-15 18:03:43 +08:00
1987e23ce5 ImDrawList::PrimReserve() minor renaming of locals to make things clearer 2017-07-15 17:52:52 +08:00
f3cf5e0322 Examples: SDL+GL3: Fixed old comments (#1229) 2017-07-15 17:50:01 +08:00
8261d9ff30 Comments (#1172, #1231) 2017-07-15 17:11:53 +08:00
be7fa76fdd Fixed Clang unknown-warning-ignored warning by ignoring it..... we are truly living in a special time (#1090) 2017-07-15 13:27:44 +08:00
52df0032a5 Travis: Blind fix for SDL+GL3 project on the Travis build setup.
Examples: SDL+GL3: Makefile blind fix for OSX (untested) (#1229, #1209)
2017-07-15 13:19:13 +08:00
358e667b7a Travis: Adding the SDL+GL3 project on the Travis build setup (for both Linux and OSX).
Examples: SDL+GL3: Makefile blind fix for OSX (untested) (#1229, #1209)
2017-07-15 13:13:09 +08:00
0fe5728971 Examples: SDL+GL3: Makefile fix for Linux (#1229, #1209) 2017-07-15 13:07:43 +08:00
03e6bfe84a Comments 2017-07-14 19:49:11 +08:00
cb6d893a13 Comments (#383, #1224) 2017-07-14 18:12:40 +08:00
afae9398cb Comments. Removed sort-of duplicate access to GImGui->Font in ImDrawList::AddText() so it's only in one place. 2017-07-14 17:49:42 +08:00
1094afc6be Merge pull request #1209 from fr500/master
Examples: Fix Makefile for non-6.3 MINGW versions, added SDL+GL3 Makefile.
2017-07-09 17:29:57 +02:00
8b6896faf9 add SDL GL3 makefile 2017-07-02 21:38:27 -05:00
d43695b748 fix gl2 sample too 2017-07-02 21:28:56 -05:00
e0aac34672 fix compilation on MINGW 2017-07-02 11:21:24 -05:00
d3f4309491 Comments about ImGuiStyleVar enum (#1198) 2017-06-24 13:11:46 +02:00
1e981f00e5 Comments 2017-06-21 13:50:31 +02:00
a5e0210902 Revert 978c84d2e9 because int32 >> 32 tends to warns on some compilers/settings. Add ImU64 type. (#1184) 2017-06-19 21:19:48 +02:00
e47cf79773 Comments tweaks, typos (#1188) 2017-06-17 19:30:30 +02:00
4c8d87d3fb Comments (#1188) 2017-06-17 19:25:58 +02:00
978c84d2e9 Removed dependency on int64_t type (unvailable in VS2008) by rewording an assert (#1184) 2017-06-16 14:08:17 +02:00
12d265fa31 Version 1.51 WIP tag 2017-06-13 11:30:22 +02:00
a2f7c40e30 Fixed comment (#1178) 2017-06-13 11:29:21 +02:00
1cd1ca259e Update README.md 2017-06-02 14:01:06 +02:00
5e1caaaef3 Version 1.50 2017-06-02 12:22:34 +02:00
7ad84b22f8 Comments 2017-06-02 12:13:47 +02:00
99ff2ec6fb Examples: DirectX9/10/11: Comments 2017-06-02 11:28:48 +02:00
2acbd1ac2d Using ImTextureID instead of void* in ImFontAtlas, not sure why I didn't do that earlier, make things more clear 2017-06-02 11:25:45 +02:00
51c200ac0d Examples: DirectX9: Clarified texture release code (#1163) 2017-06-02 11:25:45 +02:00
32f5ef4f98 Added Pascal binding 2017-06-01 12:25:01 +02:00
62c4698a73 Further clarifications of the key indices passed to IsKeyXXX functions (#1159) 2017-05-27 17:55:48 +02:00
8228dc20df Merge branch 'master' into 2016-07-navigation 2017-05-26 13:44:08 +02:00
c038339a4c Merge branch 'master' into 2015-02-colorpicker 2017-05-26 13:43:36 +02:00
9da53bcecd ImFontConfig: Removed MergeGlyphCenterV in favor of a more multipurpose ImFontConfig::GlyphOffset. (Breaking change) 2017-05-26 13:42:36 +02:00
026d021df1 Demo: Fixed warnings introduced in 0828a1fd6c 2017-05-26 13:40:53 +02:00
c5c77a3476 ImFontConfig: Added GlyphOffset to explicitely offset glyphs at font build time, useful for merged fonts. May remove MergeGlyphCenterV soon. 2017-05-26 13:36:52 +02:00
3a7111cfcd casting to GLint on init 2017-05-17 21:42:34 +02:00
ad3c1e68ab save and restore sampler in GL 3 examples 2017-05-16 16:43:59 -07:00
0981d8e381 fixes types 2017-05-16 12:49:47 +02:00
0828a1fd6c Fixed computation of ImFont::MetricsTotalSurface not taking oversampling into account 2017-05-14 16:27:10 +02:00
bd9868f447 Scrollbar: Avoid rendering when sizes are negative to reduce glitches (not sure how this ever slipped through - perhaps because of WindowMinSize settings). 2017-05-13 20:25:09 +02:00
df52f46b13 Comments, documentation (#1121) 2017-05-02 10:43:00 +02:00
9614552eba README.md added link to Nicolas Guillemot flashtalk (#1099) 2017-05-01 17:16:40 +02:00
b0db625cab Examples: Vulkan: Fixed an extra validation (tested on Windows with VulkanSDK 1.0.46.0) (#1042) 2017-05-01 17:07:53 +02:00
f87b152522 Examples: Vulkan: Various very minor stylistic fixes, fixing typos in comments, etc. (#1042 #1043) 2017-05-01 17:07:05 +02:00
201d589714 Image presentation now depends on the completeness of command buffer submission through semaphores.
To maintain maximum frame rate we render to the last acquired swapchain image but present the last but one drawn image. This behavior is optional through conditional compilation macros.
2017-05-01 16:54:49 +02:00
a9add1ce63 Removed redundant VkResult plugged into VkPresentInfoKHR pResults attribute. This is only meaningful when we present directly to multiple swapchains. In that case we can an VkResult per swapchain. 2017-05-01 16:53:54 +02:00
eaae754211 Removed redundant barrier.
The transition of the swapchain image(s) can happen implicitly in the renderpass. This approach has been stated to be more efficient than using an explicit barrier.
See "Vulkan Programming Guide", Chapter 7: "Graphics Pipelines", section "Renderpasses".
2017-05-01 16:52:52 +02:00
33874073dc Fixed all issues found by vulkan debug report. Reasons for the major design changes are commented. 2017-05-01 16:48:16 +02:00
89d03d5cca Examples: Vulkan: Disable IMGUI_VULKAN_DEBUG_REPORT by default. Update .bat files for newer VulkanSDK. 2017-05-01 16:46:57 +02:00
56dff3a080 Vulkan backend: optionally enabling vulkan validation layers and debug report callback
Additional layer, extension and the callback itself are used/created when IMGUI_VULKAN_DEBUG_REPORT is defined. The callback reports seven (potential!) errors which will be fixed with another pull request.
2017-05-01 16:32:45 +02:00
55be2f0722 Merge branch 'ParticlePeter-g_FrameIndex_not_used_fix' 2017-05-01 16:23:27 +02:00
9fd3ba871b Merge branch 'g_FrameIndex_not_used_fix' of https://github.com/ParticlePeter/imgui into ParticlePeter-g_FrameIndex_not_used_fix 2017-05-01 16:21:43 +02:00
5418bb19ff Examples: Vulkan: windows batch file for 64-bits. 2017-05-01 16:14:13 +02:00
497381dc3d Comments 2017-05-01 15:53:50 +02:00
23e7cdcee8 Merge branch 'martty-vk_small_fix' 2017-05-01 15:27:05 +02:00
ac2eb4b960 Merge branch 'vk_small_fix' of https://github.com/martty/imgui into martty-vk_small_fix 2017-05-01 15:26:29 +02:00
c3d9e0a6eb Examples: SDL2: Tweaked batch files for Win32. 2017-05-01 15:00:42 +02:00
475446b8b9 Merge pull request #1080 from SaschaWillems/master
Examples: Vulkan: Small changes to be in line with specs and fix validation layer errors/warnings
2017-05-01 14:50:34 +02:00
b3d237a5ce Examples: SDL2: Added build .bat files for win32. 2017-05-01 13:47:59 +02:00
dbfd5d6e9a Ignoring unreasonnable Clang -wformat-pedantic warning (#1090)
See e.g.
http://clang-developers.42468.n3.nabble.com/The-p-conversion-and-cast-to-void-td4044226.html
2017-05-01 12:55:47 +02:00
27b83a2cac Merge branch 'master' into 2016-07-navigation 2017-05-01 12:38:33 +02:00
89b1497843 Merge branch 'master' into 2016-02-colorpicker 2017-05-01 12:37:34 +02:00
a0a6c8a2ef Renamed ImDrawList::PathFill() to ImDrawList::PathFillConvex() for clarity. (breaking API) 2017-05-01 12:36:46 +02:00
7cd55ce939 Merge branch 'ecraven-addimagequad' 2017-05-01 12:34:45 +02:00
6517d68cdf ImDrawList::AddImage* renamed uv_ parameters to be more consistent. Fix AddImageQuad to use IM_COL32_A_MASK (#1009) 2017-05-01 12:34:32 +02:00
f06b20185f Merge branch 'addimagequad' of https://github.com/ecraven/imgui into ecraven-addimagequad 2017-05-01 12:25:25 +02:00
884c435fd3 Merge branch 'greggman-fix-opengl3-example' 2017-05-01 12:21:05 +02:00
9fdd66330f Examples: SDL2+GL3: Fix blend func state save/restore (#1120) 2017-05-01 12:20:51 +02:00
01286f6636 Fix blend func state save/restore
AFAIK there's no such enum as `GL_BLEND_SRC` or `GL_BLEND_DST` in OpenGL3 and OpenGL4.

Maybe they're left over from previous versions? They don't even seem to exist in OpenGL 2.1. In fact checking they were deprecated in OpenGL 1.5 (they exist in 1.3)
2017-05-01 16:05:45 +09:00
d878462866 End() avoid calling Columns() if no columns set is open, not sure what it wasn't the case.
Pros: Faster. Avoid early crashes StackId underflow that are meant to be more gracefully caught by CheckStacksSize() (with more explicit assert). Cons: Excercise less code.
2017-04-30 12:10:45 +02:00
bbd44b4edd Clarified asserts in CheckStacksSize() when there is a stack mismatch 2017-04-30 12:10:45 +02:00
a606f2dcb5 Update README.md 2017-04-28 13:43:11 +02:00
9ab9a846a1 Update README.md 2017-04-28 13:40:50 +02:00
6e69923e35 Update README.md 2017-04-28 13:32:04 +02:00
32390a252f Added UnrealEngine_ImGui link 2017-04-28 10:28:52 +02:00
659b3fd259 Add ImDrawList::AddImageQuad
Adds a function
  AddImageQuad(user_texture_id, a, b, c, d, uva, uvb, uvc, uvd, col)
that shows a texture on a full quad. This allows showing arbitrary
rotations of a texture.
2017-04-28 10:04:20 +02:00
104936ab1a imconfig: Added comment about redefining ImDrawIdx 2017-04-26 19:12:46 +02:00
f030087f8e Comments to redirect people to OpenGL3 examples (#1116) 2017-04-26 18:27:10 +02:00
50b4b29beb Examples: GLFW+GL3, SDL+GL3: Fixed modifying bound Texture0 (#1087, #1088, #1116) 2017-04-26 18:16:59 +02:00
8df58e2cfd MenuItem should only be selected on release 2017-04-25 15:15:56 +02:00
670775ac22 Added assert/comment about using MergeMode (#1100) 2017-04-13 20:01:24 +02:00
15d7f20d4f Update README.md 2017-04-01 18:44:34 +02:00
0e1950f7d6 Comments about child menu positioning (#1086) 2017-04-01 18:01:47 +02:00
4b125e7d5c Merge pull request #1078 from nem0/master
Added missing IMGUI_API macros in ImGuiTextEditCallbackData methods.
2017-03-29 14:51:26 +02:00
4da26d85cd Clip negative scissor offsets to zero 2017-03-26 19:54:59 +02:00
12deb53b11 Set required depth member for buffer image copy 2017-03-26 19:38:05 +02:00
7a37a1c3f6 do not export inline function, it causes problems on some compiers 2017-03-24 12:45:09 +01:00
316555f9de missing API 2017-03-24 10:10:22 +01:00
288dccd5a5 Merge branch 'master' into 2016-07-navigation 2017-03-17 21:30:16 +01:00
e10ceebd36 ImFont: Store the texture surface used to get an idea of how costly each font is. 2017-03-17 21:29:57 +01:00
b84eac53d8 ImFont: Reorder field initialization to match declaration order 2017-03-17 21:29:28 +01:00
931bc61345 Comment about ImGuiInputTextFlags_CtrlEnterForNewLine for InputTextMultiline() 2017-03-16 21:55:36 +01:00
2a3c61e5f8 Merge branch 'master' into 2016-07-navigation 2017-03-16 19:31:12 +01:00
92ea8d1131 Merge branch 'master' into 2016-02-colorpicker 2017-03-16 19:28:30 +01:00
9a068ce005 Merge pull request #1068 from codecat/fix-colorbutton
ColorButton: fix showing wrong hex value for alpha in tooltip.
2017-03-16 09:51:04 +01:00
fdd11658eb Fix ColorButton showing wrong hex value for alpha 2017-03-15 21:25:29 +01:00
30954b4a88 Merge latest from ocornut/imgui 2017-03-13 13:26:55 -07:00
337019a68f typo, #elif instead of #else, fixed 2017-02-26 17:16:37 +01:00
fd90da38e1 Vulkan backend: g_FrameIndex not used fix -> huge perf gain
Added a macro to switch between unlimited frame rate (VK_PRESENT_MODE_IMMEDIATE_KHR) and limited to 60 fps (VK_PRESENT_MODE_FIFO_KHR). Only the latter mode is guaranteed to be available, but the former one most likely is.
2017-02-26 13:25:54 +01:00
e0244c8f62 Fix scissor offset being negative 2017-02-11 12:20:12 +01:00
509df3e279 Fix new Vulkan validation warnings 2017-02-11 12:19:44 +01:00
6384eee34f Minor comments (#998) 2017-01-29 16:53:01 +01:00
4653197ca4 Update README, kinder 2017-01-28 23:26:25 +01:00
a7cf369e71 Update README.md 2017-01-28 23:14:35 +01:00
8e8117c7b1 stb_truetype update (with OpenType, Type 2 font handling) (#976) 2017-01-21 19:23:47 +01:00
b8043d3ee5 Internal: Renamed ImLoadFileToMemory to ImFileLoadToMemory to be consistent with ImFileOpen + fix mismatching .h name (#917) 2017-01-14 13:47:16 +01:00
b6c0227add Merge branch 'master' into 2016-02-colorpicker 2017-01-11 21:03:35 +01:00
c76be71acf Merge branch 'master' into 2016-07-navigation 2017-01-11 21:03:25 +01:00
6257b5814a Added an explicit (internal) ClearActiveID() helper and removed the default NULL window parameter to internal SetActiveID(), 2017-01-11 20:56:55 +01:00
cffdbfe01b Comments (#972) 2017-01-10 10:36:07 +01:00
714beb217c Demo: Console: Fixed a completion bug when multiple candidates are equals and match until the end. 2017-01-07 20:18:45 +01:00
68df09cf47 Fixed word-wrapping which would never wrap after a 1 character word. (thanks @sronsse) 2017-01-01 20:11:40 +01:00
a60b2cc645 Merge branch 'master' into 2016-02-colorpicker 2016-12-23 12:15:58 +01:00
bb4d19ff7c Merge branch 'master' - merge fix 2016-12-23 12:15:09 +01:00
fdc70456f4 Merge branch 'master' into 2016-07-navigation 2016-12-23 12:13:52 +01:00
db593220fc Comments, clarified use of io.MouseDelta (#942)
(ImGuiIO structure layout changed)
2016-12-23 11:34:23 +01:00
f4f0ee750f Update README.md 2016-12-21 21:13:43 +01:00
1396659b72 Examples: Speculative fix for OSX Makefile to make Travis happy (re #812) 2016-12-21 20:12:43 +01:00
081aec482b Merge pull request #931 from nlguillemot/master
Combo, ListBox: Extra const correctness.
2016-12-21 20:06:04 +01:00
baa2e3b451 Minor documentation tweaks 2016-12-21 18:42:52 +01:00
d74a3349e9 Examples: DirectX9: Explicitely setting viewport to match that other examples are doing (#937) 2016-12-19 23:15:38 +01:00
52308a54f8 Demo: comments 2016-12-12 11:05:41 +01:00
36d78e0565 const correctness for Combo and ListBox
Since Combo and ListBox only read and display the list of items, they
should not modify the pointers inside the array of pointers passed in.
Adding "const" here makes it possible to call these functions with such
an array of const pointers. Previously, a cast to "const char**" was
required as a workaround, otherwise there was a compile error.
2016-12-04 12:54:31 -08:00
55d651812d Renaming and massaging internal Settings/Ini functions (#923) 2016-11-29 21:55:20 +01:00
0b6211f907 Fixed clicking on a window's void while staying still overzealously marking .ini settings as dirty (#923) 2016-11-29 21:46:21 +01:00
9235e0da46 SliderInt, SliderFloat(): Fixed edge case where style.GrabMinSize being bigger than slider width can lead to a division by zero (#919) 2016-11-29 21:07:26 +01:00
ca9a918535 SliderInt(): Fixed reverse direction mode when (v_max-v_min)==-1 (#854) (+ ref #919) 2016-11-28 20:43:11 +01:00
bbd0a37bd2 ImFileOpen: MinGW uses _wfopen() codepath to support UTF-8 filenames (#917) 2016-11-28 20:30:36 +01:00
449c47c789 SliderInt, SliderFloat() interacting enforce modifying to the value to be consistent with other widget behaviors (#919) 2016-11-28 11:05:24 +01:00
94c77edfa5 SliderInt, SliderFloat() Better display support for v_min==v_max range. (#919) 2016-11-28 11:03:48 +01:00
37a27a8025 Merge branch 'master' into 2016-07-navigation 2016-11-27 18:35:48 +01:00
0a483379af Split SliderBehaviorCalcRatioFromValue() out of SliderBehavior(), fix + Not using fabsf() anymore 2016-11-27 18:34:46 +01:00
004e863727 Split SliderBehaviorCalcRatioFromValue() out from SliderBehavior() 2016-11-27 18:32:24 +01:00
67c6d6026a Nav: SliderFloat() Fixed non-linear sliders in Nav branch (#787, #323) 2016-11-27 18:29:38 +01:00
3028ccc25b Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-11-27 18:25:20 +01:00
f4cf972ea9 Merge branch 'master' into 2016-02-colorpicker 2016-11-27 18:21:14 +01:00
219e4fb8fb SliderInt, SliderFloat: Passing v_min==v_max disable setting value from clicking/dragging (#919) 2016-11-27 17:49:04 +01:00
a868c32ed1 SliderInt, SliderFloat: Renaming 2016-11-27 17:43:32 +01:00
61d5b46307 SliderInt, SliderFloat(): support reverse direction (#854) 2016-11-27 17:38:33 +01:00
104b381023 Using _wfopen() under Windows+MSVC because fopen() doesn't support UTF-8 encoding. Wrapped as ImFileOpen(). (#917) 2016-11-27 16:43:36 +01:00
66c4281290 Began improvements to columns API by splitting the Columns() function into BeginColumns() and EndColumns() and adding additional flags. The columns data still needs to be placed into a stack. 2016-11-13 23:58:09 -08:00
9c6048f781 Tools: binary_to_compressed_c.cpp : comments + link to precompiled binaries 2016-11-13 21:42:40 +01:00
3085716708 Merge branch 'Loftilus-master' 2016-11-13 17:57:57 +01:00
127dd7c88c Examples: Vulkan: Coding style fixes (#910) 2016-11-13 17:57:43 +01:00
a5600b6e59 Vulkan example: Proper surface format search. 2016-11-13 05:23:33 +01:00
b447a71cf6 Vulkan example: Fix gamma for some implementations. 2016-11-13 04:28:26 +01:00
08ef9819c8 Vulkan example: Fix validation layer warnings and errors and redeclare gl_PerVertex. 2016-11-13 03:00:36 +01:00
1a0e414d3a Fixed uninitialized variables (wouldn't have a real effect because they'd be cleared in Begin()). 2016-11-12 21:17:30 +01:00
fdbad2708c Ignore GCC 6 warnings (#883) 2016-11-12 21:04:55 +01:00
7c2b35704d Examples: DirectX9-10-11: Only call Windows' SetCursor(NULL) when io.MouseDrawCursor is set (#585, #909) 2016-11-12 19:46:52 +01:00
2973287fd3 Merge branch 'martty-master' 2016-11-12 17:50:25 +01:00
55863dd274 Examples: Vulkan: Shallow stylistic changes (following #879) 2016-11-12 17:49:59 +01:00
0449bb98e2 Merge branch 'master' of https://github.com/martty/imgui into martty-master 2016-11-12 17:36:46 +01:00
98e1d500d4 Support for #define-ing GImGui and IMGUI_SET_CURRENT_CONTEXT_FUNC to enable custom thread-based hackery (#586) 2016-11-12 17:08:31 +01:00
e0aef0018f Updated README 2016-11-12 16:08:26 +01:00
a68ac96bc4 Examples: GL3: Comments about gl3w (#880) 2016-11-12 12:48:33 +01:00
775ac24d45 Fixed overzealous GCC warnings (#883) + partly undo 8553bab241 2016-11-12 11:14:37 +01:00
89d033aba3 Merge pull request #898 from tinnnysu/master
Examples: SDL+OpenGL2: Update cmdline syntax in Windows compilation.
2016-11-12 11:08:51 +01:00
379533f661 Updated stb_truetype.h, stb_rect_pack.h primarily to reduce warnings (#883) 2016-11-11 20:19:07 +01:00
8553bab241 Ignoring overzealous GCC warnings (#883) 2016-11-11 20:17:35 +01:00
81eefb704b Minor const fixes for overzealous warnings (#883) 2016-11-11 18:40:13 +01:00
941cf1b436 Merge branch 'master' into 2016-07-navigation 2016-11-09 15:21:36 +01:00
ccb3db94da Merge branch 'master' into 2016-02-colorpicker 2016-11-09 15:17:20 +01:00
833ed760ae update cmdline syntax in windows compilation 2016-11-09 14:53:23 +08:00
faafcf418d Demo: Comments, even though nobody appears to read the comments. 2016-11-07 17:33:46 +01:00
3689efb726 Font: Readme about icons 2016-11-06 22:53:36 +01:00
da9feba539 Fixed missing frame padding on title bar text when Collapse triangle is disabled 2016-11-06 22:40:47 +01:00
620497e466 Font: Font name include size 2016-11-06 22:21:21 +01:00
84f480a638 Font: Added Roboto-Medium + tweaked readme 2016-11-06 22:21:10 +01:00
b2f0ea6c0d Font: Default font given explicit name "ProggyClean.ttf" 2016-11-06 21:51:20 +01:00
b376b68326 Font: Added io.FontDefault in ImGuiIO structure to make it easier to change default font from third-party or demo code 2016-11-06 21:50:18 +01:00
357167f917 Demo: Custom Rendering: Tweak so end of line can be dropped outside of canvas, more pleasing. 2016-11-06 18:13:14 +01:00
907dd2ed20 Comments (#896) 2016-11-06 15:25:28 +01:00
ddf08ec2e8 BeginChild(const char*) applies stack id to provided label (#894, #713) 2016-11-06 15:12:50 +01:00
32dbe836d0 Add user-facing IsPopupOpen function 2016-10-29 15:33:09 -04:00
53126cd713 Add location decorators & change to use structs as in/out in glsl, update embedded spv (produced with glslangValidator -x) 2016-10-18 22:43:20 +02:00
44250caf50 Null the released resources 2016-10-18 22:07:51 +02:00
43e6c46c8d Merge pull request #877 from Velro/patch-1
Demo: Outdated dragging API mentioned in demo text
2016-10-16 18:32:13 +02:00
6fa3aaf7c0 outdated dragging API mentioned in demo text
Looks like you changed the API on dragging, but did not update the description text for it. 
https://github.com/ocornut/imgui/issues/167
2016-10-16 12:21:38 -04:00
dd6163241c Merge branch 'master' into 2016-02-colorpicker 2016-10-16 14:02:15 +02:00
bdb34d1c11 Merge branch 'master' into 2016-07-navigation 2016-10-16 14:01:13 +02:00
b3790e7549 InputText: Fixed pressing home key on last character when it isn't a trailing \n (#588, #815) 2016-10-16 13:34:47 +02:00
7252d93dcd stb_textedit.h Merged from master 1.9 (merged bits from #473) 2016-10-16 11:34:33 +02:00
0d3f8807c7 Added a void* user_data parameter to Clipboard function handlers. (#875) 2016-10-15 11:36:43 +02:00
d649bc485b Minor comments 2016-10-15 11:18:29 +02:00
cb7e1c18b5 Separator: Fixed zero-height bounding box resulting in clipping when at top of clipping rectangle (#860) 2016-10-10 22:37:59 +02:00
31dc7d8d63 Added ImGuiMouseCursor_None for usage by app/binding 2016-10-10 18:03:37 +02:00
4de35b4f30 Removed left-over empty op 2016-10-09 10:58:38 +02:00
1810b3ff38 Added ImGuiCorner enum to clarify some internal code 2016-10-09 10:56:23 +02:00
d567595dde ImDrawList: AddRect(), PathRect() default rounded_corner 0x0F->~0/-1 so it appears less obscure in IDE completions 2016-10-09 10:35:01 +02:00
abaada4224 Removed the inconsistent shadow under RenderCollapseTriangle() (~#707) 2016-10-09 10:31:39 +02:00
5957af8a80 Fixed not using IM_ARRAYSIZE() where appropriate 2016-10-09 10:08:03 +02:00
fa73e5aa0e Plot: Fixed calling with values_count == 0 2016-10-08 12:43:30 +02:00
51111b0ed5 FAQ clarified the ClipRect entry a little 2016-10-07 10:27:19 +02:00
e4deb7a190 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-10-07 09:52:14 +02:00
404979e48d Merge remote-tracking branch 'origin' into 2016-02-colorpicker 2016-10-07 09:52:00 +02:00
e07d45709f ImDrawList: Uses IM_COL32_A_MASK macro instead of hardcoded zero alpha testing (#844) 2016-10-07 09:49:52 +02:00
7995cabce5 Merge pull request #864 from jslee02/fix-clang-unknown-warning
Fix clang warning for old Clang versions: unknown warning group '-Wreserved-id-macro'
2016-10-06 21:48:00 +02:00
1d7e05327b Fix clang warning: unknown warning group '-Wreserved-id-macro' 2016-10-06 14:48:47 -04:00
05b580e691 Tools: Fixed binary_to_compressed_c.cpp not to use different types on both sides of ternary op (#856) 2016-10-02 17:25:09 +02:00
a2487bc143 Minor tweaks 2016-10-01 15:16:17 +02:00
9896faf731 Merge branch 'madeso-master' 2016-10-01 15:00:00 +02:00
2919c77bee Examples: GLFW+OpenGL3: Fixed Shutdown() calling GL functions with NULL parameters if NewFrame was never called (#800) 2016-10-01 14:59:28 +02:00
b96471143f Merge branch 'master' of https://github.com/madeso/imgui into madeso-master 2016-10-01 14:56:24 +02:00
28974dfbbb Merge branch 'thedmd-2016-08-use_bgra_colors' 2016-10-01 14:29:27 +02:00
68c81739bf Minor tidying up following merge BGRA color PR (#844) 2016-10-01 14:29:12 +02:00
eb0382a1c1 Merge branch '2016-08-use_bgra_colors' of https://github.com/thedmd/imgui into thedmd-2016-08-use_bgra_colors 2016-10-01 14:19:25 +02:00
dfe4683c17 EndGroup(): Made IsItemHovered() work when an item was activated within the group (#849) (loosely follows #840) 2016-10-01 14:10:24 +02:00
1999c01db8 Apply Omar feedback and convert remaining 0xAABBGGRR's into IM_COL32(RR,GG,BB,AA) format. 2016-09-26 12:00:33 +02:00
d75d2b1871 Introduce IMGUI_USE_BGRA_PACKED_COLOR in imconfig.h.
When IMGUI_USE_BGRA_PACKED_COLOR is defined packed color hold in ImU32 use BGRA format instead RGBA.
2016-09-26 12:00:33 +02:00
82dcdc9dfc ShowStyleEditor: tweak font map display to show glyph details when hovered. 2016-09-25 15:52:04 +02:00
f5b37dbc52 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-09-25 15:31:36 +02:00
fea0fcb7c3 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-09-25 15:25:55 +02:00
d7c518e6cc ShowStyleEditor: show font map / grid in more details. 2016-09-25 15:22:41 +02:00
6def01be5d Fixed IsItemActive() lagging by one frame on initial widget activation (#840) 2016-09-25 14:32:38 +02:00
f2699de242 Fix using IsItemActive() after EndGroup() or any widget using groups (#840, #479) 2016-09-25 14:18:10 +02:00
ed279c0095 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-09-25 12:59:24 +02:00
1b5bbf725b Merge remote-tracking branch 'origin' into 2016-02-colorpicker 2016-09-25 12:57:22 +02:00
56cdbe434d Style: Added ButtonTextAlign, ImGuiStyleVar_ButtonTextAlign (#842) 2016-09-25 12:53:13 +02:00
0f303d363a Refactor text alignment options to use ImVec2, removed ImGuiAlign (#842, #222) 2016-09-25 12:19:15 +02:00
de9f8944ea Internal RenderTextClipped() merged optional/rate clip_min* clip_max* into clip_rect* 2016-09-25 11:38:04 +02:00
02cea0c3c3 Comment 2016-09-25 11:16:19 +02:00
281898e82e Tidying up PushStyleVar/PopStyleVar() a little more (#842) 2016-09-25 11:14:10 +02:00
c5b8c6303a Refactor PushStyleVar/PopStyleVar so it is constant time + can receive integers (yet unused) (#842) 2016-09-25 11:06:14 +02:00
35c6fd682f Inhibiting a ??e sequence in the embedded font. Shouldn't be treated as a trigraph but consistent with encoder (#839) 2016-09-23 09:09:07 +02:00
7f51929dc4 Tools: binary_to_compressed_c: Avoid ?? trigraphs sequences in string outputs (#839) 2016-09-23 09:06:19 +02:00
18d36e6f63 Merge pull request #837 from fdb/patch-1
Update link to Synergy repo.
2016-09-21 21:18:56 +02:00
5c3f8b12b9 Update link to Synergy repo
The Synergy repository has moved from synergy/synergy to symless/synergy.
2016-09-21 20:26:27 +02:00
6e87f071b8 Shutdown() clear out some remaining pointers (#836) 2016-09-20 12:41:21 +02:00
87d99fce6b ImFont: CalcWordWrapPositionA() fixed font scaling with fallback character. (followup to 86666489df) 2016-09-19 09:32:21 +02:00
0420ab027e Metrics: Displaying window position + moving extraneous line in IsPopupOpen(). 2016-09-16 01:09:57 +02:00
b397fb507e Fixed EndGroup() not restoring offset properly. breaking SameLine() offset (caused by 954c890c67) (#829) 2016-09-13 09:18:17 +02:00
612b17ef57 Fixing minor english typos (#827) 2016-09-11 22:02:35 +02:00
5a47346f5a ImFont: add RenderGlyph() to allow rendering of individual glyphs 2016-09-10 18:21:49 -07:00
02399852fe Examples: OpenGL2: Uploading font texture as RGBA32 to increase compatibility with users shaders for beginners (#824) 2016-09-10 17:43:17 +02:00
012223114d Merge pull request #825 from philix/fix-build
Examples: OSX: Fix Mac OS X build XCode project and remove cruft from Makefile
2016-09-10 11:31:41 +02:00
6e6f04f513 Fix Mac OS X build and remove cruft from Makefile 2016-09-10 11:22:40 +02:00
500d19bfdf Update README.md 2016-09-08 09:12:17 +02:00
b594b25be8 Update README.md 2016-09-08 09:11:29 +02:00
f6d4ca6473 TODO list 2016-09-07 12:02:37 +02:00
bc57fd5d1d Examples: OpenGL*: Savnig/restoring existing scissor rectangle for completeness (#807) 2016-09-05 23:39:52 +02:00
031d4e689d Examples: OpenGL3: Revert Makefile change for OSX for now (#812) 2016-09-05 22:52:45 +02:00
3a699e7264 Update README.md 2016-09-05 13:40:04 +02:00
2825eaa0be Examples: Accessing ImVector fields directly, feel less stl-ey and fix renderer side assert when render list only contains a callback (#810) 2016-09-03 19:24:57 +02:00
c0fcf223be Fixed assert triggering when a window has zero rendering but has a callback (#810) 2016-09-03 19:02:57 +02:00
056e49eec1 Merge pull request #812 from linkemars/master
Examples: opengl3 glfw: Mac makefile - correct name for linking opengl3_example
2016-09-02 15:00:49 +02:00
aa0cb13aa4 Correct name for linking opengl3_example
According to glfw offcial site, linking `libglfw.3.dylib` etc should
use `-lglfw`.

Changed this made the compilation on my Mac successfully.
2016-09-02 21:57:31 +09:00
9af74181ce Merge pull request #804 from Loftilus/master
Examples: Vulkan: Fix Vulkan example for use when a depth buffer is active.
2016-09-01 09:23:46 +02:00
08a9e78da5 fixed space issues 2016-08-29 23:35:56 +02:00
99b4f951b9 Fix Vulkan example for use when a depth buffer is active. 2016-08-27 19:08:24 +02:00
5def10c3a0 Fixed OpenGL error when calling Shutdown without calling NewFrame 2016-08-27 00:32:20 +02:00
b36ba12929 Travis test fix 2016-08-25 16:20:34 +02:00
5ae71aa04a Examples: Renaming opengl_example/ to opengl2_example/ for clarity (1/2 because git) 2016-08-25 10:25:51 +02:00
3c384c2f10 Examples: Renaming opengl_example/ to opengl2_example/ for clarity (1/2 because git) 2016-08-25 10:18:09 +02:00
ef10b984fe Merge remote-tracking branch 'origin' into 2016-02-colorpicker 2016-08-23 17:00:47 +02:00
f39513ac47 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-08-23 17:00:11 +02:00
63d47bc5a4 ImFormatString() Fixed an overflow handling bug with implementation of vsnprintf() that do not return -1 (#793) 2016-08-23 16:55:06 +02:00
e8e5c6d788 Nav: Comments. Fixed two -Wall warnings. Removed unused function. (#787) 2016-08-23 08:58:51 +02:00
3883a2027f Nav: Fixed Selectable() crash introduced earlier today in 43ee5d73 + added comments/assert (#323) 2016-08-21 17:52:42 +02:00
df9bdf38f9 Nav: NavActivateId, NavInputId are no repeat actions. Repeat buttons handle it themselves already anyway. (#323) 2016-08-21 17:32:15 +02:00
67fd805839 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-08-21 16:13:40 +02:00
c6c7371a4c Nav: Removed unnecessary test following 49ca1c2b88 (#323) 2016-08-21 16:11:53 +02:00
49ca1c2b88 Nav: InitDefaultRequest saves a fallback item so PadMenu on a collapsed window gets us to the collapse button (#323) 2016-08-21 16:07:55 +02:00
2303b67c40 Close button submitted after collapse button. Should have no effect. Consistent with expectation & will be used as fallback for nav (#323) 2016-08-21 16:05:19 +02:00
252f094101 Nav: Undo 87eb749cbc, agressively including nav focus test in IsItemHovered() (#323) 2016-08-21 15:26:40 +02:00
fddf9ca10e Nav: Fixed nav highlight clipping (affected non non-menu items within menubar) (#323) 2016-08-21 15:25:29 +02:00
78b7e2dfb3 Nav: Process and apply mouse move request immediately after move request result comes (#323) 2016-08-21 14:53:26 +02:00
f71cdd13b7 Internal tidying up, moved code to CalcNextScrollFromScrollTargetAndClamp() so it can be reused by upcoming nav code. 2016-08-21 14:39:13 +02:00
ac7826c8a5 ImRect: Added Translate() helper, removed redundant and misleading Reduce() 2016-08-21 14:37:48 +02:00
87eb749cbc Added IsItemHoveredOrFocused() (provisional name), better handling of popup/tooltip positioning when using mouse+nav (#323) 2016-08-21 13:25:40 +02:00
ea2425ad9a Nav: Fixed entering child with PadActivate not setting ActiveIdSource to Nav (#323) 2016-08-21 12:44:59 +02:00
43ee5d73e9 Nav: Hovering MenuItem/Selectable with mouse makes NavId, matching what seems to be Windows beahvior at least for menus (#323) 2016-08-21 11:45:50 +02:00
30c04d0dbe Nav: Mouse pos passed to backend always rounded, so that lossy application of non-integer mouse pos doesn't lead to undesirable movement (#3 2016-08-21 00:10:48 +02:00
bf42657850 Nav: Clearing mouse hover flag using MouseClicked[] test instead of MouseDown[] so that invalid mouse button won't keep breaking nav (#323) 2016-08-20 23:59:54 +02:00
695ca7bb45 Nav: Tidying up. Comments. (#323) 2016-08-20 23:27:25 +02:00
4f7c63a7af Nav: Fixed a bug where mouse positioning requests would be sent while opening submenus with mouse (#323) 2016-08-20 23:25:53 +02:00
e4c099d67c Nav: Comments + fixed handling of PadLeft in menus (fix e55882f) (#323) 2016-08-20 22:11:00 +02:00
e3fec8c0aa Renamed function (#323) 2016-08-20 19:19:58 +02:00
82768e05f3 Ignore list for Visual Studio 2016-08-20 13:30:42 +02:00
787a802f2e Merge branch 'martty-master' 2016-08-20 13:30:10 +02:00
4bc6a951fe tabs to space, remove braces 2016-08-20 13:27:03 +02:00
3234f81cb1 maxImageCount may be 0; add missing sType; change to 1 push constant range 2016-08-20 13:08:34 +02:00
622715725d Merge pull request #783 from bear24rw/patch-1
Demo: Add null terminator to ShowStyleEditor() output_type combo options
2016-08-19 18:00:27 +02:00
4f389b7f6a Add null terminator to ShowStyleEditor output_type combo options
Without a null terminator the Combo() function indexes outside of the "items_separated_by_zeros" string.
2016-08-18 11:00:23 -07:00
ead79dcdac Metrics: 64-bit display fix 2016-08-15 17:34:17 +02:00
3ab0d5cdfd Nav: NavHighlight gets its own color (default to Header color), made rectangle thicker (#323) 2016-08-15 13:07:39 +02:00
cf16ba6572 Nav: Exposed RenderNavHighlight() in imgui_internal.h to increase discoverability and reordered arguments to be more consistent (#323) 2016-08-15 11:52:02 +02:00
6c19d7b13c Nav: Fixed clipping rect of navigation highlight, notably for collapsing arrow (#323) 2016-08-15 11:41:56 +02:00
9501cd9991 InputText: Fixed calling callback on frame of losing active id, fix part of 848e62bfe0 (nav branch only)
#323 #701
2016-08-13 14:22:34 +02:00
cff815fd2d Merge branch 'master' into 2016-02-colorpicker 2016-08-11 23:22:15 +02:00
a83f9b7885 Merge branch 'master' into 2016-07-navigation 2016-08-11 23:21:04 +02:00
0f9addb002 Minor shuffle to ease merging branches. (tentative. fugly but those fields will be removed anyway) 2016-08-11 23:20:53 +02:00
bfe1e163b8 Merge remote-tracking branch 'origin' into 2016-02-colorpicker 2016-08-11 23:01:48 +02:00
2afffcdeb9 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-08-11 23:00:47 +02:00
4bc3f9d1f7 Minor shuffle to ease merging branches. 2016-08-11 22:59:44 +02:00
996eb080fa Merge remote-tracking branch 'origin' into 2016-02-colorpicker 2016-08-11 22:53:26 +02:00
df1d1b5b25 Nav: DragBehavior: Adjust minimum step to displayed precision when using navigation (#323, #180) 2016-08-07 20:40:57 +02:00
09cba02d3f Nav: DragBehavior: Fix for fast speed (#323 #180) 2016-08-07 20:31:51 +02:00
761a74c62b Selectable/MenuItem: Not activated on Click but only on Release is more standard (#126, #245, #323)
Apparently menu items started with OnClick (vs OnClickHoldRelease) when
doing #126. Hope to not break anything.
Also allows using xxx_DontClosePopup flags.
2016-08-07 20:21:18 +02:00
8828889d5e Refactored rare transient bool stacks into a set of flags, added unexposed ImGuiItemFlags_SelectableDontClosePopup (#323) 2016-08-07 20:05:24 +02:00
785f51227a Demo tweaks 2016-08-07 19:07:24 +02:00
525ef5b357 Nav: Tweaked default highlight clipping (clipped by scrollbar) and removed subtle background (#323) 2016-08-07 15:31:00 +02:00
a68132948b Nav: Added ImGuiCol_NavWindowingHighlight into style (#323) 2016-08-07 15:26:04 +02:00
6aa8019763 Nav: Fixed bug where pressing NavInput(Triangle) to turn slider/drag into text input would then change subsequent NavActivate as well (#323) 2016-08-07 15:19:29 +02:00
e55882f74b Nav: Allow PadLeft to close a menu (#323) 2016-08-07 15:18:04 +02:00
c203be94c6 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-08-07 13:55:59 +02:00
6eb35b8a04 BulletText(): doesn't stop displaying at the ## mark 2016-08-07 13:53:41 +02:00
8a6d209f68 Nav: Failed movement request with no current NavId fallback to an InitDefaultRequest so that we always land somewhere on first move (#323) 2016-08-07 13:34:25 +02:00
5ef8452509 Nav: Comments (#323) 2016-08-07 13:33:15 +02:00
cbf24c13ca Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-08-07 12:15:21 +02:00
5d1a0a6f77 Removed a handful of obsolete (trivial) function redirection from 1.34 and 1.38 (march-april 2015)
OpenNextNode() -> SetNextTreeNodeOpen()
GetWindowIsFocused() -> IsWindowFocused()
GetItemBoxMin() -> GetItemRectMin()
GetItemBoxMax() -> GetItemRectMax()
IsMouseHoveringBox() -> IsMouseHoveringRect()
IsClipped() -> !IsRectVisible()
2016-08-06 09:48:04 +02:00
aa9786077c Merge branch 'thedmd-2016-08-generalized_visibility_test' 2016-08-06 09:40:38 +02:00
b8397c2933 Tweak comments (#768) 2016-08-06 09:40:26 +02:00
a1521534ba Merge branch '2016-08-generalized_visibility_test' of https://github.com/thedmd/imgui into thedmd-2016-08-generalized_visibility_test 2016-08-06 09:36:24 +02:00
af33efb146 Using IM_COL32() for colors in a few spots (#767) 2016-08-06 09:35:05 +02:00
a7f6ea592f Moved GetColorU32 out of imgui_internal.h to avoid inlining mess (#759) 2016-08-06 09:22:41 +02:00
7588dfb67e Add ability to test arbitrary rectangle for visibility without need of moving cursor. 2016-08-05 11:47:16 +02:00
d85c1be6b6 Nav: Reordered Cancel handling code so you you can leave a child within a popup without closing the popup (#323) 2016-08-04 12:53:46 +02:00
c263961f07 Nav: Menu: Allow PadDown to open a menu from a menu bar, PadRight from a menu (#323, #126) 2016-08-04 10:41:33 +02:00
dcff032429 Nav: Moving all nav inputs to io.NavInputs[] float array, new enum labelled for gamepad. (#323) 2016-08-03 23:23:04 +02:00
4ccc87c91d Typo in commented default-value 2016-08-03 21:53:07 +02:00
c0dcef4e16 Nav: Moving window with nav stick disables mouse hover (#323) 2016-08-03 21:02:27 +02:00
4e91b521ee Demo: Arrange some inputs panels. 2016-08-03 20:55:54 +02:00
36fa2b9523 Nav: DragBehavior removed bogus test (#323) 2016-08-01 22:23:56 +02:00
d0801057ba Demo: Tweak handling of "animate" flag in graph demo so it doesn't keep running. 2016-08-01 20:55:54 +02:00
2e52bee12e Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-07-31 17:00:44 +02:00
907265d632 Using ImGuiID instead of ImU32 is a few places 2016-07-31 16:48:06 +02:00
8b190f1100 Nav: quick tap on NavMenu with no focused window doesn't focus one (holding still does) (#323) 2016-07-31 16:12:01 +02:00
e9c881e4de Nav: fixed using NavMenu/windowing select when no window is already focused + cleanup code (#323) 2016-07-31 16:07:58 +02:00
1ecbf73c97 Nav: working on early bits of documentation (#323) 2016-07-31 15:41:51 +02:00
a154625a56 Nav: Not exposing ImGuiWindowFlags_NavFlattened because it requires much more work (#323) 2016-07-31 13:40:14 +02:00
08a28c16ae Nav: Merge FocusedWindow and NavWindow that were basically duplicate at this point (#323) 2016-07-31 13:38:57 +02:00
2545d75c3b Tidying up, removed two unnecessary window flags from being exposed in imgui.h 2016-07-31 13:05:13 +02:00
b3cba62b80 Nav: Added experiment ImGuiWindowFlags_NavFlattened flag to cross over between parent and non-scrolling child windows (#323) 2016-07-31 12:55:23 +02:00
769a1dd748 Nav: No scrolling while using windowing functionalities (#323) 2016-07-31 10:41:41 +02:00
9ab20e6c9c Merge pull request #756 from jseward/master
Examples: SDL: Fix compile warnings.
2016-07-31 09:28:21 +02:00
0a1d456de1 Fix compile warnings in SDL examples 2016-07-30 15:26:49 -07:00
a88d189f18 Nav: MoveRequest doesn't affect io.NavUsable so that navigation failure doesn't trigger false positive & not needed (undo part of 3cc1419df) 2016-07-30 23:52:03 +02:00
f72e2fd1b1 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-07-30 23:46:09 +02:00
954c890c67 SameLine() with explicit X position is relative to left of group/columns (ref #746, #125, #630) 2016-07-30 23:41:44 +02:00
68b73b61b5 Nav: Comment (#323) 2016-07-30 23:17:32 +02:00
79e7ece259 Nav/Examples: honoring the io.WantMoveMouse flag in most common examples (#323)
Missing support Vulkan (#549), Apple (#575, #247), SDL (#58, #356),
Allegro, Marmalade (#368, #375)
2016-07-30 23:17:11 +02:00
d88dcc26cc Demo: console text input keeps focus in a less harsher and more navigation friendly way (#323) 2016-07-30 19:17:26 +02:00
3cc1419df3 Nav: making io.NavActive more suitable for end-user detecting if they should pass inputs to game (#323) 2016-07-30 19:16:41 +02:00
cc66731c39 Nav: Calling SetItemDefaultFocus() doesn't make mouse cursor dirty if nav highlight is off (#323) 2016-07-30 19:15:12 +02:00
8d0186c82b Nav: programmatic call to SetKeyboardFocusHere() doesn't quality as a nav input (doesn't position mouse) (#323) 2016-07-30 19:08:20 +02:00
e2dd48ae65 Nav: Split _NoNav window flag into _NoNavInputs and _NoNavFocus (#323) 2016-07-30 18:06:05 +02:00
4c4d750cae Nav: Fixed Collapse icon disappearing when Nav is disabled (since b2aaab873d) (#323) 2016-07-30 18:05:14 +02:00
3672105b87 Tidying up 2016-07-30 17:20:59 +02:00
04157da291 Nav: first committed pass for manual moving and manual scrolling (after a bunch of attempts) (#323) 2016-07-30 17:18:34 +02:00
4309b8c1ed Clarifying that MovedWindow* apply to mouse moving only 2016-07-30 16:25:45 +02:00
f2d1472481 Nav: Fixed navigating outside of current scrolling bounds (bug from 0cc20fca83) (#323)
+ spaces
2016-07-30 15:17:12 +02:00
efc8858328 ImRect: fixed Clip() function being the other way around (INTERNAL API BREAKING CHANGE- wasn't exposed, hoping nobody uses that) + actually fixes the function behavior. 2016-07-30 14:38:33 +02:00
d6ce800a20 Nav: ActiveIdAllowNavMove -> ActiveIdAllowNavDirFlags for more flexibility (nav up/down typically allowed on a single-line text input) (#323) 2016-07-30 14:31:34 +02:00
d9d6b0e629 Nav: Renamed private ImGuiNavDir_ enum to use left/right/up/down to be consistent with key enums (#323) 2016-07-30 13:45:46 +02:00
cbe03e3108 Nav: CalcListClipping/ImGuiListClipper: fix to ensure we can navigate clipped lists (#323) 2016-07-30 11:22:18 +02:00
b3ddae07d1 Nav: not activating widgets with NavActivate when NavMenu is held (#323) 2016-07-30 11:11:17 +02:00
b2aaab873d Nav: collapse button is interactve, allow collapsing, tidying up, resize speed takes account of framebuffer scale (#323) 2016-07-30 10:56:52 +02:00
4735802096 Shallow tidying up ctrl+wheel scaling code in NewFrame() 2016-07-30 10:26:57 +02:00
20a0fde012 Tidying up default clipboard handler for non Windows-OS 2016-07-30 10:02:46 +02:00
cabba0f158 Update README.md 2016-07-29 18:52:38 +02:00
f34d7ea199 Fixed bad merge 2016-07-29 11:23:04 +02:00
5f6f4d0ffc Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-07-29 11:17:13 +02:00
4a4d3eab70 Merge branch 'michaelbartnett-add-osx-homeend-keys' 2016-07-29 11:06:27 +02:00
7086a17854 InputTextEx: got rid of unnecessary locals. 2016-07-29 11:06:16 +02:00
776ea6b946 InputTextEx(): more shallow tidying up, still being cautious with this function 2016-07-29 11:01:06 +02:00
666d83b5c7 InputText/IO: Got rid of individual OSX options in ImGuiIO, added io.OSXBehaviors (#473, #650) 2016-07-29 10:56:47 +02:00
0ff22dbf0b InputTextEx(): minor tidying up 2016-07-29 10:51:35 +02:00
e5b6ddde26 InputText(): minor tidying up/simplification following changes for osx style improvements (#650) 2016-07-29 10:42:08 +02:00
802e91f69e Merge branch 'add-osx-homeend-keys' of https://github.com/michaelbartnett/imgui into michaelbartnett-add-osx-homeend-keys 2016-07-29 10:34:01 +02:00
d8dacd729b Examples: SDL+OpenGL: explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it (#752) 2016-07-29 10:10:41 +02:00
aeabda5a5f Navigation: Tap NavMenu to access menu and close buttons, hold to focus/resize (#323)
Introducing a concept of NavLayer to filter navigable items
2016-07-24 14:56:14 +02:00
c3aa36d9ab Navigation: Renamed ImGuiKey_NavWindowing to ImGuiKey_NavMenu (#323) 2016-07-24 14:49:16 +02:00
175f42420c Navigation: Can nav-out but not nav-in a window with ImGuiWindowFlags_NoNav flag (#323) 2016-07-24 14:41:27 +02:00
67feb5ac6c Navigation: comments + moving init block of code above in NavUpdate(), should have no side-effect (committed to simplify next commit) (#323) 2016-07-24 14:15:34 +02:00
a424d6f805 Navigation: Fixed missing initialization (had no side-effect, would be set in Begin) (#323) 2016-07-24 14:08:50 +02:00
49ec65b1b5 Navigation: can't manually focus out of a modal window with controller (#323) 2016-07-24 14:00:29 +02:00
5cac4926c8 Fixed display of TitleBgActive color on window before a Modal window + modal window availability for navigation (#323) 2016-07-24 13:56:31 +02:00
ba43310df1 Navigation: Renaming, shortened some unnecessary long fields names (#323) 2016-07-24 12:46:25 +02:00
4bbdaa4e3c Navigation: Moving NavInitWindow() around and making it static (#323) 2016-07-24 11:56:36 +02:00
b2ad33ce41 Merge remote-tracking branch 'origin' into 2016-07-navigation 2016-07-23 20:33:25 +02:00
e9d8b48a4c Navigation: Allow to navigate out of text input with direction or NavCancel (#323) 2016-07-23 20:30:44 +02:00
2f94563564 Navigation: Collapsed window uses ImGuiCol_TitleBgActive when navigation is active (#323) 2016-07-23 20:09:41 +02:00
afadc7cf59 Navigation: Scoring: Improved directional navigation. Not totally cancelling out dx. Better support for zero-spaced items. (#323) 2016-07-23 20:05:17 +02:00
e74d96642f Navigation: mouse/popup position gets clamped within visible display (#323) 2016-07-23 19:42:19 +02:00
0cc20fca83 Navigation: Scoring uses rectangle as clipped by parent. Fix selectable extending past parent column among other things (#323) 2016-07-23 19:24:56 +02:00
2f1fb41579 Navigation: Fixed automatic fallback scrolling from glitching near scroll limits because of miscalculation of SizeContents (#323) 2016-07-23 16:31:23 +02:00
ad48309047 Navigation: Fixed using NavWindowed when a menu is open. (#323) 2016-07-23 16:01:27 +02:00
2cab404a81 Fixed tooltip positioning issues when using navigation (#323) 2016-07-23 15:44:56 +02:00
bccd3d8a32 Merge branch 'nProtect-master' 2016-07-20 11:39:53 +02:00
8efd05a148 Tab->Spaces, missing spaces, typos 2016-07-20 11:39:38 +02:00
4141144b21 Added GetGlyphRangesThai() 2016-07-20 11:37:08 +02:00
c2cb2a6928 Gamepad/Keyboard navigation support, initial commit, WIP (#323) 2016-07-20 00:02:59 +02:00
4a11cc35b9 Updated code for repeat delay / repeat handling. GetKeyPressedAmount() now returns a count to support fast repeat rate (where DeltaTime > RepeatRate).
Renamed from recently added IsKeyPressed() variant to GetKeyPressedAmount(). (no API breakage, added in branch, bbd3b75609) (#323)
2016-07-19 21:26:36 +02:00
88c1966629 Added IsAnyWindowFocused(). Renamed IsMouseHoveringAnyWindow() -> IsAnyWindowHovered(), IsPosHoveringAnyWindow() -> IsAnyWindowHoveredAtPos(), IsMouseHoveringWindow() -> IsWindowHoveredRect() for consistency. Kept inline rediection function. 2016-07-18 18:24:23 +02:00
23a81027e8 Comment on invalid comment regarding preserving keyboard focus of a closed window, due to commit 19d02becef. This is probably still what we want. (followup #727) 2016-07-18 18:22:11 +02:00
eb405ab375 DragBehavior: Moving code around, in what should be a no-op, to simplify upcoming Nav diff (#323, #180) 2016-07-18 18:22:10 +02:00
c816e6c742 Fixed SetScrollX() handling of center ratio (which actually wasn't exposed publicly). (#323, #246) 2016-07-18 18:22:09 +02:00
e10ecfe28a BeginChild(): tweak to make the code easier to understand 2016-07-18 18:22:08 +02:00
24f79b91bd Style: minor tweak to default color theme to make currently focused window more prominent (#323, #707) 2016-07-18 18:22:07 +02:00
e72e3b2cbc Demo: tweaks. 2016-07-18 18:22:06 +02:00
0300e73b3f Comments 2016-07-18 15:26:07 +02:00
2df229d002 Fixed incorrect comment for ParentWindow (#615, #604) 2016-07-18 15:26:06 +02:00
068984691e Tab-key focusing inhibited when CTRL is held (#323) 2016-07-18 15:26:05 +02:00
267e54cf06 NewFrame(): update activeid data and keyboard before mouse. Should have no side-effects! (So that later we can update Nav between Keyboard and Mouse) (#323) 2016-07-18 15:26:04 +02:00
272745bd93 ImGuiIO: initializing fields in the same order as the declaration. 2016-07-18 15:26:03 +02:00
848e62bfe0 InputText: don't process keys during the activation frame (this is mostly a workaround to that activation with enter doesn't validate immediately, which is turns triggers an assert in InputScalarAsWidgetReplacement - can't see an issue with changing it this way so trying out) + using local flag clear_active_id to only clear the active id at the end of the frame, which is one of the step that my stash for #701 requires. (#323) 2016-07-18 15:26:02 +02:00
57841f417d SliderBehavior, RoundScalar: split into separate functions for usage in upcoming nav commits. Testing power==1.0f without fabsf(). Maybe just use == 1.0f as well? (#323) 2016-07-18 15:26:01 +02:00
6f7da2f9f2 Popup: Fixed popup initial frame reading MousePos again instead of the value already stored within the CurrentPopupStack in the previous frame. Doesn't make a big difference here, but will do as gamepad/keyboard navigation will set its own popup position. (#323) 2016-07-18 15:26:01 +02:00
91e1c56da6 Minor bits. 2016-07-18 15:25:59 +02:00
bbd3b75609 Added IsKeyPressed() with explicit repeat delay and repeat rate (for usage by nav) (#323) 2016-07-18 15:25:58 +02:00
9f92cc255b SetActiveId() sets ActiveIdIsJustActivated only when id changes. (#323) 2016-07-18 15:25:57 +02:00
ffdd7d7f17 Begin: Moved code that calls FocusWindow() on a newly appearing window lower in the function so that Nav branch can use CursorStartPos on the first window frame. (#323)
Pushing in master because it _should_ be a no-op but I'd rather test for any issue in Begin() as soon as possible.
2016-07-18 15:25:44 +02:00
19d02becef Closing the focused window restore focus to the first active root window in descending z-order (part of #727) 2016-07-17 19:17:49 +02:00
e215905765 Fixed scrolling offset when using SetScrollY(), SetScrollFromPosY(), SetScrollHere() with menu bar.
Tests:
a) add SetScrollY(+20) after Begin("ImGui Demo") test with/without title/menu.
b) add ImGuiWindowFlags_MenuBar in BeginChild() in scrolling tracking demo.
2016-07-16 18:12:41 +02:00
4961b2ea18 Speculative build fix for FreeBSD+GLIBC configuration
See
a1f9b62dd0
2016-07-16 11:44:10 +02:00
44a13a7f25 Windows: No default IME handler when compiling using GCC. (#738) 2016-07-16 11:29:41 +02:00
04b36bc397 TODO list 2016-07-14 13:38:44 +02:00
81036ee46f InputTextMultiline(): fix so that IsItemActive() can be used afterwards (otherwise the info was lost by using child/group) 2016-07-14 13:27:14 +02:00
c0f77f12ea InputText(): Fixed state corruption/crash bug in stb_textedit redo logic when exhausting undo char buffer (#715 #681) 2016-07-14 13:08:37 +02:00
88721118fd InputTextEx: comments (related to #725) 2016-07-13 01:54:29 +02:00
d9e2e688e9 InputTextMultiline(): partial fix for when input and internal buffers differs in a way where scrollbar existence differs. (#725)
Partial fix, won't stop ids from functioning because of a zombie id.
2016-07-13 01:18:59 +02:00
9c71ec38f0 ImVector: reserve() tweak to avoid undefined behavior warning (#731) 2016-07-12 11:19:38 +02:00
921fc50c85 add shortcut+backspace support 2016-07-07 13:03:00 -04:00
86f42b5950 osx uses super+arrows for home/end, built on work in ocornut/imgui#473 2016-07-07 13:02:52 -04:00
5525c2356a Using GetCurrentWindowRead() instead of GetCurrentWindow() 2016-06-29 10:30:42 +02:00
fe7274b6c7 SetCursorScreenPos() fixed not adjusting CursorMaxPos as well 2016-06-29 10:25:47 +02:00
b9b3dec7da ImGuiListClipper: Fix to behave within column (#661, #662, #716) 2016-06-29 10:19:01 +02:00
74bbfcfaa6 ImGuiListClipper: fixed automatic-height calc path dumbly having user display element 0 twice (#661, #716)
First bug out of two. Was easily visible using e.g. 50% alpha text.
2016-06-29 10:07:36 +02:00
297bb3fc92 NextColumn() tidying up with a sane early out 2016-06-29 09:53:02 +02:00
ba7acdac47 Added assert to track stb_textedit.h issue (#715) 2016-06-27 12:59:49 +02:00
c36fd541ad InputTextMultiline(): Fixed Ctrl+DownArrow moving scrolling out of bounds 2016-06-27 09:56:45 +02:00
e06852abaf Fixed Windows default clipboard leaving its buffer unfreed on application's exit. (#714) 2016-06-26 13:24:30 +02:00
de61fcc619 Minor bits 2016-06-25 17:03:49 +02:00
355dae5d99 Comments amend 3c8e490778 (committed before saving last comment edit) (#703) 2016-06-25 14:37:14 +02:00
3c8e490778 Comment on dealing with io.WantCaptureKeyboard (#703) 2016-06-25 14:28:58 +02:00
13615a1318 InputText: render currently edited buffer from the internal buffer, toward #701 2016-06-25 13:57:05 +02:00
2f4e2eec68 InputText, ImGuiTextFilter: using strncpy instead of printf("%s"). 2016-06-25 13:54:34 +02:00
4621b357c1 Wrapped text: fixed incorrect testing for negative wrap coordinates, they are perfectly legal. (#706) 2016-06-19 12:50:22 +02:00
92bff4c8d7 ColorEdit4(): better preserve inputting value out of 0..255 range, display then clamped in Hexadecimal form 2016-06-16 23:09:48 +02:00
9cb271f4c8 Fixed minor text clipping issue in window title for when using font straying above usual line (#699) 2016-06-15 23:09:40 +02:00
1ef7980e17 Merge branch 'master' into 2016-02-colorpicker 2016-06-15 10:05:17 +02:00
c4db79f34b Member variable name renamed "ID" "Id" for casing consistency 2016-06-12 22:27:15 +02:00
f83790dc5a Comments 2016-06-12 12:23:20 +02:00
9f21c7189f TextUnformatted() fixed clipping bug in the large-text path when horizontal scroll has been applied (#692, #246) 2016-06-12 12:23:16 +02:00
d79186931e ImDrawList: Fixed a (rarely occuring) bug with merging with previous command + unnecessary OverlayDrawList command 2016-06-11 15:42:10 +02:00
3fd3eac370 Fixed TextWrapped() override wrap position is one is already set (#690) 2016-06-11 10:23:37 +02:00
2da30e8702 Comments (#691) 2016-06-11 09:28:20 +02:00
65a525550e ImFont: Allowing to use up to 0xFFFE glyphs in same font (increased from previous 0x8000) 2016-06-07 09:14:54 +02:00
4fddfa4b5e Demo: extra (somehow duplicate) Selectables+Columns demo 2016-06-07 09:05:36 +02:00
d6a5fd06d7 Demo: Added an extra 3-way columns demo 2016-06-07 08:46:50 +02:00
0f36ec9cb9 Fixed a crash bug in stb_textedit.h (#681) 2016-06-04 14:48:08 +01:00
8291d7dc7c Fixed minor bug introduced in 45dacbf084 (#682)
Actually minor because nobody uses that value. Still a terrible
bug.
2016-05-31 22:34:48 +02:00
d1c073a199 Comments, tweaks 2016-05-31 00:00:44 +02:00
254a1a9e4c InputText: Added support for CTRL+Backspace. 2016-05-30 20:00:20 +02:00
5d4cf1c3f3 Version 1.50 WIP 2016-05-30 19:38:36 +02:00
adb85d800d Version 1.49 2016-05-29 19:16:44 +02:00
9a751da136 Caving in to ignoring stupid pedantic Clang warnings for old-style-cast in header files 2016-05-29 19:14:19 +02:00
3ddb50a925 Merge branch 'master' into 2016-02-colorpicker 2016-05-29 19:07:23 +02:00
0fb51b6b4b Removed various superflous ImGui:: prefixes in internal code 2016-05-29 18:58:41 +02:00
9886c1b43d Undo modification of ContentsRegionRect.Max, too many side-effects (undo dff078365f) 2016-05-29 18:37:26 +02:00
dcef7dedce Comments (#590) 2016-05-29 18:24:02 +02:00
784e1ef053 CollapsingHeader() with close button adapt to horizontal scrolling (#600) 2016-05-29 18:12:25 +02:00
dff078365f Fix selectable/tree node not reaching right-side of contents size when horizontal scrolling is active and no explicit size is known 2016-05-29 18:08:51 +02:00
45dacbf084 Fixed GetWindowContentRegionMax() being off by ScrollSize amount when SizeExplicit is set + caching ContentsRegionRect.
Relates to horizontal scrollbar, explicit contents size
2016-05-29 17:50:23 +02:00
d5a12866fe Comments (#676, #655) 2016-05-29 14:00:35 +02:00
1483a69c11 Demo: Tree: showing how to align tree node label with current x position (#324, #581) 2016-05-28 19:30:01 +02:00
61c294bb52 Added optional Indent() Unindent() width (#324, #581) 2016-05-28 18:40:00 +02:00
a0a48f6e59 Added TreeAdvanceToLabelPos() (#581) 2016-05-28 18:15:54 +02:00
793f5f8cdb Comments 2016-05-28 17:54:40 +02:00
806a146198 TreeNodeEx(): ImGuiTreeNodeFlags_AlwaysOpen->ImGuiTreeNodeFlags_Leaf, + added ImGuiTreeNodeFlags_Bullet (#324, #581) 2016-05-28 17:12:13 +02:00
2acb61e3a1 Comments 2016-05-28 16:52:59 +02:00
b5521a81d4 Demo: fixed multi-selection tree nodes demo to not replace selection when clicking on single-item that's already part of selection (#581) 2016-05-28 14:18:46 +02:00
8f4b123e1b SetNextWindowSizeConstraint -> SetNextWindowSizeConstraints (#668) 2016-05-28 14:02:14 +02:00
213025f3cd BeginMenu: a menu that becomes disabled when open gets closed down, facilitate user's code (#126) 2016-05-28 11:14:02 +02:00
65b1ae6ecc Comments (#335) 2016-05-22 10:20:58 +02:00
e3d8055d90 Speculative 64-bit warning fix (#668) 2016-05-21 23:13:11 +02:00
3a776d93f2 Fixed compile issue (bloody git stashes) (#668) 2016-05-21 23:03:21 +02:00
b7ebeb1610 Added SetNextWindowSizeConstraint() + demo code (#668) 2016-05-21 22:53:08 +02:00
753bf5cefe Comments 2016-05-21 22:35:05 +02:00
713730af0c Minor sizing refactor, should be no-op. Making it a commit for further bisection since sizing code is super brittle. (#668) 2016-05-21 20:55:28 +02:00
102d03a7eb Resizing window doesn't rely on MouseDelta anymore, but rather recompute expected size based absolute mouse coords. (#668)
Storing ActiveIdClickOffset to generalize pattern already used by
columns.
2016-05-21 20:50:15 +02:00
81bf5aeb09 Minor bits 2016-05-21 20:07:51 +02:00
681d5624f7 Merge pull request #666 from jslee02/patch-1
Fix minor typo in examples/README.txt
2016-05-20 13:24:41 +02:00
47911d92b2 Fix minor typo in examples/README.txt 2016-05-20 07:04:54 -04:00
b4302187dd ImFontAtlas: Tweak to allow MergeMode to apply on a font that isn't the previous one, by setting the DstFont field. 2016-05-17 19:47:13 +02:00
1dfafeb602 CheckStacksSize() added literal strings in IM_ASSERT calls to reach end-user on common failure 2016-05-17 09:36:27 +02:00
0e51f91c5e Including limits.h again to get INT_MAX, assuming previous report of missing limits.h was erroneous (#1, yes, issue ONE!) 2016-05-16 20:27:52 +02:00
69a29e4715 Added NewLine() (very shy reminder that #97 isn't done) 2016-05-16 20:14:07 +02:00
47d10944a5 Build fix 2016-05-16 20:07:02 +02:00
787be01e61 ImGuiListClipper comments (#660, #661, #662) 2016-05-16 20:03:18 +02:00
f291f2c5dd InputText(): Fixed cursor rendering on first character when framepadding is 0.0 (following #601) 2016-05-16 19:44:03 +02:00
28b09199de ImGuiListClipper: removed assert (#662) 2016-05-16 19:25:42 +02:00
7a28f5bb81 ImGuiListClipper new version, detect height automatically, fix compatibility with SetScrollPosHere (#662) 2016-05-16 19:22:51 +02:00
fa5ae60bce Demo: added decorated label to some vertical sliders. 2016-05-16 12:05:26 +02:00
82fa628135 Merge branch 'trezanik-master' 2016-05-16 10:55:04 +02:00
1349d0aacf Examples: DirectX9: Removing spaces (#663) 2016-05-16 10:54:52 +02:00
e41fbb0390 Merge branch 'master' of https://github.com/trezanik/imgui into trezanik-master 2016-05-16 10:51:29 +02:00
790275eae2 Example: DirectX9: Backup and restore all state 2016-05-16 01:02:09 +01:00
339e191c53 Demo: Console: Add a "Scroll to bottom" button (#662) 2016-05-15 18:08:41 +02:00
9e6ed0991d Demo: clarified misleading example (#660) 2016-05-15 16:03:15 +02:00
431eaf1abe Comments to clarify what float[2] int[2] etc. are. May switch to pointers? (#659) 2016-05-14 15:35:50 +02:00
39bda5ea09 Fixed a IMGUI_API->inline case (#657, #349) 2016-05-14 10:22:25 +02:00
e79d2828c4 Metrics window: coarse clipping the detailed vertex buffer for pleasure and benefits. 2016-05-13 23:10:16 +02:00
f48f9a30ef ButtonBehavior(), fixed subtle old bug when a repeating button would also return true on release + comments (#656) 2016-05-13 11:13:54 +02:00
e1e2752dcb Fixed repeating button behavior triggering twice, typically affect the +/- of InputInt/InputFloat and user repeating buttons (#656)
+ Took note of further work
Broken in 547f34cf22
2016-05-13 10:50:59 +02:00
a2a5d71582 Demo: Tweak irritating pink color. 2016-05-12 23:13:54 +02:00
8d5b2fba95 Fixed TitleBg/TitleBgActive color being rendered above WindowBg color, being inconsistent and causing visual artefact (#655)
Broke the meaning of TitleBg and TitleBgActive. Only affect values where
Alpha<1.0f. Fixed default theme.
2016-05-12 23:12:55 +02:00
b628acbb52 StyleEditor: comments (#652) 2016-05-12 20:59:20 +02:00
10d3da6b73 Merge pull request #641 from cosmy1/errors-fix
Fix compilation errors when disabling test windows.
2016-05-12 13:41:05 +02:00
2f55dc1f33 ImFontConfig: Clarified persistence requirement of GlyphRanges array (#651) 2016-05-12 11:58:05 +02:00
ed20fcf9d5 Fixed incorrect parameter to ButtonBehavior() in Columns code - had no side-effect (#649)
Broken in 3eabad0321
2016-05-11 10:31:30 +02:00
91f11fb1bd Comments / todos 2016-05-11 09:58:43 +02:00
8648346eab Modal: fixed non-child window stacked over a modal losing its hoverabilty/focusability (#615, #604) 2016-05-10 17:02:10 +02:00
b630cb5b42 ImGuiWindow: Storing ParentWindow (#615, #646) 2016-05-10 17:00:42 +02:00
a59a04f4d0 Fixed iOS/OSX build. 2016-05-10 01:10:31 +02:00
4b5a4cae09 Fix compilation errors when disabling test windows. 2016-05-09 00:21:05 +02:00
aa11934efa Comments to clarify default shared ImFontAtlas and current context pointer thread-safety (#586, #591) 2016-05-08 17:12:54 +02:00
8a0d3b9628 Examples; DirectX10/11: Added comments about removing dependency on d3dcompiler DLL (#638) 2016-05-08 11:49:21 +02:00
382253eccf Merge branch 'master' of https://github.com/ocornut/imgui 2016-05-07 21:10:16 +02:00
36ca8a8194 Minor warnings fixes. 2016-05-07 21:09:53 +02:00
8af76d56b4 Merge pull request #639 from sergof/conversion-warnings
Ignore various anal GCC warnings.
2016-05-07 21:08:43 +02:00
2ef766a1ce Examples: DirectX10: Apply depth-stencil state like DirectX11 example (#640, #636) 2016-05-07 20:57:38 +02:00
656b1e848c Examples: DirectX11: Fixed uninitialized fields. Disabling depth-write (#640, #636) 2016-05-07 20:53:55 +02:00
f4633d09ac Examples: DirectX10, DirectX11: Removed seemingly unnecessary bunch of rasterizer state creation code. 2016-05-07 20:19:04 +02:00
834bfe4af5 Examples: DirectX11: Fixed handle leak + minor coding style fix for #640 2016-05-07 20:11:14 +02:00
1e9c9df6de Merge branch 'master' of https://github.com/josiahmanson/imgui into josiahmanson-master 2016-05-07 20:04:41 +02:00
7b9c0a5c3f Renamed ImGuiState -> ImGuiContext (#586, #269) 2016-05-07 19:55:51 +02:00
8b428e8c74 Added CreateContext/DestroyContext/GetCurrentContext/SetCurrentContext() (#586, #269) 2016-05-07 19:54:27 +02:00
5fe2cacd4d DX11 example depth test 2016-05-07 10:42:48 -07:00
6e8579fc14 Ignore implicit conversion warnings 2016-05-07 18:49:24 +02:00
69cc00f91f ImGuiStorage: Added bool helper functions for completeness. 2016-05-07 18:18:37 +02:00
ce4d731486 Minor comments, tweaks 2016-05-07 18:10:32 +02:00
313d388bba Reorganised windows moving code, documented a lag in FindHoveredWindow(), fixing lag whole moving windows (#635) 2016-05-06 11:31:32 +02:00
67df0ba185 Updated FAQ and Readme with more prominent info about WantCaptureMouse etc. flags (#635) 2016-05-06 09:18:07 +02:00
f22b6e1e09 Fixed/silenced various absurd GCC warnings from outer space (#626) 2016-05-04 23:28:16 +02:00
c1da3e354e Examples: SDL: Fixed unused variable warning on non-Windows platforms (#626) 2016-05-04 23:20:41 +02:00
79ad22e1f2 Fixed various Clang -Weverything warnings (#626) 2016-05-04 23:17:53 +02:00
efedaa5df3 Updated FAQ (#628) 2016-05-04 20:49:17 +02:00
9b79327673 BeginGroup() fixed using within Columns set (fix #630) 2016-05-04 20:22:57 +02:00
0058492156 Fonts readme, refering to IconFontCppHeaders, AddRemapChar() function, etc. 2016-05-04 17:20:11 +02:00
4ce6cf0512 Demo: Moved "Fonts" section style editor 2016-05-03 20:22:35 +02:00
f46c91f5ad Examples: DirectX9: Removed dependency on dxguid.lib + remainder of d3dx9.lib (#611) 2016-05-03 11:30:43 +02:00
731ff3d3f5 Examples: DirectX9: Removed dependency on dx3x9 (remainder) (#611) 2016-05-03 11:12:59 +02:00
50df86985d Examples: DirectX9: Removed dependency on dx3x9.h so it can be used in a DirectXMath.h only environment (#611) 2016-05-03 10:47:42 +02:00
89d5026187 Renamed majority of use of "opened" to "open" for clarity. Renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(). (#625, #579) 2016-05-02 12:32:16 +02:00
1b9894cfb4 Merge pull request #624 from develophant/master
Fix typo in Programmer guide
2016-05-02 09:48:54 +02:00
4f34ed5010 Fix typo in Programmer guide 2016-05-01 16:18:31 -07:00
4170b4847d Style: Changed default IndentSpacing from 22 to 21 (#581, #324) 2016-05-01 23:49:10 +02:00
13df4668d1 Added GetTreeNodeToLabelSpacing() helper - tentative name (#581, #324) 2016-05-01 23:47:58 +02:00
b93040e600 TreeNode: minor tidying up (#581, #324) 2016-05-01 23:46:48 +02:00
bb674ccee6 TreeNode: added ImGuiTreeNodeFlags_AlwaysOpen flag (#581, #324) 2016-05-01 21:15:46 +02:00
9733f4fa24 Internal RenderBullet() helper. 2016-05-01 20:19:28 +02:00
f79b2d6ce3 TreeNode: added ImGuiTreeNodeFlags_OpenOnArrow flag (#581, #324, #190) 2016-05-01 20:12:14 +02:00
df764c21d6 Bullet(), BulletText(): slightly bigger. less polygons 2016-05-01 20:04:48 +02:00
470b88e965 ButtonBehavior(): ImGuiButtonFlags_PressedOnDoubleClick clears active id on double-click so that multiple flags don't trigger multiple times 2016-05-01 20:02:25 +02:00
dc8446d048 Demo: Added simple tree node selection demo (#581, #516, #190) 2016-05-01 17:55:04 +02:00
4c880b7106 Added ImGuiTreeNodeFlags_OpenOnDoubleClick (#581, #516, #190) 2016-05-01 17:46:08 +02:00
a38fd2e186 Added TreeNodeEx() functions (#581, #600, #190) 2016-05-01 17:45:31 +02:00
547f34cf22 Refactor ButtonBehavior(), fixed double-click mode also triggering on single-click (relate to #516) 2016-05-01 17:43:51 +02:00
ac501102fc Added IsItemClicked() helper (#581) 2016-05-01 17:43:17 +02:00
ec6471ca87 TreeNodeEx() wired the display-side ImGuiTreeNodeFlags_Selected flag (#581) 2016-05-01 16:06:46 +02:00
ab6bc05fc3 Fixed ImGuiTreeNodeFlags_AllowOverlapMode to behave better on touch-style inputs (#600) 2016-05-01 15:44:50 +02:00
df749e3f13 Added CollapsingHeader() variant with close button, obsoleted 4 parameters version. Refactored code into TreeNodeBehavior. (#600)
New flag and declaration makes uses of SetNextTreeNode() functions on
collapsing header more obvious as well (#579).
2016-05-01 14:34:55 +02:00
befe02559a Added IsRootWindowOrAnyChildHovered() helper (#615) 2016-05-01 12:14:07 +02:00
60d6c6d0e8 Comments/tweaks on ItemAdd() 2016-05-01 11:46:49 +02:00
bfb2dc2290 Examples: OpenGL3: Saving/restoring glActiveTexture() state (#602) 2016-04-30 19:02:19 +02:00
7406d64c64 PushClipRect(): not altering passed values, leave it to caller responsibility to floor properly (followup #582) 2016-04-30 18:55:23 +02:00
819cc414b1 Metrics window: uses IM_COL32() macro to generate constant colors. 2016-04-28 10:25:23 +02:00
c5149cd53c MenuItem(): checkmark render in disabled color when disabled 2016-04-27 23:34:24 +02:00
be7621f7c5 Updated FAQ about non UTF-8 literal (#609, #613) 2016-04-26 19:23:36 +02:00
544ba36bf6 Fixed GetFrontMostModalRootWindow() (#604) 2016-04-26 11:59:56 +02:00
6bcc31e575 Merge branch 'master' into 2016-02-colorpicker 2016-04-26 11:06:24 +02:00
ea6b615179 Made ImGui::PushClipRect()/PopClipRect() public. Changed ImDrawList::PushClipRect() prototype. Fixed demo. (#610) 2016-04-26 11:03:51 +02:00
4b6e9ac396 ImFont: Added AddRemapChar() helper (#609) 2016-04-26 10:08:06 +02:00
247da0e01b BeginGroup() comment tweaks (#608) 2016-04-25 08:45:32 +02:00
4b51e43d60 BeginGroup() extra comment because this is overused and misleading (#608) 2016-04-24 22:52:07 +02:00
919eb69931 Scrollbar: minor fix for top-right rounding of scrollbar background when window has menubar but no title bar 2016-04-24 22:38:30 +02:00
7da2d51480 MenuBar fixed missing lower border 2016-04-24 22:36:46 +02:00
a753aff07a Moved Bullet*() code below TreeNode*() code. 2016-04-24 19:38:37 +02:00
c2c0b57e5e Examples: OpenGL2: Extra comments (#606) 2016-04-24 18:11:54 +02:00
a0c411ffd2 Fixed typos in previous commit 1884f550bc (#582, #597)) 2016-04-23 14:40:43 +02:00
1884f550bc Fixed clipping rectangle floating point representation to ensure renderer-side ops yield correct results (#582, 597) 2016-04-23 14:22:41 +02:00
41215534d5 Internal ImRound() -> ImFloor(), ImRect::Round() -> ImRect::Floor(), 2016-04-23 14:10:36 +02:00
727ca4bd17 ImFont: IndexLookup stores short instead of int, so typical ascii-set lookup fits in 256 bytes 2016-04-23 11:37:18 +02:00
a20d69f9ce ImFont: Tweaking layout, shaving bit of alignment and simple hot/cot split 2016-04-23 11:29:42 +02:00
44fb99542f ImFont: RenderText() useful directly without ImDrawList::AddText().. Changed prototype. Reserving vertices after skipping non-visible lead. 2016-04-23 11:09:56 +02:00
fe73a23cf5 ImFont: Added RenderChar() helper. 2016-04-22 19:58:10 +02:00
29e259a43c InputText() clipping cursor rendering in case it gets out of the box (which can be forced w/ ImGuiInputTextFlags_NoHorizontalScroll) (#601) 2016-04-22 08:38:56 +02:00
7ce6c18bbe Refactored CloseWindowButton() into a CloseButton() helper declared in imgui_internal.h (#600) 2016-04-21 09:55:02 +02:00
559963e832 Examples: Apple/iOS: lowered xcode project deployment target from 10.7 to 10.11 (#598, #575) 2016-04-20 20:49:49 +02:00
ab4a69bcd4 Comments 2016-04-19 18:31:40 +02:00
fc3b8d0a56 Relative order of Child windows creation is preserved during sort (#595) 2016-04-19 18:31:25 +02:00
d92f1deff8 ImDrawList: Added AddQuad(), AddQuadFilled() helpers. 2016-04-18 19:04:47 +02:00
fec7dc22a9 Update README.md - binaries 2016-04-18 16:33:49 +02:00
ce61367520 Update README.md - binaries 2016-04-18 16:33:04 +02:00
af46ca2b4c Merge pull request #587 from sergof/patch-1
Fix font config propagation in FontFromMemoryCompressedTTF()
2016-04-13 09:52:34 +02:00
d5eb87d0a2 Fix font config propagation in FontFromMemoryCompressedTTF() 2016-04-13 02:01:18 +02:00
1612ca071b Examples: SDL: Initialize video+timer subsystem only. 2016-04-13 00:15:58 +02:00
006934fd15 Todo items + not using function called isblank() because it may be a macro in some C library 2016-04-12 22:36:51 +02:00
4466a7b3b0 Examples: DirectX9: save/restore some more device state. 2016-04-11 18:33:16 +02:00
074a6853c7 Moved comments 2016-04-09 19:13:02 +02:00
77177c18f0 Merge branch 'master' into 2016-02-colorpicker 2016-04-09 19:12:03 +02:00
1588eda1ac Version 1.49 WIP 2016-04-09 19:10:42 +02:00
95cbcdca3f Version 1.48 2016-04-09 17:46:48 +02:00
4c25de950c Warning fixes for clang. Using int64_t, may be an issue? 2016-04-09 17:46:38 +02:00
31852e1d05 Silence borderline warning with -Werror=strict-overflow
Error: assuming signed overflow does not occur when assuming that (X -
c) > X is always false [-Werror=strict-overflow]
2016-04-06 11:11:38 +02:00
319e288eef Update README.md 2016-04-05 23:08:21 +02:00
71b981d05f Examples: Apple: Readme tweaks (#575 #247) 2016-04-05 22:50:23 +02:00
b359ed7b3e Remove local glfw3 lib for osx. (+1 squashed commit)
Examples: Added OS X example (moved from ios, added support for os x)
2016-04-05 22:43:36 +02:00
67b604412b Remove local glfw3 lib for osx. (+1 squashed commit)
Squashed commits:
[34cc3b7] Adds osx example. (+6 squashed commits)
Squashed commits:
[20330f2] Uses glfw by brew install.
[0427861] Renames imguiex folder name to imguiex-ios
[f9e27e5] Renames ios_example to apple_example.
[44f8fe3] Updates the glfw header/library path.
[919f279] Renames target from imguiex to imguiex-ios since there is already a imguiex-osx target now.
[24395f5] Adds osx example.
2016-04-05 18:13:48 +08:00
2ee76bbff6 Trivial format string fix in demo 2016-04-05 09:23:00 +02:00
e808b7cfca Style: removed WindowFillAlphaDefault which was confusing and redundant, baked into WindowBg color. Renamed TooltipBg > PopupBG. (#337)
bg_alpha parameter of 5-parameters version of Begin() is an override,
however that function may become obsolete someday.
2016-04-04 01:37:02 +02:00
947171dcef Fixed InputTextMultiLine(), ListBox(), BeginChildFrame(): outer frame not honoring bordering (following #462) 2016-04-04 00:30:50 +02:00
07df3cfb3e Added ImGuiWindowFlags_AlwaysUseWindowPadding flag to ensure non-border child window uses window padding (#462) 2016-04-04 00:29:57 +02:00
8e353af1d3 Renamed ImGuiWindowFlags_Force**Scrollbar to ImGuiWindowFlags_Always**Scrollbar (#476) 2016-04-03 23:28:05 +02:00
26be1511e9 Merge branch 'Loftilus-master' 2016-04-03 17:43:40 +02:00
c1427de5b6 Examples: Libs: Update glfw binaries to glfw master. 2016-04-03 17:41:59 +02:00
0e7b9b8284 Examples: Vulkan: Coding style tweaks. 2016-04-03 17:32:53 +02:00
9c513d4443 Merge branch 'master' of https://github.com/Loftilus/imgui into Loftilus-master 2016-04-03 16:42:56 +02:00
f45fd1cef6 Comments 2016-04-03 16:42:35 +02:00
552246feed Examples: DirectX10,DirectX11 : Minor renaming 2016-04-03 13:02:04 +02:00
518f32ccfe Examples: DirectX10: Save/restore state + minor cleanups (#570) 2016-04-03 12:59:56 +02:00
90493f8add Examples: DirectX11: Shallow massaging to make the code more consistent/readable (following #570) 2016-04-03 12:48:38 +02:00
726b91a2cd Merge branch 'nlguillemot-patch-1' 2016-04-03 12:43:43 +02:00
2942240072 Examples: DX11: Cleanup state backup/restore code (#570) 2016-04-03 12:43:17 +02:00
d4d51a7802 capture and restore all state 2016-04-02 19:08:27 -07:00
4c1d4233b2 Merge branch 'master' into 2016-02-colorpicker 2016-04-03 01:10:26 +02:00
650515ce49 Updated todo list and comments 2016-04-03 01:07:11 +02:00
d53c308852 Moved EndFrame() back to imgui_internal.h + comments. Undo cfbf06e394 2016-04-03 00:47:41 +02:00
1eacfd120b Update README.md 2016-04-03 00:26:00 +02:00
c61e08e8c4 InputText: move to next word OS X style behavior on OS X (#473) 2016-04-02 22:06:47 +02:00
aeaf5ccebb stb_textedit.h: proposal for upstream PR to allow custom move-left/move-right handlers (following #473) 2016-04-02 21:20:41 +02:00
9945eecaf4 stb_truetype: updated 1.08 > 1.10 + minor unused variable warning fix 2016-04-02 20:12:20 +02:00
c3376cd45c stb_textedit.h Local warning fixes 2016-04-02 20:08:42 +02:00
e7b95646b9 stb_textedit.h updated to 1.8 (our two main changes were merged now) 2016-04-02 20:08:11 +02:00
f48fc51777 IO: Added unused MultiSelectUsesSuperKey dummy field to convey semantic for OS X compatible behavior (#473) 2016-04-02 18:58:42 +02:00
aa7a29cdbf InputText(): Added io.DoubleClickSelectsWord option for OS X compatible behavior (#473) 2016-04-02 18:57:50 +02:00
587fc60f25 InputText/IO: Added WordMovementUsesAltKey , ShortcutsUseSuperKey for OS X Compatible behavior (#473) 2016-04-02 18:57:08 +02:00
a6399f120f IO: Added "Super" keyboard modifiers (corresponding to Cmd on Mac and Windows key in theory although the later is hard to read) (#473)
NB: Value not used.
2016-04-02 18:22:40 +02:00
171b0e5ca9 Update README.md 2016-03-30 16:30:17 +02:00
ae0c33c983 Examples: Links 2016-03-29 11:33:23 +02:00
9e817a7c38 ColorPicker3/4: Fixed missing ID scoping (#346) 2016-03-28 23:45:23 +02:00
6a241d4895 ColorPicker3: Fixed 2016-03-28 23:38:04 +02:00
326c4e40f8 Merge branch 'master' into 2016-02-colorpicker 2016-03-28 23:17:13 +02:00
41c5d4651b Update README.md 2016-03-27 12:04:17 +02:00
c4876078b4 Update README.md 2016-03-27 11:43:12 +02:00
cfbf06e394 Comments and moved EndFrame() for imgui_internal.h (for clarity? or extra confusion?) 2016-03-27 10:38:14 +02:00
39c9bb73e8 Merge pull request #563 from mneumann/fix_dragonfly
Fix compilation on DragonFly BSD
2016-03-26 16:40:00 +01:00
7661b1e778 Trim trailing spaces 2016-03-26 15:43:45 +01:00
2b7eeba143 Trim trailing spaces 2016-03-26 15:38:52 +01:00
d6750c87c2 Combo: display popup above if there's isn't enough space below / or select largest side (#505) 2016-03-25 23:36:43 +01:00
7c9fa59329 Combo: Right-most button stays highlight when popup is open. 2016-03-25 22:55:45 +01:00
c71aae08f3 Merge branch 'brushfiregames-master' 2016-03-25 22:28:19 +01:00
fdc4299c6c Examples: SDL: Made ImGui_ImplSdlGL3_NewFrame() signature match GL2 one 2016-03-25 22:27:43 +01:00
e6c2c1fcfd Examples: SDL: Minor fixes to follow syntax of other examples (#495) 2016-03-25 22:25:20 +01:00
8a61c0afea Applying same fix to OpenGL 3 example. Fixing spaces/tabs. 2016-03-25 22:20:57 +01:00
a9b0abe493 Automatically updating DisplayFrameBufferScale by reading the OpenGL drawable size and comparing with the window size. This fixed dear imgui which was rendering only to 1/4 of my window. 2016-03-25 22:19:07 +01:00
aecf5d12e6 DragFloat(), SliderFloat(), InputFloat(): fixed cases of erroneously returning true repeatedly after a text input modification (#564) 2016-03-25 21:53:59 +01:00
adb4d4d48b Fix compilation on DragonFly BSD 2016-03-24 19:37:11 +01:00
5b8aa0dc84 FAQ and comments about the use of ImTextureID (#562, #561, #521, #510, #497, #475) 2016-03-24 11:06:57 +01:00
04396ed7a9 FAQ and comments about the use of ImTextureID (#562, #561, #521, #510, #497, #475 ...) 2016-03-24 11:00:47 +01:00
d39029f3a8 Branch fix 2016-03-23 10:51:40 +01:00
baabe3b62c Merge branch 'master' into 2016-02-colorpicker 2016-03-23 10:50:37 +01:00
367c53967f Metrics: inspect individual triangles in drawcall 2016-03-22 21:17:24 +01:00
5bed7144fe ImDrawList: Added AddTriangle() function 2016-03-22 20:10:06 +01:00
9260d46c2c Comments 2016-03-21 22:51:51 +01:00
b495a52fc0 ImDrawList: Allow AddText(ImFont* font, float font_size, ...) to take NULL/0.0f as default 2016-03-21 22:43:53 +01:00
37d50dccf9 Added GetFontTexUvWhitePixel() helper. 2016-03-21 22:30:32 +01:00
a274a09955 Renamed GetWindowFont()->GetFont(), GetWindowFontSize()->GetFontSize() (related to #340) 2016-03-21 22:29:11 +01:00
928832a5bc Various tidying up / comments, moved columns functions declarations, no functional changes 2016-03-21 22:11:43 +01:00
9cbc6e196b ImDrawList: AddRect() added optional thickness parameter + updated demo 2016-03-21 21:56:23 +01:00
86fb3a6a3c ImDrawList: AddCircle() takes optional thickness parameter 2016-03-21 21:48:05 +01:00
8e8e59a942 Merge pull request #555 from DMartinek/patch-1
CheckboxFlags: Added support for passing/testing multiple flags at the same time.
2016-03-21 13:09:55 -07:00
1bd3942b8e Merge branch 'kylawl-master' 2016-03-21 13:02:33 -07:00
feba83cfcd Merge branch 'master' of https://github.com/kylawl/imgui into kylawl-master 2016-03-21 13:02:25 -07:00
a9e303e006 Minor comments 2016-03-21 12:56:56 -07:00
b8fcb4e7e4 Converted tabs to spaces 2016-03-21 12:40:02 -07:00
3f46d9b933 Renamed FindTextDisplayEnd to FindRenderedTextEnd 2016-03-21 12:33:48 -07:00
5bffc85ba6 Exposed FindTextDisplayEnd to imgui_internal.h 2016-03-21 12:07:13 -07:00
37716184b3 Fixed coding style. 2016-03-18 16:49:19 +01:00
5abb39cb1f Added support for CheckboxFlags that can set multiple flags at the same time. 2016-03-18 14:02:14 +01:00
1394616d9c Vulkan Example: Some code layout changes. 2016-03-10 12:30:38 +01:00
4ea4fa3e73 Vulkan Example: Fix synchronization. 2016-03-10 11:59:42 +01:00
0ceddc29ff Vulkan Example: Fix windows build. 2016-03-09 17:01:38 +01:00
4cbd316f01 Vulkan example. 2016-03-09 16:39:54 +01:00
4b7edffe8a Comments 2016-03-08 20:54:21 +01:00
9ea093ddd0 DragFloat(): always apply value when mouse is held/widget active, so that can use a drag over an always-reseting value 2016-03-07 13:12:15 +01:00
1dcb9c877d Examples: OpenGL: Fix early return on zero-sized framebuffer breaking GL state (#486, #547) 2016-03-06 10:46:57 +01:00
6346690962 Comment (#544) 2016-03-04 14:09:08 +01:00
459af7683c Merge branch 'master' into 2016-02-colorpicker 2016-03-04 13:57:33 +01:00
3db40903ba InputText() ImGuiInputTextFlags_CallbackAlways event set the EventFlag field of ImGuiTextEditCallbackData (#541) 2016-03-04 13:07:42 +01:00
2065cbec4d Removed extraneous comma for pedantic compilers (#516) 2016-03-03 00:34:06 +01:00
76ce08c338 Merge branch 'zapolnov-master' 2016-03-03 00:30:26 +01:00
b816d05e33 Minor tidying up following (#516) - renamed ImGuiSelectableFlags_HandleDoubleClick to ImGuiSelectableFlags_AllowDoubleClick + comments 2016-03-03 00:30:08 +01:00
6846873f23 Merge branch 'master' of https://github.com/zapolnov/imgui into zapolnov-master 2016-03-03 00:18:58 +01:00
d45044fe54 CaptureKeyboardFromApp() / CaptureMouseFromApp(): allow to enforce clearing the capture flag (#533) + demo + made code a little less messy 2016-03-03 00:09:41 +01:00
cf12bc7dea InputText: Added BufTextLen in ImGuiTextEditCallbackData. Requesting user to maintain it. Zero-ing structure properly before use. (#541) 2016-03-02 23:34:29 +01:00
17d3c202ac BeginChild()/EndChild() fixed incorrect layout to allow widgets submitted after an auto-fit child wnidow (#540) 2016-03-02 21:46:23 +01:00
ba80a457b9 Demo: plot code doesn't use ImVector to avoid heap allocation + comment (#538) 2016-02-29 12:53:05 +01:00
1881cbe860 TextUnformatted: Fixed rare crash bug with large blurb of text (2k+) not finishing with a '\n' and fully above the clipping Y line. (#535) 2016-02-24 22:43:17 +01:00
4afe67cdc8 Demo: Fixed malloc/free mismatch and leak when destructing demo console (if it has been used) (#536) 2016-02-24 11:50:21 +01:00
f6181b3428 Examples: DirectX12: Add directx12_example 2016-02-22 15:22:48 -08:00
a43a9e602a ColorEdit4: support ImGuiColorEditFlags_NoSliders to display only a button (wip #346) 2016-02-21 23:55:01 +01:00
f8fede1d8b Added ColorPicker3/ColorPicker4, refactoring ColorEdit3/ColorEdit4 adding a bunch of flags and access to picker (wip #346)
Still pretty much experimenting so may break API
2016-02-21 23:23:30 +01:00
ab97b42935 Merge branch 'master' of https://github.com/ocornut/imgui 2016-02-21 18:10:44 +01:00
d1061c8799 Exposed FindWindowByName() in imgui_internal.h (missing chunk following 339b67c01a) 2016-02-21 18:10:35 +01:00
991d9e2884 Update README.md 2016-02-20 23:20:15 +01:00
874df53403 Update README.md 2016-02-20 20:46:08 +01:00
339b67c01a Exposed FindWindowByName() in imgui_internal.h 2016-02-20 17:37:36 +01:00
2813a44dcc Examples: OpenGL: skip rendering and calling glViewport() if we have a zero-fixed buffer (#486) 2016-02-16 09:14:38 +01:00
9e86d0e225 Examples: SDL/OpenGL: Tabs to spaces 2016-02-15 10:56:37 +01:00
87a6110994 Examples: OpenGL3: Fix BindVertexArray/BindBuffer order (#527) 2016-02-15 10:55:20 +01:00
20ba769644 Allow windows with only a callback only to be functional + minor cleanup (#524) 2016-02-14 10:33:56 +01:00
5b7a0b1b40 InputText() added comment (#526) 2016-02-11 23:00:14 +01:00
07e379a950 Examples: DirectX9: Wastefully use a RGBA8 texture for the font texture to make compability more evident with user's textures (#521) 2016-02-08 09:03:43 +01:00
dafedc3246 Demo: use locally defined strdup because compilers/standard librairies are an annoyance (#520) 2016-02-08 08:44:45 +01:00
2c6bc95dd5 Demo: InputText password demo filters out blanks (#515) 2016-02-03 09:24:57 +01:00
b329a36d27 Moved declaration of SetItemAllowOverlap() to imgui.h (ref #517) 2016-02-02 19:52:30 +01:00
a908c109c0 Added flag for selectables to handle double clicks. 2016-01-31 22:08:35 +01:00
62fe0b59bf Updated todo list 2016-01-30 18:34:19 +01:00
2efaa9a86f ImDrawList: fixed index overflow check broken by AddText(). Added extra assert. (#514) 2016-01-30 17:01:10 +01:00
a3b00b79f2 Fixed removal of trailing draw command if it is a callback command 2016-01-30 16:37:30 +01:00
b671840d15 InputTex(): Comment (#512) 2016-01-30 15:00:45 +01:00
b1ec90d565 InputText() fixed clipping bounds of contents (#512) 2016-01-30 14:57:24 +01:00
7afd62ec57 Tentative fix for GCC/Clang (#484, #504) 2016-01-25 21:45:45 +00:00
595684e08c Remove dependency on <new> header (#484, #504)
(Now expecting something to fail somewhere..)
2016-01-25 21:26:53 +00:00
3ee50af57e Fixed clipping of child windows within parent not taking account of childouter clipping boundaries (including scrollbar, etc.) (#506) 2016-01-25 20:55:34 +00:00
005b897d7d ProgressBar() handling of border size + storing border size in window structure (#503) 2016-01-24 11:00:37 +00:00
9f6b1ace8f Tidying up internal FindBestPopupWindowPos() 2016-01-23 15:13:55 +00:00
94dc3df956 ColorEdit4: Empty label doesn't add InnerSpacing, like other widgets (ref #346) 2016-01-23 14:57:48 +00:00
b6fe5eb4b4 Cleaned up the top of imgui.h, documenting all types / forward declarations 2016-01-23 12:45:56 +00:00
d5fd87e806 Added IM_COL32 macros (ref #346) 2016-01-23 12:15:49 +00:00
570a9dadc4 Honoring exact width passed to PushItemWidth(), previously it would add extra FramePadding.x*2 over that width. (ref #346)
If you had manual pixel-perfect alignment in place it might affect you.
2016-01-23 12:07:26 +00:00
8f0f71c7ba InputScalarEx(): removed unnecessary aabb computation. 2016-01-23 11:56:39 +00:00
2a505ebb9a ColorEdit4(): removed unnecessary calls to scanf() when idle in hexadecimal edit mode. 2016-01-23 11:29:22 +00:00
56927cbb54 Begin(): made the close button explicitly set the boolean to false instead of toggling it (#499) 2016-01-22 10:00:32 +00:00
13b1e0ec9b Merge branch 'master' of https://github.com/ocornut/imgui 2016-01-21 22:30:51 +00:00
b8f86ec4bd Examples: OpenGL2/3 Makefile; Added -lGL to Linux build 2016-01-21 22:30:47 +00:00
d6be992bef Travis CI: test adding osx 2016-01-21 21:43:24 +00:00
a81a5e5235 Commented Clang warning that's not compatible with all versions. Comments. 2016-01-21 21:40:22 +00:00
9e8795f4e2 Examples: Added extra comments 2016-01-21 18:51:42 +00:00
f144646c83 Merge branch 'master' of https://github.com/ocornut/imgui 2016-01-20 10:30:33 +00:00
e585204d82 ImFontAtlas: heuristic increase texture width up to 4096 with 4000+ glyphs. Various comments (#491) 2016-01-20 10:30:28 +00:00
39510d05ea Update README.md 2016-01-17 10:35:21 +00:00
3922988dea TreeNode(), CollapsingHeader() fixed not being to use "##" sequence in formatted label.
Removed DisableHideTextAfterDoubleHash hack used by Metrics window.
2016-01-16 12:25:40 +00:00
739e73b07b CalcTextSize(): adding early out for empty displayed string (#487) 2016-01-16 12:11:57 +00:00
fc66365805 Added overlooked test for label_size.x>0 before calling RenderText for label in a few instances (#487) 2016-01-16 12:01:18 +00:00
31fe006c85 Examples: DirectX10 fixed ImGui_ImplDX10_NewFrame() from recreating device objects if render isn't called (g_pVB not set) 2016-01-11 10:29:03 +00:00
6277ffe00f Examples: DirectX11: fixed ImGui_ImplDX11_NewFrame() from recreating device objects if render isn't called (g_pVB not set) 2016-01-11 10:19:38 +00:00
85725ff9c6 Added ImGuiWindowFlags_ForceVerticalScrollbar, ImGuiWindowFlags_ForceHorizontalScrollbar flags (#476) 2016-01-10 12:01:56 +00:00
76ca7c42ca ImDrawList: Added PrimQuadUV() helper to ease custom rendering of textured quads 2016-01-08 14:57:25 +00:00
bf6f6ba858 Demo: extra comments and example for PushItemWidth(-1) 2016-01-06 01:24:49 +01:00
49fb7364b5 Examples: SDL2+OpenGL3: Fix context creation options (#468, #463) 2016-01-05 10:23:43 +01:00
35085a4480 Drag*, Slider* clarified that keyboard inputs aren't clamped (#413) 2016-01-02 12:21:30 +01:00
749e8fa345 Minor optimization so that mass-calling BeginPopupContext* functions can early out more commonly without hashing ID 2015-12-31 12:11:28 +01:00
81c86dd5e7 Various minor fixes following a pass of cppcheck static analyzer 2015-12-30 11:55:37 +01:00
8061a6ceea ImVector: erase/insert uses Data/Data+Size directly. 2015-12-30 11:45:34 +01:00
4e3c6f64c0 Various minor fixes following a pass of cppcheck static analyzer 2015-12-30 11:45:13 +01:00
3aa4a108ed Examples: SDL/OpenGL3: Fixed linking documentation for MacOSX (#463) 2015-12-30 11:27:39 +01:00
40ed6a51b0 Fixed ImGuITextBuffer::empty() - unused in core lib - from being utterly broken 2015-12-30 11:07:31 +01:00
68bde7b862 Clarify comment (#455) 2015-12-27 21:41:01 +01:00
d212401624 Fixed ImDrawList::AddRect() which used to render a rectangle 1 px too large on each axis., fixed Image(), ImageButton() as well (#457) 2015-12-27 21:31:43 +01:00
6dbdc69131 ImDrawList: Fixed AddCircle() to fit precisely within bounding box like AddCircleFilled() and AddRectFilled() (followup #457 2015-12-27 20:18:43 +01:00
668a247af0 Demo: added more draw primitives in the Custom Rendering example (#457) 2015-12-27 19:49:31 +01:00
dc4a07c49a Fixed various Clang -Weverything warnings 2015-12-26 14:59:07 +01:00
e41568f87f Version number 1.48 WIP + Update binaries 2015-12-26 10:02:57 +01:00
24d186753e Version number 1.47 2015-12-25 22:44:03 +01:00
1c5aa32d2b TODO items. Moved ImDrawList::Clear* methods suggesting they aren't for end-user. 2015-12-25 17:41:45 +01:00
1bdd3b8e00 Merge branch 'master' of https://github.com/ocornut/imgui 2015-12-25 12:00:07 +01:00
2849596069 Comments about ImDrawList::PushClipRect 2015-12-25 11:59:49 +01:00
8de3f4843c Update README.md - revert + patrons 2015-12-24 20:19:59 +01:00
f631ae26ca Update README.md - dear imgui 2015-12-24 20:06:09 +01:00
e4cf44e967 Minor rebranding "ImGui" -> "dear imgui" (#21) 2015-12-24 20:00:50 +01:00
25c9448dda imconfig.h tweak, not advertising IMGUI_INCLUDE_IMGUI_USER_INL anymore. 2015-12-24 20:00:49 +01:00
e34b4b46da Update README.md - dear imgui 2015-12-24 20:00:29 +01:00
f3b41b35c2 Initial creation of a ImGuiWindowFlags_NoBringToFrontOnFocus window push it at the front of global window list 2015-12-24 14:55:42 +01:00
40ddf8e287 Exported high-level versions of PushClipRect / PopClipRect to imgui_internal.h (#448) 2015-12-24 14:47:11 +01:00
96e2b925b1 Comments (#449) 2015-12-24 10:45:52 +01:00
fc7a3d07bb BeginPopupContextItem: fixed comment (#439) 2015-12-21 17:21:16 +01:00
4723d97cfb Added BeginPopupContextItem() comment (#439) 2015-12-21 00:04:33 +01:00
6102aa1375 BeginPopupContextWindow() and BeginPopupContextVoid() reopen window on subsequent click (#439) 2015-12-20 23:39:47 +01:00
66886405f6 Minor comment (#439) 2015-12-20 23:32:24 +01:00
217a6c875a Examples: OpenGL: Tentative fix for miscaled call to glViewport on high-DPI screens (#441)
Fix for 980ca286fe
2015-12-19 20:54:23 +01:00
2e5577f44f Fix for popups being incorrectly positioned if their contents are larger than display and WindowPadding < DisplaySafeAreaPadding 2015-12-17 12:22:50 +00:00
21f0d64a74 stb_rect_pack.h update to 0.08 2015-12-16 11:14:49 +00:00
0b10bec71f ImDrawList: Simplified code and added check to avoid mis-recycling a callback command. 2015-12-16 01:13:36 +00:00
0873da85ec ImDrawList: Fixed bug with PopClipRect() sometimes altering TextureId + fixed merging of draw calls with same TextureId 2015-12-16 01:01:34 +00:00
370de414ef TreeNode(): Fixed horizontal spacing for layout to match Bullet() (followup to #414, #282) 2015-12-13 23:42:44 +00:00
2e5352786a Bullet(), BulletText(): vertical and horizontal alignment fixes (namely for widget sized line height). (followup to #414, #282) 2015-12-13 23:41:02 +00:00
558430ca8f TreeNode() fixed alignment of collapse arrow to it matches bullet (broken in 4006fb77bc) 2015-12-13 22:07:01 +00:00
5084f90a0d Added ProgressBar() (#333) 2015-12-13 21:41:45 +00:00
76ab5587e4 GetColorU32: Comments 2015-12-13 19:55:15 +00:00
9b6b1bc0f3 Added GetColorU32 helpers (previously internal and misplaced as window->Color()) 2015-12-13 19:32:37 +00:00
7bcebdc207 Comments and missing forward declaration 2015-12-13 18:02:15 +00:00
8afbdd1ade ImColor: Added SetHSV helper function. 2015-12-13 17:17:53 +00:00
7b0bf23071 Ensure that individual widgets are pixel aligned when using non pixel snapped font rendering. 2015-12-13 17:12:35 +00:00
02ce1a2b32 Demo: Display extra info from ImFontConfig in the font display 2015-12-13 16:15:11 +00:00
56c4f5b7dc MenuBar clipping rectangle fix for bordered mode 2015-12-13 16:03:52 +00:00
b49a985324 Various adjustment for border to be inside instead of outside the window size 2015-12-13 16:01:25 +00:00
18223fd3ab Demo: Tweak window option and style display 2015-12-13 14:03:26 +00:00
a9bdda0d95 Demo: Added style editor in demo menu + exposed WindowFillAlphaDefault 2015-12-13 13:36:00 +00:00
b1b759938e Fixed SizeContents and auto-fit size not being rounded to integer, which affects border rendering when using non-default font 2015-12-13 12:52:55 +00:00
9583868bab Added ImGuiIO::ClearInputCharacters() superfluous helper. 2015-12-12 00:08:54 +00:00
6c7f8efe1e InputText: update mouse drag on mouse move only & key input reposition selection bounds (better fix for #429) 2015-12-11 22:37:47 +00:00
4bfd5cd95f InputText: when keys are being input while mouse is dragging, disable mouse drag until button release (#429) 2015-12-11 22:20:16 +00:00
bf83ac8b55 Examples: Fixed msvc batch files from warning. 2015-12-07 21:27:25 +00:00
de4ae2d53a Metrics: computing drawcmd bounding box handle case where buffer has been de-indexed. 2015-12-05 11:26:47 +00:00
5dec997fbe Minor tidying up of now redundant code 2015-12-04 23:41:24 +00:00
c80e2274f1 Renamed Color() helpers to ValueColor() - dangerously named, rarely used and probably to be made obsolete. 2015-12-04 23:39:54 +00:00
ecc97bda7d Added SetItemAllowOverlap() exposed in imgui_internal.h only 2015-12-03 21:30:17 +00:00
18724f021a Merge branch 'JuJuBoSc-master' 2015-12-03 18:32:33 +00:00
9596e6f794 Examples: DirectX10: Minor tweaks, updated to latest example changes (#424) 2015-12-03 18:32:01 +00:00
dadd03fc11 Examples: DirectX10: Fix warning, disable debug device, add ignore list (#424) 2015-12-03 18:20:48 +00:00
59f0db6f15 Merge branch 'master' of https://github.com/JuJuBoSc/imgui into JuJuBoSc-master 2015-12-03 18:18:14 +00:00
32c1a3e46c Removed d3d11 references 2015-12-03 13:39:03 +01:00
730e8119fe Updated stb_truetype 1.07 -> 1.08 2015-12-03 12:35:27 +00:00
1f3a0e78cc Ported d3d11 renderer to d3d10 2015-12-03 13:18:35 +01:00
fe2972e8b2 Merge pull request #420 from RaptorFactor/master
Examples: DX11: Compile shaders with lower features levels.
2015-11-30 19:36:06 +00:00
6adf644448 Allow DX11 renderer to be used with devices with lower feature levels. 2015-12-01 05:08:30 +11:00
1b7aee7b9d Examples: DX11: Remove debug flag (#415) 2015-11-30 10:22:46 +00:00
632f9ec36a Commenting asserts 2015-11-30 09:45:45 +00:00
5f8200d52c TreeNode/CollapsingHeader: some minor cleanup of that horrible function. 2015-11-29 22:38:58 +00:00
d1b4159b51 TreeNode/CollapsingHeader: some minor cleanup of that horrible function. 2015-11-29 22:25:13 +00:00
9dca2ca960 Comments & spacing 2015-11-29 22:01:26 +00:00
b7e1ae4bf9 Added comment on using PushFont() before building the font (#232) 2015-11-29 21:33:51 +00:00
a500c0daf7 Demo: some TreeNode layout examples (#414, #282) 2015-11-29 21:02:15 +00:00
4006fb77bc TreeNode,CollapsingHeader: sizing fixes to support laying out item on same line before/after (#414, #282) 2015-11-29 20:35:58 +00:00
546962351b Internal minor renaming 2015-11-29 20:27:48 +00:00
6cee2fca94 Examples: Not clearing input data/tex data in atlas (will be required for dynamic atlas anyway). Effectively fix resizing in DX examples.
+ Standardized comments.
2015-11-29 14:54:05 +00:00
6269859315 Replace OS IME (Input Method Editor) cursor on top-left when we are not text editing. 2015-11-29 14:15:07 +00:00
3aebddc4ac Tweak GetGlyphRangesJapanese() to it is easier to modify 2015-11-29 11:55:54 +00:00
94ec3d534e Examples: Header comments. 2015-11-29 11:25:15 +00:00
6800939e73 Examples: Header comments. 2015-11-29 11:19:30 +00:00
5c52e9ec0d Examples: Clarified comments. Removed font merging example from comments. 2015-11-29 11:11:03 +00:00
d673db3092 Examples: Added README into the Visual Studio solution to people are less likely to miss it. 2015-11-29 11:01:50 +00:00
9735563b65 Additional comments for new users 2015-11-29 10:53:03 +00:00
eb6575508f Demo: Tweaked Clipping example. 2015-11-29 10:29:06 +00:00
b2b4bbe5ea Demo: Fixed variable shadowing warning. 2015-11-29 10:25:55 +00:00
79b09e7d10 Fixed int>void* warnings for 64-bits architectures and fancy warnings 2015-11-29 10:20:50 +00:00
f505a372fd Speculative build fix for old versions of Visual Studio compiler 2015-11-28 20:00:40 +00:00
ba77166432 Demo: comments (#414) 2015-11-28 17:23:32 +00:00
32d2768734 Demo: Moved property editor demo to its own mini example applet (#414) 2015-11-28 17:16:59 +00:00
d3df39fed1 Columns: Added Property Tree demo among tidying up demos (#125, #414) 2015-11-28 16:44:09 +00:00
4ca34a879d Columns: Fixed bug with indentation within columns, also making code shorter/faster (#414, #125) 2015-11-28 16:36:25 +00:00
a9009b133c Columns: Undo accidental change from 807d4ff92c 2015-11-28 15:52:57 +00:00
6e2e60ffad Merge branch 'master' of https://github.com/ocornut/imgui 2015-11-28 15:35:22 +00:00
e4ba6e525b Columns:: columns set with no implicit id include the columns count into the id to avoid collisions (#125) 2015-11-28 15:35:10 +00:00
807d4ff92c Columns: minor tidying up while investigating severe issues with indenting within columns (#414) 2015-11-28 12:14:50 +00:00
c0ec9f4e63 Merge pull request #416 from zryan3/bugfix/sdl2_typos
Examples:SDL: fixed comment referencing GLFW.
2015-11-28 09:36:06 +00:00
aa6cb32bd4 fixed text referencing GLFW library in SDL examples 2015-11-27 23:04:35 -07:00
b4556c404d Update README.md
Removed paragraph.
2015-11-27 23:43:19 +00:00
bfacd250df Update README.md 2015-11-27 23:42:07 +00:00
58b23b4785 Columns: avoid growing ColumnsData vector when closing a window with no columns (#125)
(Will break calling GetColumnOffset() when there's no column but it
would only have worked after the first frame anyway, so basically it
didn't work)
2015-11-26 23:07:10 +00:00
1aac69c937 Columns: tidying up, moving OffsetT to a ImGuiColumnData structure 2015-11-26 23:01:15 +00:00
95138fa8d6 Merge branch 'master' of https://github.com/ocornut/imgui 2015-11-26 22:43:28 +00:00
3102c0c97e Rename internal ColumnsStartX to IndentX, makes more sense 2015-11-26 22:43:21 +00:00
60b75d78ea Update README.md 2015-11-24 19:13:05 +00:00
10ba61f882 Added links 2015-11-24 15:35:07 +00:00
5d84f4b450 Update README.md - faq 2015-11-22 23:16:19 +00:00
b959c74488 Update README.md - faq 2015-11-22 23:12:50 +00:00
83e6cfbec0 Examples: DirectX9/11: Removed assumption about Unicode build in example main.cpp (#399) 2015-11-22 21:23:56 +00:00
dc86a8a0bf Examples: OpenGL3: Fixed gl3w.c for Linux when compiled with C++ compiler (#411) 2015-11-22 17:16:55 +00:00
38cfdafbaf Examples: SDL/OpenGL3: Added -ldl to Linux command-line (#411) 2015-11-22 17:09:03 +01:00
1e69a86d30 Update README.md 2015-11-20 09:36:43 +01:00
92c518a420 InputText: Added password mode via ImGuiInputTextFlags_Password (#237, #363, #374) 2015-11-19 23:09:59 +01:00
6b03ddbcb1 Demo: Made the "menu inside a regular window" be in a different menuset. Added a comment (#409) 2015-11-16 22:43:42 +01:00
e2ecc02e02 Examples: Updated README 2015-11-16 22:17:10 +01:00
f96de74e05 Merge branch 'zach2good-SDL_OpenGL3_Implementation' 2015-11-16 22:13:58 +01:00
899cb3b4e9 Examples: SDL+OpenGL3: Fixed readme (#356) 2015-11-16 22:13:06 +01:00
ab7e91b65e Examples: SDL+OpenGL3: Various fixes to example to make it matches current GL3 example (#356) 2015-11-16 22:12:18 +01:00
9d0caa2e66 Examples: SDL+OpenGL3: Using glew like existing example + renaming (#356) 2015-11-16 22:05:22 +01:00
624adb1b23 Tweak build batch files and readmes 2015-11-16 22:03:13 +01:00
9a8cbf128d Merge branch 'SDL_OpenGL3_Implementation' of https://github.com/zach2good/imgui into zach2good-SDL_OpenGL3_Implementation 2015-11-16 21:35:49 +01:00
693efccb62 ImageButton() uses FrameRounding up to a maximum of available framing size (#394) 2015-11-15 19:43:05 +01:00
5549744e0f Minor popups comment tweak (#402) 2015-11-15 19:09:30 +01:00
f87deff0f3 Moving stdlib.h include outside of imgui.h (#405) 2015-11-13 17:08:54 +01:00
9243aee62c Fixed unused variable warning if asserts are compiled out. 2015-11-11 10:26:12 +00:00
3b2fdf27a8 Examples: Added /Zi (output debug information) in build_win32.bat files 2015-11-11 09:45:18 +00:00
0b47edcefe Merge pull request #403 from JasonWilkins/master
Fixed a couple of problems found by CppCat code analyzer.
2015-11-10 23:28:51 +00:00
4dee8473b5 Fixed a couple of problems found by CppCat code analyzer.
* incorrect implementation of ImVec4 operator- which always gives a w value of 0
* boolean formula of ((A && B) || B) can be simplified to just (B)
2015-11-10 17:06:37 -06:00
1d76890526 Examples: OpenGL3: Implement ImGui_ImplGlfwGL3_InvalidateDeviceObjects() like other examples. 2015-11-08 22:52:25 +00:00
e4fb14a9e0 TODO notes 2015-11-08 11:00:56 +00:00
e46c7b70eb Examples: Most examples apps detect if ImDrawIdx was changed to 32-bits instead of 16 2015-11-08 11:00:31 +00:00
4982cd136e Fixed Shutdown() not clearing FontAtlas if NewFrame() was never called. (#396, #303) 2015-11-07 23:10:09 +00:00
b168c72dd1 Update README.md 2015-11-01 22:53:29 +00:00
d963ff13ca Update README.md 2015-11-01 22:25:33 +01:00
acc87f7f5e Update README.md 2015-11-01 22:18:37 +01:00
6b23fca1ff Speculative build fix for using alloca on PS4 & FreeBSD 2015-10-30 18:05:06 +01:00
0a23e2c832 Tabs to spaces 2015-10-30 15:57:03 +01:00
980ca286fe Examples: OpenGL2/3: Save/setup/restore viewport as part of render function. Update SDL example to match GL2 one. (fix #392) 2015-10-30 15:44:47 +01:00
6ffe0fddbf Examples: Fixed crash when both buttons are held (#393) 2015-10-30 15:01:26 +01:00
1a42a3f91b Refactor internal SliderBehavior() to take flags instead of a bool.
Sorry!
2015-10-30 11:43:23 +01:00
3eabad0321 Refactor - Internal ButtonBehavior() removed unnecessary boolean arg, merged into flags using ImGuiButtonFlags_NoKeyModifiers.
This is quite a risky change frankly but I'd rather refactor sooner than
later. Hopefully few people are using the internal functions.
2015-10-30 11:36:51 +01:00
e858d229a0 Examples: update all examples with same comment (#389) 2015-10-30 10:45:16 +01:00
d0afb23a3f Merge pull request #389 from dougbinks/master
Font merge demo and documentation minor additions.
2015-10-30 10:39:59 +01:00
e1bc0dd7d5 Font merge demo and documentation minor additions.
Clarifies the lifetime requirements for the ranges parameter for AddFont* functions.
2015-10-25 16:06:42 +00:00
0b0c460324 Travis CI: revert, giving up update for now. 2015-10-19 20:10:43 +01:00
7245599f04 Travis CI: test upgrading to container-based build (3) 2015-10-19 20:05:02 +01:00
d86dd37091 Travis CI: test upgrading to container-based build 2015-10-19 19:59:53 +01:00
f11adc1c08 Travis CI: test upgrading to container-based build 2015-10-19 19:57:46 +01:00
217ef444d4 ColorEdit4: Fixed broken tooltip on hovering the color button (actually fixes #373, #380) 2015-10-19 12:02:52 +01:00
5f0db60a57 Version number 1.47 WIP 2015-10-18 20:13:01 +01:00
42529f1270 Merge pull request #378 from Gargaj/patch-1
Examples: DirectX9: NULL out font texture on Invalidate so NewFrame() can be called directly without ImGui_ImplDX9_CreateDeviceObjects()
2015-10-18 18:11:54 +01:00
e4d916a4b3 NULL out font texture on invalidate
If this isn't done, NewFrame won't re-create the font.
2015-10-18 19:05:04 +02:00
72dde4d323 Version 1.46 2015-10-18 17:36:27 +01:00
fbdcb51dde Fix to allow using SetNextWindow* functions with ImGuiSetCond_Appearing on modal windows (#377)
Also affect other popups which called FindBestPopupWindowPos() on their
second frame but it most often acts as a no-op but it wouldn't be
noticeable.
2015-10-18 17:30:53 +01:00
8b9c0b2545 Tweaks (calling inner SetNext* functions directly from Begin) 2015-10-18 17:20:03 +01:00
7a61b7dd57 Renamed Window LastFrameDrawn to LastFrameActive, more correct 2015-10-18 16:57:10 +01:00
465e6839a4 ColorEdit4: hovering the color button shows correct alpha (fix #373) 2015-10-18 16:24:44 +01:00
5b7a2149fc ColorConvertFloat4ToU32() round the floats instead of truncating them. 2015-10-18 16:09:37 +01:00
43ff5a41be InputText(): always use live input data for display in read-only mode (fix #360) 2015-10-18 15:50:46 +01:00
a0d24ac03d Scrollbar: background color less translucent in default style (flattened alpha) so it works better on non-WindowBg colored background. 2015-10-18 15:36:39 +01:00
64b6e87f54 Scrollbar: fixed vertical alignment with border + no menu bar (following #365) 2015-10-18 15:35:27 +01:00
b090d711e2 InputText: removed the need for text_end pointer in the cursor position calculation loop, allows switching buffers 2015-10-18 15:25:36 +01:00
214e87d59c InputText: comments. 2015-10-18 12:18:28 +01:00
bc34ac882f InputText: added comments and somehow clarified the optimized code that calculate text position + updated demo 2015-10-18 10:57:29 +01:00
2b3fb5c0f7 Example: Marmalade: shallow tweaks and cleanups to match ImGui coding style (#375) 2015-10-15 12:44:30 +02:00
81927b073e Merge pull request #375 from gzito/master
Examples: Added example app for the Marmalade platform.
2015-10-15 11:32:13 +01:00
ba9c469ff0 no message 2015-10-14 23:13:02 +02:00
ebf4f1fa02 no message 2015-10-14 23:05:01 +02:00
79ca203850 Merge branch 'master' of https://github.com/ocornut/imgui 2015-10-14 23:01:52 +02:00
5d53f37a5d Examples: Possibly clarified the intent of imgui_impl_* files. 2015-10-13 17:53:43 +02:00
1c69b3d0df Tools: binary_to_compressed_c.cpp: added -nocompress option. 2015-10-12 13:13:00 +02:00
d4d2e5bc62 Added items to Todo list 2015-10-12 12:31:41 +02:00
a5c895f791 Added SetClipboardText / GetClipboardText helper shortcuts to match MemAlloc / MemFree 2015-10-12 12:20:01 +02:00
59cedca02e Merge pull request #371 from nguillemot/master
Examples: DirectX11: Fix vertex POSITION format (ImDrawVert::pos is 2D, not 4D)
2015-10-12 09:26:49 +01:00
509ac33abe fix POSITION format (ImDrawVert::pos is 2D, not 4D)
the inputlayout incorrectly described the POSITION attribute as being
4D, while ImDrawVert::pos is 2D. This went unnoticed because the buffer
binding has a stride of sizeof(ImDrawVert) and the POSITION is treated
as a float2 in the vertex shader. If you switch POSITION to float4 in
the vertex shader (and actually use the z/w in the matrix
multiplication) then everything become wacky-looking since it's
interpreting the texture coordinates as z/w. On a similar note: It's
weird that the projection matrix takes z and w into consideration when
those don't exist in the shader due to positions being float2s.
2015-10-11 16:42:22 -07:00
a5132286b7 ImDrawList: ChannelsSetCurrent() added an extra assert 2015-10-11 17:50:55 +02:00
8eb4df0dd6 Added comments (#369 #370) 2015-10-11 17:20:07 +02:00
8c5c0c41fc ImDrawList: AddImage() uv parameters default to (0.0) and (1.1) 2015-10-11 17:17:03 +02:00
b93e787f51 Merge pull request #369 from richardkogelnig/master
InputText: Fix for not being able to enter certain characters in InputText on german keyboard
2015-10-11 17:16:10 +02:00
8a6bde3527 Fix for AltGR being send as Ctrl&Alt on german keyboards. Don't consume characters if CTRL key press is detected AND ALT key press is detected in Imgui::InputTextEx 2015-10-11 16:25:49 +02:00
fae7b34a3f Fixed bug with handling of malformed utf-8 at the end of a non-zero terminated string range. 2015-10-09 21:47:41 +02:00
50b25b6c75 Added example for the Marmalade platform 2015-10-08 22:38:37 +02:00
b8281d96bd Fixed mouse release double-triggering (#359, #362) 2015-10-08 20:59:49 +02:00
a77e534ded Examples: OpenGL2: Add msys2/mingw64 target (#361) 2015-10-08 20:48:50 +02:00
379079ac42 Merge pull request #361 from fr500/master
Examples: OpenGL3: Add msys2/mingw64 target.
2015-10-08 20:47:22 +02:00
80173fec96 Merge branch 'osman-brian-master' 2015-10-08 20:44:25 +02:00
edf730b672 Missing tidying up (#358) 2015-10-08 20:44:13 +02:00
48bb3c8026 Merge branch 'master' of https://github.com/osman-brian/imgui into osman-brian-master 2015-10-08 20:40:54 +02:00
de92bc873f Scrollbar: fixed minor rendering offset when borders are enabled (fix #365) 2015-10-08 20:25:49 +02:00
0298603040 Update README.md
More begging, still in search for a solution..
2015-10-08 15:35:39 +02:00
bd78892164 Fixed IsKeyReleased() and IsMouseReleased() returning true on the first frame.
Loosely related to #362
2015-10-08 15:28:09 +02:00
e83b529846 BeginChildFrame() helper has the extra_flags parameter. 2015-10-07 00:22:44 +02:00
d087671369 HoveredId is set via a SetHoveredID() function. Added HoveredIdAllowHoveringOthers not used by default API. 2015-10-06 19:27:24 +02:00
06d594e86b Dummy() create an item so functions such as IsItemHovered() can be used. 2015-10-05 20:27:22 +02:00
54805fd22a InputText: fixed crash when passing a buf_size==0 (which can be of use for read-only selectable text boxes) (#360) 2015-10-05 14:13:24 +02:00
a465b2b3d8 add msys2/mingw64 target 2015-10-04 15:14:35 -05:00
7508d30b83 ImGuiTextBuffer: added c_str() helper. 2015-10-04 11:22:47 +02:00
69678d1ed2 Merge pull request #357 from orthographic-pedant/spell_check/accommodate
Fixed typographical error, changed "accomodate" to "accommodate" in README.
2015-10-03 19:13:04 +02:00
e031fe484c Added ImGuiWindowFlags_NoBringToFrontOnFocus behavior. 2015-10-02 19:07:04 +02:00
69e6f299f3 Update imgui_draw.cpp
Fix Decode85 on big-endian systems.
2015-10-01 14:57:31 -04:00
c1983d5c3f Draw: Fixed rectangle rendering glitches with width/height <= 1/2 and rounding enabled. 2015-09-30 21:48:36 +02:00
f21fda1231 Scrollbar: Tweaked scrollbar inner padding for small scrollbars. 2015-09-30 21:47:44 +02:00
6e4d959953 Window: fixed window lower-right clipping limit so it plays more friendly with both OpenGL and DirectX coordinates.
Not sure about this. Hmm.
2015-09-30 21:30:27 +02:00
c9d51d99b4 Scrollbar: tidying up (#355) 2015-09-30 21:19:54 +02:00
5d3d136733 Scrollbar: horizontal scrollbar demo allows to enable simultanaeous scrollbars on both axises. 2015-09-30 21:15:47 +02:00
b92daf0ba2 Scrollbar: fixed rounding of background + child window consistenly have ChildWindowBg color under ScrollbarBg fill (#355) 2015-09-30 21:15:17 +02:00
ea66a34f9d Fixed typographical error, changed accomodate to accommodate in README. 2015-09-30 13:16:55 -04:00
e130b09d91 Previous SDL implementation didn't work with my OpenGL 3.3 project, spliced the GLFW OpenGL examples on top of the SDL example to create an option that works for me. Could be useful for others. 2015-09-30 15:12:00 +01:00
a76b75c2d5 InputFloat() fixed explicit precision modifier, both display and input were broken. 2015-09-30 15:36:17 +02:00
572bf91006 Comments 2015-09-30 15:35:30 +02:00
ecb63ff8f3 Inline functions not marked with IMGUI_API because apparently it is illegal for MinGW (fix #349)
ARGH C++.
2015-09-27 22:28:16 +02:00
963f6b782d Examples: OpenGL3: saving more of blend state (#347) 2015-09-27 22:21:11 +02:00
9d89e03346 Merge pull request #348 from zho7611/add_korean_support
ImFontAtlas: Added GetGlyphRangesKorean() for Korean.
2015-09-23 18:49:11 +02:00
cc53d31764 Add support for Korean. 2015-09-24 00:50:00 +09:00
d5502cdd6d Examples: OpenGL3: Saving/restoring the Enable state, better than nothing (#347) 2015-09-23 09:14:27 +02:00
98465d401b Silencing inadequate MSVC warnings when exporting as DLL (#345) 2015-09-22 00:53:51 +02:00
914516110c Minor spacing 2015-09-22 00:53:11 +02:00
127f44c12b Demo: Extra plotting examples. 2015-09-20 13:29:18 +02:00
ab5def6ad8 PlotHistogram: Minimum bar width ensure better rendering with lots of points (~related to #342) 2015-09-20 12:02:17 +02:00
e268303c02 PlotLines: fixed rendering issue added in previous commit (#342) 2015-09-20 11:37:46 +02:00
994c286f61 Merge pull request #342 from nem0/master
PlotHistogram: Fixed rendering of histogram with a lot of values.
2015-09-20 11:26:13 +02:00
93200a6c37 fixed rendering of histogram with a lot of values 2015-09-19 21:12:26 +02:00
774099918a Update README.md 2015-09-19 15:37:28 +02:00
fee9e07e61 Updated FAQ (#341) 2015-09-19 15:22:05 +02:00
ff12afbd18 InputText(): fixed cursor pixel-alignment when horizontally scrolled. 2015-09-19 13:48:27 +02:00
0e86ed9361 InputText(): fixed mouse-dragging not scroll tracking the cursor when text doesn't fit (fix #339) 2015-09-19 13:45:51 +02:00
08bfe9bc7c Fixed assert introduced in 3b01b0a2f2 2015-09-18 15:03:44 +02:00
c4562ac573 Fixed mouse click detection to be more friendly to DeltaTime 0.0 (#338) 2015-09-17 23:42:34 +01:00
3b01b0a2f2 Extracted a EndFrame() function out of Render() but kept it internal/private + clarified some asserts (#335) 2015-09-16 23:48:42 +01:00
0a1d6b6b74 InputText() fixed ignoring text inputs when ALT is pressed (#334) 2015-09-16 10:38:42 +01:00
ec7eb05e88 ImGuiTextFilter::Draw helper return bool and resplit when filter is modified 2015-09-14 13:03:20 +01:00
f9928e96c7 InputText(): lose cursor/undo-stack when reactivating focus is buffer has changed size 2015-09-12 00:02:59 +01:00
0abe668221 ImFontAtlas: Added TexDesiredWidth and tweaked default cheapo best-width choice(#327) 2015-09-11 16:50:00 +01:00
bc8eb5e9cf ImDrawList, ImFontAtlas: comments, tweaks. moved less scary functions at the top of the file. 2015-09-11 16:35:37 +01:00
7b1168eb30 Internal ImLoadFileToMemory() return void* instead of taking void** + allow optional int* file_size 2015-09-11 16:01:54 +01:00
4d83519244 Comments (#328) 2015-09-11 15:52:03 +01:00
25b4b88a7a Examples: Update readme. 2015-09-10 21:10:01 +01:00
ad4c962224 Examples: DirectX11: Fixed batch file for VS 2012+, still works for 2008/2010.. Include path order matters... 2015-09-10 20:58:43 +01:00
853f265025 Examples: Added batch files to build Windows examples with VS 2015-09-10 20:34:06 +01:00
167c02d502 Better Git ignore list for quick compilations in same folder 2015-09-10 20:09:29 +01:00
951e1bd9a8 Merge branch 'master' of https://github.com/ocornut/imgui 2015-09-10 10:26:20 +01:00
2903c98bca Minor typo 2015-09-10 10:26:09 +01:00
07776595c2 Added missing IMGUI_API definitions in imgui_internal (fix #326) 2015-09-10 10:22:17 +01:00
c31ca3e2d5 Update README.md - demo binaries 2015-09-09 14:28:09 +01:00
1793c1a991 Comments 2015-09-09 14:15:17 +01:00
cafe8b0cd7 Comments 2015-09-09 12:42:59 +01:00
fcbbb0070e Fixed assert introduced in dafad3903e if there are no active draw list 2015-09-09 12:39:16 +01:00
b4f1e88860 Added ImGuiInputTextFlags_ReadOnly flag for InputText()/InputTextMultiline() (#211) 2015-09-09 09:08:08 +01:00
f5fb5f0c1e Minor tidying, reordering functions/members/initialisation to follow same orders 2015-09-07 23:39:36 +01:00
a09411b936 Demo: using MouseDelta 2015-09-07 23:33:44 +01:00
8a3593257f Fixed warning with VS2015 in stb_truetype.h 2015-09-07 15:51:43 +01:00
7d6ddbe5c8 Examples: comment on setting the RenderDrawListsFn function. 2015-09-07 14:58:26 +01:00
dafad3903e Added GetDrawData() alternative to setting a Render function. 2015-09-07 14:56:39 +01:00
93f9ad9ddf README.md 2015-09-05 20:03:05 +01:00
e34ad0a05a ImDrawList: fixed 1 leak per ImDrawList using the ChannelsSplit() API (via Columns) (fix #318) 2015-09-03 23:42:08 +01:00
dbc7903da8 IsMouseHoveringRect() added 'bool clip' parameter to disable clipping the rectangle with the current parameters (#316) 2015-09-03 13:13:13 +01:00
09f659271e ImFont: fixed comment (#317) 2015-09-03 10:42:38 +01:00
fc052e24b2 Added ImGuiWindowFlags_NoFocusOnAppearing flag (#314) 2015-09-02 19:13:25 +01:00
965fa3cb16 Version number 1.46 WIP 2015-09-02 19:09:19 +01:00
c9e19f8953 Version number 1.45 2015-09-01 20:34:10 +01:00
77bcb7152b Examples: DirectX11: fixed vertex shader which breaks with VS2015 somehow (DX11 version?) (#313) 2015-09-01 10:47:36 +01:00
f195bf744f Tabs to spaces 2015-08-30 22:15:33 +01:00
4ab43dce19 Comments 2015-08-30 22:10:49 +01:00
13daaf78a2 Update README.md 2015-08-30 19:41:02 +01:00
e4ef140e10 Speculative Linux build fix, not using itoa (#246) 2015-08-30 18:55:46 +01:00
350d96466e Demo: tweaks (#246) 2015-08-30 18:43:42 +01:00
1eef2c9108 Comment 2015-08-30 18:35:02 +01:00
71026d3655 Added GetScrollX(), GetScrollX(), GetScrollMaxX() apis + demo (#246) 2015-08-30 18:33:38 +01:00
7a31030978 Begin() windows flags are locked on the first begin of the frame, allowing using to not bother passing flags for append 2015-08-30 18:30:54 +01:00
e5e9c5cfbe Demo: removed extraneous flag in demo code + tweak comment (#246) 2015-08-30 18:07:51 +01:00
bbf09fd47d Fixed initial ScrollbarX decision when no vertical scrollbar is in (#246) 2015-08-30 18:07:04 +01:00
a3cad2ff06 BeginChild() fixed missing rounding for child sizes which leaked into layout 2015-08-30 18:06:54 +01:00
6eed3dc7c8 GetContentRegionMax() when window content size is explicit we don't adjust it with scrollbar sizes (#246) 2015-08-30 17:46:02 +01:00
73e73e6ef9 TextUnformatted(): simplifying 2015-08-30 17:45:05 +01:00
afa0346a0b Demo: using DragFloat instead of SliderFloat 2015-08-30 17:38:42 +01:00
e1f8fed734 Separator(): removed unnecessary computation + comment. 2015-08-30 17:25:26 +01:00
f128a8bce1 ColumnsStartX include window->Scroll.x to simplify code (#246) 2015-08-30 17:25:10 +01:00
8edbdb9775 Style: minor menubar bg alpha tweak. 2015-08-30 16:44:44 +01:00
e68d3c614e Style: made scrollbars rounded by default. Because nice. (#246) 2015-08-30 16:43:08 +01:00
9e5fb40ddd Demo: added horizontal scrolling example + enabled in console, log and child examples (#246) 2015-08-30 16:38:55 +01:00
65a191c005 Added optional Horizontal Scrollbar & allow user to explicitly set content width via SetNextWindowContentSize() etc (#246)
GetCursorPos, SetCursorPos, GetContentRegionMax,
GetWindowContentRegionMin, GetWindowContentRegionMax are now including
the scrolling amount. It PROBABLY shouldn't break anything for you, but
take note that SetCursorPosX(100.0f) puts you at +100 from the starting
x position which may include scrolling, not at +100 from the window left
side.
2015-08-30 16:37:56 +01:00
9eed672725 Bullet() fixed inconsistent layout behaviour when clipped. 2015-08-30 15:42:42 +01:00
d88b73a8b7 Added GetContentRegionAvailWidth() helper. Demo tweaks. 2015-08-30 15:35:59 +01:00
fc13ae2aa5 Turning float ScrollY into ImVec2 Scroll - no feature change, this is just to remove some syntax noise from the following commit (#246) 2015-08-30 15:08:13 +01:00
e0c375e7b8 Tidying up 2015-08-30 13:09:56 +01:00
b326c8fd1f Added GetCurrentWindowRead() for functions that don't write to the window 2015-08-30 11:56:04 +01:00
b994dd777a Fixed OpenPopup() accessing current window, effectively opening "Debug" on an empty window stack 2015-08-30 11:11:15 +01:00
0aa353868f Minor internal shortcuts not calling GetCurrentWindow() 2015-08-30 10:49:47 +01:00
aa35547f94 Demo: long text example uses ImGuiListClipper 2015-08-30 00:03:08 +01:00
2d565d4bfb Style: rename ScrollbarWidth to ScrollbarSize (sorry!) 2015-08-29 23:47:47 +01:00
64fcb5e568 TreeNode() fixed IsItemHovered() being inconsistent with visual behavior (#282) 2015-08-29 18:15:42 +01:00
65fe60f2b2 Split tree/collapsable into internal TreeNodeBehaviorIsOpened() helper (unsure..) (#282) 2015-08-29 18:13:30 +01:00
0bb46c824e Examples: OpenGL2/3: save/restore some more state correctly.
Might save an hour of staring at blank-screen to 5% of the population,
worth it.
2015-08-29 17:44:52 +01:00
f2c68109a6 Merge branch 'master' of https://github.com/ocornut/imgui 2015-08-29 14:45:15 +01:00
c381d58fb1 TreeNode(): arbitrary interaction padding after text label not part of layout (#282) 2015-08-29 14:12:53 +01:00
62a3142036 Demo: comments. 2015-08-29 13:31:30 +01:00
da807e55ea Examples: Ignore list a little more friendly to Unix systems. 2015-08-28 16:03:05 +01:00
5ebd61f89c Ignore list a little more friendly to Unix systems 2015-08-28 15:55:22 +01:00
e7cc048d81 Demo: custom rendering tweak. 2015-08-28 15:35:08 +01:00
0a11024459 IO.WantInputCharacters -> WantTextInput (#305) 2015-08-28 15:34:53 +01:00
30461345aa Removed default name parameter in Begin()
We already have a "Debug" window pushed to the stack in the first place
so it's not really a useful default.
2015-08-28 15:24:04 +01:00
8430c88451 Demo: added a bezier curve in the old custom rendering demo. 2015-08-28 14:41:10 +01:00
b803d284c3 InvisibleButton() honor negative size consistently with other widgets that do so 2015-08-28 14:18:50 +01:00
90e5c97f13 AddBezier()->AddBezierCurve(). PathBezierTo()->PathBezierCurveTo(), and reads current point back, more standard (#311) 2015-08-28 13:48:14 +01:00
d2e529e533 Merge branch 'master' of https://github.com/ocornut/imgui 2015-08-28 13:19:43 +01:00
80ad773c87 ImDrawList: added AddBezier(), PathBezierTo() for cubic bezier curves (#311) 2015-08-28 13:18:34 +01:00
55ea2988d2 Update README.md 2015-08-28 00:04:49 +01:00
e58f99179a Examples: OpenGL: fix for retina screens + io.DisplayFramebufferScale storage (#287) 2015-08-27 19:51:02 +01:00
a36001212f ImDrawData: added ScaleClipRects() helper (#287) 2015-08-27 18:45:43 +01:00
8b225923f8 Malformed UTF-8 don't terminate string, output 0xFFFD (#307) 2015-08-27 13:44:31 +01:00
59d498f3d0 Added ColorConvertU32ToFloat4() helper and ImColor(ImU32) constructor. 2015-08-26 21:18:08 +01:00
62671ef96e Examples: update readme 2015-08-25 22:14:31 +01:00
8cf7df7ec4 Added GetWindowHeight() for completeness + BeginGroup() comment. 2015-08-25 16:55:14 +01:00
822eaf1751 Examples: DX9, DX11: mapping missing middle mouse button. 2015-08-25 16:54:47 +01:00
08b345efd9 ImDrawList: Add comments on the usage of drawing channels 2015-08-25 16:31:20 +01:00
77b82ecad7 ImDrawList: Fixed issues with channels split/merge. Functional without manually adding a draw cmd. + Removed unnecessary parameter to Channe 2015-08-25 16:24:17 +01:00
ad00d88923 Window clipping rect fixes (for child windows with borders among others) 2015-08-25 15:01:33 +01:00
f0aca186cc Comments 2015-08-25 13:35:25 +01:00
ad3c9f620d Tabs to spaces 2015-08-25 12:40:40 +01:00
466f01b313 Fixed child windows with the ImGuiWindowFlags_NoMove flag not taking direct focus 2015-08-25 12:39:44 +01:00
43d073db1e Metrics: showing some internal state 2015-08-25 12:22:30 +01:00
b76353bbb1 Passing ImGuiWindowFlags_NoMove to BeginChild() allows to inhibit moving root window from this child 2015-08-25 11:54:13 +01:00
063d26a191 Removed obsolete comment 2015-08-24 18:13:31 +01:00
9a0650dbd0 Examples: imgui_impl* functions declared with IMGUI_API to ease copy & pasting into projects using DLL 2015-08-24 14:02:51 +02:00
b1987d697f Trim trailing whitespace (#305) 2015-08-24 13:50:18 +02:00
425c6cb3a3 Remove CaptureInputCharactersFromApp and minor cleanups (#305) 2015-08-24 13:47:27 +02:00
73917115a8 Added flag showing whether the GUI wants text input
Conflicts:
	imgui.cpp
2015-08-24 13:44:43 +02:00
7eca754094 Merge pull request #304 from yinjimmy/fix_ios
Examples: Fixed missing files in iOS example.
2015-08-23 11:05:39 +02:00
01a17aa78e fix ios compile error 2015-08-23 08:03:21 +08:00
e885b08914 Web: Fixed screenshot (Argh web editor is broken) 2015-08-22 11:54:47 +02:00
0e898fb480 Web: Fixed screenshot 2015-08-22 11:54:13 +02:00
5f4cbed7ce Web: Fixed screenshot 2015-08-22 11:53:45 +02:00
b28858b33b InputText: intentionally ignore character input when ctrl/alt are held (not sure if correct) (#279) 2015-08-21 00:24:47 +02:00
23ce837dc7 Revert "Examples: GLFW: using glfwSetCharModsCallback() to ensure characters aren't passed when using mods (fix #279)"
This reverts commit d80869189a.
2015-08-21 00:16:07 +02:00
d80869189a Examples: GLFW: using glfwSetCharModsCallback() to ensure characters aren't passed when using mods (fix #279) 2015-08-20 22:32:07 +01:00
06c7453ee2 Merge pull request #302 from andresv/mac-sdl2-example-build-instructions
Examples: SDL: Add Mac OS X build instructions for sdl_opengl_example
2015-08-20 22:21:01 +01:00
bbced3f0f0 Build fix 2015-08-18 19:31:44 -06:00
4ac4d1ac37 ImHash: defaults seed to zero + comment. 2015-08-18 19:17:09 -06:00
ccbc72e98b add mac os x build instructions for sdl_opengl_example 2015-08-18 10:16:16 +03:00
97be3428f1 Added GetMousePosOnOpeningCurrentPopup(). 2015-08-15 15:10:07 -06:00
215747635d Examples: DirectX11: resizing buffers dynamically (#299) 2015-08-13 23:13:20 -06:00
c016f6c171 Examples: DirectX9: tweaks. 2015-08-13 23:07:53 -06:00
698c7cae85 Examples: DirectX9: resizing vertex and index buffers dynamically (#299) 2015-08-13 23:06:11 -06:00
ede5956b28 Metrics window: shows indices along with triangles count (#299) 2015-08-13 22:33:33 -06:00
0a6d6da732 Demo: Log: removed unnecessary style change, 2015-08-13 22:11:32 -06:00
67b2b5f3a9 Demo: Log: removed broken clipping, tweaks. 2015-08-13 22:04:31 -06:00
07de0448f9 ImGuiTextFilter: default parameter width=0.0f for no override, allow override with negative values 2015-08-13 21:51:34 -06:00
307ed78006 ImGuITextBuffer: shallow tweak. 2015-08-13 21:48:08 -06:00
b770f3ffaf Demo: Add filtering to log with better-than-none storage of line offsets. 2015-08-13 21:47:50 -06:00
42567a9516 ImGuiTextFilter::PassFilter() supports string range. Added [] helper to ImGuiTextBuffer. 2015-08-13 21:25:32 -06:00
72d3fca52f Demo: added simple Log demo 2015-08-13 20:59:37 -06:00
d36a634ac8 Demo: Fixed incorrectly formed string passed to Combo (#298) 2015-08-13 11:55:48 -06:00
c98318a914 Renaming some argument to clarify the local vs screen coordinates 2015-08-12 22:46:39 -06:00
f421f2f47e IsWindowHovered() takes account of window hoverability (may be disabled because of a popup) + comment
Was a dupe of IsMouseHoveringWindow() anyway, they are now "clearly"
different.
2015-08-12 22:30:07 -06:00
bcb83ed24e Fixed minor typo in example 2015-08-12 12:29:51 -06:00
4630815fb0 Links 2015-08-11 14:45:42 -06:00
f1f4d68f7f Prevent imgui_internal.h from being included without imgui.h (piles of errors) 2015-08-10 10:26:39 -06:00
0c9fcdbe71 Allow to override ImDrawIdx type (#292) 2015-08-09 11:11:39 -06:00
915b46f1c1 Added assert on index overflow (#292) 2015-08-09 11:05:38 -06:00
48ed0a10d7 Minor code compaction (following #296) 2015-08-09 10:54:28 -06:00
9a97ef673e Merge pull request #296 from tpoechtrager/master
Fixes for compiling Windows target with non-MSVC compiler.
2015-08-09 10:49:06 -06:00
6a90ac2094 Tentative GCC/Clang warning fixes with unused functions (cf #296) 2015-08-09 10:45:58 -06:00
3604aecf8f Minor Windows adjustments 2015-08-09 17:24:10 +02:00
23e7bdebcf Warnings for clang (#295) 2015-08-08 12:30:56 -06:00
32f15b9c9a Merge branch 'tpoechtrager-master' 2015-08-08 12:26:44 -06:00
aa3c26fd30 IM_PRINTFARGS takes one argument. Moved pragma outside of .h (#295) 2015-08-08 12:26:22 -06:00
b637850260 Merge branch 'master' of https://github.com/tpoechtrager/imgui into tpoechtrager-master 2015-08-08 12:18:59 -06:00
14822609bd Version number 1.45 WIP 2015-08-08 12:18:37 -06:00
947cf3434f Added printf attribute to printf like text formatting functions 2015-08-08 19:29:11 +02:00
a99ba42a39 Version number 1.44 2015-08-08 07:57:29 -06:00
20cc65788d Build fix for Orbis / PS4 2015-08-07 21:52:57 -06:00
27961401c6 Cleanup (#219) 2015-08-06 08:37:51 -06:00
88a00f77e9 Cleanup - using ImRect more consistently for ImGui-side cliprect data 2015-08-06 08:23:05 -06:00
f1fb62fa6d Cleanup - shuffle functions around (#219) 2015-08-06 08:11:33 -06:00
b6313577bb Merge pull request #291 from twoscomplement/surplus_inlines
Remove inline qualifiers inside .cpp
2015-08-06 07:33:12 -06:00
0911597550 Remove inline qualifiers inside .cpp
Use of inline in the .cpp file causes link errors with gcc.
2015-08-07 15:41:22 -07:00
80fc576d07 Update README.md 2015-08-05 22:17:10 -06:00
96a7873622 Update documentation 2015-08-05 22:00:27 -06:00
470200ee5c Update documentation 2015-08-05 21:59:07 -06:00
85dab1a680 Fixed documentation 2015-08-05 19:19:12 -06:00
15cfa63e97 Comments 2015-08-05 19:09:13 -06:00
692a38c0fc Merge branch 'master' into 2015-07-cleanup 2015-08-05 17:41:43 -06:00
f2b652a39e Comments 2015-08-05 17:38:17 -06:00
e7f1e28b6b Merge branch 'master' into 2015-07-cleanup 2015-08-05 17:27:47 -06:00
4b4f6d78ee InputFloat() fixed 0 decimal_precision 2015-08-05 17:26:04 -06:00
a54995eace RoundScalar() fallback use powf(10.f, -x) instead of 1.0f/powf(10.0f,x) 2015-08-05 17:11:20 -06:00
9b19f8c19d Merge branch 'master' into 2015-07-cleanup
Conflicts:
	imgui.cpp
2015-08-05 16:57:31 -06:00
12d941a42a Merge branch 'master' of https://github.com/ocornut/imgui 2015-08-05 16:51:17 -06:00
f6e21b7ab7 InputInt() also hexadecimal input (awkwardly via ImGuiInputTextFlags_CharsHexadecimal but we will allow fmt string in InputInt* later)
+ Fix for large ints constant assignment
2015-08-05 16:47:46 -06:00
cc8ff4c8d1 RoundScalar() use a lookup table to avoid calling powf(10.0f, x); 2015-08-05 16:17:11 -06:00
f0f2afa87d InputInt() doesn't cast to float, fix handling lost of precision with large integer. Added primitives to support more data types. 2015-08-05 16:08:53 -06:00
a793ad682d Merge branch 'master' into 2015-07-cleanup
Conflicts:
	imgui.cpp
2015-08-05 15:29:38 -06:00
ebd25cf1a3 Minor comments 2015-08-05 15:13:13 -06:00
7fea3eacfe Minor comments 2015-08-05 12:50:13 -06:00
e20b90154c Comments 2015-08-05 11:04:13 -06:00
3ee2fac892 Slider: fixed using FramePadding between frame and grab visual. Scaling that spacing would look odd. 2015-08-05 11:00:00 -06:00
e42bec5ba2 Fixed scaling of checkbox and radio button for the filling of "active" visual 2015-08-05 10:50:20 -06:00
155873a6b0 Added GetContentRegionAvail() helper 2015-08-05 10:43:12 -06:00
1b0a8f9ac3 Comments 2015-08-05 10:00:05 -06:00
60b46cc712 Comment (#219) 2015-08-05 09:34:07 -06:00
8be4d41540 Merge remote-tracking branch 'origin' into 2015-07-cleanup 2015-08-05 09:32:29 -06:00
1befd21b37 Moved ShowUserGuide() after ShowTestWindow() (#219) 2015-08-05 09:31:03 -06:00
3658314638 imgui_demo.cpp doesn't redefine functions from imgui_internal.h so all files can be unity-built (#219) 2015-08-05 09:28:19 -06:00
a526b423e8 Merge pull request #290 from cmaughan/master
Examples: DirectX11: Clear font texture view pointer to ensure Release() doesn't get called twice
2015-08-04 07:48:31 -06:00
d667de9490 Clear font texture view to ensure Release() doesn't get called twice 2015-08-04 14:22:05 +01:00
815d1d9be4 Merge remote-tracking branch 'origin' into 2015-07-cleanup
Conflicts:
	imgui.cpp
2015-08-03 08:12:57 -06:00
3aca446817 Added ImFontAtlas::AddFontFromMemoryCompressedBase85TTF() 2015-08-03 08:10:10 -06:00
da3baebd43 Fixed lower-right resize grip hit box not scaling along with its rendered size (#287) 2015-08-02 09:15:36 -06:00
e099798c97 Merge remote-tracking branch 'origin' into 2015-07-cleanup 2015-08-01 22:12:51 -06:00
3ccbdc8423 Unnecessary .gitignore in root folder 2015-08-01 22:12:18 -06:00
4b29cc9e10 Exposed relevant functions in imgui_internal.h (#219) 2015-08-01 21:57:24 -06:00
e47bf041bf Clang warning fixes 2015-08-01 21:37:32 -06:00
11d91a27a4 Carriage return (#289) 2015-08-01 17:18:01 -06:00
040e427dad Merge pull request #289 from twoscomplement/sdl_error_out
Examples: Show SDL error message on init failure.
2015-08-01 17:07:05 -06:00
f158617551 Show SDL error message on init failure 2015-08-02 01:35:43 -07:00
1e76c63bb6 Fixed comment 2015-08-01 08:07:16 -06:00
2d8c134747 Merge remote-tracking branch 'origin' into 2015-07-cleanup
Conflicts:
	imgui.cpp
2015-08-01 07:26:09 -06:00
26a992c6f6 Updated to stb_truetype 1.07 (back to vanilla version as our minor changes are now in master & fix #280) 2015-08-01 07:22:52 -06:00
6c63d80aa4 Tidying up InputTextApplyArithmeticOp() 2015-07-30 23:59:51 -06:00
f63beeae86 Internal version of LogText() -> LogRenderedText() + shallow tidying up 2015-07-30 23:48:59 -06:00
faa609a43c Internal cleanup ParseFormatPrecision() doesn't take a reference 2015-07-30 23:14:29 -06:00
f8646338c3 Merge remote-tracking branch 'origin' into 2015-07-cleanup 2015-07-30 23:00:11 -06:00
7650d4cc67 Internal SliderFloatAsInputText() -> InputFloatReplaceWidget() 2015-07-30 22:59:30 -06:00
abf823c6f6 Tidying up 2015-07-30 22:49:10 -06:00
58ee08f214 Todo list notes 2015-07-30 22:18:07 -06:00
040f3950a3 Merge remote-tracking branch 'origin' into 2015-07-cleanup
Conflicts:
	imgui.cpp
2015-07-30 21:54:07 -06:00
e6b29b70b4 Make internal SliderFloatAsInputText() take a size to match the calling widget 2015-07-30 21:51:55 -06:00
a7e5945206 Merge 2015-07-30 21:37:59 -06:00
c639f65eb7 Merge remote-tracking branch 'origin' into 2015-07-cleanup
Conflicts:
	imgui.cpp
2015-07-30 21:37:47 -06:00
02fbb36918 ImDrawList: Add missing support for anti-aliased thick-lines (#133, also ref #288) 2015-07-30 21:11:07 -06:00
a79ee94fc4 Removed unnecessary assignment + added comment 2015-07-30 20:59:41 -06:00
709c4c3168 Merge remote-tracking branch 'origin' into 2015-07-cleanup
Conflicts:
	imgui.cpp
2015-07-30 20:42:12 -06:00
527208ad7c Default font encoded as base85 saves ~100 lines / 26 KB of source code (from @mmalex) 2015-07-30 19:36:55 -06:00
fddc871870 Columns: never assume horizontal space for scrollbar if NoScrollbar flag is set. 2015-07-30 12:32:20 -06:00
fc9ee2bc9b Merge pull request #286 from GHF/cleanup
Remove non-text character at start of imgui.cpp
2015-07-30 12:14:01 -06:00
8d45c89352 Remove non-text character at start of imgui.cpp 2015-07-26 19:18:04 -07:00
4468ec001e Fixed warning in console example (we're iterating chars) 2015-07-22 06:38:19 -06:00
fb83323b1d Tidying up 2015-07-21 20:13:12 -06:00
62c888177a Tweaks 2015-07-21 20:06:34 -06:00
e1ac5a3198 Honor IMGUI_DISABLE_TEST_WINDOWS as described (#219) 2015-07-21 19:57:32 -06:00
68962ae683 README update 2015-07-21 19:53:06 -06:00
7552f48d7b ImLoadFileToMemory() default parameters 2015-07-21 17:46:49 -06:00
94f085aa3e Update comments (#219) 2015-07-21 17:19:11 -06:00
5a29eef1fa Fixed further warnings with GCC/Clang (#219) 2015-07-21 17:13:56 -06:00
e32f0931e8 Missing includes for imgui_draw.cpp (#219) 2015-07-21 17:08:20 -06:00
52a74701f5 Updated projects to reference new files (#219)
Didn't update iOS example (#247)
2015-07-21 17:04:03 -06:00
dace68b6fd Big cleanup, split imgui.cpp into imgui_demo.cpp,imgui_draw.cpp imgui_internal.h (#219) 2015-07-21 17:00:28 -06:00
60dce8bc22 Fix to get all code ShowTestWindow() copiable outside. Moved ShowMetricsWindows() above. (#219) 2015-07-19 11:45:03 -06:00
0eb196d544 Examples: OpenGL3: simplified code using glBufferData for vertices as well (#277, #278) 2015-07-19 10:52:51 -06:00
dc1cb9e625 Tweak 2015-07-19 10:49:56 -06:00
d184730dd2 Merge branch 'trevex-master' 2015-07-19 10:45:59 -06:00
bc9bae6d01 To support drivers with strict core profiles, a buffer is used for the indices as well (fixes ocornut/imgui#277). 2015-07-19 17:56:14 +02:00
83ebbebadd Fixed inconsistent declaration of ImVec2 privates operators 2015-07-18 22:37:08 -06:00
5a4b521855 Added ImDrawList::AddText() shorthand helper 2015-07-18 21:50:23 -06:00
74908a9513 Fixed angles in ImDrawList::PathArcTo(), PathArcToFast() being off by an extra PI for no reason 2015-07-18 18:45:37 -06:00
479211808f ImDrawList::AddPolyLine() tidying up in AA path 2015-07-18 17:31:40 -06:00
82727d7119 Version number 1.44 WIP 2015-07-18 14:07:22 -06:00
cdbf71ac12 Added ImGuiWindowFlags_NoInputs for input-passthru window
Would be more useful with finer control over display layer
2015-07-17 16:36:04 -06:00
0ab620c2b9 Combo() clamp popup to lower edge of visible area 2015-07-17 16:14:04 -06:00
20db726a9a Version number 1.44 WIP 2015-07-17 16:03:13 -06:00
4015414978 InputtextMultiline(): honor negative size consistently with other widgets 2015-07-17 16:01:21 -06:00
3b53a6513a Button() honor negative size consistently with other widgets that do so 2015-07-17 15:58:23 -06:00
eca26ae91d Build fix for MinGW (#276) 2015-07-17 13:38:55 -06:00
99c5f5735c Tweak button sizes 2015-07-17 07:08:51 -06:00
242 changed files with 72793 additions and 27297 deletions

24
.editorconfig Normal file
View File

@ -0,0 +1,24 @@
# See http://editorconfig.org to read about the EditorConfig format.
# - In theory automatically supported by VS2017+ and most common IDE or text editors.
# - In practice VS2019 stills gets trailing whitespaces wrong :(
# - Suggest install to trim whitespaces: https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TrailingWhitespaceVisualizer
# - Alternative for older VS2010 to VS2015: https://marketplace.visualstudio.com/items?itemName=EditorConfigTeam.EditorConfig
# top-most EditorConfig file
root = true
# Default settings:
# Use 4 spaces as indentation
[*]
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
[imstb_*]
indent_size = 3
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
indent_size = 4

30
.gitattributes vendored Normal file
View File

@ -0,0 +1,30 @@
* text=auto
*.c text
*.cpp text
*.h text
*.m text
*.mm text
*.md text
*.txt text
*.html text
*.bat text
*.frag text
*.vert text
*.mkb text
*.icf text
*.sln text eol=crlf
*.vcxproj text eol=crlf
*.vcxproj.filters text eol=crlf
*.natvis text eol=crlf
Makefile text eol=lf
*.sh text eol=lf
*.pbxproj text eol=lf
*.storyboard text eol=lf
*.plist text eol=lf
*.png binary
*.ttf binary
*.lib binary

1
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1 @@
custom: ['https://github.com/ocornut/imgui/wiki/Sponsors']

46
.github/issue_template.md vendored Normal file
View File

@ -0,0 +1,46 @@
(Click "Preview" above ^ to turn URL into clickable links)
1. PLEASE CAREFULLY READ: [FAQ](https://github.com/ocornut/imgui/blob/master/docs/FAQ.md)
2. PLEASE CAREFULLY READ: [Issue Submitting Guidelines](https://github.com/ocornut/imgui/issues/2261)
3. FOR FIRST-TIME USERS ISSUES COMPILING/LINKING/RUNNING/LOADING FONTS, please use [GitHub Discussions](https://github.com/ocornut/imgui/discussions).
4. PLEASE MAKE SURE that you have: read the FAQ; explored the contents of `ShowDemoWindow()` including the Examples menu; searched among Issues; used your IDE to search for keywords in all sources and text files; and read the link provided in (1) (2).
5. Be mindful that messages are being sent to the e-mail box of "Watching" users. Try to proof-read your messages before sending them. Edits are not seen by those users.
6. Delete points 1-6 and PLEASE FILL THE TEMPLATE BELOW before submitting your issue.
Thank you!
----
_(you may also go to Demo>About Window, and click "Config/Build Information" to obtain a bunch of detailed information that you can paste here)_
**Version/Branch of Dear ImGui:**
Version: XXX
Branch: XXX _(master/viewport/docking/etc.)_
**Back-end/Renderer/Compiler/OS**
Back-ends: imgui_impl_XXX.cpp + imgui_impl_XXX.cpp _(or specify if using a custom engine/back-end)_
Compiler: XXX _(if the question is related to building or platform specific features)_
Operating System: XXX
**My Issue/Question:**
XXX _(please provide as much context as possible)_
**Screenshots/Video**
XXX _(you can drag files here)_
**Standalone, minimal, complete and verifiable example:** _(see https://github.com/ocornut/imgui/issues/2261)_
```
// Here's some code anyone can copy and paste to reproduce your issue
ImGui::Begin("Example Bug");
MoreCodeToExplainMyIssue();
ImGui::End();
```

6
.github/pull_request_template.md vendored Normal file
View File

@ -0,0 +1,6 @@
(Click "Preview" to turn any http URL into a clickable link)
PLEASE CAREFULLY READ:
https://github.com/ocornut/imgui/issues/2261
(Clear this template before submitting your PR)

504
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,504 @@
name: build
on:
push:
pull_request:
workflow_run:
# Use a workflow as a trigger of scheduled builds. Forked repositories can disable scheduled builds by disabling
# "scheduled" workflow, while maintaining ability to perform local CI builds.
workflows:
- scheduled
branches:
- master
- docking
types:
- requested
jobs:
Windows:
runs-on: windows-2019
env:
VS_PATH: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\
MSBUILD_PATH: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
shell: powershell
run: |
Invoke-WebRequest -Uri "https://www.libsdl.org/release/SDL2-devel-2.0.10-VC.zip" -OutFile "SDL2-devel-2.0.10-VC.zip"
Expand-Archive -Path SDL2-devel-2.0.10-VC.zip
echo "SDL2_DIR=$(pwd)\SDL2-devel-2.0.10-VC\SDL2-2.0.10\" >>${env:GITHUB_ENV}
Invoke-WebRequest -Uri "https://github.com/ocornut/imgui/files/3789205/vulkan-sdk-1.1.121.2.zip" -OutFile vulkan-sdk-1.1.121.2.zip
Expand-Archive -Path vulkan-sdk-1.1.121.2.zip
echo "VULKAN_SDK=$(pwd)\vulkan-sdk-1.1.121.2\" >>${env:GITHUB_ENV}
- name: Fix Projects
shell: powershell
run: |
# WARNING: This will need updating if toolset/sdk change in project files!
gci -recurse -filter "*.vcxproj" | ForEach-Object {
# Fix SDK and toolset for most samples.
(Get-Content $_.FullName) -Replace "<PlatformToolset>v110</PlatformToolset>","<PlatformToolset>v142</PlatformToolset>" | Set-Content -Path $_.FullName
(Get-Content $_.FullName) -Replace "<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>","<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>" | Set-Content -Path $_.FullName
# Fix SDK and toolset for samples that require newer SDK/toolset. At the moment it is only dx12.
(Get-Content $_.FullName) -Replace "<PlatformToolset>v140</PlatformToolset>","<PlatformToolset>v142</PlatformToolset>" | Set-Content -Path $_.FullName
(Get-Content $_.FullName) -Replace "<WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>","<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>" | Set-Content -Path $_.FullName
}
# Not using matrix here because it would inflate job count too much. Check out and setup is done for every job and that makes build times way too long.
- name: Build example_null (extra warnings, mingw 64-bit)
run: mingw32-make -C examples/example_null WITH_EXTRA_WARNINGS=1
- name: Build example_null (extra warnings, msvc 64-bit)
shell: cmd
run: |
cd examples\example_null
call "%VS_PATH%\VC\Auxiliary\Build\vcvars64.bat"
.\build_win32.bat /W4
- name: Build example_null (single file build)
shell: bash
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file.exe example_single_file.cpp -limm32
- name: Build example_null (with IMGUI_DISABLE_WIN32_FUNCTIONS)
shell: bash
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_DISABLE_WIN32_FUNCTIONS
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file.exe example_single_file.cpp -limm32
- name: Build example_null (as DLL)
shell: cmd
run: |
call "%VS_PATH%\VC\Auxiliary\Build\vcvars64.bat"
echo #ifdef _EXPORT > example_single_file.cpp
echo # define IMGUI_API __declspec(dllexport) >> example_single_file.cpp
echo #else >> example_single_file.cpp
echo # define IMGUI_API __declspec(dllimport) >> example_single_file.cpp
echo #endif >> example_single_file.cpp
echo #define IMGUI_IMPLEMENTATION >> example_single_file.cpp
echo #include "misc/single_file/imgui_single_file.h" >> example_single_file.cpp
cl.exe /D_USRDLL /D_WINDLL /D_EXPORT /I. example_single_file.cpp /LD /FeImGui.dll /link
cl.exe /I. ImGui.lib /Feexample_null.exe examples/example_null/main.cpp
- name: Build Win32 example_glfw_opengl2
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj /p:Platform=Win32 /p:Configuration=Release'
- name: Build Win32 example_glfw_opengl3
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj /p:Platform=Win32 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build Win32 example_glfw_vulkan
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj /p:Platform=Win32 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build Win32 example_sdl_vulkan
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj /p:Platform=Win32 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build Win32 example_sdl_opengl2
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj /p:Platform=Win32 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build Win32 example_sdl_opengl3
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj /p:Platform=Win32 /p:Configuration=Release'
- name: Build Win32 example_sdl_directx11
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_directx11/example_sdl_directx11.vcxproj /p:Platform=Win32 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build Win32 example_win32_directx9
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx9/example_win32_directx9.vcxproj /p:Platform=Win32 /p:Configuration=Release'
- name: Build Win32 example_win32_directx10
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx10/example_win32_directx10.vcxproj /p:Platform=Win32 /p:Configuration=Release'
- name: Build Win32 example_win32_directx11
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx11/example_win32_directx11.vcxproj /p:Platform=Win32 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_glfw_opengl2
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj /p:Platform=x64 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_glfw_opengl3
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj /p:Platform=x64 /p:Configuration=Release'
- name: Build x64 example_glfw_vulkan
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj /p:Platform=x64 /p:Configuration=Release'
- name: Build x64 example_sdl_vulkan
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj /p:Platform=x64 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_sdl_opengl2
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj /p:Platform=x64 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_sdl_opengl3
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj /p:Platform=x64 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_sdl_directx11
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl_directx11/example_sdl_directx11.vcxproj /p:Platform=x64 /p:Configuration=Release'
- name: Build x64 example_win32_directx9
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx9/example_win32_directx9.vcxproj /p:Platform=x64 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_win32_directx10
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx10/example_win32_directx10.vcxproj /p:Platform=x64 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_win32_directx11
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx11/example_win32_directx11.vcxproj /p:Platform=x64 /p:Configuration=Release'
if: github.event_name == 'workflow_run'
- name: Build x64 example_win32_directx12
shell: cmd
run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx12/example_win32_directx12.vcxproj /p:Platform=x64 /p:Configuration=Release'
Linux:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install -y libglfw3-dev libsdl2-dev gcc-multilib g++-multilib libfreetype6-dev libvulkan-dev
- name: Build example_null (extra warnings, gcc 32-bit)
run: |
make -C examples/example_null clean
CXXFLAGS="$CXXFLAGS -m32 -Werror" make -C examples/example_null WITH_EXTRA_WARNINGS=1
- name: Build example_null (extra warnings, gcc 64-bit)
run: |
make -C examples/example_null clean
CXXFLAGS="$CXXFLAGS -m64 -Werror" make -C examples/example_null WITH_EXTRA_WARNINGS=1
- name: Build example_null (extra warnings, clang 32-bit)
run: |
make -C examples/example_null clean
CXXFLAGS="$CXXFLAGS -m32 -Werror" CXX=clang++ make -C examples/example_null WITH_EXTRA_WARNINGS=1
- name: Build example_null (extra warnings, clang 64-bit)
run: |
make -C examples/example_null clean
CXXFLAGS="$CXXFLAGS -m64 -Werror" CXX=clang++ make -C examples/example_null WITH_EXTRA_WARNINGS=1
- name: Build example_null (freetype)
run: |
make -C examples/example_null clean
make -C examples/example_null WITH_FREETYPE=1
- name: Build example_null (single file build)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (with ImWchar32)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_USE_WCHAR32
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (with large ImDrawIdx + pointer ImTextureID)
run: |
cat > example_single_file.cpp <<'EOF'
#define ImTextureID void*
#define ImDrawIdx unsigned int
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (with IMGUI_DISABLE_OBSOLETE_FUNCTIONS)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (with IMGUI_DISABLE_DEMO_WINDOWS and IMGUI_DISABLE_METRICS_WINDOW)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_DISABLE_DEMO_WINDOWS
#define IMGUI_DISABLE_METRICS_WINDOW
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (with IMGUI_DISABLE_FILE_FUNCTIONS)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_DISABLE_FILE_FUNCTIONS
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (with IMGUI_USE_BGRA_PACKED_COLOR)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_USE_BGRA_PACKED_COLOR
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (with IM_VEC2_CLASS_EXTRA and IM_VEC4_CLASS_EXTRA)
run: |
cat > example_single_file.cpp <<'EOF'
struct MyVec2 { float x; float y; MyVec2(float x, float y) : x(x), y(y) { } };
struct MyVec4 { float x; float y; float z; float w;
MyVec4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) { } };
#define IM_VEC2_CLASS_EXTRA \
ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \
operator MyVec2() const { return MyVec2(x, y); }
#define IM_VEC4_CLASS_EXTRA \
ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \
operator MyVec4() const { return MyVec4(x, y, z, w); }
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
g++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (without c++ runtime, Clang)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_IMPLEMENTATION
#define IMGUI_DISABLE_DEMO_WINDOWS
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
clang++ -I. -Wall -Wformat -nodefaultlibs -fno-rtti -fno-exceptions -fno-threadsafe-statics -lc -lm -o example_single_file example_single_file.cpp
- name: Build example_glfw_opengl2
run: make -C examples/example_glfw_opengl2
- name: Build example_glfw_opengl3
run: make -C examples/example_glfw_opengl3
if: github.event_name == 'workflow_run'
- name: Build example_sdl_opengl2
run: make -C examples/example_sdl_opengl2
if: github.event_name == 'workflow_run'
- name: Build example_sdl_opengl3
run: make -C examples/example_sdl_opengl3
- name: Build with IMGUI_IMPL_VULKAN_NO_PROTOTYPES
run: g++ -c -I. -DIMGUI_IMPL_VULKAN_NO_PROTOTYPES=1 backends/imgui_impl_vulkan.cpp
MacOS:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
run: |
brew install glfw3 sdl2
- name: Build example_null (extra warnings, clang 64-bit)
run: make -C examples/example_null WITH_EXTRA_WARNINGS=1
- name: Build example_null (single file build)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
clang++ -I. -Wall -Wformat -o example_single_file example_single_file.cpp
- name: Build example_null (without c++ runtime)
run: |
cat > example_single_file.cpp <<'EOF'
#define IMGUI_IMPLEMENTATION
#include "misc/single_file/imgui_single_file.h"
#include "examples/example_null/main.cpp"
EOF
clang++ -I. -Wall -Wformat -nodefaultlibs -fno-rtti -fno-exceptions -fno-threadsafe-statics -lc -lm -o example_single_file example_single_file.cpp
- name: Build example_glfw_opengl2
run: make -C examples/example_glfw_opengl2
- name: Build example_glfw_opengl3
run: make -C examples/example_glfw_opengl3
if: github.event_name == 'workflow_run'
- name: Build example_glfw_metal
run: make -C examples/example_glfw_metal
- name: Build example_sdl_metal
run: make -C examples/example_sdl_metal
- name: Build example_sdl_opengl2
run: make -C examples/example_sdl_opengl2
if: github.event_name == 'workflow_run'
- name: Build example_sdl_opengl3
run: make -C examples/example_sdl_opengl3
- name: Build example_apple_metal
run: xcodebuild -project examples/example_apple_metal/example_apple_metal.xcodeproj -target example_apple_metal_macos
- name: Build example_apple_opengl2
run: xcodebuild -project examples/example_apple_opengl2/example_apple_opengl2.xcodeproj -target example_osx_opengl2
iOS:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Build example_apple_metal
run: |
# Code signing is required, but we disable it because it is irrelevant for CI builds.
xcodebuild -project examples/example_apple_metal/example_apple_metal.xcodeproj -target example_apple_metal_ios CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
Emscripten:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
run: |
wget -q https://github.com/emscripten-core/emsdk/archive/master.tar.gz
tar -xvf master.tar.gz
emsdk-master/emsdk update
emsdk-master/emsdk install latest
emsdk-master/emsdk activate latest
- name: Build example_emscripten_opengl3
run: |
pushd emsdk-master
source ./emsdk_env.sh
popd
make -C examples/example_emscripten_opengl3
- name: Build example_emscripten_wgpu
run: |
pushd emsdk-master
source ./emsdk_env.sh
popd
make -C examples/example_emscripten_wgpu
Android:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Build example_android_opengl3
run: |
cd examples/example_android_opengl3/android
gradle assembleDebug
Discord-CI:
runs-on: ubuntu-18.04
if: always()
needs: [Windows, Linux, MacOS, iOS, Emscripten, Android]
steps:
- uses: dearimgui/github_discord_notifier@latest
with:
discord-webhook: ${{ secrets.DISCORD_CI_WEBHOOK }}
github-token: ${{ github.token }}
action-task: discord-jobs
discord-filter: "'{{ github.branch }}'.match(/master|docking/g) != null && '{{ run.conclusion }}' != '{{ last_run.conclusion }}'"
discord-username: GitHub Actions
discord-job-new-failure-message: ''
discord-job-fixed-failure-message: ''
discord-job-new-failure-embed: |
{
"title": "`{{ job.name }}` job is failing on `{{ github.branch }}`!",
"description": "Commit [{{ github.context.payload.head_commit.title }}]({{ github.context.payload.head_commit.url }}) pushed to [{{ github.branch }}]({{ github.branch_url }}) broke [{{ job.name }}]({{ job.url }}) build job.\nFailing steps: {{ failing_steps }}",
"url": "{{ job.url }}",
"color": "0xFF0000",
"timestamp": "{{ run.updated_at }}"
}
discord-job-fixed-failure-embed: |
{
"title": "`{{ github.branch }}` branch is no longer failing!",
"description": "Build failures were fixed on [{{ github.branch }}]({{ github.branch_url }}) branch.",
"color": "0x00FF00",
"url": "{{ github.context.payload.head_commit.url }}",
"timestamp": "{{ run.completed_at }}"
}

15
.github/workflows/scheduled.yml vendored Normal file
View File

@ -0,0 +1,15 @@
#
# This is a dummy workflow used to trigger scheduled builds. Forked repositories most likely should disable this
# workflow to avoid daily builds of inactive repositories.
#
name: scheduled
on:
schedule:
- cron: '0 9 * * *'
jobs:
scheduled:
runs-on: ubuntu-latest
steps:
- run: exit 0

77
.github/workflows/static-analysis.yml vendored Normal file
View File

@ -0,0 +1,77 @@
name: static-analysis
on:
workflow_run:
# Perform static analysis together with build workflow. Build triggers of "build" workflow do not need to be repeated here.
workflows:
- build
types:
- requested
jobs:
PVS-Studio:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: Install Dependencies
env:
# The Secret variable setup in GitHub must be in format: "name_or_email key", on a single line
PVS_STUDIO_LICENSE: ${{ secrets.PVS_STUDIO_LICENSE }}
run: |
if [[ "$PVS_STUDIO_LICENSE" != "" ]];
then
wget -q https://files.viva64.com/etc/pubkey.txt
sudo apt-key add pubkey.txt
sudo wget -O /etc/apt/sources.list.d/viva64.list https://files.viva64.com/etc/viva64.list
sudo apt-get update
sudo apt-get install -y pvs-studio
pvs-studio-analyzer credentials -o pvs-studio.lic $PVS_STUDIO_LICENSE
fi
- name: PVS-Studio static analysis
run: |
if [[ ! -f pvs-studio.lic ]];
then
echo "PVS Studio license is missing. No analysis will be performed."
echo "If you have a PVS Studio license please create a project secret named PVS_STUDIO_LICENSE with your license."
echo "You may use a free license. More information at https://www.viva64.com/en/b/0457/"
exit 0
fi
cd examples/example_null
pvs-studio-analyzer trace -- make WITH_EXTRA_WARNINGS=1
pvs-studio-analyzer analyze -e ../../imstb_rectpack.h -e ../../imstb_textedit.h -e ../../imstb_truetype.h -l ../../pvs-studio.lic -o pvs-studio.log
plog-converter -a 'GA:1,2;OP:1' -d V1071 -t errorfile -w pvs-studio.log
Discord-CI:
runs-on: ubuntu-18.04
needs: [PVS-Studio]
if: always()
steps:
- uses: dearimgui/github_discord_notifier@latest
with:
discord-webhook: ${{ secrets.DISCORD_CI_WEBHOOK }}
github-token: ${{ github.token }}
action-task: discord-jobs
discord-filter: "'{{ github.branch }}'.match(/master|docking/g) != null && '{{ run.conclusion }}' != '{{ last_run.conclusion }}'"
discord-username: GitHub Actions
discord-job-new-failure-message: ''
discord-job-fixed-failure-message: ''
discord-job-new-failure-embed: |
{
"title": "`{{ job.name }}` job is failing on `{{ github.branch }}`!",
"description": "Commit [{{ github.context.payload.head_commit.title }}]({{ github.context.payload.head_commit.url }}) pushed to [{{ github.branch }}]({{ github.branch_url }}) broke static analysis [{{ job.name }}]({{ job.url }}) job.\nFailing steps: {{ failing_steps }}",
"url": "{{ job.url }}",
"color": "0xFF0000",
"timestamp": "{{ run.updated_at }}"
}
discord-job-fixed-failure-embed: |
{
"title": "`{{ github.branch }}` branch is no longer failing!",
"description": "Static analysis failures were fixed on [{{ github.branch }}]({{ github.branch_url }}) branch.",
"color": "0x00FF00",
"url": "{{ github.context.payload.head_commit.url }}",
"timestamp": "{{ run.completed_at }}"
}

52
.gitignore vendored
View File

@ -1 +1,53 @@
## OSX artifacts
.DS_Store
## Dear ImGui artifacts
imgui.ini
## General build artifacts
*.o
*.obj
*.exe
examples/build/*
examples/*/Debug/*
examples/*/Release/*
examples/*/x64/*
## Visual Studio artifacts
.vs
ipch
*.opensdf
*.log
*.pdb
*.ilk
*.user
*.sdf
*.suo
*.VC.db
*.VC.VC.opendb
## Commonly used CMake directories
/build*/
## Xcode artifacts
project.xcworkspace
xcuserdata
## Emscripten artifacts
examples/*.o.tmp
examples/*.out.js
examples/*.out.wasm
examples/example_emscripten_opengl3/web/*
examples/example_emscripten_wgpu/web/*
## JetBrains IDE artifacts
.idea
cmake-build-*
## Unix executables from our example Makefiles
examples/example_glfw_opengl2/example_glfw_opengl2
examples/example_glfw_opengl3/example_glfw_opengl3
examples/example_glut_opengl2/example_glut_opengl2
examples/example_null/example_null
examples/example_sdl_opengl2/example_sdl_opengl2
examples/example_sdl_opengl3/example_sdl_opengl3

View File

@ -1,17 +0,0 @@
language: cpp
os:
- linux
compiler:
- gcc
- clang
before_install:
- if [ $TRAVIS_OS_NAME == linux ]; then sudo add-apt-repository -y ppa:pyglfw/pyglfw && sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends libglfw3-dev libxrandr-dev libxi-dev libxxf86vm-dev; fi
- if [ $TRAVIS_OS_NAME == osx ]; then brew update && brew install glfw3; fi
script:
- make -C examples/opengl_example
- make -C examples/opengl3_example

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2014-2015 Omar Cornut and ImGui contributors
Copyright (c) 2014-2021 Omar Cornut
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

147
README.md
View File

@ -1,147 +0,0 @@
ImGui
=====
[![Build Status](https://travis-ci.org/ocornut/imgui.svg?branch=master)](https://travis-ci.org/ocornut/imgui)
[![Coverity Status](https://scan.coverity.com/projects/4720/badge.svg)](https://scan.coverity.com/projects/4720)
[![Patreon](https://cloud.githubusercontent.com/assets/8225057/5990484/70413560-a9ab-11e4-8942-1a63607c0b00.png)](http://www.patreon.com/imgui) [![PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5Q73FPZ9C526U)
ImGui is a bloat-free graphical user interface library for C++. It outputs vertex buffers that you can render in your 3D-pipeline enabled application. It is portable, renderer agnostic and carries minimal amount of dependencies. It is based on an "immediate" graphical user interface paradigm which enables you to build user interfaces with ease.
ImGui is designed to enable fast iteration and allow programmers to create "content creation" or "debug" tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and thus lacks certain features normally found in more high-level libraries.
ImGui is particularly suited to integration in realtime 3D applications, fullscreen applications, embedded applications, games, or any applications on consoles platforms where operating system features are non-standard. pa
ImGui is self-contained within 6 files that you can easily copy and compile into your application/engine:
- imgui.cpp
- imgui.h
- imconfig.h (empty by default, user-editable)
- stb_rect_pack.h
- stb_textedit.h
- stb_truetype.h
Your code passes mouse/keyboard inputs and settings to ImGui (see example applications for more details). After ImGui is setup, you can use it like in this example:
![screenshot of sample code alongside its output with ImGui](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/code_sample_01.png)
ImGui outputs vertex buffers and simple command-lists that you can render in your application. Because it doesn't know or touch graphics state directly, you can call ImGui commands anywhere in your code (e.g. in the middle of a running algorithm, or in the middle of your own rendering process). Refer to the sample applications in the examples/ folder for instructions on how to integrate ImGui with your existing codebase.
ImGui allows you create elaborate tools as well as very short-lived ones. On the extreme side of short-liveness: using the Edit&Continue feature of compilers you can add a few widgets to tweaks variables while your application is running, and remove the code a minute later! ImGui is not just for tweaking values. You can use it to trace a running algorithm by just emitting text commands. You can use it along with your own reflection data to browse your dataset live. You can use it to expose the internals of a subsystem in your engine, to create a logger, an inspection tool, a profiler, a debugger, etc.
Demo
----
You should be able to build the examples from sources (tested on Windows/Mac/Linux). If you don't, let me know! If you want to have a quick look at the features of ImGui, you can download binaries of the demo app here.
- [imgui-demo-binaries-20150716.zip](http://www.miracleworld.net/imgui/binaries/imgui-demo-binaries-20150716.zip) (Windows binaries, ImGui 1.43 WIP 2015/07/16, 4 executables, 475 KB)
Gallery
-------
![screenshot 1](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v143/test_window_01.png)
![screenshot 2](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v143/test_window_02.png)
![screenshot 3](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v143/test_window_03.png)
![screenshot 5](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v140/test_window_05_menus.png)
![screenshot 4](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v143/skinning_sample_02.png)
![screenshot 6](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v143/examples_04.png)
![screenshot 7](https://cloud.githubusercontent.com/assets/8225057/7903336/96f0fb7c-07d0-11e5-95d6-41c6a1595e5a.png)
ImGui can load TTF fonts. UTF-8 is supported for text display and input. Here using Arial Unicode font to display Japanese. Initialize custom font with:
```
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
```
For Microsoft IME, pass your HWND to enable IME positioning:
```
io.ImeWindowHandle = my_hwnd;
```
![Japanese screenshot](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/code_sample_01.png)
References
----------
The Immediate Mode GUI paradigm may at first appear unusual to some users. This is mainly because "Retained Mode" GUIs have been so widespread and predominant. The following links can give you a better understanding about how Immediate Mode GUIs works.
- [Johannes 'johno' Norneby's article](http://www.johno.se/book/imgui.html).
- [A presentation by Rickard Gustafsson and Johannes Algelind](http://www.cse.chalmers.se/edu/year/2011/course/TDA361/Advanced%20Computer%20Graphics/IMGUI.pdf).
- [Jari Komppa's tutorial on building an ImGui library](http://iki.fi/sol/imgui/).
- [Casey Muratori's original video that popularized the concept](https://mollyrocket.com/861).
Frequently Asked Question
-------------------------
<b>Where is the documentation?</b>
- The documentation is at the top of imgui.cpp + effectively imgui.h.
- Example code is in the ImGui::ShowTestWindow() function. It covers most features of ImGui so you can read the code and call the function itself to see its output.
- Standalone example applications using OpenGL/DirectX are provided in the examples/ folder.
<b>How do you use ImGui on a platform that may not have a mouse or keyboard?</b>
I recommend using [Synergy](http://synergy-project.org) ([sources](https://github.com/synergy/synergy)). In particular, the _src/micro/uSynergy.c_ file contains a small client that you can use on any platform to connect to your host PC. You can seamlessly use your PC input devices from a video game console or a tablet. ImGui allows to increase the hit box of widgets (via the _TouchPadding_ setting) to accomodate a little for the lack of precision of touch inputs, but it is recommended you use a mouse to allow optimising for screen real-estate.
<b>I integrated ImGui in my engine and the text or lines are blurry..</b>
In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f).
<b>Can you create elaborate/serious tools with ImGui?</b>
Yes. I have written data browsers, debuggers, profilers and all sort of non-trivial tools with the library. In my experience the simplicity of the API is very empowering. Your UI runs close to your live data. Make the tools always-on and everybody in the team will be inclined to create new tools (as opposed to more "offline" UI toolkits where only a fraction of your team effectively creates tools).
However note that ImGui is programmer centric and the immediate-mode GUI paradigm might requires a bit of adaptation before you can realize its full potential. Many programmers have unfortunately been taught by their environment to make complicated unproductive things. Strip yourself out of all those heavy layers and start making lots of useful tools!
<b>Is ImGui fast?</b>
Down to the fundation of its visual design, ImGui is engineered to be fairly performant both in term of CPU and GPU usage. Running elaborate code and creating elaborate UI will of course have a cost but ImGui aims to minimize it.
Mileage may vary but the following screenshot can give you a rough idea of the cost of running and rendering UI code (In the case of a trivial demo application like this one, your driver/os setup are likely to be the bottleneck. Testing performance as part of a real application is recommended).
![performance screenshot](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v138/performance_01.png)
This is showing framerate for the full application loop on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M with an optimized executable. In contrast, librairies featuring higher-quality rendering and layouting techniques may have a higher resources footprint.
If you intend to display large lists of items (say, 1000+) it can be beneficial for your code to perform clipping manually - using helpers such as ImGuiListClipper - in order to avoid submitting them to ImGui in the first place. Even though ImGui will discard your clipped items it still needs to calculate their size and that overhead will add up if you have thousands of items. If you can handle clipping and height positionning yourself then browsing a list with millions of items isn't a problem.
<b>Can you reskin the look of ImGui?</b>
You can alter the look of the interface to some degree: changing colors, sizes, padding, rounding, fonts. However, as ImGui is designed and optimised to create debug tools, the amount of skinning you can apply is limited. There is only so much you can stray away from the default look and feel of the interface.
<b>Why using C++ (as opposed to C)?</b>
ImGui takes advantage of a few C++ features for convenience but nothing anywhere Boost-insanity/quagmire. In particular, function overloading and default parameters are used to make the API easier to use and code more terse. Doing so I believe the API is sitting on a sweet spot and giving up on those features would make the API more cumbersome. Other features such as namespace, constructors and templates (in the case of the ImVector<> class) are also relied on as a convenience but could be removed.
Shall someone really need to use ImGui from another language, there is an unofficial but reasonably maintained [c-api for ImGui](https://github.com/Extrawurst/cimgui) by Stephan Dilly. I would suggest using your target language functionality to try replicating the function overloading and default parameters used in C++ else the API may be harder to use. It was really designed with C++ in mind and may not make the same amount of sense with another language.
Donate
------
<b>Can I donate to support the development of ImGui?</b>
[![Patreon](https://cloud.githubusercontent.com/assets/8225057/5990484/70413560-a9ab-11e4-8942-1a63607c0b00.png)](http://www.patreon.com/imgui) [![PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5Q73FPZ9C526U)
I'm currently an independant developer and your contributions are very meaningful to me. I have setup an [**ImGui Patreon page**](http://www.patreon.com/imgui) if you want to donate and enable me to spend more time improving the library. If your company uses ImGui please consider making a contribution. One-off donations are also greatly appreciated (PayPal link above). I am also available for hire to work on or with ImGui. Thanks!
Credits
-------
Developed by [Omar Cornut](http://www.miracleworld.net) and every direct or indirect contributors to the GitHub. The early version of this library was developed with the support of [Media Molecule](http://www.mediamolecule.com) and first used internally on the game [Tearaway](http://tearaway.mediamolecule.com).
Embeds [ProggyClean.ttf](http://upperbounds.net) font by Tristan Grimmer (MIT license).
Embeds [stb_textedit.h, stb_truetype.h, stb_rectpack.h](https://github.com/nothings/stb/) by Sean Barrett (public domain).
Inspiration, feedback, and testing for early versions: Casey Muratori, Atman Binstock, Mikko Mononen, Emmanuel Briney, Stefan Kamoda, Anton Mikhailov, Matt Willis. And everybody posting feedback, questions and patches on the GitHub.
ImGui development is financially supported on [**Patreon**](http://www.patreon.com/imgui).
Special supporters:
- Jetha Chan, Wild Sheep Studio, Pastagames, Mārtiņš Možeiko, Daniel Collin, Stefano Cristiano.
And:
- Michel Courtine, César Leblic, Dale Kim, Alex Evans, Rui Figueira, Paul Patrashcu, Jerome Lanquetot, Ctrl Alt Ninja, Paul Fleming, Neil Henning, Stephan Dilly, Neil Blakey-Milner, Aleksei.
And other supporters; thanks!
License
-------
ImGui is licensed under the MIT License, see LICENSE for more information.

View File

@ -0,0 +1,471 @@
// dear imgui: Renderer + Platform Backend for Allegro 5
// (Info: Allegro 5 is a cross-platform general purpose library for handling windows, inputs, graphics, etc.)
// Implemented features:
// [X] Renderer: User texture binding. Use 'ALLEGRO_BITMAP*' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Platform: Clipboard support (from Allegro 5.1.12)
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// Issues:
// [ ] Renderer: The renderer is suboptimal as we need to unindex our buffers and convert vertices manually.
// [ ] Platform: Missing gamepad support.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-08-17: Calling io.AddFocusEvent() on ALLEGRO_EVENT_DISPLAY_SWITCH_OUT/ALLEGRO_EVENT_DISPLAY_SWITCH_IN events.
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-05-19: Renderer: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-02-18: Change blending equation to preserve alpha in output buffer.
// 2020-08-10: Inputs: Fixed horizontal mouse wheel direction.
// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor.
// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter.
// 2019-05-11: Inputs: Don't filter character value from ALLEGRO_EVENT_KEY_CHAR before calling AddInputCharacter().
// 2019-04-30: Renderer: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2018-11-30: Platform: Added touchscreen support.
// 2018-11-30: Misc: Setting up io.BackendPlatformName/io.BackendRendererName so they can be displayed in the About Window.
// 2018-06-13: Platform: Added clipboard support (from Allegro 5.1.12).
// 2018-06-13: Renderer: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-06-13: Renderer: Backup/restore transform and clipping rectangle.
// 2018-06-11: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag.
// 2018-04-18: Misc: Renamed file from imgui_impl_a5.cpp to imgui_impl_allegro5.cpp.
// 2018-04-18: Misc: Added support for 32-bit vertex indices to avoid conversion at runtime. Added imconfig_allegro5.h to enforce 32-bit indices when included from imgui.h.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplAllegro5_RenderDrawData() in the .h file so you can call it yourself.
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
#include <stdint.h> // uint64_t
#include <cstring> // memcpy
#include "imgui.h"
#include "imgui_impl_allegro5.h"
// Allegro
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#ifdef _WIN32
#include <allegro5/allegro_windows.h>
#endif
#define ALLEGRO_HAS_CLIPBOARD (ALLEGRO_VERSION_INT >= ((5 << 24) | (1 << 16) | (12 << 8))) // Clipboard only supported from Allegro 5.1.12
// Visual Studio warnings
#ifdef _MSC_VER
#pragma warning (disable: 4127) // condition expression is constant
#endif
// Allegro Data
struct ImGui_ImplAllegro5_Data
{
ALLEGRO_DISPLAY* Display;
ALLEGRO_BITMAP* Texture;
double Time;
ALLEGRO_MOUSE_CURSOR* MouseCursorInvisible;
ALLEGRO_VERTEX_DECL* VertexDecl;
char* ClipboardTextData;
ImGui_ImplAllegro5_Data() { memset(this, 0, sizeof(*this)); }
};
// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
static ImGui_ImplAllegro5_Data* ImGui_ImplAllegro5_GetBackendData() { return ImGui::GetCurrentContext() ? (ImGui_ImplAllegro5_Data*)ImGui::GetIO().BackendPlatformUserData : NULL; }
struct ImDrawVertAllegro
{
ImVec2 pos;
ImVec2 uv;
ALLEGRO_COLOR col;
};
static void ImGui_ImplAllegro5_SetupRenderState(ImDrawData* draw_data)
{
// Setup blending
al_set_separate_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA, ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA);
// Setup orthographic projection matrix
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
{
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
ALLEGRO_TRANSFORM transform;
al_identity_transform(&transform);
al_use_transform(&transform);
al_orthographic_transform(&transform, L, T, 1.0f, R, B, -1.0f);
al_use_projection_transform(&transform);
}
}
// Render function.
void ImGui_ImplAllegro5_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
// Backup Allegro state that will be modified
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
ALLEGRO_TRANSFORM last_transform = *al_get_current_transform();
ALLEGRO_TRANSFORM last_projection_transform = *al_get_current_projection_transform();
int last_clip_x, last_clip_y, last_clip_w, last_clip_h;
al_get_clipping_rectangle(&last_clip_x, &last_clip_y, &last_clip_w, &last_clip_h);
int last_blender_op, last_blender_src, last_blender_dst;
al_get_blender(&last_blender_op, &last_blender_src, &last_blender_dst);
// Setup desired render state
ImGui_ImplAllegro5_SetupRenderState(draw_data);
// Render command lists
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
// Allegro's implementation of al_draw_indexed_prim() for DX9 is completely broken. Unindex our buffers ourselves.
// FIXME-OPT: Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 float as well..
static ImVector<ImDrawVertAllegro> vertices;
vertices.resize(cmd_list->IdxBuffer.Size);
for (int i = 0; i < cmd_list->IdxBuffer.Size; i++)
{
const ImDrawVert* src_v = &cmd_list->VtxBuffer[cmd_list->IdxBuffer[i]];
ImDrawVertAllegro* dst_v = &vertices[i];
dst_v->pos = src_v->pos;
dst_v->uv = src_v->uv;
unsigned char* c = (unsigned char*)&src_v->col;
dst_v->col = al_map_rgba(c[0], c[1], c[2], c[3]);
}
const int* indices = NULL;
if (sizeof(ImDrawIdx) == 2)
{
// FIXME-OPT: Unfortunately Allegro doesn't support 16-bit indices.. You can '#define ImDrawIdx int' in imconfig.h to request Dear ImGui to output 32-bit indices.
// Otherwise, we convert them from 16-bit to 32-bit at runtime here, which works perfectly but is a little wasteful.
static ImVector<int> indices_converted;
indices_converted.resize(cmd_list->IdxBuffer.Size);
for (int i = 0; i < cmd_list->IdxBuffer.Size; ++i)
indices_converted[i] = (int)cmd_list->IdxBuffer.Data[i];
indices = indices_converted.Data;
}
else if (sizeof(ImDrawIdx) == 4)
{
indices = (const int*)cmd_list->IdxBuffer.Data;
}
// Render command lists
int idx_offset = 0;
ImVec2 clip_off = draw_data->DisplayPos;
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplAllegro5_SetupRenderState(draw_data);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Draw
ALLEGRO_BITMAP* texture = (ALLEGRO_BITMAP*)pcmd->GetTexID();
al_set_clipping_rectangle(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y, pcmd->ClipRect.z - pcmd->ClipRect.x, pcmd->ClipRect.w - pcmd->ClipRect.y);
al_draw_prim(&vertices[0], bd->VertexDecl, texture, idx_offset, idx_offset + pcmd->ElemCount, ALLEGRO_PRIM_TRIANGLE_LIST);
}
idx_offset += pcmd->ElemCount;
}
}
// Restore modified Allegro state
al_set_blender(last_blender_op, last_blender_src, last_blender_dst);
al_set_clipping_rectangle(last_clip_x, last_clip_y, last_clip_w, last_clip_h);
al_use_transform(&last_transform);
al_use_projection_transform(&last_projection_transform);
}
bool ImGui_ImplAllegro5_CreateDeviceObjects()
{
// Build texture atlas
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
ImGuiIO& io = ImGui::GetIO();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Create texture
int flags = al_get_new_bitmap_flags();
int fmt = al_get_new_bitmap_format();
al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP | ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR);
al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE);
ALLEGRO_BITMAP* img = al_create_bitmap(width, height);
al_set_new_bitmap_flags(flags);
al_set_new_bitmap_format(fmt);
if (!img)
return false;
ALLEGRO_LOCKED_REGION* locked_img = al_lock_bitmap(img, al_get_bitmap_format(img), ALLEGRO_LOCK_WRITEONLY);
if (!locked_img)
{
al_destroy_bitmap(img);
return false;
}
memcpy(locked_img->data, pixels, sizeof(int) * width * height);
al_unlock_bitmap(img);
// Convert software texture to hardware texture.
ALLEGRO_BITMAP* cloned_img = al_clone_bitmap(img);
al_destroy_bitmap(img);
if (!cloned_img)
return false;
// Store our identifier
io.Fonts->SetTexID((void*)cloned_img);
bd->Texture = cloned_img;
// Create an invisible mouse cursor
// Because al_hide_mouse_cursor() seems to mess up with the actual inputs..
ALLEGRO_BITMAP* mouse_cursor = al_create_bitmap(8, 8);
bd->MouseCursorInvisible = al_create_mouse_cursor(mouse_cursor, 0, 0);
al_destroy_bitmap(mouse_cursor);
return true;
}
void ImGui_ImplAllegro5_InvalidateDeviceObjects()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
if (bd->Texture)
{
io.Fonts->SetTexID(NULL);
al_destroy_bitmap(bd->Texture);
bd->Texture = NULL;
}
if (bd->MouseCursorInvisible)
{
al_destroy_mouse_cursor(bd->MouseCursorInvisible);
bd->MouseCursorInvisible = NULL;
}
}
#if ALLEGRO_HAS_CLIPBOARD
static const char* ImGui_ImplAllegro5_GetClipboardText(void*)
{
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
if (bd->ClipboardTextData)
al_free(bd->ClipboardTextData);
bd->ClipboardTextData = al_get_clipboard_text(bd->Display);
return bd->ClipboardTextData;
}
static void ImGui_ImplAllegro5_SetClipboardText(void*, const char* text)
{
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
al_set_clipboard_text(bd->Display, text);
}
#endif
bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!");
// Setup backend capabilities flags
ImGui_ImplAllegro5_Data* bd = IM_NEW(ImGui_ImplAllegro5_Data)();
io.BackendPlatformUserData = (void*)bd;
io.BackendPlatformName = io.BackendRendererName = "imgui_impl_allegro5";
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
bd->Display = display;
// Create custom vertex declaration.
// Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 floats.
// We still use a custom declaration to use 'ALLEGRO_PRIM_TEX_COORD' instead of 'ALLEGRO_PRIM_TEX_COORD_PIXEL' else we can't do a reliable conversion.
ALLEGRO_VERTEX_ELEMENT elems[] =
{
{ ALLEGRO_PRIM_POSITION, ALLEGRO_PRIM_FLOAT_2, IM_OFFSETOF(ImDrawVertAllegro, pos) },
{ ALLEGRO_PRIM_TEX_COORD, ALLEGRO_PRIM_FLOAT_2, IM_OFFSETOF(ImDrawVertAllegro, uv) },
{ ALLEGRO_PRIM_COLOR_ATTR, 0, IM_OFFSETOF(ImDrawVertAllegro, col) },
{ 0, 0, 0 }
};
bd->VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro));
io.KeyMap[ImGuiKey_Tab] = ALLEGRO_KEY_TAB;
io.KeyMap[ImGuiKey_LeftArrow] = ALLEGRO_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = ALLEGRO_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = ALLEGRO_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = ALLEGRO_KEY_DOWN;
io.KeyMap[ImGuiKey_PageUp] = ALLEGRO_KEY_PGUP;
io.KeyMap[ImGuiKey_PageDown] = ALLEGRO_KEY_PGDN;
io.KeyMap[ImGuiKey_Home] = ALLEGRO_KEY_HOME;
io.KeyMap[ImGuiKey_End] = ALLEGRO_KEY_END;
io.KeyMap[ImGuiKey_Insert] = ALLEGRO_KEY_INSERT;
io.KeyMap[ImGuiKey_Delete] = ALLEGRO_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = ALLEGRO_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Space] = ALLEGRO_KEY_SPACE;
io.KeyMap[ImGuiKey_Enter] = ALLEGRO_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = ALLEGRO_KEY_ESCAPE;
io.KeyMap[ImGuiKey_KeyPadEnter] = ALLEGRO_KEY_PAD_ENTER;
io.KeyMap[ImGuiKey_A] = ALLEGRO_KEY_A;
io.KeyMap[ImGuiKey_C] = ALLEGRO_KEY_C;
io.KeyMap[ImGuiKey_V] = ALLEGRO_KEY_V;
io.KeyMap[ImGuiKey_X] = ALLEGRO_KEY_X;
io.KeyMap[ImGuiKey_Y] = ALLEGRO_KEY_Y;
io.KeyMap[ImGuiKey_Z] = ALLEGRO_KEY_Z;
io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
#if ALLEGRO_HAS_CLIPBOARD
io.SetClipboardTextFn = ImGui_ImplAllegro5_SetClipboardText;
io.GetClipboardTextFn = ImGui_ImplAllegro5_GetClipboardText;
io.ClipboardUserData = NULL;
#endif
return true;
}
void ImGui_ImplAllegro5_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
ImGui_ImplAllegro5_InvalidateDeviceObjects();
if (bd->VertexDecl)
al_destroy_vertex_decl(bd->VertexDecl);
if (bd->ClipboardTextData)
al_free(bd->ClipboardTextData);
io.BackendPlatformUserData = NULL;
io.BackendPlatformName = io.BackendRendererName = NULL;
IM_DELETE(bd);
}
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT* ev)
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
switch (ev->type)
{
case ALLEGRO_EVENT_MOUSE_AXES:
if (ev->mouse.display == bd->Display)
{
io.MouseWheel += ev->mouse.dz;
io.MouseWheelH -= ev->mouse.dw;
io.MousePos = ImVec2(ev->mouse.x, ev->mouse.y);
}
return true;
case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN:
case ALLEGRO_EVENT_MOUSE_BUTTON_UP:
if (ev->mouse.display == bd->Display && ev->mouse.button <= 5)
io.MouseDown[ev->mouse.button - 1] = (ev->type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN);
return true;
case ALLEGRO_EVENT_TOUCH_MOVE:
if (ev->touch.display == bd->Display)
io.MousePos = ImVec2(ev->touch.x, ev->touch.y);
return true;
case ALLEGRO_EVENT_TOUCH_BEGIN:
case ALLEGRO_EVENT_TOUCH_END:
case ALLEGRO_EVENT_TOUCH_CANCEL:
if (ev->touch.display == bd->Display && ev->touch.primary)
io.MouseDown[0] = (ev->type == ALLEGRO_EVENT_TOUCH_BEGIN);
return true;
case ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY:
if (ev->mouse.display == bd->Display)
io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
return true;
case ALLEGRO_EVENT_KEY_CHAR:
if (ev->keyboard.display == bd->Display)
if (ev->keyboard.unichar != 0)
io.AddInputCharacter((unsigned int)ev->keyboard.unichar);
return true;
case ALLEGRO_EVENT_KEY_DOWN:
case ALLEGRO_EVENT_KEY_UP:
if (ev->keyboard.display == bd->Display)
io.KeysDown[ev->keyboard.keycode] = (ev->type == ALLEGRO_EVENT_KEY_DOWN);
return true;
case ALLEGRO_EVENT_DISPLAY_SWITCH_OUT:
if (ev->display.source == bd->Display)
io.AddFocusEvent(false);
return true;
case ALLEGRO_EVENT_DISPLAY_SWITCH_IN:
if (ev->display.source == bd->Display)
{
io.AddFocusEvent(true);
#if defined(ALLEGRO_UNSTABLE)
al_clear_keyboard_state(bd->Display);
#endif
}
return true;
}
return false;
}
static void ImGui_ImplAllegro5_UpdateMouseCursor()
{
ImGuiIO& io = ImGui::GetIO();
if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
return;
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None)
{
// Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
al_set_mouse_cursor(bd->Display, bd->MouseCursorInvisible);
}
else
{
ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT;
switch (imgui_cursor)
{
case ImGuiMouseCursor_TextInput: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT; break;
case ImGuiMouseCursor_ResizeAll: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE; break;
case ImGuiMouseCursor_ResizeNS: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N; break;
case ImGuiMouseCursor_ResizeEW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E; break;
case ImGuiMouseCursor_ResizeNESW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE; break;
case ImGuiMouseCursor_ResizeNWSE: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW; break;
case ImGuiMouseCursor_NotAllowed: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_UNAVAILABLE; break;
}
al_set_system_mouse_cursor(bd->Display, cursor_id);
}
}
void ImGui_ImplAllegro5_NewFrame()
{
ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplAllegro5_Init()?");
if (!bd->Texture)
ImGui_ImplAllegro5_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w, h;
w = al_get_display_width(bd->Display);
h = al_get_display_height(bd->Display);
io.DisplaySize = ImVec2((float)w, (float)h);
// Setup time step
double current_time = al_get_time();
io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f);
bd->Time = current_time;
// Setup inputs
ALLEGRO_KEYBOARD_STATE keys;
al_get_keyboard_state(&keys);
io.KeyCtrl = al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL);
io.KeyShift = al_key_down(&keys, ALLEGRO_KEY_LSHIFT) || al_key_down(&keys, ALLEGRO_KEY_RSHIFT);
io.KeyAlt = al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR);
io.KeySuper = al_key_down(&keys, ALLEGRO_KEY_LWIN) || al_key_down(&keys, ALLEGRO_KEY_RWIN);
ImGui_ImplAllegro5_UpdateMouseCursor();
}

View File

@ -0,0 +1,31 @@
// dear imgui: Renderer + Platform Backend for Allegro 5
// (Info: Allegro 5 is a cross-platform general purpose library for handling windows, inputs, graphics, etc.)
// Implemented features:
// [X] Renderer: User texture binding. Use 'ALLEGRO_BITMAP*' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Platform: Clipboard support (from Allegro 5.1.12)
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// Issues:
// [ ] Renderer: The renderer is suboptimal as we need to unindex our buffers and convert vertices manually.
// [ ] Platform: Missing gamepad support.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
struct ALLEGRO_DISPLAY;
union ALLEGRO_EVENT;
IMGUI_IMPL_API bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display);
IMGUI_IMPL_API void ImGui_ImplAllegro5_Shutdown();
IMGUI_IMPL_API void ImGui_ImplAllegro5_NewFrame();
IMGUI_IMPL_API void ImGui_ImplAllegro5_RenderDrawData(ImDrawData* draw_data);
IMGUI_IMPL_API bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT* event);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API bool ImGui_ImplAllegro5_CreateDeviceObjects();
IMGUI_IMPL_API void ImGui_ImplAllegro5_InvalidateDeviceObjects();

View File

@ -0,0 +1,187 @@
// dear imgui: Platform Binding for Android native app
// This needs to be used along with the OpenGL 3 Renderer (imgui_impl_opengl3)
// Implemented features:
// [X] Platform: Keyboard arrays indexed using AKEYCODE_* codes, e.g. ImGui::IsKeyPressed(AKEYCODE_SPACE).
// Missing features:
// [ ] Platform: Clipboard support.
// [ ] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// [ ] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. FIXME: Check if this is even possible with Android.
// Important:
// - FIXME: On-screen keyboard currently needs to be enabled by the application (see examples/ and issue #3446)
// - FIXME: Unicode character inputs needs to be passed by Dear ImGui by the application (see examples/ and issue #3446)
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-03-04: Initial version.
#include "imgui.h"
#include "imgui_impl_android.h"
#include <time.h>
#include <map>
#include <queue>
#include <android/native_window.h>
#include <android/input.h>
#include <android/keycodes.h>
#include <android/log.h>
// Android data
static double g_Time = 0.0;
static ANativeWindow* g_Window;
static char g_LogTag[] = "ImGuiExample";
static std::map<int32_t, std::queue<int32_t>> g_KeyEventQueues; // FIXME: Remove dependency on map and queue once we use upcoming input queue.
int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event)
{
ImGuiIO& io = ImGui::GetIO();
int32_t event_type = AInputEvent_getType(input_event);
switch (event_type)
{
case AINPUT_EVENT_TYPE_KEY:
{
int32_t event_key_code = AKeyEvent_getKeyCode(input_event);
int32_t event_action = AKeyEvent_getAction(input_event);
int32_t event_meta_state = AKeyEvent_getMetaState(input_event);
io.KeyCtrl = ((event_meta_state & AMETA_CTRL_ON) != 0);
io.KeyShift = ((event_meta_state & AMETA_SHIFT_ON) != 0);
io.KeyAlt = ((event_meta_state & AMETA_ALT_ON) != 0);
switch (event_action)
{
// FIXME: AKEY_EVENT_ACTION_DOWN and AKEY_EVENT_ACTION_UP occur at once as soon as a touch pointer
// goes up from a key. We use a simple key event queue/ and process one event per key per frame in
// ImGui_ImplAndroid_NewFrame()...or consider using IO queue, if suitable: https://github.com/ocornut/imgui/issues/2787
case AKEY_EVENT_ACTION_DOWN:
case AKEY_EVENT_ACTION_UP:
g_KeyEventQueues[event_key_code].push(event_action);
break;
default:
break;
}
break;
}
case AINPUT_EVENT_TYPE_MOTION:
{
int32_t event_action = AMotionEvent_getAction(input_event);
int32_t event_pointer_index = (event_action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
event_action &= AMOTION_EVENT_ACTION_MASK;
switch (event_action)
{
case AMOTION_EVENT_ACTION_DOWN:
case AMOTION_EVENT_ACTION_UP:
// Physical mouse buttons (and probably other physical devices) also invoke the actions AMOTION_EVENT_ACTION_DOWN/_UP,
// but we have to process them separately to identify the actual button pressed. This is done below via
// AMOTION_EVENT_ACTION_BUTTON_PRESS/_RELEASE. Here, we only process "FINGER" input (and "UNKNOWN", as a fallback).
if((AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_FINGER)
|| (AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_UNKNOWN))
{
io.MouseDown[0] = (event_action == AMOTION_EVENT_ACTION_DOWN);
io.MousePos = ImVec2(AMotionEvent_getX(input_event, event_pointer_index), AMotionEvent_getY(input_event, event_pointer_index));
}
break;
case AMOTION_EVENT_ACTION_BUTTON_PRESS:
case AMOTION_EVENT_ACTION_BUTTON_RELEASE:
{
int32_t button_state = AMotionEvent_getButtonState(input_event);
io.MouseDown[0] = ((button_state & AMOTION_EVENT_BUTTON_PRIMARY) != 0);
io.MouseDown[1] = ((button_state & AMOTION_EVENT_BUTTON_SECONDARY) != 0);
io.MouseDown[2] = ((button_state & AMOTION_EVENT_BUTTON_TERTIARY) != 0);
}
break;
case AMOTION_EVENT_ACTION_HOVER_MOVE: // Hovering: Tool moves while NOT pressed (such as a physical mouse)
case AMOTION_EVENT_ACTION_MOVE: // Touch pointer moves while DOWN
io.MousePos = ImVec2(AMotionEvent_getX(input_event, event_pointer_index), AMotionEvent_getY(input_event, event_pointer_index));
break;
case AMOTION_EVENT_ACTION_SCROLL:
io.MouseWheel = AMotionEvent_getAxisValue(input_event, AMOTION_EVENT_AXIS_VSCROLL, event_pointer_index);
io.MouseWheelH = AMotionEvent_getAxisValue(input_event, AMOTION_EVENT_AXIS_HSCROLL, event_pointer_index);
break;
default:
break;
}
}
return 1;
default:
break;
}
return 0;
}
bool ImGui_ImplAndroid_Init(ANativeWindow* window)
{
g_Window = window;
g_Time = 0.0;
// Setup backend capabilities flags
ImGuiIO& io = ImGui::GetIO();
io.BackendPlatformName = "imgui_impl_android";
// Keyboard mapping. Dear ImGui will use those indices to peek into the io.KeysDown[] array.
io.KeyMap[ImGuiKey_Tab] = AKEYCODE_TAB;
io.KeyMap[ImGuiKey_LeftArrow] = AKEYCODE_DPAD_LEFT; // also covers physical keyboard arrow key
io.KeyMap[ImGuiKey_RightArrow] = AKEYCODE_DPAD_RIGHT; // also covers physical keyboard arrow key
io.KeyMap[ImGuiKey_UpArrow] = AKEYCODE_DPAD_UP; // also covers physical keyboard arrow key
io.KeyMap[ImGuiKey_DownArrow] = AKEYCODE_DPAD_DOWN; // also covers physical keyboard arrow key
io.KeyMap[ImGuiKey_PageUp] = AKEYCODE_PAGE_UP;
io.KeyMap[ImGuiKey_PageDown] = AKEYCODE_PAGE_DOWN;
io.KeyMap[ImGuiKey_Home] = AKEYCODE_MOVE_HOME;
io.KeyMap[ImGuiKey_End] = AKEYCODE_MOVE_END;
io.KeyMap[ImGuiKey_Insert] = AKEYCODE_INSERT;
io.KeyMap[ImGuiKey_Delete] = AKEYCODE_FORWARD_DEL;
io.KeyMap[ImGuiKey_Backspace] = AKEYCODE_DEL;
io.KeyMap[ImGuiKey_Space] = AKEYCODE_SPACE;
io.KeyMap[ImGuiKey_Enter] = AKEYCODE_ENTER;
io.KeyMap[ImGuiKey_Escape] = AKEYCODE_ESCAPE;
io.KeyMap[ImGuiKey_KeyPadEnter] = AKEYCODE_NUMPAD_ENTER;
io.KeyMap[ImGuiKey_A] = AKEYCODE_A;
io.KeyMap[ImGuiKey_C] = AKEYCODE_C;
io.KeyMap[ImGuiKey_V] = AKEYCODE_V;
io.KeyMap[ImGuiKey_X] = AKEYCODE_X;
io.KeyMap[ImGuiKey_Y] = AKEYCODE_Y;
io.KeyMap[ImGuiKey_Z] = AKEYCODE_Z;
return true;
}
void ImGui_ImplAndroid_Shutdown()
{
}
void ImGui_ImplAndroid_NewFrame()
{
ImGuiIO& io = ImGui::GetIO();
// Process queued key events
// FIXME: This is a workaround for multiple key event actions occurring at once (see above) and can be removed once we use upcoming input queue.
for (auto& key_queue : g_KeyEventQueues)
{
if (key_queue.second.empty())
continue;
io.KeysDown[key_queue.first] = (key_queue.second.front() == AKEY_EVENT_ACTION_DOWN);
key_queue.second.pop();
}
// Setup display size (every frame to accommodate for window resizing)
int32_t window_width = ANativeWindow_getWidth(g_Window);
int32_t window_height = ANativeWindow_getHeight(g_Window);
int display_width = window_width;
int display_height = window_height;
io.DisplaySize = ImVec2((float)window_width, (float)window_height);
if (window_width > 0 && window_height > 0)
io.DisplayFramebufferScale = ImVec2((float)display_width / window_width, (float)display_height / window_height);
// Setup time step
struct timespec current_timespec;
clock_gettime(CLOCK_MONOTONIC, &current_timespec);
double current_time = (double)(current_timespec.tv_sec) + (current_timespec.tv_nsec / 1000000000.0);
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f);
g_Time = current_time;
}

View File

@ -0,0 +1,27 @@
// dear imgui: Platform Binding for Android native app
// This needs to be used along with the OpenGL 3 Renderer (imgui_impl_opengl3)
// Implemented features:
// [X] Platform: Keyboard arrays indexed using AKEYCODE_* codes, e.g. ImGui::IsKeyPressed(AKEYCODE_SPACE).
// Missing features:
// [ ] Platform: Clipboard support.
// [ ] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// [ ] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. FIXME: Check if this is even possible with Android.
// Important:
// - FIXME: On-screen keyboard currently needs to be enabled by the application (see examples/ and issue #3446)
// - FIXME: Unicode character inputs needs to be passed by Dear ImGui by the application (see examples/ and issue #3446)
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
struct ANativeWindow;
struct AInputEvent;
IMGUI_IMPL_API bool ImGui_ImplAndroid_Init(ANativeWindow* window);
IMGUI_IMPL_API int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event);
IMGUI_IMPL_API void ImGui_ImplAndroid_Shutdown();
IMGUI_IMPL_API void ImGui_ImplAndroid_NewFrame();

View File

@ -0,0 +1,571 @@
// dear imgui: Renderer Backend for DirectX10
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture backend. Use 'ID3D10ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-05-19: DirectX10: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-02-18: DirectX10: Change blending equation to preserve alpha in output buffer.
// 2019-07-21: DirectX10: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX10_RenderDrawData().
// 2019-05-29: DirectX10: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: DirectX10: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile().
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-07-13: DirectX10: Fixed unreleased resources in Init and Shutdown functions.
// 2018-06-08: Misc: Extracted imgui_impl_dx10.cpp/.h away from the old combined DX10+Win32 example.
// 2018-06-08: DirectX10: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-04-09: Misc: Fixed erroneous call to io.Fonts->ClearInputData() + ClearTexData() that was left in DX10 example but removed in 1.47 (Nov 2015) on other backends.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX10_RenderDrawData() in the .h file so you can call it yourself.
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2016-05-07: DirectX10: Disabling depth-write.
#include "imgui.h"
#include "imgui_impl_dx10.h"
// DirectX
#include <stdio.h>
#include <d3d10_1.h>
#include <d3d10.h>
#include <d3dcompiler.h>
#ifdef _MSC_VER
#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
#endif
// DirectX data
struct ImGui_ImplDX10_Data
{
ID3D10Device* pd3dDevice;
IDXGIFactory* pFactory;
ID3D10Buffer* pVB;
ID3D10Buffer* pIB;
ID3D10VertexShader* pVertexShader;
ID3D10InputLayout* pInputLayout;
ID3D10Buffer* pVertexConstantBuffer;
ID3D10PixelShader* pPixelShader;
ID3D10SamplerState* pFontSampler;
ID3D10ShaderResourceView* pFontTextureView;
ID3D10RasterizerState* pRasterizerState;
ID3D10BlendState* pBlendState;
ID3D10DepthStencilState* pDepthStencilState;
int VertexBufferSize;
int IndexBufferSize;
ImGui_ImplDX10_Data() { memset(this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; }
};
struct VERTEX_CONSTANT_BUFFER
{
float mvp[4][4];
};
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
static ImGui_ImplDX10_Data* ImGui_ImplDX10_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplDX10_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
}
// Functions
static void ImGui_ImplDX10_SetupRenderState(ImDrawData* draw_data, ID3D10Device* ctx)
{
ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
// Setup viewport
D3D10_VIEWPORT vp;
memset(&vp, 0, sizeof(D3D10_VIEWPORT));
vp.Width = (UINT)draw_data->DisplaySize.x;
vp.Height = (UINT)draw_data->DisplaySize.y;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = vp.TopLeftY = 0;
ctx->RSSetViewports(1, &vp);
// Bind shader and vertex buffers
unsigned int stride = sizeof(ImDrawVert);
unsigned int offset = 0;
ctx->IASetInputLayout(bd->pInputLayout);
ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset);
ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
ctx->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
ctx->VSSetShader(bd->pVertexShader);
ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer);
ctx->PSSetShader(bd->pPixelShader);
ctx->PSSetSamplers(0, 1, &bd->pFontSampler);
ctx->GSSetShader(NULL);
// Setup render state
const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff);
ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0);
ctx->RSSetState(bd->pRasterizerState);
}
// Render function
void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
ID3D10Device* ctx = bd->pd3dDevice;
// Create and grow vertex/index buffers if needed
if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount)
{
if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
bd->VertexBufferSize = draw_data->TotalVtxCount + 5000;
D3D10_BUFFER_DESC desc;
memset(&desc, 0, sizeof(D3D10_BUFFER_DESC));
desc.Usage = D3D10_USAGE_DYNAMIC;
desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert);
desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
if (ctx->CreateBuffer(&desc, NULL, &bd->pVB) < 0)
return;
}
if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount)
{
if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
bd->IndexBufferSize = draw_data->TotalIdxCount + 10000;
D3D10_BUFFER_DESC desc;
memset(&desc, 0, sizeof(D3D10_BUFFER_DESC));
desc.Usage = D3D10_USAGE_DYNAMIC;
desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx);
desc.BindFlags = D3D10_BIND_INDEX_BUFFER;
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
if (ctx->CreateBuffer(&desc, NULL, &bd->pIB) < 0)
return;
}
// Copy and convert all vertices into a single contiguous buffer
ImDrawVert* vtx_dst = NULL;
ImDrawIdx* idx_dst = NULL;
bd->pVB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&vtx_dst);
bd->pIB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&idx_dst);
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
vtx_dst += cmd_list->VtxBuffer.Size;
idx_dst += cmd_list->IdxBuffer.Size;
}
bd->pVB->Unmap();
bd->pIB->Unmap();
// Setup orthographic projection matrix into our constant buffer
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
{
void* mapped_resource;
if (bd->pVertexConstantBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)
return;
VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource;
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
float mvp[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.5f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
};
memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
bd->pVertexConstantBuffer->Unmap();
}
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
struct BACKUP_DX10_STATE
{
UINT ScissorRectsCount, ViewportsCount;
D3D10_RECT ScissorRects[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
D3D10_VIEWPORT Viewports[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
ID3D10RasterizerState* RS;
ID3D10BlendState* BlendState;
FLOAT BlendFactor[4];
UINT SampleMask;
UINT StencilRef;
ID3D10DepthStencilState* DepthStencilState;
ID3D10ShaderResourceView* PSShaderResource;
ID3D10SamplerState* PSSampler;
ID3D10PixelShader* PS;
ID3D10VertexShader* VS;
ID3D10GeometryShader* GS;
D3D10_PRIMITIVE_TOPOLOGY PrimitiveTopology;
ID3D10Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer;
UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset;
DXGI_FORMAT IndexBufferFormat;
ID3D10InputLayout* InputLayout;
};
BACKUP_DX10_STATE old = {};
old.ScissorRectsCount = old.ViewportsCount = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);
ctx->RSGetViewports(&old.ViewportsCount, old.Viewports);
ctx->RSGetState(&old.RS);
ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);
ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef);
ctx->PSGetShaderResources(0, 1, &old.PSShaderResource);
ctx->PSGetSamplers(0, 1, &old.PSSampler);
ctx->PSGetShader(&old.PS);
ctx->VSGetShader(&old.VS);
ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);
ctx->GSGetShader(&old.GS);
ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology);
ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);
ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);
ctx->IAGetInputLayout(&old.InputLayout);
// Setup desired DX state
ImGui_ImplDX10_SetupRenderState(draw_data, ctx);
// Render command lists
// (Because we merged all buffers into a single one, we maintain our own offset into them)
int global_vtx_offset = 0;
int global_idx_offset = 0;
ImVec2 clip_off = draw_data->DisplayPos;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplDX10_SetupRenderState(draw_data, ctx);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Apply scissor/clipping rectangle
const D3D10_RECT r = { (LONG)(pcmd->ClipRect.x - clip_off.x), (LONG)(pcmd->ClipRect.y - clip_off.y), (LONG)(pcmd->ClipRect.z - clip_off.x), (LONG)(pcmd->ClipRect.w - clip_off.y)};
ctx->RSSetScissorRects(1, &r);
// Bind texture, Draw
ID3D10ShaderResourceView* texture_srv = (ID3D10ShaderResourceView*)pcmd->GetTexID();
ctx->PSSetShaderResources(0, 1, &texture_srv);
ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset);
}
}
global_idx_offset += cmd_list->IdxBuffer.Size;
global_vtx_offset += cmd_list->VtxBuffer.Size;
}
// Restore modified DX state
ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
ctx->RSSetViewports(old.ViewportsCount, old.Viewports);
ctx->RSSetState(old.RS); if (old.RS) old.RS->Release();
ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();
ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release();
ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();
ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();
ctx->PSSetShader(old.PS); if (old.PS) old.PS->Release();
ctx->VSSetShader(old.VS); if (old.VS) old.VS->Release();
ctx->GSSetShader(old.GS); if (old.GS) old.GS->Release();
ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();
ctx->IASetPrimitiveTopology(old.PrimitiveTopology);
ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();
ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();
ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();
}
static void ImGui_ImplDX10_CreateFontsTexture()
{
// Build texture atlas
ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
ImGuiIO& io = ImGui::GetIO();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Upload texture to graphics system
{
D3D10_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = width;
desc.Height = height;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D10_USAGE_DEFAULT;
desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
ID3D10Texture2D* pTexture = NULL;
D3D10_SUBRESOURCE_DATA subResource;
subResource.pSysMem = pixels;
subResource.SysMemPitch = desc.Width * 4;
subResource.SysMemSlicePitch = 0;
bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture);
IM_ASSERT(pTexture != NULL);
// Create texture view
D3D10_SHADER_RESOURCE_VIEW_DESC srv_desc;
ZeroMemory(&srv_desc, sizeof(srv_desc));
srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srv_desc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
srv_desc.Texture2D.MipLevels = desc.MipLevels;
srv_desc.Texture2D.MostDetailedMip = 0;
bd->pd3dDevice->CreateShaderResourceView(pTexture, &srv_desc, &bd->pFontTextureView);
pTexture->Release();
}
// Store our identifier
io.Fonts->SetTexID((ImTextureID)bd->pFontTextureView);
// Create texture sampler
{
D3D10_SAMPLER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR;
desc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP;
desc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP;
desc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP;
desc.MipLODBias = 0.f;
desc.ComparisonFunc = D3D10_COMPARISON_ALWAYS;
desc.MinLOD = 0.f;
desc.MaxLOD = 0.f;
bd->pd3dDevice->CreateSamplerState(&desc, &bd->pFontSampler);
}
}
bool ImGui_ImplDX10_CreateDeviceObjects()
{
ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
if (!bd->pd3dDevice)
return false;
if (bd->pFontSampler)
ImGui_ImplDX10_InvalidateDeviceObjects();
// By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)
// If you would like to use this DX10 sample code but remove this dependency you can:
// 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]
// 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
// See https://github.com/ocornut/imgui/pull/638 for sources and details.
// Create the vertex shader
{
static const char* vertexShader =
"cbuffer vertexBuffer : register(b0) \
{\
float4x4 ProjectionMatrix; \
};\
struct VS_INPUT\
{\
float2 pos : POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
PS_INPUT main(VS_INPUT input)\
{\
PS_INPUT output;\
output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
output.col = input.col;\
output.uv = input.uv;\
return output;\
}";
ID3DBlob* vertexShaderBlob;
if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_4_0", 0, 0, &vertexShaderBlob, NULL)))
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pVertexShader) != S_OK)
{
vertexShaderBlob->Release();
return false;
}
// Create the input layout
D3D10_INPUT_ELEMENT_DESC local_layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D10_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D10_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D10_INPUT_PER_VERTEX_DATA, 0 },
};
if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK)
{
vertexShaderBlob->Release();
return false;
}
vertexShaderBlob->Release();
// Create the constant buffer
{
D3D10_BUFFER_DESC desc;
desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
desc.Usage = D3D10_USAGE_DYNAMIC;
desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
bd->pd3dDevice->CreateBuffer(&desc, NULL, &bd->pVertexConstantBuffer);
}
}
// Create the pixel shader
{
static const char* pixelShader =
"struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
sampler sampler0;\
Texture2D texture0;\
\
float4 main(PS_INPUT input) : SV_Target\
{\
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \
}";
ID3DBlob* pixelShaderBlob;
if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_4_0", 0, 0, &pixelShaderBlob, NULL)))
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), &bd->pPixelShader) != S_OK)
{
pixelShaderBlob->Release();
return false;
}
pixelShaderBlob->Release();
}
// Create the blending setup
{
D3D10_BLEND_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AlphaToCoverageEnable = false;
desc.BlendEnable[0] = true;
desc.SrcBlend = D3D10_BLEND_SRC_ALPHA;
desc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
desc.BlendOp = D3D10_BLEND_OP_ADD;
desc.SrcBlendAlpha = D3D10_BLEND_ONE;
desc.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA;
desc.BlendOpAlpha = D3D10_BLEND_OP_ADD;
desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState);
}
// Create the rasterizer state
{
D3D10_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.FillMode = D3D10_FILL_SOLID;
desc.CullMode = D3D10_CULL_NONE;
desc.ScissorEnable = true;
desc.DepthClipEnable = true;
bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState);
}
// Create depth-stencil State
{
D3D10_DEPTH_STENCIL_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.DepthEnable = false;
desc.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ALL;
desc.DepthFunc = D3D10_COMPARISON_ALWAYS;
desc.StencilEnable = false;
desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;
desc.FrontFace.StencilFunc = D3D10_COMPARISON_ALWAYS;
desc.BackFace = desc.FrontFace;
bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState);
}
ImGui_ImplDX10_CreateFontsTexture();
return true;
}
void ImGui_ImplDX10_InvalidateDeviceObjects()
{
ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
if (!bd->pd3dDevice)
return;
if (bd->pFontSampler) { bd->pFontSampler->Release(); bd->pFontSampler = NULL; }
if (bd->pFontTextureView) { bd->pFontTextureView->Release(); bd->pFontTextureView = NULL; ImGui::GetIO().Fonts->SetTexID(NULL); } // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well.
if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = NULL; }
if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = NULL; }
if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = NULL; }
if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = NULL; }
if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = NULL; }
if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = NULL; }
if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = NULL; }
}
bool ImGui_ImplDX10_Init(ID3D10Device* device)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
// Setup backend capabilities flags
ImGui_ImplDX10_Data* bd = IM_NEW(ImGui_ImplDX10_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_dx10";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
// Get factory from device
IDXGIDevice* pDXGIDevice = NULL;
IDXGIAdapter* pDXGIAdapter = NULL;
IDXGIFactory* pFactory = NULL;
if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK)
if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK)
if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK)
{
bd->pd3dDevice = device;
bd->pFactory = pFactory;
}
if (pDXGIDevice) pDXGIDevice->Release();
if (pDXGIAdapter) pDXGIAdapter->Release();
bd->pd3dDevice->AddRef();
return true;
}
void ImGui_ImplDX10_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
ImGui_ImplDX10_InvalidateDeviceObjects();
if (bd->pFactory) { bd->pFactory->Release(); }
if (bd->pd3dDevice) { bd->pd3dDevice->Release(); }
io.BackendRendererName = NULL;
io.BackendRendererUserData = NULL;
IM_DELETE(bd);
}
void ImGui_ImplDX10_NewFrame()
{
ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplDX10_Init()?");
if (!bd->pFontSampler)
ImGui_ImplDX10_CreateDeviceObjects();
}

View File

@ -0,0 +1,25 @@
// dear imgui: Renderer Backend for DirectX10
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture backend. Use 'ID3D10ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
struct ID3D10Device;
IMGUI_IMPL_API bool ImGui_ImplDX10_Init(ID3D10Device* device);
IMGUI_IMPL_API void ImGui_ImplDX10_Shutdown();
IMGUI_IMPL_API void ImGui_ImplDX10_NewFrame();
IMGUI_IMPL_API void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API void ImGui_ImplDX10_InvalidateDeviceObjects();
IMGUI_IMPL_API bool ImGui_ImplDX10_CreateDeviceObjects();

View File

@ -0,0 +1,587 @@
// dear imgui: Renderer Backend for DirectX11
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-05-19: DirectX11: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-02-18: DirectX11: Change blending equation to preserve alpha in output buffer.
// 2019-08-01: DirectX11: Fixed code querying the Geometry Shader state (would generally error with Debug layer enabled).
// 2019-07-21: DirectX11: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX10_RenderDrawData. Clearing Hull/Domain/Compute shaders without backup/restore.
// 2019-05-29: DirectX11: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: DirectX11: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile().
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-08-01: DirectX11: Querying for IDXGIFactory instead of IDXGIFactory1 to increase compatibility.
// 2018-07-13: DirectX11: Fixed unreleased resources in Init and Shutdown functions.
// 2018-06-08: Misc: Extracted imgui_impl_dx11.cpp/.h away from the old combined DX11+Win32 example.
// 2018-06-08: DirectX11: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX11_RenderDrawData() in the .h file so you can call it yourself.
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2016-05-07: DirectX11: Disabling depth-write.
#include "imgui.h"
#include "imgui_impl_dx11.h"
// DirectX
#include <stdio.h>
#include <d3d11.h>
#include <d3dcompiler.h>
#ifdef _MSC_VER
#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
#endif
// DirectX11 data
struct ImGui_ImplDX11_Data
{
ID3D11Device* pd3dDevice;
ID3D11DeviceContext* pd3dDeviceContext;
IDXGIFactory* pFactory;
ID3D11Buffer* pVB;
ID3D11Buffer* pIB;
ID3D11VertexShader* pVertexShader;
ID3D11InputLayout* pInputLayout;
ID3D11Buffer* pVertexConstantBuffer;
ID3D11PixelShader* pPixelShader;
ID3D11SamplerState* pFontSampler;
ID3D11ShaderResourceView* pFontTextureView;
ID3D11RasterizerState* pRasterizerState;
ID3D11BlendState* pBlendState;
ID3D11DepthStencilState* pDepthStencilState;
int VertexBufferSize;
int IndexBufferSize;
ImGui_ImplDX11_Data() { memset(this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; }
};
struct VERTEX_CONSTANT_BUFFER
{
float mvp[4][4];
};
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
static ImGui_ImplDX11_Data* ImGui_ImplDX11_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplDX11_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
}
// Functions
static void ImGui_ImplDX11_SetupRenderState(ImDrawData* draw_data, ID3D11DeviceContext* ctx)
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
// Setup viewport
D3D11_VIEWPORT vp;
memset(&vp, 0, sizeof(D3D11_VIEWPORT));
vp.Width = draw_data->DisplaySize.x;
vp.Height = draw_data->DisplaySize.y;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = vp.TopLeftY = 0;
ctx->RSSetViewports(1, &vp);
// Setup shader and vertex buffers
unsigned int stride = sizeof(ImDrawVert);
unsigned int offset = 0;
ctx->IASetInputLayout(bd->pInputLayout);
ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset);
ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
ctx->VSSetShader(bd->pVertexShader, NULL, 0);
ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer);
ctx->PSSetShader(bd->pPixelShader, NULL, 0);
ctx->PSSetSamplers(0, 1, &bd->pFontSampler);
ctx->GSSetShader(NULL, NULL, 0);
ctx->HSSetShader(NULL, NULL, 0); // In theory we should backup and restore this as well.. very infrequently used..
ctx->DSSetShader(NULL, NULL, 0); // In theory we should backup and restore this as well.. very infrequently used..
ctx->CSSetShader(NULL, NULL, 0); // In theory we should backup and restore this as well.. very infrequently used..
// Setup blend state
const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff);
ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0);
ctx->RSSetState(bd->pRasterizerState);
}
// Render function
void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
ID3D11DeviceContext* ctx = bd->pd3dDeviceContext;
// Create and grow vertex/index buffers if needed
if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount)
{
if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
bd->VertexBufferSize = draw_data->TotalVtxCount + 5000;
D3D11_BUFFER_DESC desc;
memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert);
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
if (bd->pd3dDevice->CreateBuffer(&desc, NULL, &bd->pVB) < 0)
return;
}
if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount)
{
if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
bd->IndexBufferSize = draw_data->TotalIdxCount + 10000;
D3D11_BUFFER_DESC desc;
memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx);
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
if (bd->pd3dDevice->CreateBuffer(&desc, NULL, &bd->pIB) < 0)
return;
}
// Upload vertex/index data into a single contiguous GPU buffer
D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;
if (ctx->Map(bd->pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)
return;
if (ctx->Map(bd->pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)
return;
ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;
ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
vtx_dst += cmd_list->VtxBuffer.Size;
idx_dst += cmd_list->IdxBuffer.Size;
}
ctx->Unmap(bd->pVB, 0);
ctx->Unmap(bd->pIB, 0);
// Setup orthographic projection matrix into our constant buffer
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
{
D3D11_MAPPED_SUBRESOURCE mapped_resource;
if (ctx->Map(bd->pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)
return;
VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource.pData;
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
float mvp[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.5f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
};
memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
ctx->Unmap(bd->pVertexConstantBuffer, 0);
}
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
struct BACKUP_DX11_STATE
{
UINT ScissorRectsCount, ViewportsCount;
D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
ID3D11RasterizerState* RS;
ID3D11BlendState* BlendState;
FLOAT BlendFactor[4];
UINT SampleMask;
UINT StencilRef;
ID3D11DepthStencilState* DepthStencilState;
ID3D11ShaderResourceView* PSShaderResource;
ID3D11SamplerState* PSSampler;
ID3D11PixelShader* PS;
ID3D11VertexShader* VS;
ID3D11GeometryShader* GS;
UINT PSInstancesCount, VSInstancesCount, GSInstancesCount;
ID3D11ClassInstance *PSInstances[256], *VSInstances[256], *GSInstances[256]; // 256 is max according to PSSetShader documentation
D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology;
ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer;
UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset;
DXGI_FORMAT IndexBufferFormat;
ID3D11InputLayout* InputLayout;
};
BACKUP_DX11_STATE old = {};
old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);
ctx->RSGetViewports(&old.ViewportsCount, old.Viewports);
ctx->RSGetState(&old.RS);
ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);
ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef);
ctx->PSGetShaderResources(0, 1, &old.PSShaderResource);
ctx->PSGetSamplers(0, 1, &old.PSSampler);
old.PSInstancesCount = old.VSInstancesCount = old.GSInstancesCount = 256;
ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount);
ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount);
ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);
ctx->GSGetShader(&old.GS, old.GSInstances, &old.GSInstancesCount);
ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology);
ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);
ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);
ctx->IAGetInputLayout(&old.InputLayout);
// Setup desired DX state
ImGui_ImplDX11_SetupRenderState(draw_data, ctx);
// Render command lists
// (Because we merged all buffers into a single one, we maintain our own offset into them)
int global_idx_offset = 0;
int global_vtx_offset = 0;
ImVec2 clip_off = draw_data->DisplayPos;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback != NULL)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplDX11_SetupRenderState(draw_data, ctx);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Apply scissor/clipping rectangle
const D3D11_RECT r = { (LONG)(pcmd->ClipRect.x - clip_off.x), (LONG)(pcmd->ClipRect.y - clip_off.y), (LONG)(pcmd->ClipRect.z - clip_off.x), (LONG)(pcmd->ClipRect.w - clip_off.y) };
ctx->RSSetScissorRects(1, &r);
// Bind texture, Draw
ID3D11ShaderResourceView* texture_srv = (ID3D11ShaderResourceView*)pcmd->GetTexID();
ctx->PSSetShaderResources(0, 1, &texture_srv);
ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset);
}
}
global_idx_offset += cmd_list->IdxBuffer.Size;
global_vtx_offset += cmd_list->VtxBuffer.Size;
}
// Restore modified DX state
ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
ctx->RSSetViewports(old.ViewportsCount, old.Viewports);
ctx->RSSetState(old.RS); if (old.RS) old.RS->Release();
ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();
ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release();
ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();
ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();
ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release();
for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release();
ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release();
ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();
ctx->GSSetShader(old.GS, old.GSInstances, old.GSInstancesCount); if (old.GS) old.GS->Release();
for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release();
ctx->IASetPrimitiveTopology(old.PrimitiveTopology);
ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();
ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();
ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();
}
static void ImGui_ImplDX11_CreateFontsTexture()
{
// Build texture atlas
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Upload texture to graphics system
{
D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = width;
desc.Height = height;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
ID3D11Texture2D* pTexture = NULL;
D3D11_SUBRESOURCE_DATA subResource;
subResource.pSysMem = pixels;
subResource.SysMemPitch = desc.Width * 4;
subResource.SysMemSlicePitch = 0;
bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture);
IM_ASSERT(pTexture != NULL);
// Create texture view
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = desc.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &bd->pFontTextureView);
pTexture->Release();
}
// Store our identifier
io.Fonts->SetTexID((ImTextureID)bd->pFontTextureView);
// Create texture sampler
{
D3D11_SAMPLER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
desc.MipLODBias = 0.f;
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
desc.MinLOD = 0.f;
desc.MaxLOD = 0.f;
bd->pd3dDevice->CreateSamplerState(&desc, &bd->pFontSampler);
}
}
bool ImGui_ImplDX11_CreateDeviceObjects()
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
if (!bd->pd3dDevice)
return false;
if (bd->pFontSampler)
ImGui_ImplDX11_InvalidateDeviceObjects();
// By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)
// If you would like to use this DX11 sample code but remove this dependency you can:
// 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]
// 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
// See https://github.com/ocornut/imgui/pull/638 for sources and details.
// Create the vertex shader
{
static const char* vertexShader =
"cbuffer vertexBuffer : register(b0) \
{\
float4x4 ProjectionMatrix; \
};\
struct VS_INPUT\
{\
float2 pos : POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
PS_INPUT main(VS_INPUT input)\
{\
PS_INPUT output;\
output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
output.col = input.col;\
output.uv = input.uv;\
return output;\
}";
ID3DBlob* vertexShaderBlob;
if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_4_0", 0, 0, &vertexShaderBlob, NULL)))
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), NULL, &bd->pVertexShader) != S_OK)
{
vertexShaderBlob->Release();
return false;
}
// Create the input layout
D3D11_INPUT_ELEMENT_DESC local_layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK)
{
vertexShaderBlob->Release();
return false;
}
vertexShaderBlob->Release();
// Create the constant buffer
{
D3D11_BUFFER_DESC desc;
desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
bd->pd3dDevice->CreateBuffer(&desc, NULL, &bd->pVertexConstantBuffer);
}
}
// Create the pixel shader
{
static const char* pixelShader =
"struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
sampler sampler0;\
Texture2D texture0;\
\
float4 main(PS_INPUT input) : SV_Target\
{\
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \
}";
ID3DBlob* pixelShaderBlob;
if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_4_0", 0, 0, &pixelShaderBlob, NULL)))
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), NULL, &bd->pPixelShader) != S_OK)
{
pixelShaderBlob->Release();
return false;
}
pixelShaderBlob->Release();
}
// Create the blending setup
{
D3D11_BLEND_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AlphaToCoverageEnable = false;
desc.RenderTarget[0].BlendEnable = true;
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState);
}
// Create the rasterizer state
{
D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.FillMode = D3D11_FILL_SOLID;
desc.CullMode = D3D11_CULL_NONE;
desc.ScissorEnable = true;
desc.DepthClipEnable = true;
bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState);
}
// Create depth-stencil State
{
D3D11_DEPTH_STENCIL_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.DepthEnable = false;
desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
desc.DepthFunc = D3D11_COMPARISON_ALWAYS;
desc.StencilEnable = false;
desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
desc.BackFace = desc.FrontFace;
bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState);
}
ImGui_ImplDX11_CreateFontsTexture();
return true;
}
void ImGui_ImplDX11_InvalidateDeviceObjects()
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
if (!bd->pd3dDevice)
return;
if (bd->pFontSampler) { bd->pFontSampler->Release(); bd->pFontSampler = NULL; }
if (bd->pFontTextureView) { bd->pFontTextureView->Release(); bd->pFontTextureView = NULL; ImGui::GetIO().Fonts->SetTexID(NULL); } // We copied data->pFontTextureView to io.Fonts->TexID so let's clear that as well.
if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = NULL; }
if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = NULL; }
if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = NULL; }
if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = NULL; }
if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = NULL; }
if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = NULL; }
if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = NULL; }
}
bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
// Setup backend capabilities flags
ImGui_ImplDX11_Data* bd = IM_NEW(ImGui_ImplDX11_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_dx11";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
// Get factory from device
IDXGIDevice* pDXGIDevice = NULL;
IDXGIAdapter* pDXGIAdapter = NULL;
IDXGIFactory* pFactory = NULL;
if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK)
if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK)
if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK)
{
bd->pd3dDevice = device;
bd->pd3dDeviceContext = device_context;
bd->pFactory = pFactory;
}
if (pDXGIDevice) pDXGIDevice->Release();
if (pDXGIAdapter) pDXGIAdapter->Release();
bd->pd3dDevice->AddRef();
bd->pd3dDeviceContext->AddRef();
return true;
}
void ImGui_ImplDX11_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
ImGui_ImplDX11_InvalidateDeviceObjects();
if (bd->pFactory) { bd->pFactory->Release(); }
if (bd->pd3dDevice) { bd->pd3dDevice->Release(); }
if (bd->pd3dDeviceContext) { bd->pd3dDeviceContext->Release(); }
io.BackendRendererName = NULL;
io.BackendRendererUserData = NULL;
IM_DELETE(bd);
}
void ImGui_ImplDX11_NewFrame()
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplDX11_Init()?");
if (!bd->pFontSampler)
ImGui_ImplDX11_CreateDeviceObjects();
}

View File

@ -0,0 +1,26 @@
// dear imgui: Renderer Backend for DirectX11
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
struct ID3D11Device;
struct ID3D11DeviceContext;
IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context);
IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown();
IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame();
IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects();
IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects();

View File

@ -0,0 +1,742 @@
// dear imgui: Renderer Backend for DirectX12
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'D3D12_GPU_DESCRIPTOR_HANDLE' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'.
// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*.
// To build this on 32-bit systems:
// - [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in the 'example_win32_direct12/example_win32_direct12.vcxproj' project file)
// - [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like.
// - [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!)
// - [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in the example_win32_direct12/build_win32.bat file)
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-05-19: DirectX12: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-02-18: DirectX12: Change blending equation to preserve alpha in output buffer.
// 2021-01-11: DirectX12: Improve Windows 7 compatibility (for D3D12On7) by loading d3d12.dll dynamically.
// 2020-09-16: DirectX12: Avoid rendering calls with zero-sized scissor rectangle since it generates a validation layer warning.
// 2020-09-08: DirectX12: Clarified support for building on 32-bit systems by redefining ImTextureID.
// 2019-10-18: DirectX12: *BREAKING CHANGE* Added extra ID3D12DescriptorHeap parameter to ImGui_ImplDX12_Init() function.
// 2019-05-29: DirectX12: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: DirectX12: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2019-03-29: Misc: Various minor tidying up.
// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile().
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-06-12: DirectX12: Moved the ID3D12GraphicsCommandList* parameter from NewFrame() to RenderDrawData().
// 2018-06-08: Misc: Extracted imgui_impl_dx12.cpp/.h away from the old combined DX12+Win32 example.
// 2018-06-08: DirectX12: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle (to ease support for future multi-viewport).
// 2018-02-22: Merged into master with all Win32 code synchronized to other examples.
#include "imgui.h"
#include "imgui_impl_dx12.h"
// DirectX
#include <d3d12.h>
#include <dxgi1_4.h>
#include <d3dcompiler.h>
#ifdef _MSC_VER
#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
#endif
// DirectX data
struct ImGui_ImplDX12_RenderBuffers
{
ID3D12Resource* IndexBuffer;
ID3D12Resource* VertexBuffer;
int IndexBufferSize;
int VertexBufferSize;
};
struct ImGui_ImplDX12_Data
{
ID3D12Device* pd3dDevice;
ID3D12RootSignature* pRootSignature;
ID3D12PipelineState* pPipelineState;
DXGI_FORMAT RTVFormat;
ID3D12Resource* pFontTextureResource;
D3D12_CPU_DESCRIPTOR_HANDLE hFontSrvCpuDescHandle;
D3D12_GPU_DESCRIPTOR_HANDLE hFontSrvGpuDescHandle;
ImGui_ImplDX12_RenderBuffers* pFrameResources;
UINT numFramesInFlight;
UINT frameIndex;
ImGui_ImplDX12_Data() { memset(this, 0, sizeof(*this)); frameIndex = UINT_MAX; }
};
struct VERTEX_CONSTANT_BUFFER
{
float mvp[4][4];
};
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
static ImGui_ImplDX12_Data* ImGui_ImplDX12_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplDX12_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
}
// Functions
static void ImGui_ImplDX12_SetupRenderState(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx, ImGui_ImplDX12_RenderBuffers* fr)
{
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
// Setup orthographic projection matrix into our constant buffer
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
VERTEX_CONSTANT_BUFFER vertex_constant_buffer;
{
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
float mvp[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.5f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
};
memcpy(&vertex_constant_buffer.mvp, mvp, sizeof(mvp));
}
// Setup viewport
D3D12_VIEWPORT vp;
memset(&vp, 0, sizeof(D3D12_VIEWPORT));
vp.Width = draw_data->DisplaySize.x;
vp.Height = draw_data->DisplaySize.y;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = vp.TopLeftY = 0.0f;
ctx->RSSetViewports(1, &vp);
// Bind shader and vertex buffers
unsigned int stride = sizeof(ImDrawVert);
unsigned int offset = 0;
D3D12_VERTEX_BUFFER_VIEW vbv;
memset(&vbv, 0, sizeof(D3D12_VERTEX_BUFFER_VIEW));
vbv.BufferLocation = fr->VertexBuffer->GetGPUVirtualAddress() + offset;
vbv.SizeInBytes = fr->VertexBufferSize * stride;
vbv.StrideInBytes = stride;
ctx->IASetVertexBuffers(0, 1, &vbv);
D3D12_INDEX_BUFFER_VIEW ibv;
memset(&ibv, 0, sizeof(D3D12_INDEX_BUFFER_VIEW));
ibv.BufferLocation = fr->IndexBuffer->GetGPUVirtualAddress();
ibv.SizeInBytes = fr->IndexBufferSize * sizeof(ImDrawIdx);
ibv.Format = sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT;
ctx->IASetIndexBuffer(&ibv);
ctx->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
ctx->SetPipelineState(bd->pPipelineState);
ctx->SetGraphicsRootSignature(bd->pRootSignature);
ctx->SetGraphicsRoot32BitConstants(0, 16, &vertex_constant_buffer, 0);
// Setup blend factor
const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
ctx->OMSetBlendFactor(blend_factor);
}
template<typename T>
static inline void SafeRelease(T*& res)
{
if (res)
res->Release();
res = NULL;
}
// Render function
void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
// FIXME: I'm assuming that this only gets called once per frame!
// If not, we can't just re-allocate the IB or VB, we'll have to do a proper allocator.
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
bd->frameIndex = bd->frameIndex + 1;
ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[bd->frameIndex % bd->numFramesInFlight];
// Create and grow vertex/index buffers if needed
if (fr->VertexBuffer == NULL || fr->VertexBufferSize < draw_data->TotalVtxCount)
{
SafeRelease(fr->VertexBuffer);
fr->VertexBufferSize = draw_data->TotalVtxCount + 5000;
D3D12_HEAP_PROPERTIES props;
memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES));
props.Type = D3D12_HEAP_TYPE_UPLOAD;
props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
D3D12_RESOURCE_DESC desc;
memset(&desc, 0, sizeof(D3D12_RESOURCE_DESC));
desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
desc.Width = fr->VertexBufferSize * sizeof(ImDrawVert);
desc.Height = 1;
desc.DepthOrArraySize = 1;
desc.MipLevels = 1;
desc.Format = DXGI_FORMAT_UNKNOWN;
desc.SampleDesc.Count = 1;
desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
desc.Flags = D3D12_RESOURCE_FLAG_NONE;
if (bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, NULL, IID_PPV_ARGS(&fr->VertexBuffer)) < 0)
return;
}
if (fr->IndexBuffer == NULL || fr->IndexBufferSize < draw_data->TotalIdxCount)
{
SafeRelease(fr->IndexBuffer);
fr->IndexBufferSize = draw_data->TotalIdxCount + 10000;
D3D12_HEAP_PROPERTIES props;
memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES));
props.Type = D3D12_HEAP_TYPE_UPLOAD;
props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
D3D12_RESOURCE_DESC desc;
memset(&desc, 0, sizeof(D3D12_RESOURCE_DESC));
desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
desc.Width = fr->IndexBufferSize * sizeof(ImDrawIdx);
desc.Height = 1;
desc.DepthOrArraySize = 1;
desc.MipLevels = 1;
desc.Format = DXGI_FORMAT_UNKNOWN;
desc.SampleDesc.Count = 1;
desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
desc.Flags = D3D12_RESOURCE_FLAG_NONE;
if (bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, NULL, IID_PPV_ARGS(&fr->IndexBuffer)) < 0)
return;
}
// Upload vertex/index data into a single contiguous GPU buffer
void* vtx_resource, *idx_resource;
D3D12_RANGE range;
memset(&range, 0, sizeof(D3D12_RANGE));
if (fr->VertexBuffer->Map(0, &range, &vtx_resource) != S_OK)
return;
if (fr->IndexBuffer->Map(0, &range, &idx_resource) != S_OK)
return;
ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource;
ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
vtx_dst += cmd_list->VtxBuffer.Size;
idx_dst += cmd_list->IdxBuffer.Size;
}
fr->VertexBuffer->Unmap(0, &range);
fr->IndexBuffer->Unmap(0, &range);
// Setup desired DX state
ImGui_ImplDX12_SetupRenderState(draw_data, ctx, fr);
// Render command lists
// (Because we merged all buffers into a single one, we maintain our own offset into them)
int global_vtx_offset = 0;
int global_idx_offset = 0;
ImVec2 clip_off = draw_data->DisplayPos;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback != NULL)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplDX12_SetupRenderState(draw_data, ctx, fr);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Apply Scissor, Bind texture, Draw
const D3D12_RECT r = { (LONG)(pcmd->ClipRect.x - clip_off.x), (LONG)(pcmd->ClipRect.y - clip_off.y), (LONG)(pcmd->ClipRect.z - clip_off.x), (LONG)(pcmd->ClipRect.w - clip_off.y) };
if (r.right > r.left && r.bottom > r.top)
{
D3D12_GPU_DESCRIPTOR_HANDLE texture_handle = {};
texture_handle.ptr = (UINT64)pcmd->GetTexID();
ctx->SetGraphicsRootDescriptorTable(1, texture_handle);
ctx->RSSetScissorRects(1, &r);
ctx->DrawIndexedInstanced(pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0);
}
}
}
global_idx_offset += cmd_list->IdxBuffer.Size;
global_vtx_offset += cmd_list->VtxBuffer.Size;
}
}
static void ImGui_ImplDX12_CreateFontsTexture()
{
// Build texture atlas
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Upload texture to graphics system
{
D3D12_HEAP_PROPERTIES props;
memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES));
props.Type = D3D12_HEAP_TYPE_DEFAULT;
props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
D3D12_RESOURCE_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
desc.Alignment = 0;
desc.Width = width;
desc.Height = height;
desc.DepthOrArraySize = 1;
desc.MipLevels = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
desc.Flags = D3D12_RESOURCE_FLAG_NONE;
ID3D12Resource* pTexture = NULL;
bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc,
D3D12_RESOURCE_STATE_COPY_DEST, NULL, IID_PPV_ARGS(&pTexture));
UINT uploadPitch = (width * 4 + D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1u) & ~(D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1u);
UINT uploadSize = height * uploadPitch;
desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
desc.Alignment = 0;
desc.Width = uploadSize;
desc.Height = 1;
desc.DepthOrArraySize = 1;
desc.MipLevels = 1;
desc.Format = DXGI_FORMAT_UNKNOWN;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
desc.Flags = D3D12_RESOURCE_FLAG_NONE;
props.Type = D3D12_HEAP_TYPE_UPLOAD;
props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
ID3D12Resource* uploadBuffer = NULL;
HRESULT hr = bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc,
D3D12_RESOURCE_STATE_GENERIC_READ, NULL, IID_PPV_ARGS(&uploadBuffer));
IM_ASSERT(SUCCEEDED(hr));
void* mapped = NULL;
D3D12_RANGE range = { 0, uploadSize };
hr = uploadBuffer->Map(0, &range, &mapped);
IM_ASSERT(SUCCEEDED(hr));
for (int y = 0; y < height; y++)
memcpy((void*) ((uintptr_t) mapped + y * uploadPitch), pixels + y * width * 4, width * 4);
uploadBuffer->Unmap(0, &range);
D3D12_TEXTURE_COPY_LOCATION srcLocation = {};
srcLocation.pResource = uploadBuffer;
srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
srcLocation.PlacedFootprint.Footprint.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srcLocation.PlacedFootprint.Footprint.Width = width;
srcLocation.PlacedFootprint.Footprint.Height = height;
srcLocation.PlacedFootprint.Footprint.Depth = 1;
srcLocation.PlacedFootprint.Footprint.RowPitch = uploadPitch;
D3D12_TEXTURE_COPY_LOCATION dstLocation = {};
dstLocation.pResource = pTexture;
dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
dstLocation.SubresourceIndex = 0;
D3D12_RESOURCE_BARRIER barrier = {};
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
barrier.Transition.pResource = pTexture;
barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST;
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
ID3D12Fence* fence = NULL;
hr = bd->pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence));
IM_ASSERT(SUCCEEDED(hr));
HANDLE event = CreateEvent(0, 0, 0, 0);
IM_ASSERT(event != NULL);
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.NodeMask = 1;
ID3D12CommandQueue* cmdQueue = NULL;
hr = bd->pd3dDevice->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&cmdQueue));
IM_ASSERT(SUCCEEDED(hr));
ID3D12CommandAllocator* cmdAlloc = NULL;
hr = bd->pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&cmdAlloc));
IM_ASSERT(SUCCEEDED(hr));
ID3D12GraphicsCommandList* cmdList = NULL;
hr = bd->pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, cmdAlloc, NULL, IID_PPV_ARGS(&cmdList));
IM_ASSERT(SUCCEEDED(hr));
cmdList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, NULL);
cmdList->ResourceBarrier(1, &barrier);
hr = cmdList->Close();
IM_ASSERT(SUCCEEDED(hr));
cmdQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&cmdList);
hr = cmdQueue->Signal(fence, 1);
IM_ASSERT(SUCCEEDED(hr));
fence->SetEventOnCompletion(1, event);
WaitForSingleObject(event, INFINITE);
cmdList->Release();
cmdAlloc->Release();
cmdQueue->Release();
CloseHandle(event);
fence->Release();
uploadBuffer->Release();
// Create texture view
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = desc.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, bd->hFontSrvCpuDescHandle);
SafeRelease(bd->pFontTextureResource);
bd->pFontTextureResource = pTexture;
}
// Store our identifier
// READ THIS IF THE STATIC_ASSERT() TRIGGERS:
// - Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'.
// - This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*.
// [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in the 'example_win32_direct12/example_win32_direct12.vcxproj' project file)
// [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like.
// [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!)
// [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in the example_win32_direct12/build_win32.bat file)
static_assert(sizeof(ImTextureID) >= sizeof(bd->hFontSrvGpuDescHandle.ptr), "Can't pack descriptor handle into TexID, 32-bit not supported yet.");
io.Fonts->SetTexID((ImTextureID)bd->hFontSrvGpuDescHandle.ptr);
}
bool ImGui_ImplDX12_CreateDeviceObjects()
{
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
if (!bd || !bd->pd3dDevice)
return false;
if (bd->pPipelineState)
ImGui_ImplDX12_InvalidateDeviceObjects();
// Create the root signature
{
D3D12_DESCRIPTOR_RANGE descRange = {};
descRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
descRange.NumDescriptors = 1;
descRange.BaseShaderRegister = 0;
descRange.RegisterSpace = 0;
descRange.OffsetInDescriptorsFromTableStart = 0;
D3D12_ROOT_PARAMETER param[2] = {};
param[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
param[0].Constants.ShaderRegister = 0;
param[0].Constants.RegisterSpace = 0;
param[0].Constants.Num32BitValues = 16;
param[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;
param[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
param[1].DescriptorTable.NumDescriptorRanges = 1;
param[1].DescriptorTable.pDescriptorRanges = &descRange;
param[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
D3D12_STATIC_SAMPLER_DESC staticSampler = {};
staticSampler.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
staticSampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
staticSampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
staticSampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
staticSampler.MipLODBias = 0.f;
staticSampler.MaxAnisotropy = 0;
staticSampler.ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
staticSampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
staticSampler.MinLOD = 0.f;
staticSampler.MaxLOD = 0.f;
staticSampler.ShaderRegister = 0;
staticSampler.RegisterSpace = 0;
staticSampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
D3D12_ROOT_SIGNATURE_DESC desc = {};
desc.NumParameters = _countof(param);
desc.pParameters = param;
desc.NumStaticSamplers = 1;
desc.pStaticSamplers = &staticSampler;
desc.Flags =
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |
D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
// Load d3d12.dll and D3D12SerializeRootSignature() function address dynamically to facilitate using with D3D12On7.
// See if any version of d3d12.dll is already loaded in the process. If so, give preference to that.
static HINSTANCE d3d12_dll = ::GetModuleHandleA("d3d12.dll");
if (d3d12_dll == NULL)
{
// Attempt to load d3d12.dll from local directories. This will only succeed if
// (1) the current OS is Windows 7, and
// (2) there exists a version of d3d12.dll for Windows 7 (D3D12On7) in one of the following directories.
// See https://github.com/ocornut/imgui/pull/3696 for details.
const char* localD3d12Paths[] = { ".\\d3d12.dll", ".\\d3d12on7\\d3d12.dll", ".\\12on7\\d3d12.dll" }; // A. current directory, B. used by some games, C. used in Microsoft D3D12On7 sample
for (int i = 0; i < IM_ARRAYSIZE(localD3d12Paths); i++)
if ((d3d12_dll = ::LoadLibraryA(localD3d12Paths[i])) != NULL)
break;
// If failed, we are on Windows >= 10.
if (d3d12_dll == NULL)
d3d12_dll = ::LoadLibraryA("d3d12.dll");
if (d3d12_dll == NULL)
return false;
}
PFN_D3D12_SERIALIZE_ROOT_SIGNATURE D3D12SerializeRootSignatureFn = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)::GetProcAddress(d3d12_dll, "D3D12SerializeRootSignature");
if (D3D12SerializeRootSignatureFn == NULL)
return false;
ID3DBlob* blob = NULL;
if (D3D12SerializeRootSignatureFn(&desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, NULL) != S_OK)
return false;
bd->pd3dDevice->CreateRootSignature(0, blob->GetBufferPointer(), blob->GetBufferSize(), IID_PPV_ARGS(&bd->pRootSignature));
blob->Release();
}
// By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)
// If you would like to use this DX12 sample code but remove this dependency you can:
// 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]
// 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
// See https://github.com/ocornut/imgui/pull/638 for sources and details.
D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc;
memset(&psoDesc, 0, sizeof(D3D12_GRAPHICS_PIPELINE_STATE_DESC));
psoDesc.NodeMask = 1;
psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
psoDesc.pRootSignature = bd->pRootSignature;
psoDesc.SampleMask = UINT_MAX;
psoDesc.NumRenderTargets = 1;
psoDesc.RTVFormats[0] = bd->RTVFormat;
psoDesc.SampleDesc.Count = 1;
psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
ID3DBlob* vertexShaderBlob;
ID3DBlob* pixelShaderBlob;
// Create the vertex shader
{
static const char* vertexShader =
"cbuffer vertexBuffer : register(b0) \
{\
float4x4 ProjectionMatrix; \
};\
struct VS_INPUT\
{\
float2 pos : POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
PS_INPUT main(VS_INPUT input)\
{\
PS_INPUT output;\
output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
output.col = input.col;\
output.uv = input.uv;\
return output;\
}";
if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_5_0", 0, 0, &vertexShaderBlob, NULL)))
return false; // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
psoDesc.VS = { vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize() };
// Create the input layout
static D3D12_INPUT_ELEMENT_DESC local_layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
};
psoDesc.InputLayout = { local_layout, 3 };
}
// Create the pixel shader
{
static const char* pixelShader =
"struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
SamplerState sampler0 : register(s0);\
Texture2D texture0 : register(t0);\
\
float4 main(PS_INPUT input) : SV_Target\
{\
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \
}";
if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_5_0", 0, 0, &pixelShaderBlob, NULL)))
{
vertexShaderBlob->Release();
return false; // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
}
psoDesc.PS = { pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize() };
}
// Create the blending setup
{
D3D12_BLEND_DESC& desc = psoDesc.BlendState;
desc.AlphaToCoverageEnable = false;
desc.RenderTarget[0].BlendEnable = true;
desc.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA;
desc.RenderTarget[0].DestBlend = D3D12_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOp = D3D12_BLEND_OP_ADD;
desc.RenderTarget[0].SrcBlendAlpha = D3D12_BLEND_ONE;
desc.RenderTarget[0].DestBlendAlpha = D3D12_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOpAlpha = D3D12_BLEND_OP_ADD;
desc.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
}
// Create the rasterizer state
{
D3D12_RASTERIZER_DESC& desc = psoDesc.RasterizerState;
desc.FillMode = D3D12_FILL_MODE_SOLID;
desc.CullMode = D3D12_CULL_MODE_NONE;
desc.FrontCounterClockwise = FALSE;
desc.DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
desc.DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
desc.SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
desc.DepthClipEnable = true;
desc.MultisampleEnable = FALSE;
desc.AntialiasedLineEnable = FALSE;
desc.ForcedSampleCount = 0;
desc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
}
// Create depth-stencil State
{
D3D12_DEPTH_STENCIL_DESC& desc = psoDesc.DepthStencilState;
desc.DepthEnable = false;
desc.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
desc.DepthFunc = D3D12_COMPARISON_FUNC_ALWAYS;
desc.StencilEnable = false;
desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D12_STENCIL_OP_KEEP;
desc.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS;
desc.BackFace = desc.FrontFace;
}
HRESULT result_pipeline_state = bd->pd3dDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&bd->pPipelineState));
vertexShaderBlob->Release();
pixelShaderBlob->Release();
if (result_pipeline_state != S_OK)
return false;
ImGui_ImplDX12_CreateFontsTexture();
return true;
}
void ImGui_ImplDX12_InvalidateDeviceObjects()
{
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
if (!bd || !bd->pd3dDevice)
return;
ImGuiIO& io = ImGui::GetIO();
SafeRelease(bd->pRootSignature);
SafeRelease(bd->pPipelineState);
SafeRelease(bd->pFontTextureResource);
io.Fonts->SetTexID(NULL); // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well.
for (UINT i = 0; i < bd->numFramesInFlight; i++)
{
ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[i];
SafeRelease(fr->IndexBuffer);
SafeRelease(fr->VertexBuffer);
}
}
bool ImGui_ImplDX12_Init(ID3D12Device* device, int num_frames_in_flight, DXGI_FORMAT rtv_format, ID3D12DescriptorHeap* cbv_srv_heap,
D3D12_CPU_DESCRIPTOR_HANDLE font_srv_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE font_srv_gpu_desc_handle)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
// Setup backend capabilities flags
ImGui_ImplDX12_Data* bd = IM_NEW(ImGui_ImplDX12_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_dx12";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
bd->pd3dDevice = device;
bd->RTVFormat = rtv_format;
bd->hFontSrvCpuDescHandle = font_srv_cpu_desc_handle;
bd->hFontSrvGpuDescHandle = font_srv_gpu_desc_handle;
bd->pFrameResources = new ImGui_ImplDX12_RenderBuffers[num_frames_in_flight];
bd->numFramesInFlight = num_frames_in_flight;
bd->frameIndex = UINT_MAX;
IM_UNUSED(cbv_srv_heap); // Unused in master branch (will be used by multi-viewports)
// Create buffers with a default size (they will later be grown as needed)
for (int i = 0; i < num_frames_in_flight; i++)
{
ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[i];
fr->IndexBuffer = NULL;
fr->VertexBuffer = NULL;
fr->IndexBufferSize = 10000;
fr->VertexBufferSize = 5000;
}
return true;
}
void ImGui_ImplDX12_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
ImGui_ImplDX12_InvalidateDeviceObjects();
delete[] bd->pFrameResources;
io.BackendRendererName = NULL;
io.BackendRendererUserData = NULL;
IM_DELETE(bd);
}
void ImGui_ImplDX12_NewFrame()
{
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplDX12_Init()?");
if (!bd->pPipelineState)
ImGui_ImplDX12_CreateDeviceObjects();
}

View File

@ -0,0 +1,49 @@
// dear imgui: Renderer Backend for DirectX12
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'D3D12_GPU_DESCRIPTOR_HANDLE' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'.
// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*.
// This define is set in the example .vcxproj file and need to be replicated in your app or by adding it to your imconfig.h file.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
#ifdef _MSC_VER
#pragma warning (push)
#pragma warning (disable: 4471) // a forward declaration of an unscoped enumeration must have an underlying type
#endif
enum DXGI_FORMAT;
struct ID3D12Device;
struct ID3D12DescriptorHeap;
struct ID3D12GraphicsCommandList;
struct D3D12_CPU_DESCRIPTOR_HANDLE;
struct D3D12_GPU_DESCRIPTOR_HANDLE;
// cmd_list is the command list that the implementation will use to render imgui draw lists.
// Before calling the render function, caller must prepare cmd_list by resetting it and setting the appropriate
// render target and descriptor heap that contains font_srv_cpu_desc_handle/font_srv_gpu_desc_handle.
// font_srv_cpu_desc_handle and font_srv_gpu_desc_handle are handles to a single SRV descriptor to use for the internal font texture.
IMGUI_IMPL_API bool ImGui_ImplDX12_Init(ID3D12Device* device, int num_frames_in_flight, DXGI_FORMAT rtv_format, ID3D12DescriptorHeap* cbv_srv_heap,
D3D12_CPU_DESCRIPTOR_HANDLE font_srv_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE font_srv_gpu_desc_handle);
IMGUI_IMPL_API void ImGui_ImplDX12_Shutdown();
IMGUI_IMPL_API void ImGui_ImplDX12_NewFrame();
IMGUI_IMPL_API void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3D12GraphicsCommandList* graphics_command_list);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API void ImGui_ImplDX12_InvalidateDeviceObjects();
IMGUI_IMPL_API bool ImGui_ImplDX12_CreateDeviceObjects();
#ifdef _MSC_VER
#pragma warning (pop)
#endif

370
backends/imgui_impl_dx9.cpp Normal file
View File

@ -0,0 +1,370 @@
// dear imgui: Renderer Backend for DirectX9
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'LPDIRECT3DTEXTURE9' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-06-25: DirectX9: Explicitly disable texture state stages after >= 1.
// 2021-05-19: DirectX9: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-04-23: DirectX9: Explicitly setting up more graphics states to increase compatibility with unusual non-default states.
// 2021-03-18: DirectX9: Calling IDirect3DStateBlock9::Capture() after CreateStateBlock() as a workaround for state restoring issues (see #3857).
// 2021-03-03: DirectX9: Added support for IMGUI_USE_BGRA_PACKED_COLOR in user's imconfig file.
// 2021-02-18: DirectX9: Change blending equation to preserve alpha in output buffer.
// 2019-05-29: DirectX9: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: DirectX9: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2019-03-29: Misc: Fixed erroneous assert in ImGui_ImplDX9_InvalidateDeviceObjects().
// 2019-01-16: Misc: Disabled fog before drawing UI's. Fixes issue #2288.
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-06-08: Misc: Extracted imgui_impl_dx9.cpp/.h away from the old combined DX9+Win32 example.
// 2018-06-08: DirectX9: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-05-07: Render: Saving/restoring Transform because they don't seem to be included in the StateBlock. Setting shading mode to Gouraud.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX9_RenderDrawData() in the .h file so you can call it yourself.
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
#include "imgui.h"
#include "imgui_impl_dx9.h"
// DirectX
#include <d3d9.h>
// DirectX data
struct ImGui_ImplDX9_Data
{
LPDIRECT3DDEVICE9 pd3dDevice;
LPDIRECT3DVERTEXBUFFER9 pVB;
LPDIRECT3DINDEXBUFFER9 pIB;
LPDIRECT3DTEXTURE9 FontTexture;
int VertexBufferSize;
int IndexBufferSize;
ImGui_ImplDX9_Data() { memset(this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; }
};
struct CUSTOMVERTEX
{
float pos[3];
D3DCOLOR col;
float uv[2];
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
#ifdef IMGUI_USE_BGRA_PACKED_COLOR
#define IMGUI_COL_TO_DX9_ARGB(_COL) (_COL)
#else
#define IMGUI_COL_TO_DX9_ARGB(_COL) (((_COL) & 0xFF00FF00) | (((_COL) & 0xFF0000) >> 16) | (((_COL) & 0xFF) << 16))
#endif
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
static ImGui_ImplDX9_Data* ImGui_ImplDX9_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplDX9_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
}
// Functions
static void ImGui_ImplDX9_SetupRenderState(ImDrawData* draw_data)
{
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
// Setup viewport
D3DVIEWPORT9 vp;
vp.X = vp.Y = 0;
vp.Width = (DWORD)draw_data->DisplaySize.x;
vp.Height = (DWORD)draw_data->DisplaySize.y;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
bd->pd3dDevice->SetViewport(&vp);
// Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing, shade mode (for gradient)
bd->pd3dDevice->SetPixelShader(NULL);
bd->pd3dDevice->SetVertexShader(NULL);
bd->pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
bd->pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
bd->pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
bd->pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
bd->pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
bd->pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
bd->pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
bd->pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
bd->pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
bd->pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
bd->pd3dDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
bd->pd3dDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE);
bd->pd3dDevice->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA);
bd->pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE);
bd->pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
bd->pd3dDevice->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
bd->pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
bd->pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
bd->pd3dDevice->SetRenderState(D3DRS_CLIPPING, TRUE);
bd->pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
bd->pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
bd->pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
// Setup orthographic projection matrix
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
// Being agnostic of whether <d3dx9.h> or <DirectXMath.h> can be used, we aren't relying on D3DXMatrixIdentity()/D3DXMatrixOrthoOffCenterLH() or DirectX::XMMatrixIdentity()/DirectX::XMMatrixOrthographicOffCenterLH()
{
float L = draw_data->DisplayPos.x + 0.5f;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x + 0.5f;
float T = draw_data->DisplayPos.y + 0.5f;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y + 0.5f;
D3DMATRIX mat_identity = { { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } } };
D3DMATRIX mat_projection =
{ { {
2.0f/(R-L), 0.0f, 0.0f, 0.0f,
0.0f, 2.0f/(T-B), 0.0f, 0.0f,
0.0f, 0.0f, 0.5f, 0.0f,
(L+R)/(L-R), (T+B)/(B-T), 0.5f, 1.0f
} } };
bd->pd3dDevice->SetTransform(D3DTS_WORLD, &mat_identity);
bd->pd3dDevice->SetTransform(D3DTS_VIEW, &mat_identity);
bd->pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat_projection);
}
}
// Render function.
void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
// Create and grow buffers if needed
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount)
{
if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
bd->VertexBufferSize = draw_data->TotalVtxCount + 5000;
if (bd->pd3dDevice->CreateVertexBuffer(bd->VertexBufferSize * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &bd->pVB, NULL) < 0)
return;
}
if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount)
{
if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
bd->IndexBufferSize = draw_data->TotalIdxCount + 10000;
if (bd->pd3dDevice->CreateIndexBuffer(bd->IndexBufferSize * sizeof(ImDrawIdx), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, sizeof(ImDrawIdx) == 2 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, D3DPOOL_DEFAULT, &bd->pIB, NULL) < 0)
return;
}
// Backup the DX9 state
IDirect3DStateBlock9* d3d9_state_block = NULL;
if (bd->pd3dDevice->CreateStateBlock(D3DSBT_ALL, &d3d9_state_block) < 0)
return;
if (d3d9_state_block->Capture() < 0)
{
d3d9_state_block->Release();
return;
}
// Backup the DX9 transform (DX9 documentation suggests that it is included in the StateBlock but it doesn't appear to)
D3DMATRIX last_world, last_view, last_projection;
bd->pd3dDevice->GetTransform(D3DTS_WORLD, &last_world);
bd->pd3dDevice->GetTransform(D3DTS_VIEW, &last_view);
bd->pd3dDevice->GetTransform(D3DTS_PROJECTION, &last_projection);
// Allocate buffers
CUSTOMVERTEX* vtx_dst;
ImDrawIdx* idx_dst;
if (bd->pVB->Lock(0, (UINT)(draw_data->TotalVtxCount * sizeof(CUSTOMVERTEX)), (void**)&vtx_dst, D3DLOCK_DISCARD) < 0)
{
d3d9_state_block->Release();
return;
}
if (bd->pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0)
{
bd->pVB->Unlock();
d3d9_state_block->Release();
return;
}
// Copy and convert all vertices into a single contiguous buffer, convert colors to DX9 default format.
// FIXME-OPT: This is a minor waste of resource, the ideal is to use imconfig.h and
// 1) to avoid repacking colors: #define IMGUI_USE_BGRA_PACKED_COLOR
// 2) to avoid repacking vertices: #define IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT struct ImDrawVert { ImVec2 pos; float z; ImU32 col; ImVec2 uv; }
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
const ImDrawVert* vtx_src = cmd_list->VtxBuffer.Data;
for (int i = 0; i < cmd_list->VtxBuffer.Size; i++)
{
vtx_dst->pos[0] = vtx_src->pos.x;
vtx_dst->pos[1] = vtx_src->pos.y;
vtx_dst->pos[2] = 0.0f;
vtx_dst->col = IMGUI_COL_TO_DX9_ARGB(vtx_src->col);
vtx_dst->uv[0] = vtx_src->uv.x;
vtx_dst->uv[1] = vtx_src->uv.y;
vtx_dst++;
vtx_src++;
}
memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
idx_dst += cmd_list->IdxBuffer.Size;
}
bd->pVB->Unlock();
bd->pIB->Unlock();
bd->pd3dDevice->SetStreamSource(0, bd->pVB, 0, sizeof(CUSTOMVERTEX));
bd->pd3dDevice->SetIndices(bd->pIB);
bd->pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
// Setup desired DX state
ImGui_ImplDX9_SetupRenderState(draw_data);
// Render command lists
// (Because we merged all buffers into a single one, we maintain our own offset into them)
int global_vtx_offset = 0;
int global_idx_offset = 0;
ImVec2 clip_off = draw_data->DisplayPos;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback != NULL)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplDX9_SetupRenderState(draw_data);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
const RECT r = { (LONG)(pcmd->ClipRect.x - clip_off.x), (LONG)(pcmd->ClipRect.y - clip_off.y), (LONG)(pcmd->ClipRect.z - clip_off.x), (LONG)(pcmd->ClipRect.w - clip_off.y) };
const LPDIRECT3DTEXTURE9 texture = (LPDIRECT3DTEXTURE9)pcmd->GetTexID();
bd->pd3dDevice->SetTexture(0, texture);
bd->pd3dDevice->SetScissorRect(&r);
bd->pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, pcmd->VtxOffset + global_vtx_offset, 0, (UINT)cmd_list->VtxBuffer.Size, pcmd->IdxOffset + global_idx_offset, pcmd->ElemCount / 3);
}
}
global_idx_offset += cmd_list->IdxBuffer.Size;
global_vtx_offset += cmd_list->VtxBuffer.Size;
}
// Restore the DX9 transform
bd->pd3dDevice->SetTransform(D3DTS_WORLD, &last_world);
bd->pd3dDevice->SetTransform(D3DTS_VIEW, &last_view);
bd->pd3dDevice->SetTransform(D3DTS_PROJECTION, &last_projection);
// Restore the DX9 state
d3d9_state_block->Apply();
d3d9_state_block->Release();
}
bool ImGui_ImplDX9_Init(IDirect3DDevice9* device)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
// Setup backend capabilities flags
ImGui_ImplDX9_Data* bd = IM_NEW(ImGui_ImplDX9_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_dx9";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
bd->pd3dDevice = device;
bd->pd3dDevice->AddRef();
return true;
}
void ImGui_ImplDX9_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
ImGui_ImplDX9_InvalidateDeviceObjects();
if (bd->pd3dDevice) { bd->pd3dDevice->Release(); }
io.BackendRendererName = NULL;
io.BackendRendererUserData = NULL;
IM_DELETE(bd);
}
static bool ImGui_ImplDX9_CreateFontsTexture()
{
// Build texture atlas
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
unsigned char* pixels;
int width, height, bytes_per_pixel;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &bytes_per_pixel);
// Convert RGBA32 to BGRA32 (because RGBA32 is not well supported by DX9 devices)
#ifndef IMGUI_USE_BGRA_PACKED_COLOR
if (io.Fonts->TexPixelsUseColors)
{
ImU32* dst_start = (ImU32*)ImGui::MemAlloc((size_t)width * height * bytes_per_pixel);
for (ImU32* src = (ImU32*)pixels, *dst = dst_start, *dst_end = dst_start + (size_t)width * height; dst < dst_end; src++, dst++)
*dst = IMGUI_COL_TO_DX9_ARGB(*src);
pixels = (unsigned char*)dst_start;
}
#endif
// Upload texture to graphics system
bd->FontTexture = NULL;
if (bd->pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bd->FontTexture, NULL) < 0)
return false;
D3DLOCKED_RECT tex_locked_rect;
if (bd->FontTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK)
return false;
for (int y = 0; y < height; y++)
memcpy((unsigned char*)tex_locked_rect.pBits + (size_t)tex_locked_rect.Pitch * y, pixels + (size_t)width * bytes_per_pixel * y, (size_t)width * bytes_per_pixel);
bd->FontTexture->UnlockRect(0);
// Store our identifier
io.Fonts->SetTexID((ImTextureID)bd->FontTexture);
#ifndef IMGUI_USE_BGRA_PACKED_COLOR
if (io.Fonts->TexPixelsUseColors)
ImGui::MemFree(pixels);
#endif
return true;
}
bool ImGui_ImplDX9_CreateDeviceObjects()
{
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
if (!bd || !bd->pd3dDevice)
return false;
if (!ImGui_ImplDX9_CreateFontsTexture())
return false;
return true;
}
void ImGui_ImplDX9_InvalidateDeviceObjects()
{
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
if (!bd || !bd->pd3dDevice)
return;
if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
if (bd->FontTexture) { bd->FontTexture->Release(); bd->FontTexture = NULL; ImGui::GetIO().Fonts->SetTexID(NULL); } // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well.
}
void ImGui_ImplDX9_NewFrame()
{
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplDX9_Init()?");
if (!bd->FontTexture)
ImGui_ImplDX9_CreateDeviceObjects();
}

25
backends/imgui_impl_dx9.h Normal file
View File

@ -0,0 +1,25 @@
// dear imgui: Renderer Backend for DirectX9
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'LPDIRECT3DTEXTURE9' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
struct IDirect3DDevice9;
IMGUI_IMPL_API bool ImGui_ImplDX9_Init(IDirect3DDevice9* device);
IMGUI_IMPL_API void ImGui_ImplDX9_Shutdown();
IMGUI_IMPL_API void ImGui_ImplDX9_NewFrame();
IMGUI_IMPL_API void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API bool ImGui_ImplDX9_CreateDeviceObjects();
IMGUI_IMPL_API void ImGui_ImplDX9_InvalidateDeviceObjects();

View File

@ -0,0 +1,453 @@
// dear imgui: Platform Backend for GLFW
// This needs to be used along with a Renderer (e.g. OpenGL3, Vulkan, WebGPU..)
// (Info: GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)
// (Requires: GLFW 3.1+)
// Implemented features:
// [X] Platform: Clipboard support.
// [X] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange' (note: the resizing cursors requires GLFW 3.4+).
// [X] Platform: Keyboard arrays indexed using GLFW_KEY_* codes, e.g. ImGui::IsKeyPressed(GLFW_KEY_SPACE).
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-08-17: *BREAKING CHANGE*: Now using glfwSetWindowFocusCallback() to calling io.AddFocusEvent(). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() and forward it to the backend via ImGui_ImplGlfw_WindowFocusCallback().
// 2021-07-29: *BREAKING CHANGE*: Now using glfwSetCursorEnterCallback(). MousePos is correctly reported when the host platform window is hovered but not focused. If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() callback and forward it to the backend via ImGui_ImplGlfw_CursorEnterCallback().
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2020-01-17: Inputs: Disable error callback while assigning mouse cursors because some X11 setup don't have them and it generates errors.
// 2019-12-05: Inputs: Added support for new mouse cursors added in GLFW 3.4+ (resizing cursors, not allowed cursor).
// 2019-10-18: Misc: Previously installed user callbacks are now restored on shutdown.
// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter.
// 2019-05-11: Inputs: Don't filter value from character callback before calling AddInputCharacter().
// 2019-03-12: Misc: Preserve DisplayFramebufferScale when main window is minimized.
// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window.
// 2018-11-07: Inputs: When installing our GLFW callbacks, we save user's previously installed ones - if any - and chain call them.
// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls.
// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor.
// 2018-06-08: Misc: Extracted imgui_impl_glfw.cpp/.h away from the old combined GLFW+OpenGL/Vulkan examples.
// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag.
// 2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value, passed to glfwSetCursor()).
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
// 2018-01-25: Inputs: Added gamepad support if ImGuiConfigFlags_NavEnableGamepad is set.
// 2018-01-25: Inputs: Honoring the io.WantSetMousePos by repositioning the mouse (when using navigation and ImGuiConfigFlags_NavMoveMouse is set).
// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support.
// 2018-01-18: Inputs: Added mapping for ImGuiKey_Insert.
// 2017-08-25: Inputs: MousePos set to -FLT_MAX,-FLT_MAX when mouse is unavailable/missing (instead of -1,-1).
// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers.
#include "imgui.h"
#include "imgui_impl_glfw.h"
// GLFW
#include <GLFW/glfw3.h>
#ifdef _WIN32
#undef APIENTRY
#define GLFW_EXPOSE_NATIVE_WIN32
#include <GLFW/glfw3native.h> // for glfwGetWin32Window
#endif
#define GLFW_HAS_WINDOW_TOPMOST (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3200) // 3.2+ GLFW_FLOATING
#define GLFW_HAS_WINDOW_HOVERED (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3300) // 3.3+ GLFW_HOVERED
#define GLFW_HAS_WINDOW_ALPHA (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3300) // 3.3+ glfwSetWindowOpacity
#define GLFW_HAS_PER_MONITOR_DPI (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3300) // 3.3+ glfwGetMonitorContentScale
#define GLFW_HAS_VULKAN (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3200) // 3.2+ glfwCreateWindowSurface
#ifdef GLFW_RESIZE_NESW_CURSOR // Let's be nice to people who pulled GLFW between 2019-04-16 (3.4 define) and 2019-11-29 (cursors defines) // FIXME: Remove when GLFW 3.4 is released?
#define GLFW_HAS_NEW_CURSORS (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3400) // 3.4+ GLFW_RESIZE_ALL_CURSOR, GLFW_RESIZE_NESW_CURSOR, GLFW_RESIZE_NWSE_CURSOR, GLFW_NOT_ALLOWED_CURSOR
#else
#define GLFW_HAS_NEW_CURSORS (0)
#endif
// GLFW data
enum GlfwClientApi
{
GlfwClientApi_Unknown,
GlfwClientApi_OpenGL,
GlfwClientApi_Vulkan
};
struct ImGui_ImplGlfw_Data
{
GLFWwindow* Window;
GlfwClientApi ClientApi;
double Time;
GLFWwindow* MouseWindow;
bool MouseJustPressed[ImGuiMouseButton_COUNT];
GLFWcursor* MouseCursors[ImGuiMouseCursor_COUNT];
bool InstalledCallbacks;
// Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
GLFWwindowfocusfun PrevUserCallbackWindowFocus;
GLFWcursorenterfun PrevUserCallbackCursorEnter;
GLFWmousebuttonfun PrevUserCallbackMousebutton;
GLFWscrollfun PrevUserCallbackScroll;
GLFWkeyfun PrevUserCallbackKey;
GLFWcharfun PrevUserCallbackChar;
GLFWmonitorfun PrevUserCallbackMonitor;
ImGui_ImplGlfw_Data() { memset(this, 0, sizeof(*this)); }
};
// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
// - Because glfwPollEvents() process all windows and some events may be called outside of it, you will need to register your own callbacks
// (passing install_callbacks=false in ImGui_ImplGlfw_InitXXX functions), set the current dear imgui context and then call our callbacks.
// - Otherwise we may need to store a GLFWWindow* -> ImGuiContext* map and handle this in the backend, adding a little bit of extra complexity to it.
// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context.
static ImGui_ImplGlfw_Data* ImGui_ImplGlfw_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplGlfw_Data*)ImGui::GetIO().BackendPlatformUserData : NULL;
}
// Functions
static const char* ImGui_ImplGlfw_GetClipboardText(void* user_data)
{
return glfwGetClipboardString((GLFWwindow*)user_data);
}
static void ImGui_ImplGlfw_SetClipboardText(void* user_data, const char* text)
{
glfwSetClipboardString((GLFWwindow*)user_data, text);
}
void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if (bd->PrevUserCallbackMousebutton != NULL && window == bd->Window)
bd->PrevUserCallbackMousebutton(window, button, action, mods);
if (action == GLFW_PRESS && button >= 0 && button < IM_ARRAYSIZE(bd->MouseJustPressed))
bd->MouseJustPressed[button] = true;
}
void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset)
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if (bd->PrevUserCallbackScroll != NULL && window == bd->Window)
bd->PrevUserCallbackScroll(window, xoffset, yoffset);
ImGuiIO& io = ImGui::GetIO();
io.MouseWheelH += (float)xoffset;
io.MouseWheel += (float)yoffset;
}
void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if (bd->PrevUserCallbackKey != NULL && window == bd->Window)
bd->PrevUserCallbackKey(window, key, scancode, action, mods);
ImGuiIO& io = ImGui::GetIO();
if (key >= 0 && key < IM_ARRAYSIZE(io.KeysDown))
{
if (action == GLFW_PRESS)
io.KeysDown[key] = true;
if (action == GLFW_RELEASE)
io.KeysDown[key] = false;
}
// Modifiers are not reliable across systems
io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];
io.KeyShift = io.KeysDown[GLFW_KEY_LEFT_SHIFT] || io.KeysDown[GLFW_KEY_RIGHT_SHIFT];
io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];
#ifdef _WIN32
io.KeySuper = false;
#else
io.KeySuper = io.KeysDown[GLFW_KEY_LEFT_SUPER] || io.KeysDown[GLFW_KEY_RIGHT_SUPER];
#endif
}
void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused)
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if (bd->PrevUserCallbackWindowFocus != NULL && window == bd->Window)
bd->PrevUserCallbackWindowFocus(window, focused);
ImGuiIO& io = ImGui::GetIO();
io.AddFocusEvent(focused != 0);
}
void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered)
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if (bd->PrevUserCallbackCursorEnter != NULL && window == bd->Window)
bd->PrevUserCallbackCursorEnter(window, entered);
if (entered)
bd->MouseWindow = window;
if (!entered && bd->MouseWindow == window)
bd->MouseWindow = NULL;
}
void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c)
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if (bd->PrevUserCallbackChar != NULL && window == bd->Window)
bd->PrevUserCallbackChar(window, c);
ImGuiIO& io = ImGui::GetIO();
io.AddInputCharacter(c);
}
void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor*, int)
{
// Unused in 'master' branch but 'docking' branch will use this, so we declare it ahead of it so if you have to install callbacks you can install this one too.
}
static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, GlfwClientApi client_api)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!");
// Setup backend capabilities flags
ImGui_ImplGlfw_Data* bd = IM_NEW(ImGui_ImplGlfw_Data)();
io.BackendPlatformUserData = (void*)bd;
io.BackendPlatformName = "imgui_impl_glfw";
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
bd->Window = window;
bd->Time = 0.0;
// Keyboard mapping. Dear ImGui will use those indices to peek into the io.KeysDown[] array.
io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB;
io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;
io.KeyMap[ImGuiKey_PageUp] = GLFW_KEY_PAGE_UP;
io.KeyMap[ImGuiKey_PageDown] = GLFW_KEY_PAGE_DOWN;
io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;
io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;
io.KeyMap[ImGuiKey_Insert] = GLFW_KEY_INSERT;
io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Space] = GLFW_KEY_SPACE;
io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;
io.KeyMap[ImGuiKey_KeyPadEnter] = GLFW_KEY_KP_ENTER;
io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;
io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;
io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;
io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;
io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;
io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;
io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText;
io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText;
io.ClipboardUserData = bd->Window;
#if defined(_WIN32)
io.ImeWindowHandle = (void*)glfwGetWin32Window(bd->Window);
#endif
// Create mouse cursors
// (By design, on X11 cursors are user configurable and some cursors may be missing. When a cursor doesn't exist,
// GLFW will emit an error which will often be printed by the app, so we temporarily disable error reporting.
// Missing cursors will return NULL and our _UpdateMouseCursor() function will use the Arrow cursor instead.)
GLFWerrorfun prev_error_callback = glfwSetErrorCallback(NULL);
bd->MouseCursors[ImGuiMouseCursor_Arrow] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_TextInput] = glfwCreateStandardCursor(GLFW_IBEAM_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = glfwCreateStandardCursor(GLFW_VRESIZE_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_Hand] = glfwCreateStandardCursor(GLFW_HAND_CURSOR);
#if GLFW_HAS_NEW_CURSORS
bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_RESIZE_ALL_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_RESIZE_NESW_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_RESIZE_NWSE_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_NOT_ALLOWED_CURSOR);
#else
bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
#endif
glfwSetErrorCallback(prev_error_callback);
// Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
bd->PrevUserCallbackWindowFocus = NULL;
bd->PrevUserCallbackMousebutton = NULL;
bd->PrevUserCallbackScroll = NULL;
bd->PrevUserCallbackKey = NULL;
bd->PrevUserCallbackChar = NULL;
bd->PrevUserCallbackMonitor = NULL;
if (install_callbacks)
{
bd->InstalledCallbacks = true;
bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback);
bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback);
bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback);
bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback);
bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback);
bd->PrevUserCallbackChar = glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback);
bd->PrevUserCallbackMonitor = glfwSetMonitorCallback(ImGui_ImplGlfw_MonitorCallback);
}
bd->ClientApi = client_api;
return true;
}
bool ImGui_ImplGlfw_InitForOpenGL(GLFWwindow* window, bool install_callbacks)
{
return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_OpenGL);
}
bool ImGui_ImplGlfw_InitForVulkan(GLFWwindow* window, bool install_callbacks)
{
return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_Vulkan);
}
bool ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool install_callbacks)
{
return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_Unknown);
}
void ImGui_ImplGlfw_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if (bd->InstalledCallbacks)
{
glfwSetWindowFocusCallback(bd->Window, bd->PrevUserCallbackWindowFocus);
glfwSetCursorEnterCallback(bd->Window, bd->PrevUserCallbackCursorEnter);
glfwSetMouseButtonCallback(bd->Window, bd->PrevUserCallbackMousebutton);
glfwSetScrollCallback(bd->Window, bd->PrevUserCallbackScroll);
glfwSetKeyCallback(bd->Window, bd->PrevUserCallbackKey);
glfwSetCharCallback(bd->Window, bd->PrevUserCallbackChar);
glfwSetMonitorCallback(bd->PrevUserCallbackMonitor);
}
for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++)
glfwDestroyCursor(bd->MouseCursors[cursor_n]);
io.BackendPlatformName = NULL;
io.BackendPlatformUserData = NULL;
IM_DELETE(bd);
}
static void ImGui_ImplGlfw_UpdateMousePosAndButtons()
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
ImGuiIO& io = ImGui::GetIO();
const ImVec2 mouse_pos_prev = io.MousePos;
io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
// Update mouse buttons
// (if a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame)
for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
{
io.MouseDown[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0;
bd->MouseJustPressed[i] = false;
}
#ifdef __EMSCRIPTEN__
const bool focused = true;
#else
const bool focused = glfwGetWindowAttrib(bd->Window, GLFW_FOCUSED) != 0;
#endif
GLFWwindow* mouse_window = (bd->MouseWindow == bd->Window || focused) ? bd->Window : NULL;
// Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user)
if (io.WantSetMousePos && focused)
glfwSetCursorPos(bd->Window, (double)mouse_pos_prev.x, (double)mouse_pos_prev.y);
// Set Dear ImGui mouse position from OS position
if (mouse_window != NULL)
{
double mouse_x, mouse_y;
glfwGetCursorPos(mouse_window, &mouse_x, &mouse_y);
io.MousePos = ImVec2((float)mouse_x, (float)mouse_y);
}
}
static void ImGui_ImplGlfw_UpdateMouseCursor()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
if ((io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) || glfwGetInputMode(bd->Window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)
return;
ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor)
{
// Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
glfwSetInputMode(bd->Window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
}
else
{
// Show OS mouse cursor
// FIXME-PLATFORM: Unfocused windows seems to fail changing the mouse cursor with GLFW 3.2, but 3.3 works here.
glfwSetCursor(bd->Window, bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow]);
glfwSetInputMode(bd->Window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
}
}
static void ImGui_ImplGlfw_UpdateGamepads()
{
ImGuiIO& io = ImGui::GetIO();
memset(io.NavInputs, 0, sizeof(io.NavInputs));
if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
return;
// Update gamepad inputs
#define MAP_BUTTON(NAV_NO, BUTTON_NO) { if (buttons_count > BUTTON_NO && buttons[BUTTON_NO] == GLFW_PRESS) io.NavInputs[NAV_NO] = 1.0f; }
#define MAP_ANALOG(NAV_NO, AXIS_NO, V0, V1) { float v = (axes_count > AXIS_NO) ? axes[AXIS_NO] : V0; v = (v - V0) / (V1 - V0); if (v > 1.0f) v = 1.0f; if (io.NavInputs[NAV_NO] < v) io.NavInputs[NAV_NO] = v; }
int axes_count = 0, buttons_count = 0;
const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
const unsigned char* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
MAP_BUTTON(ImGuiNavInput_Activate, 0); // Cross / A
MAP_BUTTON(ImGuiNavInput_Cancel, 1); // Circle / B
MAP_BUTTON(ImGuiNavInput_Menu, 2); // Square / X
MAP_BUTTON(ImGuiNavInput_Input, 3); // Triangle / Y
MAP_BUTTON(ImGuiNavInput_DpadLeft, 13); // D-Pad Left
MAP_BUTTON(ImGuiNavInput_DpadRight, 11); // D-Pad Right
MAP_BUTTON(ImGuiNavInput_DpadUp, 10); // D-Pad Up
MAP_BUTTON(ImGuiNavInput_DpadDown, 12); // D-Pad Down
MAP_BUTTON(ImGuiNavInput_FocusPrev, 4); // L1 / LB
MAP_BUTTON(ImGuiNavInput_FocusNext, 5); // R1 / RB
MAP_BUTTON(ImGuiNavInput_TweakSlow, 4); // L1 / LB
MAP_BUTTON(ImGuiNavInput_TweakFast, 5); // R1 / RB
MAP_ANALOG(ImGuiNavInput_LStickLeft, 0, -0.3f, -0.9f);
MAP_ANALOG(ImGuiNavInput_LStickRight,0, +0.3f, +0.9f);
MAP_ANALOG(ImGuiNavInput_LStickUp, 1, +0.3f, +0.9f);
MAP_ANALOG(ImGuiNavInput_LStickDown, 1, -0.3f, -0.9f);
#undef MAP_BUTTON
#undef MAP_ANALOG
if (axes_count > 0 && buttons_count > 0)
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
else
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
}
void ImGui_ImplGlfw_NewFrame()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplGlfw_InitForXXX()?");
// Setup display size (every frame to accommodate for window resizing)
int w, h;
int display_w, display_h;
glfwGetWindowSize(bd->Window, &w, &h);
glfwGetFramebufferSize(bd->Window, &display_w, &display_h);
io.DisplaySize = ImVec2((float)w, (float)h);
if (w > 0 && h > 0)
io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h);
// Setup time step
double current_time = glfwGetTime();
io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f);
bd->Time = current_time;
ImGui_ImplGlfw_UpdateMousePosAndButtons();
ImGui_ImplGlfw_UpdateMouseCursor();
// Update game controllers (if enabled and available)
ImGui_ImplGlfw_UpdateGamepads();
}

View File

@ -0,0 +1,41 @@
// dear imgui: Platform Backend for GLFW
// This needs to be used along with a Renderer (e.g. OpenGL3, Vulkan, WebGPU..)
// (Info: GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)
// Implemented features:
// [X] Platform: Clipboard support.
// [X] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// [x] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. FIXME: 3 cursors types are missing from GLFW.
// [X] Platform: Keyboard arrays indexed using GLFW_KEY_* codes, e.g. ImGui::IsKeyPressed(GLFW_KEY_SPACE).
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// About GLSL version:
// The 'glsl_version' initialization parameter defaults to "#version 150" if NULL.
// Only override if your GL version doesn't handle this GLSL version. Keep NULL if unsure!
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
struct GLFWwindow;
struct GLFWmonitor;
IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForOpenGL(GLFWwindow* window, bool install_callbacks);
IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForVulkan(GLFWwindow* window, bool install_callbacks);
IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool install_callbacks);
IMGUI_IMPL_API void ImGui_ImplGlfw_Shutdown();
IMGUI_IMPL_API void ImGui_ImplGlfw_NewFrame();
// GLFW callbacks
// - When calling Init with 'install_callbacks=true': GLFW callbacks will be installed for you. They will call user's previously installed callbacks, if any.
// - When calling Init with 'install_callbacks=false': GLFW callbacks won't be installed. You will need to call those function yourself from your own GLFW callbacks.
IMGUI_IMPL_API void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused);
IMGUI_IMPL_API void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered);
IMGUI_IMPL_API void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
IMGUI_IMPL_API void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
IMGUI_IMPL_API void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
IMGUI_IMPL_API void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c);
IMGUI_IMPL_API void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor* monitor, int event);

View File

@ -0,0 +1,217 @@
// dear imgui: Platform Backend for GLUT/FreeGLUT
// This needs to be used along with a Renderer (e.g. OpenGL2)
// !!! GLUT/FreeGLUT IS OBSOLETE PREHISTORIC SOFTWARE. Using GLUT is not recommended unless you really miss the 90's. !!!
// !!! If someone or something is teaching you GLUT today, you are being abused. Please show some resistance. !!!
// !!! Nowadays, prefer using GLFW or SDL instead!
// Issues:
// [ ] Platform: GLUT is unable to distinguish e.g. Backspace from CTRL+H or TAB from CTRL+I
// [ ] Platform: Missing mouse cursor shape/visibility support.
// [ ] Platform: Missing clipboard support (not supported by Glut).
// [ ] Platform: Missing gamepad support.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2019-04-03: Misc: Renamed imgui_impl_freeglut.cpp/.h to imgui_impl_glut.cpp/.h.
// 2019-03-25: Misc: Made io.DeltaTime always above zero.
// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window.
// 2018-03-22: Added GLUT Platform binding.
#include "imgui.h"
#include "imgui_impl_glut.h"
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/freeglut.h>
#endif
#ifdef _MSC_VER
#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)
#endif
static int g_Time = 0; // Current time, in milliseconds
bool ImGui_ImplGLUT_Init()
{
ImGuiIO& io = ImGui::GetIO();
#ifdef FREEGLUT
io.BackendPlatformName = "imgui_impl_glut (freeglut)";
#else
io.BackendPlatformName = "imgui_impl_glut";
#endif
g_Time = 0;
// Glut has 1 function for characters and one for "special keys". We map the characters in the 0..255 range and the keys above.
io.KeyMap[ImGuiKey_Tab] = '\t'; // == 9 == CTRL+I
io.KeyMap[ImGuiKey_LeftArrow] = 256 + GLUT_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = 256 + GLUT_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = 256 + GLUT_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = 256 + GLUT_KEY_DOWN;
io.KeyMap[ImGuiKey_PageUp] = 256 + GLUT_KEY_PAGE_UP;
io.KeyMap[ImGuiKey_PageDown] = 256 + GLUT_KEY_PAGE_DOWN;
io.KeyMap[ImGuiKey_Home] = 256 + GLUT_KEY_HOME;
io.KeyMap[ImGuiKey_End] = 256 + GLUT_KEY_END;
io.KeyMap[ImGuiKey_Insert] = 256 + GLUT_KEY_INSERT;
io.KeyMap[ImGuiKey_Delete] = 127;
io.KeyMap[ImGuiKey_Backspace] = 8; // == CTRL+H
io.KeyMap[ImGuiKey_Space] = ' ';
io.KeyMap[ImGuiKey_Enter] = 13; // == CTRL+M
io.KeyMap[ImGuiKey_Escape] = 27;
io.KeyMap[ImGuiKey_KeyPadEnter] = 13; // == CTRL+M
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
return true;
}
void ImGui_ImplGLUT_InstallFuncs()
{
glutReshapeFunc(ImGui_ImplGLUT_ReshapeFunc);
glutMotionFunc(ImGui_ImplGLUT_MotionFunc);
glutPassiveMotionFunc(ImGui_ImplGLUT_MotionFunc);
glutMouseFunc(ImGui_ImplGLUT_MouseFunc);
#ifdef __FREEGLUT_EXT_H__
glutMouseWheelFunc(ImGui_ImplGLUT_MouseWheelFunc);
#endif
glutKeyboardFunc(ImGui_ImplGLUT_KeyboardFunc);
glutKeyboardUpFunc(ImGui_ImplGLUT_KeyboardUpFunc);
glutSpecialFunc(ImGui_ImplGLUT_SpecialFunc);
glutSpecialUpFunc(ImGui_ImplGLUT_SpecialUpFunc);
}
void ImGui_ImplGLUT_Shutdown()
{
}
void ImGui_ImplGLUT_NewFrame()
{
// Setup time step
ImGuiIO& io = ImGui::GetIO();
int current_time = glutGet(GLUT_ELAPSED_TIME);
int delta_time_ms = (current_time - g_Time);
if (delta_time_ms <= 0)
delta_time_ms = 1;
io.DeltaTime = delta_time_ms / 1000.0f;
g_Time = current_time;
// Start the frame
ImGui::NewFrame();
}
static void ImGui_ImplGLUT_UpdateKeyboardMods()
{
ImGuiIO& io = ImGui::GetIO();
int mods = glutGetModifiers();
io.KeyCtrl = (mods & GLUT_ACTIVE_CTRL) != 0;
io.KeyShift = (mods & GLUT_ACTIVE_SHIFT) != 0;
io.KeyAlt = (mods & GLUT_ACTIVE_ALT) != 0;
}
void ImGui_ImplGLUT_KeyboardFunc(unsigned char c, int x, int y)
{
// Send character to imgui
//printf("char_down_func %d '%c'\n", c, c);
ImGuiIO& io = ImGui::GetIO();
if (c >= 32)
io.AddInputCharacter((unsigned int)c);
// Store letters in KeysDown[] array as both uppercase and lowercase + Handle GLUT translating CTRL+A..CTRL+Z as 1..26.
// This is a hacky mess but GLUT is unable to distinguish e.g. a TAB key from CTRL+I so this is probably the best we can do here.
if (c >= 1 && c <= 26)
io.KeysDown[c] = io.KeysDown[c - 1 + 'a'] = io.KeysDown[c - 1 + 'A'] = true;
else if (c >= 'a' && c <= 'z')
io.KeysDown[c] = io.KeysDown[c - 'a' + 'A'] = true;
else if (c >= 'A' && c <= 'Z')
io.KeysDown[c] = io.KeysDown[c - 'A' + 'a'] = true;
else
io.KeysDown[c] = true;
ImGui_ImplGLUT_UpdateKeyboardMods();
(void)x; (void)y; // Unused
}
void ImGui_ImplGLUT_KeyboardUpFunc(unsigned char c, int x, int y)
{
//printf("char_up_func %d '%c'\n", c, c);
ImGuiIO& io = ImGui::GetIO();
if (c >= 1 && c <= 26)
io.KeysDown[c] = io.KeysDown[c - 1 + 'a'] = io.KeysDown[c - 1 + 'A'] = false;
else if (c >= 'a' && c <= 'z')
io.KeysDown[c] = io.KeysDown[c - 'a' + 'A'] = false;
else if (c >= 'A' && c <= 'Z')
io.KeysDown[c] = io.KeysDown[c - 'A' + 'a'] = false;
else
io.KeysDown[c] = false;
ImGui_ImplGLUT_UpdateKeyboardMods();
(void)x; (void)y; // Unused
}
void ImGui_ImplGLUT_SpecialFunc(int key, int x, int y)
{
//printf("key_down_func %d\n", key);
ImGuiIO& io = ImGui::GetIO();
if (key + 256 < IM_ARRAYSIZE(io.KeysDown))
io.KeysDown[key + 256] = true;
ImGui_ImplGLUT_UpdateKeyboardMods();
(void)x; (void)y; // Unused
}
void ImGui_ImplGLUT_SpecialUpFunc(int key, int x, int y)
{
//printf("key_up_func %d\n", key);
ImGuiIO& io = ImGui::GetIO();
if (key + 256 < IM_ARRAYSIZE(io.KeysDown))
io.KeysDown[key + 256] = false;
ImGui_ImplGLUT_UpdateKeyboardMods();
(void)x; (void)y; // Unused
}
void ImGui_ImplGLUT_MouseFunc(int glut_button, int state, int x, int y)
{
ImGuiIO& io = ImGui::GetIO();
io.MousePos = ImVec2((float)x, (float)y);
int button = -1;
if (glut_button == GLUT_LEFT_BUTTON) button = 0;
if (glut_button == GLUT_RIGHT_BUTTON) button = 1;
if (glut_button == GLUT_MIDDLE_BUTTON) button = 2;
if (button != -1 && state == GLUT_DOWN)
io.MouseDown[button] = true;
if (button != -1 && state == GLUT_UP)
io.MouseDown[button] = false;
}
#ifdef __FREEGLUT_EXT_H__
void ImGui_ImplGLUT_MouseWheelFunc(int button, int dir, int x, int y)
{
ImGuiIO& io = ImGui::GetIO();
io.MousePos = ImVec2((float)x, (float)y);
if (dir > 0)
io.MouseWheel += 1.0;
else if (dir < 0)
io.MouseWheel -= 1.0;
(void)button; // Unused
}
#endif
void ImGui_ImplGLUT_ReshapeFunc(int w, int h)
{
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)w, (float)h);
}
void ImGui_ImplGLUT_MotionFunc(int x, int y)
{
ImGuiIO& io = ImGui::GetIO();
io.MousePos = ImVec2((float)x, (float)y);
}

View File

@ -0,0 +1,37 @@
// dear imgui: Platform Backend for GLUT/FreeGLUT
// This needs to be used along with a Renderer (e.g. OpenGL2)
// !!! GLUT/FreeGLUT IS OBSOLETE PREHISTORIC SOFTWARE. Using GLUT is not recommended unless you really miss the 90's. !!!
// !!! If someone or something is teaching you GLUT today, you are being abused. Please show some resistance. !!!
// !!! Nowadays, prefer using GLFW or SDL instead!
// Issues:
// [ ] Platform: GLUT is unable to distinguish e.g. Backspace from CTRL+H or TAB from CTRL+I
// [ ] Platform: Missing mouse cursor shape/visibility support.
// [ ] Platform: Missing clipboard support (not supported by Glut).
// [ ] Platform: Missing gamepad support.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
IMGUI_IMPL_API bool ImGui_ImplGLUT_Init();
IMGUI_IMPL_API void ImGui_ImplGLUT_InstallFuncs();
IMGUI_IMPL_API void ImGui_ImplGLUT_Shutdown();
IMGUI_IMPL_API void ImGui_ImplGLUT_NewFrame();
// You can call ImGui_ImplGLUT_InstallFuncs() to get all those functions installed automatically,
// or call them yourself from your own GLUT handlers. We are using the same weird names as GLUT for consistency..
//---------------------------------------- GLUT name --------------------------------------------- Decent Name ---------
IMGUI_IMPL_API void ImGui_ImplGLUT_ReshapeFunc(int w, int h); // ~ ResizeFunc
IMGUI_IMPL_API void ImGui_ImplGLUT_MotionFunc(int x, int y); // ~ MouseMoveFunc
IMGUI_IMPL_API void ImGui_ImplGLUT_MouseFunc(int button, int state, int x, int y); // ~ MouseButtonFunc
IMGUI_IMPL_API void ImGui_ImplGLUT_MouseWheelFunc(int button, int dir, int x, int y); // ~ MouseWheelFunc
IMGUI_IMPL_API void ImGui_ImplGLUT_KeyboardFunc(unsigned char c, int x, int y); // ~ CharPressedFunc
IMGUI_IMPL_API void ImGui_ImplGLUT_KeyboardUpFunc(unsigned char c, int x, int y); // ~ CharReleasedFunc
IMGUI_IMPL_API void ImGui_ImplGLUT_SpecialFunc(int key, int x, int y); // ~ KeyPressedFunc
IMGUI_IMPL_API void ImGui_ImplGLUT_SpecialUpFunc(int key, int x, int y); // ~ KeyReleasedFunc

View File

@ -0,0 +1,318 @@
// dear imgui: Renderer + Platform Backend for Marmalade + IwGx
// Marmalade code: Copyright (C) 2015 by Giovanni Zito (this file is part of Dear ImGui)
// Implemented features:
// [X] Renderer: User texture binding. Use 'CIwTexture*' as ImTextureID. Read the FAQ about ImTextureID!
// Missing features:
// [ ] Renderer: Clipping rectangles are not honored.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-05-19: Renderer: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter.
// 2019-05-11: Inputs: Don't filter value from character callback before calling AddInputCharacter().
// 2018-11-30: Misc: Setting up io.BackendPlatformName/io.BackendRendererName so they can be displayed in the About Window.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_Marmalade_RenderDrawData() in the .h file so you can call it yourself.
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
#include "imgui.h"
#include "imgui_impl_marmalade.h"
#include <s3eClipboard.h>
#include <s3ePointer.h>
#include <s3eKeyboard.h>
#include <IwTexture.h>
#include <IwGx.h>
// Data
static double g_Time = 0.0f;
static bool g_MousePressed[3] = { false, false, false };
static CIwTexture* g_FontTexture = NULL;
static char* g_ClipboardText = NULL;
static bool g_osdKeyboardEnabled = false;
// use this setting to scale the interface - e.g. on device you could use 2 or 3 scale factor
static ImVec2 g_RenderScale = ImVec2(1.0f, 1.0f);
// Render function.
void ImGui_Marmalade_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
// Render command lists
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;
const int nVert = cmd_list->VtxBuffer.Size;
CIwFVec2* pVertStream = IW_GX_ALLOC(CIwFVec2, nVert);
CIwFVec2* pUVStream = IW_GX_ALLOC(CIwFVec2, nVert);
CIwColour* pColStream = IW_GX_ALLOC(CIwColour, nVert);
for (int i = 0; i < nVert; i++)
{
// FIXME-OPT: optimize multiplication on GPU using vertex shader/projection matrix.
pVertStream[i].x = cmd_list->VtxBuffer[i].pos.x * g_RenderScale.x;
pVertStream[i].y = cmd_list->VtxBuffer[i].pos.y * g_RenderScale.y;
pUVStream[i].x = cmd_list->VtxBuffer[i].uv.x;
pUVStream[i].y = cmd_list->VtxBuffer[i].uv.y;
pColStream[i] = cmd_list->VtxBuffer[i].col;
}
IwGxSetVertStreamScreenSpace(pVertStream, nVert);
IwGxSetUVStream(pUVStream);
IwGxSetColStream(pColStream, nVert);
IwGxSetNormStream(0);
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// FIXME: Not honoring ClipRect fields.
CIwMaterial* pCurrentMaterial = IW_GX_ALLOC_MATERIAL();
pCurrentMaterial->SetShadeMode(CIwMaterial::SHADE_FLAT);
pCurrentMaterial->SetCullMode(CIwMaterial::CULL_NONE);
pCurrentMaterial->SetFiltering(false);
pCurrentMaterial->SetAlphaMode(CIwMaterial::ALPHA_BLEND);
pCurrentMaterial->SetDepthWriteMode(CIwMaterial::DEPTH_WRITE_NORMAL);
pCurrentMaterial->SetAlphaTestMode(CIwMaterial::ALPHATEST_DISABLED);
pCurrentMaterial->SetTexture((CIwTexture*)pcmd->GetTexID());
IwGxSetMaterial(pCurrentMaterial);
IwGxDrawPrims(IW_GX_TRI_LIST, (uint16*)idx_buffer, pcmd->ElemCount);
}
idx_buffer += pcmd->ElemCount;
}
IwGxFlush();
}
// TODO: restore modified state (i.e. mvp matrix)
}
static const char* ImGui_Marmalade_GetClipboardText(void* /*user_data*/)
{
if (!s3eClipboardAvailable())
return NULL;
if (int size = s3eClipboardGetText(NULL, 0))
{
if (g_ClipboardText)
delete[] g_ClipboardText;
g_ClipboardText = new char[size];
g_ClipboardText[0] = '\0';
s3eClipboardGetText(g_ClipboardText, size);
}
return g_ClipboardText;
}
static void ImGui_Marmalade_SetClipboardText(void* /*user_data*/, const char* text)
{
if (s3eClipboardAvailable())
s3eClipboardSetText(text);
}
int32 ImGui_Marmalade_PointerButtonEventCallback(void* system_data, void* user_data)
{
// pEvent->m_Button is of type s3ePointerButton and indicates which mouse
// button was pressed. For touchscreen this should always have the value
// S3E_POINTER_BUTTON_SELECT
s3ePointerEvent* pEvent = (s3ePointerEvent*)system_data;
if (pEvent->m_Pressed == 1)
{
if (pEvent->m_Button == S3E_POINTER_BUTTON_LEFTMOUSE)
g_MousePressed[0] = true;
if (pEvent->m_Button == S3E_POINTER_BUTTON_RIGHTMOUSE)
g_MousePressed[1] = true;
if (pEvent->m_Button == S3E_POINTER_BUTTON_MIDDLEMOUSE)
g_MousePressed[2] = true;
if (pEvent->m_Button == S3E_POINTER_BUTTON_MOUSEWHEELUP)
io.MouseWheel += pEvent->m_y;
if (pEvent->m_Button == S3E_POINTER_BUTTON_MOUSEWHEELDOWN)
io.MouseWheel += pEvent->m_y;
}
return 0;
}
int32 ImGui_Marmalade_KeyCallback(void* system_data, void* user_data)
{
ImGuiIO& io = ImGui::GetIO();
s3eKeyboardEvent* e = (s3eKeyboardEvent*)system_data;
if (e->m_Pressed == 1)
io.KeysDown[e->m_Key] = true;
if (e->m_Pressed == 0)
io.KeysDown[e->m_Key] = false;
io.KeyCtrl = s3eKeyboardGetState(s3eKeyLeftControl) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightControl) == S3E_KEY_STATE_DOWN;
io.KeyShift = s3eKeyboardGetState(s3eKeyLeftShift) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightShift) == S3E_KEY_STATE_DOWN;
io.KeyAlt = s3eKeyboardGetState(s3eKeyLeftAlt) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightAlt) == S3E_KEY_STATE_DOWN;
io.KeySuper = s3eKeyboardGetState(s3eKeyLeftWindows) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightWindows) == S3E_KEY_STATE_DOWN;
return 0;
}
int32 ImGui_Marmalade_CharCallback(void* system_data, void* user_data)
{
ImGuiIO& io = ImGui::GetIO();
s3eKeyboardCharEvent* e = (s3eKeyboardCharEvent*)system_data;
io.AddInputCharacter((unsigned int)e->m_Char);
return 0;
}
bool ImGui_Marmalade_CreateDeviceObjects()
{
// Build texture atlas
ImGuiIO& io = ImGui::GetIO();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Upload texture to graphics system
g_FontTexture = new CIwTexture();
g_FontTexture->SetModifiable(true);
CIwImage& image = g_FontTexture->GetImage();
image.SetFormat(CIwImage::ARGB_8888);
image.SetWidth(width);
image.SetHeight(height);
image.SetBuffers(); // allocates and own buffers
image.ReadTexels(pixels);
g_FontTexture->SetMipMapping(false);
g_FontTexture->SetFiltering(false);
g_FontTexture->Upload();
// Store our identifier
io.Fonts->SetTexID((ImTextureID)g_FontTexture);
return true;
}
void ImGui_Marmalade_InvalidateDeviceObjects()
{
if (g_ClipboardText)
{
delete[] g_ClipboardText;
g_ClipboardText = NULL;
}
if (g_FontTexture)
{
ImGui::GetIO().Fonts->SetTexID(0);
delete g_FontTexture;
g_FontTexture = NULL;
}
}
bool ImGui_Marmalade_Init(bool install_callbacks)
{
ImGuiIO& io = ImGui::GetIO();
io.BackendPlatformName = io.BackendRendererName = "imgui_impl_marmalade";
// Keyboard mapping. Dear ImGui will use those indices to peek into the io.KeysDown[] array.
io.KeyMap[ImGuiKey_Tab] = s3eKeyTab
io.KeyMap[ImGuiKey_LeftArrow] = s3eKeyLeft;
io.KeyMap[ImGuiKey_RightArrow] = s3eKeyRight;
io.KeyMap[ImGuiKey_UpArrow] = s3eKeyUp;
io.KeyMap[ImGuiKey_DownArrow] = s3eKeyDown;
io.KeyMap[ImGuiKey_PageUp] = s3eKeyPageUp;
io.KeyMap[ImGuiKey_PageDown] = s3eKeyPageDown;
io.KeyMap[ImGuiKey_Home] = s3eKeyHome;
io.KeyMap[ImGuiKey_End] = s3eKeyEnd;
io.KeyMap[ImGuiKey_Insert] = s3eKeyInsert;
io.KeyMap[ImGuiKey_Delete] = s3eKeyDelete;
io.KeyMap[ImGuiKey_Backspace] = s3eKeyBackspace;
io.KeyMap[ImGuiKey_Space] = s3eKeySpace;
io.KeyMap[ImGuiKey_Enter] = s3eKeyEnter;
io.KeyMap[ImGuiKey_Escape] = s3eKeyEsc;
io.KeyMap[ImGuiKey_KeyPadEnter] = s3eKeyNumPadEnter;
io.KeyMap[ImGuiKey_A] = s3eKeyA;
io.KeyMap[ImGuiKey_C] = s3eKeyC;
io.KeyMap[ImGuiKey_V] = s3eKeyV;
io.KeyMap[ImGuiKey_X] = s3eKeyX;
io.KeyMap[ImGuiKey_Y] = s3eKeyY;
io.KeyMap[ImGuiKey_Z] = s3eKeyZ;
io.SetClipboardTextFn = ImGui_Marmalade_SetClipboardText;
io.GetClipboardTextFn = ImGui_Marmalade_GetClipboardText;
if (install_callbacks)
{
s3ePointerRegister(S3E_POINTER_BUTTON_EVENT, ImGui_Marmalade_PointerButtonEventCallback, 0);
s3eKeyboardRegister(S3E_KEYBOARD_KEY_EVENT, ImGui_Marmalade_KeyCallback, 0);
s3eKeyboardRegister(S3E_KEYBOARD_CHAR_EVENT, ImGui_Marmalade_CharCallback, 0);
}
return true;
}
void ImGui_Marmalade_Shutdown()
{
ImGui_Marmalade_InvalidateDeviceObjects();
}
void ImGui_Marmalade_NewFrame()
{
if (!g_FontTexture)
ImGui_Marmalade_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w = IwGxGetScreenWidth(), h = IwGxGetScreenHeight();
io.DisplaySize = ImVec2((float)w, (float)h);
// For retina display or other situations where window coordinates are different from framebuffer coordinates. User storage only, presently not used by ImGui.
io.DisplayFramebufferScale = g_scale;
// Setup time step
double current_time = s3eTimerGetUST() / 1000.0f;
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f);
g_Time = current_time;
double mouse_x, mouse_y;
mouse_x = s3ePointerGetX();
mouse_y = s3ePointerGetY();
io.MousePos = ImVec2((float)mouse_x / g_scale.x, (float)mouse_y / g_scale.y); // Mouse position (set to -FLT_MAX,-FLT_MAX if no mouse / on another screen, etc.)
for (int i = 0; i < 3; i++)
{
io.MouseDown[i] = g_MousePressed[i] || s3ePointerGetState((s3ePointerButton)i) != S3E_POINTER_STATE_UP; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
g_MousePressed[i] = false;
}
// TODO: Hide OS mouse cursor if ImGui is drawing it
// s3ePointerSetInt(S3E_POINTER_HIDE_CURSOR,(io.MouseDrawCursor ? 0 : 1));
// Show/hide OSD keyboard
if (io.WantTextInput)
{
// Some text input widget is active?
if (!g_osdKeyboardEnabled)
{
g_osdKeyboardEnabled = true;
s3eKeyboardSetInt(S3E_KEYBOARD_GET_CHAR, 1); // show OSD keyboard
}
}
else
{
// No text input widget is active
if (g_osdKeyboardEnabled)
{
g_osdKeyboardEnabled = false;
s3eKeyboardSetInt(S3E_KEYBOARD_GET_CHAR, 0); // hide OSD keyboard
}
}
}

View File

@ -0,0 +1,28 @@
// dear imgui: Renderer + Platform Backend for Marmalade + IwGx
// Marmalade code: Copyright (C) 2015 by Giovanni Zito (this file is part of Dear ImGui)
// Implemented features:
// [X] Renderer: User texture binding. Use 'CIwTexture*' as ImTextureID. Read the FAQ about ImTextureID!
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
IMGUI_IMPL_API bool ImGui_Marmalade_Init(bool install_callbacks);
IMGUI_IMPL_API void ImGui_Marmalade_Shutdown();
IMGUI_IMPL_API void ImGui_Marmalade_NewFrame();
IMGUI_IMPL_API void ImGui_Marmalade_RenderDrawData(ImDrawData* draw_data);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API void ImGui_Marmalade_InvalidateDeviceObjects();
IMGUI_IMPL_API bool ImGui_Marmalade_CreateDeviceObjects();
// Callbacks (installed by default if you enable 'install_callbacks' during initialization)
// You can also handle inputs yourself and use those as a reference.
IMGUI_IMPL_API int32 ImGui_Marmalade_PointerButtonEventCallback(void* system_data, void* user_data);
IMGUI_IMPL_API int32 ImGui_Marmalade_KeyCallback(void* system_data, void* user_data);
IMGUI_IMPL_API int32 ImGui_Marmalade_CharCallback(void* system_data, void* user_data);

View File

@ -0,0 +1,29 @@
// dear imgui: Renderer Backend for Metal
// This needs to be used along with a Platform Backend (e.g. OSX)
// Implemented features:
// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#include "imgui.h" // IMGUI_IMPL_API
@class MTLRenderPassDescriptor;
@protocol MTLDevice, MTLCommandBuffer, MTLRenderCommandEncoder;
IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor);
IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data,
id<MTLCommandBuffer> commandBuffer,
id<MTLRenderCommandEncoder> commandEncoder);
// Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateFontsTexture(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyFontsTexture();
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();

View File

@ -0,0 +1,554 @@
// dear imgui: Renderer Backend for Metal
// This needs to be used along with a Platform Backend (e.g. OSX)
// Implemented features:
// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-05-19: Metal: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-02-18: Metal: Change blending equation to preserve alpha in output buffer.
// 2021-01-25: Metal: Fixed texture storage mode when building on Mac Catalyst.
// 2019-05-29: Metal: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: Metal: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2019-02-11: Metal: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-07-05: Metal: Added new Metal backend implementation.
#include "imgui.h"
#include "imgui_impl_metal.h"
#import <Metal/Metal.h>
// #import <QuartzCore/CAMetalLayer.h> // Not supported in XCode 9.2. Maybe a macro to detect the SDK version can be used (something like #if MACOS_SDK >= 10.13 ...)
#import <simd/simd.h>
#pragma mark - Support classes
// A wrapper around a MTLBuffer object that knows the last time it was reused
@interface MetalBuffer : NSObject
@property (nonatomic, strong) id<MTLBuffer> buffer;
@property (nonatomic, assign) NSTimeInterval lastReuseTime;
- (instancetype)initWithBuffer:(id<MTLBuffer>)buffer;
@end
// An object that encapsulates the data necessary to uniquely identify a
// render pipeline state. These are used as cache keys.
@interface FramebufferDescriptor : NSObject<NSCopying>
@property (nonatomic, assign) unsigned long sampleCount;
@property (nonatomic, assign) MTLPixelFormat colorPixelFormat;
@property (nonatomic, assign) MTLPixelFormat depthPixelFormat;
@property (nonatomic, assign) MTLPixelFormat stencilPixelFormat;
- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor *)renderPassDescriptor;
@end
// A singleton that stores long-lived objects that are needed by the Metal
// renderer backend. Stores the render pipeline state cache and the default
// font texture, and manages the reusable buffer cache.
@interface MetalContext : NSObject
@property (nonatomic, strong) id<MTLDepthStencilState> depthStencilState;
@property (nonatomic, strong) FramebufferDescriptor *framebufferDescriptor; // framebuffer descriptor for current frame; transient
@property (nonatomic, strong) NSMutableDictionary *renderPipelineStateCache; // pipeline cache; keyed on framebuffer descriptors
@property (nonatomic, strong, nullable) id<MTLTexture> fontTexture;
@property (nonatomic, strong) NSMutableArray<MetalBuffer *> *bufferCache;
@property (nonatomic, assign) NSTimeInterval lastBufferCachePurge;
- (void)makeDeviceObjectsWithDevice:(id<MTLDevice>)device;
- (void)makeFontTextureWithDevice:(id<MTLDevice>)device;
- (MetalBuffer *)dequeueReusableBufferOfLength:(NSUInteger)length device:(id<MTLDevice>)device;
- (void)enqueueReusableBuffer:(MetalBuffer *)buffer;
- (id<MTLRenderPipelineState>)renderPipelineStateForFrameAndDevice:(id<MTLDevice>)device;
- (void)emptyRenderPipelineStateCache;
- (void)setupRenderState:(ImDrawData *)drawData
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder
renderPipelineState:(id<MTLRenderPipelineState>)renderPipelineState
vertexBuffer:(MetalBuffer *)vertexBuffer
vertexBufferOffset:(size_t)vertexBufferOffset;
- (void)renderDrawData:(ImDrawData *)drawData
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder;
@end
static MetalContext *g_sharedMetalContext = nil;
#pragma mark - ImGui API implementation
bool ImGui_ImplMetal_Init(id<MTLDevice> device)
{
ImGuiIO& io = ImGui::GetIO();
io.BackendRendererName = "imgui_impl_metal";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
g_sharedMetalContext = [[MetalContext alloc] init];
});
ImGui_ImplMetal_CreateDeviceObjects(device);
return true;
}
void ImGui_ImplMetal_Shutdown()
{
ImGui_ImplMetal_DestroyDeviceObjects();
}
void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor *renderPassDescriptor)
{
IM_ASSERT(g_sharedMetalContext != nil && "No Metal context. Did you call ImGui_ImplMetal_Init() ?");
g_sharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor];
}
// Metal Render function.
void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, id<MTLCommandBuffer> commandBuffer, id<MTLRenderCommandEncoder> commandEncoder)
{
[g_sharedMetalContext renderDrawData:draw_data commandBuffer:commandBuffer commandEncoder:commandEncoder];
}
bool ImGui_ImplMetal_CreateFontsTexture(id<MTLDevice> device)
{
[g_sharedMetalContext makeFontTextureWithDevice:device];
ImGuiIO& io = ImGui::GetIO();
io.Fonts->SetTexID((__bridge void *)g_sharedMetalContext.fontTexture); // ImTextureID == void*
return (g_sharedMetalContext.fontTexture != nil);
}
void ImGui_ImplMetal_DestroyFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
g_sharedMetalContext.fontTexture = nil;
io.Fonts->SetTexID(nullptr);
}
bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device)
{
[g_sharedMetalContext makeDeviceObjectsWithDevice:device];
ImGui_ImplMetal_CreateFontsTexture(device);
return true;
}
void ImGui_ImplMetal_DestroyDeviceObjects()
{
ImGui_ImplMetal_DestroyFontsTexture();
[g_sharedMetalContext emptyRenderPipelineStateCache];
}
#pragma mark - MetalBuffer implementation
@implementation MetalBuffer
- (instancetype)initWithBuffer:(id<MTLBuffer>)buffer
{
if ((self = [super init]))
{
_buffer = buffer;
_lastReuseTime = [NSDate date].timeIntervalSince1970;
}
return self;
}
@end
#pragma mark - FramebufferDescriptor implementation
@implementation FramebufferDescriptor
- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor *)renderPassDescriptor
{
if ((self = [super init]))
{
_sampleCount = renderPassDescriptor.colorAttachments[0].texture.sampleCount;
_colorPixelFormat = renderPassDescriptor.colorAttachments[0].texture.pixelFormat;
_depthPixelFormat = renderPassDescriptor.depthAttachment.texture.pixelFormat;
_stencilPixelFormat = renderPassDescriptor.stencilAttachment.texture.pixelFormat;
}
return self;
}
- (nonnull id)copyWithZone:(nullable NSZone *)zone
{
FramebufferDescriptor *copy = [[FramebufferDescriptor allocWithZone:zone] init];
copy.sampleCount = self.sampleCount;
copy.colorPixelFormat = self.colorPixelFormat;
copy.depthPixelFormat = self.depthPixelFormat;
copy.stencilPixelFormat = self.stencilPixelFormat;
return copy;
}
- (NSUInteger)hash
{
NSUInteger sc = _sampleCount & 0x3;
NSUInteger cf = _colorPixelFormat & 0x3FF;
NSUInteger df = _depthPixelFormat & 0x3FF;
NSUInteger sf = _stencilPixelFormat & 0x3FF;
NSUInteger hash = (sf << 22) | (df << 12) | (cf << 2) | sc;
return hash;
}
- (BOOL)isEqual:(id)object
{
FramebufferDescriptor *other = object;
if (![other isKindOfClass:[FramebufferDescriptor class]])
return NO;
return other.sampleCount == self.sampleCount &&
other.colorPixelFormat == self.colorPixelFormat &&
other.depthPixelFormat == self.depthPixelFormat &&
other.stencilPixelFormat == self.stencilPixelFormat;
}
@end
#pragma mark - MetalContext implementation
@implementation MetalContext
- (instancetype)init {
if ((self = [super init]))
{
_renderPipelineStateCache = [NSMutableDictionary dictionary];
_bufferCache = [NSMutableArray array];
_lastBufferCachePurge = [NSDate date].timeIntervalSince1970;
}
return self;
}
- (void)makeDeviceObjectsWithDevice:(id<MTLDevice>)device
{
MTLDepthStencilDescriptor *depthStencilDescriptor = [[MTLDepthStencilDescriptor alloc] init];
depthStencilDescriptor.depthWriteEnabled = NO;
depthStencilDescriptor.depthCompareFunction = MTLCompareFunctionAlways;
self.depthStencilState = [device newDepthStencilStateWithDescriptor:depthStencilDescriptor];
}
// We are retrieving and uploading the font atlas as a 4-channels RGBA texture here.
// In theory we could call GetTexDataAsAlpha8() and upload a 1-channel texture to save on memory access bandwidth.
// However, using a shader designed for 1-channel texture would make it less obvious to use the ImTextureID facility to render users own textures.
// You can make that change in your implementation.
- (void)makeFontTextureWithDevice:(id<MTLDevice>)device
{
ImGuiIO &io = ImGui::GetIO();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm
width:(NSUInteger)width
height:(NSUInteger)height
mipmapped:NO];
textureDescriptor.usage = MTLTextureUsageShaderRead;
#if TARGET_OS_OSX || TARGET_OS_MACCATALYST
textureDescriptor.storageMode = MTLStorageModeManaged;
#else
textureDescriptor.storageMode = MTLStorageModeShared;
#endif
id <MTLTexture> texture = [device newTextureWithDescriptor:textureDescriptor];
[texture replaceRegion:MTLRegionMake2D(0, 0, (NSUInteger)width, (NSUInteger)height) mipmapLevel:0 withBytes:pixels bytesPerRow:(NSUInteger)width * 4];
self.fontTexture = texture;
}
- (MetalBuffer *)dequeueReusableBufferOfLength:(NSUInteger)length device:(id<MTLDevice>)device
{
NSTimeInterval now = [NSDate date].timeIntervalSince1970;
// Purge old buffers that haven't been useful for a while
if (now - self.lastBufferCachePurge > 1.0)
{
NSMutableArray *survivors = [NSMutableArray array];
for (MetalBuffer *candidate in self.bufferCache)
{
if (candidate.lastReuseTime > self.lastBufferCachePurge)
{
[survivors addObject:candidate];
}
}
self.bufferCache = [survivors mutableCopy];
self.lastBufferCachePurge = now;
}
// See if we have a buffer we can reuse
MetalBuffer *bestCandidate = nil;
for (MetalBuffer *candidate in self.bufferCache)
if (candidate.buffer.length >= length && (bestCandidate == nil || bestCandidate.lastReuseTime > candidate.lastReuseTime))
bestCandidate = candidate;
if (bestCandidate != nil)
{
[self.bufferCache removeObject:bestCandidate];
bestCandidate.lastReuseTime = now;
return bestCandidate;
}
// No luck; make a new buffer
id<MTLBuffer> backing = [device newBufferWithLength:length options:MTLResourceStorageModeShared];
return [[MetalBuffer alloc] initWithBuffer:backing];
}
- (void)enqueueReusableBuffer:(MetalBuffer *)buffer
{
[self.bufferCache addObject:buffer];
}
- (_Nullable id<MTLRenderPipelineState>)renderPipelineStateForFrameAndDevice:(id<MTLDevice>)device
{
// Try to retrieve a render pipeline state that is compatible with the framebuffer config for this frame
// The hit rate for this cache should be very near 100%.
id<MTLRenderPipelineState> renderPipelineState = self.renderPipelineStateCache[self.framebufferDescriptor];
if (renderPipelineState == nil)
{
// No luck; make a new render pipeline state
renderPipelineState = [self _renderPipelineStateForFramebufferDescriptor:self.framebufferDescriptor device:device];
// Cache render pipeline state for later reuse
self.renderPipelineStateCache[self.framebufferDescriptor] = renderPipelineState;
}
return renderPipelineState;
}
- (id<MTLRenderPipelineState>)_renderPipelineStateForFramebufferDescriptor:(FramebufferDescriptor *)descriptor device:(id<MTLDevice>)device
{
NSError *error = nil;
NSString *shaderSource = @""
"#include <metal_stdlib>\n"
"using namespace metal;\n"
"\n"
"struct Uniforms {\n"
" float4x4 projectionMatrix;\n"
"};\n"
"\n"
"struct VertexIn {\n"
" float2 position [[attribute(0)]];\n"
" float2 texCoords [[attribute(1)]];\n"
" uchar4 color [[attribute(2)]];\n"
"};\n"
"\n"
"struct VertexOut {\n"
" float4 position [[position]];\n"
" float2 texCoords;\n"
" float4 color;\n"
"};\n"
"\n"
"vertex VertexOut vertex_main(VertexIn in [[stage_in]],\n"
" constant Uniforms &uniforms [[buffer(1)]]) {\n"
" VertexOut out;\n"
" out.position = uniforms.projectionMatrix * float4(in.position, 0, 1);\n"
" out.texCoords = in.texCoords;\n"
" out.color = float4(in.color) / float4(255.0);\n"
" return out;\n"
"}\n"
"\n"
"fragment half4 fragment_main(VertexOut in [[stage_in]],\n"
" texture2d<half, access::sample> texture [[texture(0)]]) {\n"
" constexpr sampler linearSampler(coord::normalized, min_filter::linear, mag_filter::linear, mip_filter::linear);\n"
" half4 texColor = texture.sample(linearSampler, in.texCoords);\n"
" return half4(in.color) * texColor;\n"
"}\n";
id<MTLLibrary> library = [device newLibraryWithSource:shaderSource options:nil error:&error];
if (library == nil)
{
NSLog(@"Error: failed to create Metal library: %@", error);
return nil;
}
id<MTLFunction> vertexFunction = [library newFunctionWithName:@"vertex_main"];
id<MTLFunction> fragmentFunction = [library newFunctionWithName:@"fragment_main"];
if (vertexFunction == nil || fragmentFunction == nil)
{
NSLog(@"Error: failed to find Metal shader functions in library: %@", error);
return nil;
}
MTLVertexDescriptor *vertexDescriptor = [MTLVertexDescriptor vertexDescriptor];
vertexDescriptor.attributes[0].offset = IM_OFFSETOF(ImDrawVert, pos);
vertexDescriptor.attributes[0].format = MTLVertexFormatFloat2; // position
vertexDescriptor.attributes[0].bufferIndex = 0;
vertexDescriptor.attributes[1].offset = IM_OFFSETOF(ImDrawVert, uv);
vertexDescriptor.attributes[1].format = MTLVertexFormatFloat2; // texCoords
vertexDescriptor.attributes[1].bufferIndex = 0;
vertexDescriptor.attributes[2].offset = IM_OFFSETOF(ImDrawVert, col);
vertexDescriptor.attributes[2].format = MTLVertexFormatUChar4; // color
vertexDescriptor.attributes[2].bufferIndex = 0;
vertexDescriptor.layouts[0].stepRate = 1;
vertexDescriptor.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex;
vertexDescriptor.layouts[0].stride = sizeof(ImDrawVert);
MTLRenderPipelineDescriptor *pipelineDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
pipelineDescriptor.vertexFunction = vertexFunction;
pipelineDescriptor.fragmentFunction = fragmentFunction;
pipelineDescriptor.vertexDescriptor = vertexDescriptor;
pipelineDescriptor.sampleCount = self.framebufferDescriptor.sampleCount;
pipelineDescriptor.colorAttachments[0].pixelFormat = self.framebufferDescriptor.colorPixelFormat;
pipelineDescriptor.colorAttachments[0].blendingEnabled = YES;
pipelineDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperationAdd;
pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;
pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
pipelineDescriptor.colorAttachments[0].alphaBlendOperation = MTLBlendOperationAdd;
pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactorOne;
pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
pipelineDescriptor.depthAttachmentPixelFormat = self.framebufferDescriptor.depthPixelFormat;
pipelineDescriptor.stencilAttachmentPixelFormat = self.framebufferDescriptor.stencilPixelFormat;
id<MTLRenderPipelineState> renderPipelineState = [device newRenderPipelineStateWithDescriptor:pipelineDescriptor error:&error];
if (error != nil)
{
NSLog(@"Error: failed to create Metal pipeline state: %@", error);
}
return renderPipelineState;
}
- (void)emptyRenderPipelineStateCache
{
[self.renderPipelineStateCache removeAllObjects];
}
- (void)setupRenderState:(ImDrawData *)drawData
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder
renderPipelineState:(id<MTLRenderPipelineState>)renderPipelineState
vertexBuffer:(MetalBuffer *)vertexBuffer
vertexBufferOffset:(size_t)vertexBufferOffset
{
[commandEncoder setCullMode:MTLCullModeNone];
[commandEncoder setDepthStencilState:g_sharedMetalContext.depthStencilState];
// Setup viewport, orthographic projection matrix
// Our visible imgui space lies from draw_data->DisplayPos (top left) to
// draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps.
MTLViewport viewport =
{
.originX = 0.0,
.originY = 0.0,
.width = (double)(drawData->DisplaySize.x * drawData->FramebufferScale.x),
.height = (double)(drawData->DisplaySize.y * drawData->FramebufferScale.y),
.znear = 0.0,
.zfar = 1.0
};
[commandEncoder setViewport:viewport];
float L = drawData->DisplayPos.x;
float R = drawData->DisplayPos.x + drawData->DisplaySize.x;
float T = drawData->DisplayPos.y;
float B = drawData->DisplayPos.y + drawData->DisplaySize.y;
float N = (float)viewport.znear;
float F = (float)viewport.zfar;
const float ortho_projection[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, 1/(F-N), 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), N/(F-N), 1.0f },
};
[commandEncoder setVertexBytes:&ortho_projection length:sizeof(ortho_projection) atIndex:1];
[commandEncoder setRenderPipelineState:renderPipelineState];
[commandEncoder setVertexBuffer:vertexBuffer.buffer offset:0 atIndex:0];
[commandEncoder setVertexBufferOffset:vertexBufferOffset atIndex:0];
}
- (void)renderDrawData:(ImDrawData *)drawData
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder
{
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
int fb_width = (int)(drawData->DisplaySize.x * drawData->FramebufferScale.x);
int fb_height = (int)(drawData->DisplaySize.y * drawData->FramebufferScale.y);
if (fb_width <= 0 || fb_height <= 0 || drawData->CmdListsCount == 0)
return;
id<MTLRenderPipelineState> renderPipelineState = [self renderPipelineStateForFrameAndDevice:commandBuffer.device];
size_t vertexBufferLength = (size_t)drawData->TotalVtxCount * sizeof(ImDrawVert);
size_t indexBufferLength = (size_t)drawData->TotalIdxCount * sizeof(ImDrawIdx);
MetalBuffer* vertexBuffer = [self dequeueReusableBufferOfLength:vertexBufferLength device:commandBuffer.device];
MetalBuffer* indexBuffer = [self dequeueReusableBufferOfLength:indexBufferLength device:commandBuffer.device];
[self setupRenderState:drawData commandBuffer:commandBuffer commandEncoder:commandEncoder renderPipelineState:renderPipelineState vertexBuffer:vertexBuffer vertexBufferOffset:0];
// Will project scissor/clipping rectangles into framebuffer space
ImVec2 clip_off = drawData->DisplayPos; // (0,0) unless using multi-viewports
ImVec2 clip_scale = drawData->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
// Render command lists
size_t vertexBufferOffset = 0;
size_t indexBufferOffset = 0;
for (int n = 0; n < drawData->CmdListsCount; n++)
{
const ImDrawList* cmd_list = drawData->CmdLists[n];
memcpy((char *)vertexBuffer.buffer.contents + vertexBufferOffset, cmd_list->VtxBuffer.Data, (size_t)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
memcpy((char *)indexBuffer.buffer.contents + indexBufferOffset, cmd_list->IdxBuffer.Data, (size_t)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
[self setupRenderState:drawData commandBuffer:commandBuffer commandEncoder:commandEncoder renderPipelineState:renderPipelineState vertexBuffer:vertexBuffer vertexBufferOffset:vertexBufferOffset];
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Project scissor/clipping rectangles into framebuffer space
ImVec4 clip_rect;
clip_rect.x = (pcmd->ClipRect.x - clip_off.x) * clip_scale.x;
clip_rect.y = (pcmd->ClipRect.y - clip_off.y) * clip_scale.y;
clip_rect.z = (pcmd->ClipRect.z - clip_off.x) * clip_scale.x;
clip_rect.w = (pcmd->ClipRect.w - clip_off.y) * clip_scale.y;
if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f)
{
// Apply scissor/clipping rectangle
MTLScissorRect scissorRect =
{
.x = NSUInteger(clip_rect.x),
.y = NSUInteger(clip_rect.y),
.width = NSUInteger(clip_rect.z - clip_rect.x),
.height = NSUInteger(clip_rect.w - clip_rect.y)
};
[commandEncoder setScissorRect:scissorRect];
// Bind texture, Draw
if (ImTextureID tex_id = pcmd->GetTexID())
[commandEncoder setFragmentTexture:(__bridge id<MTLTexture>)(tex_id) atIndex:0];
[commandEncoder setVertexBufferOffset:(vertexBufferOffset + pcmd->VtxOffset * sizeof(ImDrawVert)) atIndex:0];
[commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle
indexCount:pcmd->ElemCount
indexType:sizeof(ImDrawIdx) == 2 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32
indexBuffer:indexBuffer.buffer
indexBufferOffset:indexBufferOffset + pcmd->IdxOffset * sizeof(ImDrawIdx)];
}
}
}
vertexBufferOffset += (size_t)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert);
indexBufferOffset += (size_t)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx);
}
__weak id weakSelf = self;
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer>)
{
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf enqueueReusableBuffer:vertexBuffer];
[weakSelf enqueueReusableBuffer:indexBuffer];
});
}];
}
@end

View File

@ -0,0 +1,288 @@
// dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline)
// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
// Implemented features:
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**
// **Prefer using the code in imgui_impl_opengl3.cpp**
// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.
// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more
// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might
// confuse your GPU driver.
// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API.
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-01-03: OpenGL: Backup, setup and restore GL_SHADE_MODEL state, disable GL_STENCIL_TEST and disable GL_NORMAL_ARRAY client state to increase compatibility with legacy OpenGL applications.
// 2020-01-23: OpenGL: Backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications.
// 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-08-03: OpenGL: Disabling/restoring GL_LIGHTING and GL_COLOR_MATERIAL to increase compatibility with legacy OpenGL applications.
// 2018-06-08: Misc: Extracted imgui_impl_opengl2.cpp/.h away from the old combined GLFW/SDL+OpenGL2 examples.
// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplOpenGL2_RenderDrawData() in the .h file so you can call it yourself.
// 2017-09-01: OpenGL: Save and restore current polygon mode.
// 2016-09-10: OpenGL: Uploading font texture as RGBA32 to increase compatibility with users shaders (not ideal).
// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
#include "imgui.h"
#include "imgui_impl_opengl2.h"
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
#include <stddef.h> // intptr_t
#else
#include <stdint.h> // intptr_t
#endif
// Include OpenGL header (without an OpenGL loader) requires a bit of fiddling
#if defined(_WIN32) && !defined(APIENTRY)
#define APIENTRY __stdcall // It is customary to use APIENTRY for OpenGL function pointer declarations on all platforms. Additionally, the Windows OpenGL header needs APIENTRY.
#endif
#if defined(_WIN32) && !defined(WINGDIAPI)
#define WINGDIAPI __declspec(dllimport) // Some Windows OpenGL headers need this
#endif
#if defined(__APPLE__)
#define GL_SILENCE_DEPRECATION
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif
struct ImGui_ImplOpenGL2_Data
{
GLuint FontTexture;
ImGui_ImplOpenGL2_Data() { memset(this, 0, sizeof(*this)); }
};
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
static ImGui_ImplOpenGL2_Data* ImGui_ImplOpenGL2_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL2_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
}
// Functions
bool ImGui_ImplOpenGL2_Init()
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
// Setup backend capabilities flags
ImGui_ImplOpenGL2_Data* bd = IM_NEW(ImGui_ImplOpenGL2_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_opengl2";
return true;
}
void ImGui_ImplOpenGL2_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
ImGui_ImplOpenGL2_DestroyDeviceObjects();
io.BackendRendererName = NULL;
io.BackendRendererUserData = NULL;
IM_DELETE(bd);
}
void ImGui_ImplOpenGL2_NewFrame()
{
ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplOpenGL2_Init()?");
if (!bd->FontTexture)
ImGui_ImplOpenGL2_CreateDeviceObjects();
}
static void ImGui_ImplOpenGL2_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height)
{
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill.
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // In order to composite our output buffer we need to preserve alpha
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glDisable(GL_STENCIL_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL);
glEnable(GL_SCISSOR_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glEnable(GL_TEXTURE_2D);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glShadeModel(GL_SMOOTH);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!),
// you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below.
// (DO NOT MODIFY THIS FILE! Add the code in your calling function)
// GLint last_program;
// glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
// glUseProgram(0);
// ImGui_ImplOpenGL2_RenderDrawData(...);
// glUseProgram(last_program)
// There are potentially many more states you could need to clear/setup that we can't access from default headers.
// e.g. glBindBuffer(GL_ARRAY_BUFFER, 0), glDisable(GL_TEXTURE_CUBE_MAP).
// Setup viewport, orthographic projection matrix
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(draw_data->DisplayPos.x, draw_data->DisplayPos.x + draw_data->DisplaySize.x, draw_data->DisplayPos.y + draw_data->DisplaySize.y, draw_data->DisplayPos.y, -1.0f, +1.0f);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
}
// OpenGL2 Render function.
// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly.
// This is in order to be able to run within an OpenGL engine that doesn't do so.
void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
if (fb_width == 0 || fb_height == 0)
return;
// Backup GL state
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
GLint last_shade_model; glGetIntegerv(GL_SHADE_MODEL, &last_shade_model);
GLint last_tex_env_mode; glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_tex_env_mode);
glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);
// Setup desired GL state
ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height);
// Will project scissor/clipping rectangles into framebuffer space
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
// Render command lists
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data;
const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;
glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)));
glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)));
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Project scissor/clipping rectangles into framebuffer space
ImVec4 clip_rect;
clip_rect.x = (pcmd->ClipRect.x - clip_off.x) * clip_scale.x;
clip_rect.y = (pcmd->ClipRect.y - clip_off.y) * clip_scale.y;
clip_rect.z = (pcmd->ClipRect.z - clip_off.x) * clip_scale.x;
clip_rect.w = (pcmd->ClipRect.w - clip_off.y) * clip_scale.y;
if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f)
{
// Apply scissor/clipping rectangle
glScissor((int)clip_rect.x, (int)(fb_height - clip_rect.w), (int)(clip_rect.z - clip_rect.x), (int)(clip_rect.w - clip_rect.y));
// Bind texture, Draw
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID());
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer);
}
}
idx_buffer += pcmd->ElemCount;
}
}
// Restore modified GL state
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]);
glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
glShadeModel(last_shade_model);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_tex_env_mode);
}
bool ImGui_ImplOpenGL2_CreateFontsTexture()
{
// Build texture atlas
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
// Upload texture to graphics system
GLint last_texture;
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
glGenTextures(1, &bd->FontTexture);
glBindTexture(GL_TEXTURE_2D, bd->FontTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
// Store our identifier
io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
// Restore state
glBindTexture(GL_TEXTURE_2D, last_texture);
return true;
}
void ImGui_ImplOpenGL2_DestroyFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
if (bd->FontTexture)
{
glDeleteTextures(1, &bd->FontTexture);
io.Fonts->SetTexID(0);
bd->FontTexture = 0;
}
}
bool ImGui_ImplOpenGL2_CreateDeviceObjects()
{
return ImGui_ImplOpenGL2_CreateFontsTexture();
}
void ImGui_ImplOpenGL2_DestroyDeviceObjects()
{
ImGui_ImplOpenGL2_DestroyFontsTexture();
}

View File

@ -0,0 +1,32 @@
// dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline)
// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
// Implemented features:
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**
// **Prefer using the code in imgui_impl_opengl3.cpp**
// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.
// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more
// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might
// confuse your GPU driver.
// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API.
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_Init();
IMGUI_IMPL_API void ImGui_ImplOpenGL2_Shutdown();
IMGUI_IMPL_API void ImGui_ImplOpenGL2_NewFrame();
IMGUI_IMPL_API void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data);
// Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateFontsTexture();
IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyFontsTexture();
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateDeviceObjects();
IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyDeviceObjects();

View File

@ -0,0 +1,778 @@
// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline
// - Desktop GL: 2.x 3.x 4.x
// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0)
// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
// Implemented features:
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
// [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-08-23: OpenGL: Fixed ES 3.0 shader ("#version 300 es") use normal precision floats to avoid wobbly rendering at HD resolutions.
// 2021-08-19: OpenGL: Embed and use our own minimal GL loader (imgui_impl_opengl3_loader.h), removing requirement and support for third-party loader.
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-06-25: OpenGL: Use OES_vertex_array extension on Emscripten + backup/restore current state.
// 2021-06-21: OpenGL: Destroy individual vertex/fragment shader objects right after they are linked into the main shader.
// 2021-05-24: OpenGL: Access GL_CLIP_ORIGIN when "GL_ARB_clip_control" extension is detected, inside of just OpenGL 4.5 version.
// 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-04-06: OpenGL: Don't try to read GL_CLIP_ORIGIN unless we're OpenGL 4.5 or greater.
// 2021-02-18: OpenGL: Change blending equation to preserve alpha in output buffer.
// 2021-01-03: OpenGL: Backup, setup and restore GL_STENCIL_TEST state.
// 2020-10-23: OpenGL: Backup, setup and restore GL_PRIMITIVE_RESTART state.
// 2020-10-15: OpenGL: Use glGetString(GL_VERSION) instead of glGetIntegerv(GL_MAJOR_VERSION, ...) when the later returns zero (e.g. Desktop GL 2.x)
// 2020-09-17: OpenGL: Fix to avoid compiling/calling glBindSampler() on ES or pre 3.3 context which have the defines set by a loader.
// 2020-07-10: OpenGL: Added support for glad2 OpenGL loader.
// 2020-05-08: OpenGL: Made default GLSL version 150 (instead of 130) on OSX.
// 2020-04-21: OpenGL: Fixed handling of glClipControl(GL_UPPER_LEFT) by inverting projection matrix.
// 2020-04-12: OpenGL: Fixed context version check mistakenly testing for 4.0+ instead of 3.2+ to enable ImGuiBackendFlags_RendererHasVtxOffset.
// 2020-03-24: OpenGL: Added support for glbinding 2.x OpenGL loader.
// 2020-01-07: OpenGL: Added support for glbinding 3.x OpenGL loader.
// 2019-10-25: OpenGL: Using a combination of GL define and runtime GL version to decide whether to use glDrawElementsBaseVertex(). Fix building with pre-3.2 GL loaders.
// 2019-09-22: OpenGL: Detect default GL loader using __has_include compiler facility.
// 2019-09-16: OpenGL: Tweak initialization code to allow application calling ImGui_ImplOpenGL3_CreateFontsTexture() before the first NewFrame() call.
// 2019-05-29: OpenGL: Desktop GL only: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2019-03-29: OpenGL: Not calling glBindBuffer more than necessary in the render loop.
// 2019-03-15: OpenGL: Added a GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early.
// 2019-03-03: OpenGL: Fix support for ES 2.0 (WebGL 1.0).
// 2019-02-20: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if defined by the headers/loader.
// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
// 2019-02-01: OpenGL: Using GLSL 410 shaders for any version over 410 (e.g. 430, 450).
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-11-13: OpenGL: Support for GL 4.5's glClipControl(GL_UPPER_LEFT) / GL_CLIP_ORIGIN.
// 2018-08-29: OpenGL: Added support for more OpenGL loaders: glew and glad, with comments indicative that any loader can be used.
// 2018-08-09: OpenGL: Default to OpenGL ES 3 on iOS and Android. GLSL version default to "#version 300 ES".
// 2018-07-30: OpenGL: Support for GLSL 300 ES and 410 core. Fixes for Emscripten compilation.
// 2018-07-10: OpenGL: Support for more GLSL versions (based on the GLSL version string). Added error output when shaders fail to compile/link.
// 2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples.
// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state.
// 2018-05-14: OpenGL: Making the call to glBindSampler() optional so 3.2 context won't fail if the function is a NULL pointer.
// 2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplOpenGL3_Init() so user can override the GLSL version e.g. "#version 150".
// 2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself.
// 2018-01-07: OpenGL: Changed GLSL shader version from 330 to 150.
// 2017-09-01: OpenGL: Save and restore current bound sampler. Save and restore current polygon mode.
// 2017-05-01: OpenGL: Fixed save and restore of current blend func state.
// 2017-05-01: OpenGL: Fixed save and restore of current GL_ACTIVE_TEXTURE.
// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
// 2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752)
//----------------------------------------
// OpenGL GLSL GLSL
// version version string
//----------------------------------------
// 2.0 110 "#version 110"
// 2.1 120 "#version 120"
// 3.0 130 "#version 130"
// 3.1 140 "#version 140"
// 3.2 150 "#version 150"
// 3.3 330 "#version 330 core"
// 4.0 400 "#version 400 core"
// 4.1 410 "#version 410 core"
// 4.2 420 "#version 410 core"
// 4.3 430 "#version 430 core"
// ES 2.0 100 "#version 100" = WebGL 1.0
// ES 3.0 300 "#version 300 es" = WebGL 2.0
//----------------------------------------
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
#define _CRT_SECURE_NO_WARNINGS
#endif
#include "imgui.h"
#include "imgui_impl_opengl3.h"
#include <stdio.h>
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
#include <stddef.h> // intptr_t
#else
#include <stdint.h> // intptr_t
#endif
// GL includes
#if defined(IMGUI_IMPL_OPENGL_ES2)
#include <GLES2/gl2.h>
#if defined(__EMSCRIPTEN__)
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES
#endif
#include <GLES2/gl2ext.h>
#endif
#elif defined(IMGUI_IMPL_OPENGL_ES3)
#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV))
#include <OpenGLES/ES3/gl.h> // Use GL ES 3
#else
#include <GLES3/gl3.h> // Use GL ES 3
#endif
#elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
// Modern desktop OpenGL doesn't have a standard portable header file to load OpenGL function pointers.
// Helper libraries are often used for this purpose! Here we are using our own minimal custom loader based on gl3w.
// In the rest of your app/engine, you can use another loader of your choice (gl3w, glew, glad, glbinding, glext, glLoadGen, etc.).
// If you happen to be developing a new feature for this backend (imgui_impl_opengl3.cpp):
// - You may need to regenerate imgui_impl_opengl3_loader.h to add new symbols. See https://github.com/dearimgui/gl3w_stripped
// - You can temporarily use an unstripped version. See https://github.com/dearimgui/gl3w_stripped/releases
// Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version.
#define IMGL3W_IMPL
#include "imgui_impl_opengl3_loader.h"
#endif
// Vertex arrays are not supported on ES2/WebGL1 unless Emscripten which uses an extension
#ifndef IMGUI_IMPL_OPENGL_ES2
#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
#elif defined(__EMSCRIPTEN__)
#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
#define glBindVertexArray glBindVertexArrayOES
#define glGenVertexArrays glGenVertexArraysOES
#define glDeleteVertexArrays glDeleteVertexArraysOES
#define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES
#endif
// Desktop GL 2.0+ has glPolygonMode() which GL ES and WebGL don't have.
#ifdef GL_POLYGON_MODE
#define IMGUI_IMPL_HAS_POLYGON_MODE
#endif
// Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have.
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_2)
#define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
#endif
// Desktop GL 3.3+ has glBindSampler()
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_3)
#define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
#endif
// Desktop GL 3.1+ has GL_PRIMITIVE_RESTART state
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1)
#define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
#endif
// Desktop GL use extension detection
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3)
#define IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS
#endif
// OpenGL Data
struct ImGui_ImplOpenGL3_Data
{
GLuint GlVersion; // Extracted at runtime using GL_MAJOR_VERSION, GL_MINOR_VERSION queries (e.g. 320 for GL 3.2)
char GlslVersionString[32]; // Specified by user or detected based on compile time GL settings.
GLuint FontTexture;
GLuint ShaderHandle;
GLint AttribLocationTex; // Uniforms location
GLint AttribLocationProjMtx;
GLuint AttribLocationVtxPos; // Vertex attributes location
GLuint AttribLocationVtxUV;
GLuint AttribLocationVtxColor;
unsigned int VboHandle, ElementsHandle;
bool HasClipOrigin;
ImGui_ImplOpenGL3_Data() { memset(this, 0, sizeof(*this)); }
};
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
static ImGui_ImplOpenGL3_Data* ImGui_ImplOpenGL3_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL3_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
}
// Functions
bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
// Initialize our loader
#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
if (imgl3wInit() != 0)
{
fprintf(stderr, "Failed to initialize OpenGL loader!\n");
return false;
}
#endif
// Setup backend capabilities flags
ImGui_ImplOpenGL3_Data* bd = IM_NEW(ImGui_ImplOpenGL3_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_opengl3";
// Query for GL version (e.g. 320 for GL 3.2)
#if !defined(IMGUI_IMPL_OPENGL_ES2)
GLint major = 0;
GLint minor = 0;
glGetIntegerv(GL_MAJOR_VERSION, &major);
glGetIntegerv(GL_MINOR_VERSION, &minor);
if (major == 0 && minor == 0)
{
// Query GL_VERSION in desktop GL 2.x, the string will start with "<major>.<minor>"
const char* gl_version = (const char*)glGetString(GL_VERSION);
sscanf(gl_version, "%d.%d", &major, &minor);
}
bd->GlVersion = (GLuint)(major * 100 + minor * 10);
#else
bd->GlVersion = 200; // GLES 2
#endif
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
if (bd->GlVersion >= 320)
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
#endif
// Store GLSL version string so we can refer to it later in case we recreate shaders.
// Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure.
if (glsl_version == NULL)
{
#if defined(IMGUI_IMPL_OPENGL_ES2)
glsl_version = "#version 100";
#elif defined(IMGUI_IMPL_OPENGL_ES3)
glsl_version = "#version 300 es";
#elif defined(__APPLE__)
glsl_version = "#version 150";
#else
glsl_version = "#version 130";
#endif
}
IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(bd->GlslVersionString));
strcpy(bd->GlslVersionString, glsl_version);
strcat(bd->GlslVersionString, "\n");
// Make an arbitrary GL call (we don't actually need the result)
// IF YOU GET A CRASH HERE: it probably means the OpenGL function loader didn't do its job. Let us know!
GLint current_texture;
glGetIntegerv(GL_TEXTURE_BINDING_2D, &current_texture);
// Detect extensions we support
bd->HasClipOrigin = (bd->GlVersion >= 450);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS
GLint num_extensions = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
for (GLint i = 0; i < num_extensions; i++)
{
const char* extension = (const char*)glGetStringi(GL_EXTENSIONS, i);
if (extension != NULL && strcmp(extension, "GL_ARB_clip_control") == 0)
bd->HasClipOrigin = true;
}
#endif
return true;
}
void ImGui_ImplOpenGL3_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
ImGui_ImplOpenGL3_DestroyDeviceObjects();
io.BackendRendererName = NULL;
io.BackendRendererUserData = NULL;
IM_DELETE(bd);
}
void ImGui_ImplOpenGL3_NewFrame()
{
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplOpenGL3_Init()?");
if (!bd->ShaderHandle)
ImGui_ImplOpenGL3_CreateDeviceObjects();
}
static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object)
{
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glDisable(GL_STENCIL_TEST);
glEnable(GL_SCISSOR_TEST);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
if (bd->GlVersion >= 310)
glDisable(GL_PRIMITIVE_RESTART);
#endif
#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
// Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT)
#if defined(GL_CLIP_ORIGIN)
bool clip_origin_lower_left = true;
if (bd->HasClipOrigin)
{
GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)&current_clip_origin);
if (current_clip_origin == GL_UPPER_LEFT)
clip_origin_lower_left = false;
}
#endif
// Setup viewport, orthographic projection matrix
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
#if defined(GL_CLIP_ORIGIN)
if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } // Swap top and bottom if origin is upper left
#endif
const float ortho_projection[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, -1.0f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.0f, 1.0f },
};
glUseProgram(bd->ShaderHandle);
glUniform1i(bd->AttribLocationTex, 0);
glUniformMatrix4fv(bd->AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
if (bd->GlVersion >= 330)
glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
#endif
(void)vertex_array_object;
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
glBindVertexArray(vertex_array_object);
#endif
// Bind vertex/index buffers and setup attributes for ImDrawVert
glBindBuffer(GL_ARRAY_BUFFER, bd->VboHandle);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bd->ElementsHandle);
glEnableVertexAttribArray(bd->AttribLocationVtxPos);
glEnableVertexAttribArray(bd->AttribLocationVtxUV);
glEnableVertexAttribArray(bd->AttribLocationVtxColor);
glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos));
glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv));
glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col));
}
// OpenGL3 Render function.
// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly.
// This is in order to be able to run within an OpenGL engine that doesn't do so.
void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
if (fb_width <= 0 || fb_height <= 0)
return;
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
// Backup GL state
GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture);
glActiveTexture(GL_TEXTURE0);
GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program);
GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
GLuint last_sampler; if (bd->GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; }
#endif
GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer);
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object);
#endif
#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
#endif
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);
GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);
GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);
GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);
GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);
GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);
GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST);
GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
GLboolean last_enable_primitive_restart = (bd->GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE;
#endif
// Setup desired GL state
// Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts)
// The renderer would actually work without any VAO bound, but then our VertexAttrib calls would overwrite the default one currently bound.
GLuint vertex_array_object = 0;
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
glGenVertexArrays(1, &vertex_array_object);
#endif
ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
// Will project scissor/clipping rectangles into framebuffer space
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
// Render command lists
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
// Upload vertex/index buffers
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert), (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx), (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW);
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback != NULL)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Project scissor/clipping rectangles into framebuffer space
ImVec4 clip_rect;
clip_rect.x = (pcmd->ClipRect.x - clip_off.x) * clip_scale.x;
clip_rect.y = (pcmd->ClipRect.y - clip_off.y) * clip_scale.y;
clip_rect.z = (pcmd->ClipRect.z - clip_off.x) * clip_scale.x;
clip_rect.w = (pcmd->ClipRect.w - clip_off.y) * clip_scale.y;
if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f)
{
// Apply scissor/clipping rectangle
glScissor((int)clip_rect.x, (int)(fb_height - clip_rect.w), (int)(clip_rect.z - clip_rect.x), (int)(clip_rect.w - clip_rect.y));
// Bind texture, Draw
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID());
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
if (bd->GlVersion >= 320)
glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset);
else
#endif
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)));
}
}
}
}
// Destroy the temporary VAO
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
glDeleteVertexArrays(1, &vertex_array_object);
#endif
// Restore modified GL state
glUseProgram(last_program);
glBindTexture(GL_TEXTURE_2D, last_texture);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
if (bd->GlVersion >= 330)
glBindSampler(0, last_sampler);
#endif
glActiveTexture(last_active_texture);
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
glBindVertexArray(last_vertex_array_object);
#endif
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);
if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST); else glDisable(GL_STENCIL_TEST);
if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
if (bd->GlVersion >= 310) { if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART); else glDisable(GL_PRIMITIVE_RESTART); }
#endif
#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
#endif
glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
(void)bd; // Not all compilation paths use this
}
bool ImGui_ImplOpenGL3_CreateFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
// Build texture atlas
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
// Upload texture to graphics system
GLint last_texture;
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
glGenTextures(1, &bd->FontTexture);
glBindTexture(GL_TEXTURE_2D, bd->FontTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
#ifdef GL_UNPACK_ROW_LENGTH // Not on WebGL/ES
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
#endif
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
// Store our identifier
io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
// Restore state
glBindTexture(GL_TEXTURE_2D, last_texture);
return true;
}
void ImGui_ImplOpenGL3_DestroyFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
if (bd->FontTexture)
{
glDeleteTextures(1, &bd->FontTexture);
io.Fonts->SetTexID(0);
bd->FontTexture = 0;
}
}
// If you get an error please report on github. You may try different GL context version or GLSL version. See GL<>GLSL version table at the top of this file.
static bool CheckShader(GLuint handle, const char* desc)
{
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
GLint status = 0, log_length = 0;
glGetShaderiv(handle, GL_COMPILE_STATUS, &status);
glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length);
if ((GLboolean)status == GL_FALSE)
fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s! With GLSL: %s\n", desc, bd->GlslVersionString);
if (log_length > 1)
{
ImVector<char> buf;
buf.resize((int)(log_length + 1));
glGetShaderInfoLog(handle, log_length, NULL, (GLchar*)buf.begin());
fprintf(stderr, "%s\n", buf.begin());
}
return (GLboolean)status == GL_TRUE;
}
// If you get an error please report on GitHub. You may try different GL context version or GLSL version.
static bool CheckProgram(GLuint handle, const char* desc)
{
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
GLint status = 0, log_length = 0;
glGetProgramiv(handle, GL_LINK_STATUS, &status);
glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length);
if ((GLboolean)status == GL_FALSE)
fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s! With GLSL %s\n", desc, bd->GlslVersionString);
if (log_length > 1)
{
ImVector<char> buf;
buf.resize((int)(log_length + 1));
glGetProgramInfoLog(handle, log_length, NULL, (GLchar*)buf.begin());
fprintf(stderr, "%s\n", buf.begin());
}
return (GLboolean)status == GL_TRUE;
}
bool ImGui_ImplOpenGL3_CreateDeviceObjects()
{
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
// Backup GL state
GLint last_texture, last_array_buffer;
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
GLint last_vertex_array;
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
#endif
// Parse GLSL version string
int glsl_version = 130;
sscanf(bd->GlslVersionString, "#version %d", &glsl_version);
const GLchar* vertex_shader_glsl_120 =
"uniform mat4 ProjMtx;\n"
"attribute vec2 Position;\n"
"attribute vec2 UV;\n"
"attribute vec4 Color;\n"
"varying vec2 Frag_UV;\n"
"varying vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Color = Color;\n"
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
"}\n";
const GLchar* vertex_shader_glsl_130 =
"uniform mat4 ProjMtx;\n"
"in vec2 Position;\n"
"in vec2 UV;\n"
"in vec4 Color;\n"
"out vec2 Frag_UV;\n"
"out vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Color = Color;\n"
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
"}\n";
const GLchar* vertex_shader_glsl_300_es =
"precision highp float;\n"
"layout (location = 0) in vec2 Position;\n"
"layout (location = 1) in vec2 UV;\n"
"layout (location = 2) in vec4 Color;\n"
"uniform mat4 ProjMtx;\n"
"out vec2 Frag_UV;\n"
"out vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Color = Color;\n"
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
"}\n";
const GLchar* vertex_shader_glsl_410_core =
"layout (location = 0) in vec2 Position;\n"
"layout (location = 1) in vec2 UV;\n"
"layout (location = 2) in vec4 Color;\n"
"uniform mat4 ProjMtx;\n"
"out vec2 Frag_UV;\n"
"out vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Color = Color;\n"
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
"}\n";
const GLchar* fragment_shader_glsl_120 =
"#ifdef GL_ES\n"
" precision mediump float;\n"
"#endif\n"
"uniform sampler2D Texture;\n"
"varying vec2 Frag_UV;\n"
"varying vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n"
"}\n";
const GLchar* fragment_shader_glsl_130 =
"uniform sampler2D Texture;\n"
"in vec2 Frag_UV;\n"
"in vec4 Frag_Color;\n"
"out vec4 Out_Color;\n"
"void main()\n"
"{\n"
" Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
"}\n";
const GLchar* fragment_shader_glsl_300_es =
"precision mediump float;\n"
"uniform sampler2D Texture;\n"
"in vec2 Frag_UV;\n"
"in vec4 Frag_Color;\n"
"layout (location = 0) out vec4 Out_Color;\n"
"void main()\n"
"{\n"
" Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
"}\n";
const GLchar* fragment_shader_glsl_410_core =
"in vec2 Frag_UV;\n"
"in vec4 Frag_Color;\n"
"uniform sampler2D Texture;\n"
"layout (location = 0) out vec4 Out_Color;\n"
"void main()\n"
"{\n"
" Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
"}\n";
// Select shaders matching our GLSL versions
const GLchar* vertex_shader = NULL;
const GLchar* fragment_shader = NULL;
if (glsl_version < 130)
{
vertex_shader = vertex_shader_glsl_120;
fragment_shader = fragment_shader_glsl_120;
}
else if (glsl_version >= 410)
{
vertex_shader = vertex_shader_glsl_410_core;
fragment_shader = fragment_shader_glsl_410_core;
}
else if (glsl_version == 300)
{
vertex_shader = vertex_shader_glsl_300_es;
fragment_shader = fragment_shader_glsl_300_es;
}
else
{
vertex_shader = vertex_shader_glsl_130;
fragment_shader = fragment_shader_glsl_130;
}
// Create shaders
const GLchar* vertex_shader_with_version[2] = { bd->GlslVersionString, vertex_shader };
GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vert_handle, 2, vertex_shader_with_version, NULL);
glCompileShader(vert_handle);
CheckShader(vert_handle, "vertex shader");
const GLchar* fragment_shader_with_version[2] = { bd->GlslVersionString, fragment_shader };
GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(frag_handle, 2, fragment_shader_with_version, NULL);
glCompileShader(frag_handle);
CheckShader(frag_handle, "fragment shader");
// Link
bd->ShaderHandle = glCreateProgram();
glAttachShader(bd->ShaderHandle, vert_handle);
glAttachShader(bd->ShaderHandle, frag_handle);
glLinkProgram(bd->ShaderHandle);
CheckProgram(bd->ShaderHandle, "shader program");
glDetachShader(bd->ShaderHandle, vert_handle);
glDetachShader(bd->ShaderHandle, frag_handle);
glDeleteShader(vert_handle);
glDeleteShader(frag_handle);
bd->AttribLocationTex = glGetUniformLocation(bd->ShaderHandle, "Texture");
bd->AttribLocationProjMtx = glGetUniformLocation(bd->ShaderHandle, "ProjMtx");
bd->AttribLocationVtxPos = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Position");
bd->AttribLocationVtxUV = (GLuint)glGetAttribLocation(bd->ShaderHandle, "UV");
bd->AttribLocationVtxColor = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Color");
// Create buffers
glGenBuffers(1, &bd->VboHandle);
glGenBuffers(1, &bd->ElementsHandle);
ImGui_ImplOpenGL3_CreateFontsTexture();
// Restore modified GL state
glBindTexture(GL_TEXTURE_2D, last_texture);
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
glBindVertexArray(last_vertex_array);
#endif
return true;
}
void ImGui_ImplOpenGL3_DestroyDeviceObjects()
{
ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
if (bd->VboHandle) { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; }
if (bd->ElementsHandle) { glDeleteBuffers(1, &bd->ElementsHandle); bd->ElementsHandle = 0; }
if (bd->ShaderHandle) { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; }
ImGui_ImplOpenGL3_DestroyFontsTexture();
}

View File

@ -0,0 +1,55 @@
// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline
// - Desktop GL: 2.x 3.x 4.x
// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0)
// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
// Implemented features:
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
// [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// About GLSL version:
// The 'glsl_version' initialization parameter should be NULL (default) or a "#version XXX" string.
// On computer platform the GLSL version default to "#version 130". On OpenGL ES 3 platform it defaults to "#version 300 es"
// Only override if your GL version doesn't handle this GLSL version. See GLSL version table at the top of imgui_impl_opengl3.cpp.
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
// Backend API
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL);
IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data);
// (Optional) Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateFontsTexture();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyFontsTexture();
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateDeviceObjects();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
// Specific OpenGL ES versions
//#define IMGUI_IMPL_OPENGL_ES2 // Auto-detected on Emscripten
//#define IMGUI_IMPL_OPENGL_ES3 // Auto-detected on iOS/Android
// You can explicitly select GLES2 or GLES3 API by using one of the '#define IMGUI_IMPL_OPENGL_LOADER_XXX' in imconfig.h or compiler command-line.
#if !defined(IMGUI_IMPL_OPENGL_ES2) \
&& !defined(IMGUI_IMPL_OPENGL_ES3)
// Try to detect GLES on matching platforms
#if defined(__APPLE__)
#include "TargetConditionals.h"
#endif
#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) || (defined(__ANDROID__))
#define IMGUI_IMPL_OPENGL_ES3 // iOS, Android -> GL ES 3, "#version 300 es"
#elif defined(__EMSCRIPTEN__)
#define IMGUI_IMPL_OPENGL_ES2 // Emscripten -> GL ES 2, "#version 100"
#else
// Otherwise imgui_impl_opengl3_loader.h will be used.
#endif
#endif

View File

@ -0,0 +1,730 @@
/*
* This file was generated with gl3w_gen.py, part of imgl3w
* (hosted at https://github.com/dearimgui/gl3w_stripped)
*
* This is free and unencumbered software released into the public domain.
*
* Anyone is free to copy, modify, publish, use, compile, sell, or
* distribute this software, either in source code form or as a compiled
* binary, for any purpose, commercial or non-commercial, and by any
* means.
*
* In jurisdictions that recognize copyright laws, the author or authors
* of this software dedicate any and all copyright interest in the
* software to the public domain. We make this dedication for the benefit
* of the public at large and to the detriment of our heirs and
* successors. We intend this dedication to be an overt act of
* relinquishment in perpetuity of all present and future rights to this
* software under copyright law.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
// We embed our own OpenGL loader to not require user to provide their own or to have to use ours, which proved to be endless problems for users.
// Our loader is custom-generated, based on gl3w but automatically filtered to only include enums/functions that we use in this source file.
// Regenerate with: python gl3w_gen.py --imgui-dir /path/to/imgui/
// see https://github.com/dearimgui/gl3w_stripped for more info.
#ifndef __gl3w_h_
#define __gl3w_h_
// Adapted from KHR/khrplatform.h to avoid including entire file.
typedef float khronos_float_t;
typedef signed char khronos_int8_t;
typedef unsigned char khronos_uint8_t;
typedef signed short int khronos_int16_t;
typedef unsigned short int khronos_uint16_t;
#ifdef _WIN64
typedef signed long long int khronos_intptr_t;
typedef signed long long int khronos_ssize_t;
#else
typedef signed long int khronos_intptr_t;
typedef signed long int khronos_ssize_t;
#endif
#if defined(_MSC_VER) && !defined(__clang__)
typedef signed __int64 khronos_int64_t;
typedef unsigned __int64 khronos_uint64_t;
#elif (defined(__clang__) || defined(__GNUC__)) && (__cplusplus < 201100)
#include <stdint.h>
typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#else
typedef signed long long khronos_int64_t;
typedef unsigned long long khronos_uint64_t;
#endif
#ifndef __gl_glcorearb_h_
#define __gl_glcorearb_h_ 1
#ifdef __cplusplus
extern "C" {
#endif
/*
** Copyright 2013-2020 The Khronos Group Inc.
** SPDX-License-Identifier: MIT
**
** This header is generated from the Khronos OpenGL / OpenGL ES XML
** API Registry. The current version of the Registry, generator scripts
** used to make the header, and the header can be found at
** https://github.com/KhronosGroup/OpenGL-Registry
*/
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN 1
#endif
#include <windows.h>
#endif
#ifndef APIENTRY
#define APIENTRY
#endif
#ifndef APIENTRYP
#define APIENTRYP APIENTRY *
#endif
#ifndef GLAPI
#define GLAPI extern
#endif
/* glcorearb.h is for use with OpenGL core profile implementations.
** It should should be placed in the same directory as gl.h and
** included as <GL/glcorearb.h>.
**
** glcorearb.h includes only APIs in the latest OpenGL core profile
** implementation together with APIs in newer ARB extensions which
** can be supported by the core profile. It does not, and never will
** include functionality removed from the core profile, such as
** fixed-function vertex and fragment processing.
**
** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or
** <GL/glext.h> in the same source file.
*/
/* Generated C header for:
* API: gl
* Profile: core
* Versions considered: .*
* Versions emitted: .*
* Default extensions included: glcore
* Additional extensions included: _nomatch_^
* Extensions removed: _nomatch_^
*/
#ifndef GL_VERSION_1_0
typedef void GLvoid;
typedef unsigned int GLenum;
typedef khronos_float_t GLfloat;
typedef int GLint;
typedef int GLsizei;
typedef unsigned int GLbitfield;
typedef double GLdouble;
typedef unsigned int GLuint;
typedef unsigned char GLboolean;
typedef khronos_uint8_t GLubyte;
#define GL_COLOR_BUFFER_BIT 0x00004000
#define GL_FALSE 0
#define GL_TRUE 1
#define GL_TRIANGLES 0x0004
#define GL_ONE 1
#define GL_SRC_ALPHA 0x0302
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
#define GL_FRONT_AND_BACK 0x0408
#define GL_POLYGON_MODE 0x0B40
#define GL_CULL_FACE 0x0B44
#define GL_DEPTH_TEST 0x0B71
#define GL_STENCIL_TEST 0x0B90
#define GL_VIEWPORT 0x0BA2
#define GL_BLEND 0x0BE2
#define GL_SCISSOR_BOX 0x0C10
#define GL_SCISSOR_TEST 0x0C11
#define GL_UNPACK_ROW_LENGTH 0x0CF2
#define GL_PACK_ALIGNMENT 0x0D05
#define GL_TEXTURE_2D 0x0DE1
#define GL_UNSIGNED_BYTE 0x1401
#define GL_UNSIGNED_SHORT 0x1403
#define GL_UNSIGNED_INT 0x1405
#define GL_FLOAT 0x1406
#define GL_RGBA 0x1908
#define GL_FILL 0x1B02
#define GL_VERSION 0x1F02
#define GL_EXTENSIONS 0x1F03
#define GL_LINEAR 0x2601
#define GL_TEXTURE_MAG_FILTER 0x2800
#define GL_TEXTURE_MIN_FILTER 0x2801
typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode);
typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);
typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode);
GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
GLAPI void APIENTRY glClear (GLbitfield mask);
GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
GLAPI void APIENTRY glDisable (GLenum cap);
GLAPI void APIENTRY glEnable (GLenum cap);
GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param);
GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *data);
GLAPI const GLubyte *APIENTRY glGetString (GLenum name);
GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap);
GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
#endif
#endif /* GL_VERSION_1_0 */
#ifndef GL_VERSION_1_1
typedef khronos_float_t GLclampf;
typedef double GLclampd;
#define GL_TEXTURE_BINDING_2D 0x8069
typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
#endif
#endif /* GL_VERSION_1_1 */
#ifndef GL_VERSION_1_3
#define GL_TEXTURE0 0x84C0
#define GL_ACTIVE_TEXTURE 0x84E0
typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glActiveTexture (GLenum texture);
#endif
#endif /* GL_VERSION_1_3 */
#ifndef GL_VERSION_1_4
#define GL_BLEND_DST_RGB 0x80C8
#define GL_BLEND_SRC_RGB 0x80C9
#define GL_BLEND_DST_ALPHA 0x80CA
#define GL_BLEND_SRC_ALPHA 0x80CB
#define GL_FUNC_ADD 0x8006
typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
GLAPI void APIENTRY glBlendEquation (GLenum mode);
#endif
#endif /* GL_VERSION_1_4 */
#ifndef GL_VERSION_1_5
typedef khronos_ssize_t GLsizeiptr;
typedef khronos_intptr_t GLintptr;
#define GL_ARRAY_BUFFER 0x8892
#define GL_ELEMENT_ARRAY_BUFFER 0x8893
#define GL_ARRAY_BUFFER_BINDING 0x8894
#define GL_STREAM_DRAW 0x88E0
typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer);
GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
#endif
#endif /* GL_VERSION_1_5 */
#ifndef GL_VERSION_2_0
typedef char GLchar;
typedef khronos_int16_t GLshort;
typedef khronos_int8_t GLbyte;
typedef khronos_uint16_t GLushort;
#define GL_BLEND_EQUATION_RGB 0x8009
#define GL_BLEND_EQUATION_ALPHA 0x883D
#define GL_FRAGMENT_SHADER 0x8B30
#define GL_VERTEX_SHADER 0x8B31
#define GL_COMPILE_STATUS 0x8B81
#define GL_LINK_STATUS 0x8B82
#define GL_INFO_LOG_LENGTH 0x8B84
#define GL_CURRENT_PROGRAM 0x8B8D
#define GL_UPPER_LEFT 0x8CA2
typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader);
GLAPI void APIENTRY glCompileShader (GLuint shader);
GLAPI GLuint APIENTRY glCreateProgram (void);
GLAPI GLuint APIENTRY glCreateShader (GLenum type);
GLAPI void APIENTRY glDeleteProgram (GLuint program);
GLAPI void APIENTRY glDeleteShader (GLuint shader);
GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader);
GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index);
GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
GLAPI void APIENTRY glLinkProgram (GLuint program);
GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
GLAPI void APIENTRY glUseProgram (GLuint program);
GLAPI void APIENTRY glUniform1i (GLint location, GLint v0);
GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
#endif
#endif /* GL_VERSION_2_0 */
#ifndef GL_VERSION_3_0
typedef khronos_uint16_t GLhalf;
#define GL_MAJOR_VERSION 0x821B
#define GL_MINOR_VERSION 0x821C
#define GL_NUM_EXTENSIONS 0x821D
#define GL_FRAMEBUFFER_SRGB 0x8DB9
#define GL_VERTEX_ARRAY_BINDING 0x85B5
typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index);
GLAPI void APIENTRY glBindVertexArray (GLuint array);
GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
#endif
#endif /* GL_VERSION_3_0 */
#ifndef GL_VERSION_3_1
#define GL_VERSION_3_1 1
#define GL_PRIMITIVE_RESTART 0x8F9D
#endif /* GL_VERSION_3_1 */
#ifndef GL_VERSION_3_2
#define GL_VERSION_3_2 1
typedef struct __GLsync *GLsync;
typedef khronos_uint64_t GLuint64;
typedef khronos_int64_t GLint64;
typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
#endif
#endif /* GL_VERSION_3_2 */
#ifndef GL_VERSION_3_3
#define GL_VERSION_3_3 1
#define GL_SAMPLER_BINDING 0x8919
typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler);
#endif
#endif /* GL_VERSION_3_3 */
#ifndef GL_VERSION_4_1
typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data);
typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data);
#endif /* GL_VERSION_4_1 */
#ifndef GL_VERSION_4_3
typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
#endif /* GL_VERSION_4_3 */
#ifndef GL_VERSION_4_5
#define GL_CLIP_ORIGIN 0x935C
typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param);
typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
#endif /* GL_VERSION_4_5 */
#ifndef GL_ARB_bindless_texture
typedef khronos_uint64_t GLuint64EXT;
#endif /* GL_ARB_bindless_texture */
#ifndef GL_ARB_cl_event
struct _cl_context;
struct _cl_event;
#endif /* GL_ARB_cl_event */
#ifndef GL_ARB_clip_control
#define GL_ARB_clip_control 1
#endif /* GL_ARB_clip_control */
#ifndef GL_ARB_debug_output
typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
#endif /* GL_ARB_debug_output */
#ifndef GL_EXT_EGL_image_storage
typedef void *GLeglImageOES;
#endif /* GL_EXT_EGL_image_storage */
#ifndef GL_EXT_direct_state_access
typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params);
typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params);
typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params);
typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param);
typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param);
#endif /* GL_EXT_direct_state_access */
#ifndef GL_NV_draw_vulkan_image
typedef void (APIENTRY *GLVULKANPROCNV)(void);
#endif /* GL_NV_draw_vulkan_image */
#ifndef GL_NV_gpu_shader5
typedef khronos_int64_t GLint64EXT;
#endif /* GL_NV_gpu_shader5 */
#ifndef GL_NV_vertex_buffer_unified_memory
typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result);
#endif /* GL_NV_vertex_buffer_unified_memory */
#ifdef __cplusplus
}
#endif
#endif
#ifndef GL3W_API
#define GL3W_API
#endif
#ifndef __gl_h_
#define __gl_h_
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define GL3W_OK 0
#define GL3W_ERROR_INIT -1
#define GL3W_ERROR_LIBRARY_OPEN -2
#define GL3W_ERROR_OPENGL_VERSION -3
typedef void (*GL3WglProc)(void);
typedef GL3WglProc (*GL3WGetProcAddressProc)(const char *proc);
/* gl3w api */
GL3W_API int imgl3wInit(void);
GL3W_API int imgl3wInit2(GL3WGetProcAddressProc proc);
GL3W_API int imgl3wIsSupported(int major, int minor);
GL3W_API GL3WglProc imgl3wGetProcAddress(const char *proc);
/* gl3w internal state */
union GL3WProcs {
GL3WglProc ptr[52];
struct {
PFNGLACTIVETEXTUREPROC ActiveTexture;
PFNGLATTACHSHADERPROC AttachShader;
PFNGLBINDBUFFERPROC BindBuffer;
PFNGLBINDSAMPLERPROC BindSampler;
PFNGLBINDTEXTUREPROC BindTexture;
PFNGLBINDVERTEXARRAYPROC BindVertexArray;
PFNGLBLENDEQUATIONPROC BlendEquation;
PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate;
PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate;
PFNGLBUFFERDATAPROC BufferData;
PFNGLCLEARPROC Clear;
PFNGLCLEARCOLORPROC ClearColor;
PFNGLCOMPILESHADERPROC CompileShader;
PFNGLCREATEPROGRAMPROC CreateProgram;
PFNGLCREATESHADERPROC CreateShader;
PFNGLDELETEBUFFERSPROC DeleteBuffers;
PFNGLDELETEPROGRAMPROC DeleteProgram;
PFNGLDELETESHADERPROC DeleteShader;
PFNGLDELETETEXTURESPROC DeleteTextures;
PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays;
PFNGLDETACHSHADERPROC DetachShader;
PFNGLDISABLEPROC Disable;
PFNGLDRAWELEMENTSPROC DrawElements;
PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex;
PFNGLENABLEPROC Enable;
PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
PFNGLGENBUFFERSPROC GenBuffers;
PFNGLGENTEXTURESPROC GenTextures;
PFNGLGENVERTEXARRAYSPROC GenVertexArrays;
PFNGLGETATTRIBLOCATIONPROC GetAttribLocation;
PFNGLGETINTEGERVPROC GetIntegerv;
PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
PFNGLGETPROGRAMIVPROC GetProgramiv;
PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
PFNGLGETSHADERIVPROC GetShaderiv;
PFNGLGETSTRINGPROC GetString;
PFNGLGETSTRINGIPROC GetStringi;
PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
PFNGLISENABLEDPROC IsEnabled;
PFNGLLINKPROGRAMPROC LinkProgram;
PFNGLPIXELSTOREIPROC PixelStorei;
PFNGLPOLYGONMODEPROC PolygonMode;
PFNGLREADPIXELSPROC ReadPixels;
PFNGLSCISSORPROC Scissor;
PFNGLSHADERSOURCEPROC ShaderSource;
PFNGLTEXIMAGE2DPROC TexImage2D;
PFNGLTEXPARAMETERIPROC TexParameteri;
PFNGLUNIFORM1IPROC Uniform1i;
PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;
PFNGLUSEPROGRAMPROC UseProgram;
PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;
PFNGLVIEWPORTPROC Viewport;
} gl;
};
GL3W_API extern union GL3WProcs gl3wProcs;
/* OpenGL functions */
#define glActiveTexture gl3wProcs.gl.ActiveTexture
#define glAttachShader gl3wProcs.gl.AttachShader
#define glBindBuffer gl3wProcs.gl.BindBuffer
#define glBindSampler gl3wProcs.gl.BindSampler
#define glBindTexture gl3wProcs.gl.BindTexture
#define glBindVertexArray gl3wProcs.gl.BindVertexArray
#define glBlendEquation gl3wProcs.gl.BlendEquation
#define glBlendEquationSeparate gl3wProcs.gl.BlendEquationSeparate
#define glBlendFuncSeparate gl3wProcs.gl.BlendFuncSeparate
#define glBufferData gl3wProcs.gl.BufferData
#define glClear gl3wProcs.gl.Clear
#define glClearColor gl3wProcs.gl.ClearColor
#define glCompileShader gl3wProcs.gl.CompileShader
#define glCreateProgram gl3wProcs.gl.CreateProgram
#define glCreateShader gl3wProcs.gl.CreateShader
#define glDeleteBuffers gl3wProcs.gl.DeleteBuffers
#define glDeleteProgram gl3wProcs.gl.DeleteProgram
#define glDeleteShader gl3wProcs.gl.DeleteShader
#define glDeleteTextures gl3wProcs.gl.DeleteTextures
#define glDeleteVertexArrays gl3wProcs.gl.DeleteVertexArrays
#define glDetachShader gl3wProcs.gl.DetachShader
#define glDisable gl3wProcs.gl.Disable
#define glDrawElements gl3wProcs.gl.DrawElements
#define glDrawElementsBaseVertex gl3wProcs.gl.DrawElementsBaseVertex
#define glEnable gl3wProcs.gl.Enable
#define glEnableVertexAttribArray gl3wProcs.gl.EnableVertexAttribArray
#define glGenBuffers gl3wProcs.gl.GenBuffers
#define glGenTextures gl3wProcs.gl.GenTextures
#define glGenVertexArrays gl3wProcs.gl.GenVertexArrays
#define glGetAttribLocation gl3wProcs.gl.GetAttribLocation
#define glGetIntegerv gl3wProcs.gl.GetIntegerv
#define glGetProgramInfoLog gl3wProcs.gl.GetProgramInfoLog
#define glGetProgramiv gl3wProcs.gl.GetProgramiv
#define glGetShaderInfoLog gl3wProcs.gl.GetShaderInfoLog
#define glGetShaderiv gl3wProcs.gl.GetShaderiv
#define glGetString gl3wProcs.gl.GetString
#define glGetStringi gl3wProcs.gl.GetStringi
#define glGetUniformLocation gl3wProcs.gl.GetUniformLocation
#define glIsEnabled gl3wProcs.gl.IsEnabled
#define glLinkProgram gl3wProcs.gl.LinkProgram
#define glPixelStorei gl3wProcs.gl.PixelStorei
#define glPolygonMode gl3wProcs.gl.PolygonMode
#define glReadPixels gl3wProcs.gl.ReadPixels
#define glScissor gl3wProcs.gl.Scissor
#define glShaderSource gl3wProcs.gl.ShaderSource
#define glTexImage2D gl3wProcs.gl.TexImage2D
#define glTexParameteri gl3wProcs.gl.TexParameteri
#define glUniform1i gl3wProcs.gl.Uniform1i
#define glUniformMatrix4fv gl3wProcs.gl.UniformMatrix4fv
#define glUseProgram gl3wProcs.gl.UseProgram
#define glVertexAttribPointer gl3wProcs.gl.VertexAttribPointer
#define glViewport gl3wProcs.gl.Viewport
#ifdef __cplusplus
}
#endif
#endif
#ifdef IMGL3W_IMPL
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#if defined(_WIN32)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN 1
#endif
#include <windows.h>
static HMODULE libgl;
typedef PROC(__stdcall* GL3WglGetProcAddr)(LPCSTR);
static GL3WglGetProcAddr wgl_get_proc_address;
static int open_libgl(void)
{
libgl = LoadLibraryA("opengl32.dll");
if (!libgl)
return GL3W_ERROR_LIBRARY_OPEN;
wgl_get_proc_address = (GL3WglGetProcAddr)GetProcAddress(libgl, "wglGetProcAddress");
return GL3W_OK;
}
static void close_libgl(void) { FreeLibrary(libgl); }
static GL3WglProc get_proc(const char *proc)
{
GL3WglProc res;
res = (GL3WglProc)wgl_get_proc_address(proc);
if (!res)
res = (GL3WglProc)GetProcAddress(libgl, proc);
return res;
}
#elif defined(__APPLE__)
#include <dlfcn.h>
static void *libgl;
static int open_libgl(void)
{
libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL);
if (!libgl)
return GL3W_ERROR_LIBRARY_OPEN;
return GL3W_OK;
}
static void close_libgl(void) { dlclose(libgl); }
static GL3WglProc get_proc(const char *proc)
{
GL3WglProc res;
*(void **)(&res) = dlsym(libgl, proc);
return res;
}
#else
#include <dlfcn.h>
static void *libgl;
static GL3WglProc (*glx_get_proc_address)(const GLubyte *);
static int open_libgl(void)
{
libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL);
if (!libgl)
return GL3W_ERROR_LIBRARY_OPEN;
*(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB");
return GL3W_OK;
}
static void close_libgl(void) { dlclose(libgl); }
static GL3WglProc get_proc(const char *proc)
{
GL3WglProc res;
res = glx_get_proc_address((const GLubyte *)proc);
if (!res)
*(void **)(&res) = dlsym(libgl, proc);
return res;
}
#endif
static struct { int major, minor; } version;
static int parse_version(void)
{
if (!glGetIntegerv)
return GL3W_ERROR_INIT;
glGetIntegerv(GL_MAJOR_VERSION, &version.major);
glGetIntegerv(GL_MINOR_VERSION, &version.minor);
if (version.major < 3)
return GL3W_ERROR_OPENGL_VERSION;
return GL3W_OK;
}
static void load_procs(GL3WGetProcAddressProc proc);
int imgl3wInit(void)
{
int res = open_libgl();
if (res)
return res;
atexit(close_libgl);
return imgl3wInit2(get_proc);
}
int imgl3wInit2(GL3WGetProcAddressProc proc)
{
load_procs(proc);
return parse_version();
}
int imgl3wIsSupported(int major, int minor)
{
if (major < 3)
return 0;
if (version.major == major)
return version.minor >= minor;
return version.major >= major;
}
GL3WglProc imgl3wGetProcAddress(const char *proc) { return get_proc(proc); }
static const char *proc_names[] = {
"glActiveTexture",
"glAttachShader",
"glBindBuffer",
"glBindSampler",
"glBindTexture",
"glBindVertexArray",
"glBlendEquation",
"glBlendEquationSeparate",
"glBlendFuncSeparate",
"glBufferData",
"glClear",
"glClearColor",
"glCompileShader",
"glCreateProgram",
"glCreateShader",
"glDeleteBuffers",
"glDeleteProgram",
"glDeleteShader",
"glDeleteTextures",
"glDeleteVertexArrays",
"glDetachShader",
"glDisable",
"glDrawElements",
"glDrawElementsBaseVertex",
"glEnable",
"glEnableVertexAttribArray",
"glGenBuffers",
"glGenTextures",
"glGenVertexArrays",
"glGetAttribLocation",
"glGetIntegerv",
"glGetProgramInfoLog",
"glGetProgramiv",
"glGetShaderInfoLog",
"glGetShaderiv",
"glGetString",
"glGetStringi",
"glGetUniformLocation",
"glIsEnabled",
"glLinkProgram",
"glPixelStorei",
"glPolygonMode",
"glReadPixels",
"glScissor",
"glShaderSource",
"glTexImage2D",
"glTexParameteri",
"glUniform1i",
"glUniformMatrix4fv",
"glUseProgram",
"glVertexAttribPointer",
"glViewport",
};
GL3W_API union GL3WProcs gl3wProcs;
static void load_procs(GL3WGetProcAddressProc proc)
{
size_t i;
for (i = 0; i < ARRAY_SIZE(proc_names); i++)
gl3wProcs.ptr[i] = proc(proc_names[i]);
}
#ifdef __cplusplus
}
#endif
#endif

24
backends/imgui_impl_osx.h Normal file
View File

@ -0,0 +1,24 @@
// dear imgui: Platform Backend for OSX / Cocoa
// This needs to be used along with a Renderer (e.g. OpenGL2, OpenGL3, Vulkan, Metal..)
// [ALPHA] Early backend, not well tested. If you want a portable application, prefer using the GLFW or SDL platform Backends on Mac.
// Implemented features:
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend).
// Issues:
// [ ] Platform: Keys are all generally very broken. Best using [event keycode] and not [event characters]..
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#include "imgui.h" // IMGUI_IMPL_API
@class NSEvent;
@class NSView;
IMGUI_IMPL_API bool ImGui_ImplOSX_Init();
IMGUI_IMPL_API void ImGui_ImplOSX_Shutdown();
IMGUI_IMPL_API void ImGui_ImplOSX_NewFrame(NSView* _Nullable view);
IMGUI_IMPL_API bool ImGui_ImplOSX_HandleEvent(NSEvent* _Nonnull event, NSView* _Nullable view);

369
backends/imgui_impl_osx.mm Normal file
View File

@ -0,0 +1,369 @@
// dear imgui: Platform Backend for OSX / Cocoa
// This needs to be used along with a Renderer (e.g. OpenGL2, OpenGL3, Vulkan, Metal..)
// [ALPHA] Early backend, not well tested. If you want a portable application, prefer using the GLFW or SDL platform Backends on Mac.
// Implemented features:
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend).
// Issues:
// [ ] Platform: Keys are all generally very broken. Best using [event keycode] and not [event characters]..
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#include "imgui.h"
#include "imgui_impl_osx.h"
#import <Cocoa/Cocoa.h>
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-08-17: Calling io.AddFocusEvent() on NSApplicationDidBecomeActiveNotification/NSApplicationDidResignActiveNotification events.
// 2021-06-23: Inputs: Added a fix for shortcuts using CTRL key instead of CMD key.
// 2021-04-19: Inputs: Added a fix for keys remaining stuck in pressed state when CMD-tabbing into different application.
// 2021-01-27: Inputs: Added a fix for mouse position not being reported when mouse buttons other than left one are down.
// 2020-10-28: Inputs: Added a fix for handling keypad-enter key.
// 2020-05-25: Inputs: Added a fix for missing trackpad clicks when done with "soft tap".
// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor.
// 2019-10-11: Inputs: Fix using Backspace key.
// 2019-07-21: Re-added clipboard handlers as they are not enabled by default in core imgui.cpp (reverted 2019-05-18 change).
// 2019-05-28: Inputs: Added mouse cursor shape and visibility support.
// 2019-05-18: Misc: Removed clipboard handlers as they are now supported by core imgui.cpp.
// 2019-05-11: Inputs: Don't filter character values before calling AddInputCharacter() apart from 0xF700..0xFFFF range.
// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window.
// 2018-07-07: Initial version.
@class ImFocusObserver;
// Data
static CFAbsoluteTime g_Time = 0.0;
static NSCursor* g_MouseCursors[ImGuiMouseCursor_COUNT] = {};
static bool g_MouseCursorHidden = false;
static bool g_MouseJustPressed[ImGuiMouseButton_COUNT] = {};
static bool g_MouseDown[ImGuiMouseButton_COUNT] = {};
static ImFocusObserver* g_FocusObserver = NULL;
// Undocumented methods for creating cursors.
@interface NSCursor()
+ (id)_windowResizeNorthWestSouthEastCursor;
+ (id)_windowResizeNorthEastSouthWestCursor;
+ (id)_windowResizeNorthSouthCursor;
+ (id)_windowResizeEastWestCursor;
@end
static void resetKeys()
{
ImGuiIO& io = ImGui::GetIO();
memset(io.KeysDown, 0, sizeof(io.KeysDown));
io.KeyCtrl = io.KeyShift = io.KeyAlt = io.KeySuper = false;
}
@interface ImFocusObserver : NSObject
- (void)onApplicationBecomeActive:(NSNotification*)aNotification;
- (void)onApplicationBecomeInactive:(NSNotification*)aNotification;
@end
@implementation ImFocusObserver
- (void)onApplicationBecomeActive:(NSNotification*)aNotification
{
ImGuiIO& io = ImGui::GetIO();
io.AddFocusEvent(true);
}
- (void)onApplicationBecomeInactive:(NSNotification*)aNotification
{
ImGuiIO& io = ImGui::GetIO();
io.AddFocusEvent(false);
// Unfocused applications do not receive input events, therefore we must manually
// release any pressed keys when application loses focus, otherwise they would remain
// stuck in a pressed state. https://github.com/ocornut/imgui/issues/3832
resetKeys();
}
@end
// Functions
bool ImGui_ImplOSX_Init()
{
ImGuiIO& io = ImGui::GetIO();
// Setup backend capabilities flags
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
//io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
//io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional)
//io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport; // We can set io.MouseHoveredViewport correctly (optional, not easy)
io.BackendPlatformName = "imgui_impl_osx";
// Keyboard mapping. Dear ImGui will use those indices to peek into the io.KeyDown[] array.
const int offset_for_function_keys = 256 - 0xF700;
io.KeyMap[ImGuiKey_Tab] = '\t';
io.KeyMap[ImGuiKey_LeftArrow] = NSLeftArrowFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_RightArrow] = NSRightArrowFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_UpArrow] = NSUpArrowFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_DownArrow] = NSDownArrowFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_PageUp] = NSPageUpFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_PageDown] = NSPageDownFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_Home] = NSHomeFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_End] = NSEndFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_Insert] = NSInsertFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_Delete] = NSDeleteFunctionKey + offset_for_function_keys;
io.KeyMap[ImGuiKey_Backspace] = 127;
io.KeyMap[ImGuiKey_Space] = 32;
io.KeyMap[ImGuiKey_Enter] = 13;
io.KeyMap[ImGuiKey_Escape] = 27;
io.KeyMap[ImGuiKey_KeyPadEnter] = 3;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
// Load cursors. Some of them are undocumented.
g_MouseCursorHidden = false;
g_MouseCursors[ImGuiMouseCursor_Arrow] = [NSCursor arrowCursor];
g_MouseCursors[ImGuiMouseCursor_TextInput] = [NSCursor IBeamCursor];
g_MouseCursors[ImGuiMouseCursor_ResizeAll] = [NSCursor closedHandCursor];
g_MouseCursors[ImGuiMouseCursor_Hand] = [NSCursor pointingHandCursor];
g_MouseCursors[ImGuiMouseCursor_NotAllowed] = [NSCursor operationNotAllowedCursor];
g_MouseCursors[ImGuiMouseCursor_ResizeNS] = [NSCursor respondsToSelector:@selector(_windowResizeNorthSouthCursor)] ? [NSCursor _windowResizeNorthSouthCursor] : [NSCursor resizeUpDownCursor];
g_MouseCursors[ImGuiMouseCursor_ResizeEW] = [NSCursor respondsToSelector:@selector(_windowResizeEastWestCursor)] ? [NSCursor _windowResizeEastWestCursor] : [NSCursor resizeLeftRightCursor];
g_MouseCursors[ImGuiMouseCursor_ResizeNESW] = [NSCursor respondsToSelector:@selector(_windowResizeNorthEastSouthWestCursor)] ? [NSCursor _windowResizeNorthEastSouthWestCursor] : [NSCursor closedHandCursor];
g_MouseCursors[ImGuiMouseCursor_ResizeNWSE] = [NSCursor respondsToSelector:@selector(_windowResizeNorthWestSouthEastCursor)] ? [NSCursor _windowResizeNorthWestSouthEastCursor] : [NSCursor closedHandCursor];
// Note that imgui.cpp also include default OSX clipboard handlers which can be enabled
// by adding '#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS' in imconfig.h and adding '-framework ApplicationServices' to your linker command-line.
// Since we are already in ObjC land here, it is easy for us to add a clipboard handler using the NSPasteboard api.
io.SetClipboardTextFn = [](void*, const char* str) -> void
{
NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
[pasteboard declareTypes:[NSArray arrayWithObject:NSPasteboardTypeString] owner:nil];
[pasteboard setString:[NSString stringWithUTF8String:str] forType:NSPasteboardTypeString];
};
io.GetClipboardTextFn = [](void*) -> const char*
{
NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
NSString* available = [pasteboard availableTypeFromArray: [NSArray arrayWithObject:NSPasteboardTypeString]];
if (![available isEqualToString:NSPasteboardTypeString])
return NULL;
NSString* string = [pasteboard stringForType:NSPasteboardTypeString];
if (string == nil)
return NULL;
const char* string_c = (const char*)[string UTF8String];
size_t string_len = strlen(string_c);
static ImVector<char> s_clipboard;
s_clipboard.resize((int)string_len + 1);
strcpy(s_clipboard.Data, string_c);
return s_clipboard.Data;
};
g_FocusObserver = [[ImFocusObserver alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:g_FocusObserver
selector:@selector(onApplicationBecomeActive:)
name:NSApplicationDidBecomeActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:g_FocusObserver
selector:@selector(onApplicationBecomeInactive:)
name:NSApplicationDidResignActiveNotification
object:nil];
return true;
}
void ImGui_ImplOSX_Shutdown()
{
g_FocusObserver = NULL;
}
static void ImGui_ImplOSX_UpdateMouseCursorAndButtons()
{
// Update buttons
ImGuiIO& io = ImGui::GetIO();
for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
{
// If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
io.MouseDown[i] = g_MouseJustPressed[i] || g_MouseDown[i];
g_MouseJustPressed[i] = false;
}
if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
return;
ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None)
{
// Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
if (!g_MouseCursorHidden)
{
g_MouseCursorHidden = true;
[NSCursor hide];
}
}
else
{
// Show OS mouse cursor
[g_MouseCursors[g_MouseCursors[imgui_cursor] ? imgui_cursor : ImGuiMouseCursor_Arrow] set];
if (g_MouseCursorHidden)
{
g_MouseCursorHidden = false;
[NSCursor unhide];
}
}
}
void ImGui_ImplOSX_NewFrame(NSView* view)
{
// Setup display size
ImGuiIO& io = ImGui::GetIO();
if (view)
{
const float dpi = (float)[view.window backingScaleFactor];
io.DisplaySize = ImVec2((float)view.bounds.size.width, (float)view.bounds.size.height);
io.DisplayFramebufferScale = ImVec2(dpi, dpi);
}
// Setup time step
if (g_Time == 0.0)
g_Time = CFAbsoluteTimeGetCurrent();
CFAbsoluteTime current_time = CFAbsoluteTimeGetCurrent();
io.DeltaTime = (float)(current_time - g_Time);
g_Time = current_time;
ImGui_ImplOSX_UpdateMouseCursorAndButtons();
}
static int mapCharacterToKey(int c)
{
if (c >= 'a' && c <= 'z')
return c - 'a' + 'A';
if (c == 25) // SHIFT+TAB -> TAB
return 9;
if (c >= 0 && c < 256)
return c;
if (c >= 0xF700 && c < 0xF700 + 256)
return c - 0xF700 + 256;
return -1;
}
bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view)
{
ImGuiIO& io = ImGui::GetIO();
if (event.type == NSEventTypeLeftMouseDown || event.type == NSEventTypeRightMouseDown || event.type == NSEventTypeOtherMouseDown)
{
int button = (int)[event buttonNumber];
if (button >= 0 && button < IM_ARRAYSIZE(g_MouseDown))
g_MouseDown[button] = g_MouseJustPressed[button] = true;
return io.WantCaptureMouse;
}
if (event.type == NSEventTypeLeftMouseUp || event.type == NSEventTypeRightMouseUp || event.type == NSEventTypeOtherMouseUp)
{
int button = (int)[event buttonNumber];
if (button >= 0 && button < IM_ARRAYSIZE(g_MouseDown))
g_MouseDown[button] = false;
return io.WantCaptureMouse;
}
if (event.type == NSEventTypeMouseMoved || event.type == NSEventTypeLeftMouseDragged || event.type == NSEventTypeRightMouseDragged || event.type == NSEventTypeOtherMouseDragged)
{
NSPoint mousePoint = event.locationInWindow;
mousePoint = [view convertPoint:mousePoint fromView:nil];
mousePoint = NSMakePoint(mousePoint.x, view.bounds.size.height - mousePoint.y);
io.MousePos = ImVec2((float)mousePoint.x, (float)mousePoint.y);
}
if (event.type == NSEventTypeScrollWheel)
{
double wheel_dx = 0.0;
double wheel_dy = 0.0;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
{
wheel_dx = [event scrollingDeltaX];
wheel_dy = [event scrollingDeltaY];
if ([event hasPreciseScrollingDeltas])
{
wheel_dx *= 0.1;
wheel_dy *= 0.1;
}
}
else
#endif // MAC_OS_X_VERSION_MAX_ALLOWED
{
wheel_dx = [event deltaX];
wheel_dy = [event deltaY];
}
if (fabs(wheel_dx) > 0.0)
io.MouseWheelH += (float)wheel_dx * 0.1f;
if (fabs(wheel_dy) > 0.0)
io.MouseWheel += (float)wheel_dy * 0.1f;
return io.WantCaptureMouse;
}
// FIXME: All the key handling is wrong and broken. Refer to GLFW's cocoa_init.mm and cocoa_window.mm.
if (event.type == NSEventTypeKeyDown)
{
NSString* str = [event characters];
NSUInteger len = [str length];
for (NSUInteger i = 0; i < len; i++)
{
int c = [str characterAtIndex:i];
if (!io.KeySuper && !(c >= 0xF700 && c <= 0xFFFF) && c != 127)
io.AddInputCharacter((unsigned int)c);
// We must reset in case we're pressing a sequence of special keys while keeping the command pressed
int key = mapCharacterToKey(c);
if (key != -1 && key < 256 && !io.KeySuper)
resetKeys();
if (key != -1)
io.KeysDown[key] = true;
}
return io.WantCaptureKeyboard;
}
if (event.type == NSEventTypeKeyUp)
{
NSString* str = [event characters];
NSUInteger len = [str length];
for (NSUInteger i = 0; i < len; i++)
{
int c = [str characterAtIndex:i];
int key = mapCharacterToKey(c);
if (key != -1)
io.KeysDown[key] = false;
}
return io.WantCaptureKeyboard;
}
if (event.type == NSEventTypeFlagsChanged)
{
unsigned int flags = [event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
bool oldKeyCtrl = io.KeyCtrl;
bool oldKeyShift = io.KeyShift;
bool oldKeyAlt = io.KeyAlt;
bool oldKeySuper = io.KeySuper;
io.KeyCtrl = flags & NSEventModifierFlagControl;
io.KeyShift = flags & NSEventModifierFlagShift;
io.KeyAlt = flags & NSEventModifierFlagOption;
io.KeySuper = flags & NSEventModifierFlagCommand;
// We must reset them as we will not receive any keyUp event if they where pressed with a modifier
if ((oldKeyShift && !io.KeyShift) || (oldKeyCtrl && !io.KeyCtrl) || (oldKeyAlt && !io.KeyAlt) || (oldKeySuper && !io.KeySuper))
resetKeys();
return io.WantCaptureKeyboard;
}
return false;
}

443
backends/imgui_impl_sdl.cpp Normal file
View File

@ -0,0 +1,443 @@
// dear imgui: Platform Backend for SDL2
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
// (Info: SDL2 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.)
// (Prefer SDL 2.0.5+ for full feature support.)
// Implemented features:
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// [X] Platform: Clipboard support.
// [X] Platform: Keyboard arrays indexed using SDL_SCANCODE_* codes, e.g. ImGui::IsKeyPressed(SDL_SCANCODE_SPACE).
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// Missing features:
// [ ] Platform: SDL2 handling of IME under Windows appears to be broken and it explicitly disable the regular Windows IME. You can restore Windows IME by compiling SDL with SDL_DISABLE_WINDOWS_IME.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-08-17: Calling io.AddFocusEvent() on SDL_WINDOWEVENT_FOCUS_GAINED/SDL_WINDOWEVENT_FOCUS_LOST.
// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using SDL_GetMouseFocus() + SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, requires SDL 2.0.5+)
// 2021-06-29: *BREAKING CHANGE* Removed 'SDL_Window* window' parameter to ImGui_ImplSDL2_NewFrame() which was unnecessary.
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-03-22: Rework global mouse pos availability check listing supported platforms explicitly, effectively fixing mouse access on Raspberry Pi. (#2837, #3950)
// 2020-05-25: Misc: Report a zero display-size when window is minimized, to be consistent with other backends.
// 2020-02-20: Inputs: Fixed mapping for ImGuiKey_KeyPadEnter (using SDL_SCANCODE_KP_ENTER instead of SDL_SCANCODE_RETURN2).
// 2019-12-17: Inputs: On Wayland, use SDL_GetMouseState (because there is no global mouse state).
// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor.
// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter.
// 2019-04-23: Inputs: Added support for SDL_GameController (if ImGuiConfigFlags_NavEnableGamepad is set by user application).
// 2019-03-12: Misc: Preserve DisplayFramebufferScale when main window is minimized.
// 2018-12-21: Inputs: Workaround for Android/iOS which don't seem to handle focus related calls.
// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window.
// 2018-11-14: Changed the signature of ImGui_ImplSDL2_ProcessEvent() to take a 'const SDL_Event*'.
// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls.
// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor.
// 2018-06-08: Misc: Extracted imgui_impl_sdl.cpp/.h away from the old combined SDL2+OpenGL/Vulkan examples.
// 2018-06-08: Misc: ImGui_ImplSDL2_InitForOpenGL() now takes a SDL_GLContext parameter.
// 2018-05-09: Misc: Fixed clipboard paste memory leak (we didn't call SDL_FreeMemory on the data returned by SDL_GetClipboardText).
// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag.
// 2018-02-16: Inputs: Added support for mouse cursors, honoring ImGui::GetMouseCursor() value.
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
// 2018-02-05: Misc: Using SDL_GetPerformanceCounter() instead of SDL_GetTicks() to be able to handle very high framerate (1000+ FPS).
// 2018-02-05: Inputs: Keyboard mapping is using scancodes everywhere instead of a confusing mixture of keycodes and scancodes.
// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support.
// 2018-01-19: Inputs: When available (SDL 2.0.4+) using SDL_CaptureMouse() to retrieve coordinates outside of client area when dragging. Otherwise (SDL 2.0.3 and before) testing for SDL_WINDOW_INPUT_FOCUS instead of SDL_WINDOW_MOUSE_FOCUS.
// 2018-01-18: Inputs: Added mapping for ImGuiKey_Insert.
// 2017-08-25: Inputs: MousePos set to -FLT_MAX,-FLT_MAX when mouse is unavailable/missing (instead of -1,-1).
// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers.
#include "imgui.h"
#include "imgui_impl_sdl.h"
// SDL
#include <SDL.h>
#include <SDL_syswm.h>
#if defined(__APPLE__)
#include "TargetConditionals.h"
#endif
#if SDL_VERSION_ATLEAST(2,0,4) && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS)
#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 1
#else
#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 0
#endif
#define SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH SDL_VERSION_ATLEAST(2,0,5)
#define SDL_HAS_VULKAN SDL_VERSION_ATLEAST(2,0,6)
// SDL Data
struct ImGui_ImplSDL2_Data
{
SDL_Window* Window;
Uint64 Time;
bool MousePressed[3];
SDL_Cursor* MouseCursors[ImGuiMouseCursor_COUNT];
char* ClipboardTextData;
bool MouseCanUseGlobalState;
ImGui_ImplSDL2_Data() { memset(this, 0, sizeof(*this)); }
};
// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context.
static ImGui_ImplSDL2_Data* ImGui_ImplSDL2_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplSDL2_Data*)ImGui::GetIO().BackendPlatformUserData : NULL;
}
// Functions
static const char* ImGui_ImplSDL2_GetClipboardText(void*)
{
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
if (bd->ClipboardTextData)
SDL_free(bd->ClipboardTextData);
bd->ClipboardTextData = SDL_GetClipboardText();
return bd->ClipboardTextData;
}
static void ImGui_ImplSDL2_SetClipboardText(void*, const char* text)
{
SDL_SetClipboardText(text);
}
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field.
bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
switch (event->type)
{
case SDL_MOUSEWHEEL:
{
if (event->wheel.x > 0) io.MouseWheelH += 1;
if (event->wheel.x < 0) io.MouseWheelH -= 1;
if (event->wheel.y > 0) io.MouseWheel += 1;
if (event->wheel.y < 0) io.MouseWheel -= 1;
return true;
}
case SDL_MOUSEBUTTONDOWN:
{
if (event->button.button == SDL_BUTTON_LEFT) { bd->MousePressed[0] = true; }
if (event->button.button == SDL_BUTTON_RIGHT) { bd->MousePressed[1] = true; }
if (event->button.button == SDL_BUTTON_MIDDLE) { bd->MousePressed[2] = true; }
return true;
}
case SDL_TEXTINPUT:
{
io.AddInputCharactersUTF8(event->text.text);
return true;
}
case SDL_KEYDOWN:
case SDL_KEYUP:
{
int key = event->key.keysym.scancode;
IM_ASSERT(key >= 0 && key < IM_ARRAYSIZE(io.KeysDown));
io.KeysDown[key] = (event->type == SDL_KEYDOWN);
io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);
io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);
io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);
#ifdef _WIN32
io.KeySuper = false;
#else
io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0);
#endif
return true;
}
case SDL_WINDOWEVENT:
{
if (event->window.event == SDL_WINDOWEVENT_FOCUS_GAINED)
io.AddFocusEvent(true);
else if (event->window.event == SDL_WINDOWEVENT_FOCUS_LOST)
io.AddFocusEvent(false);
return true;
}
}
return false;
}
static bool ImGui_ImplSDL2_Init(SDL_Window* window)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!");
// Check and store if we are on a SDL backend that supports global mouse position
// ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list)
bool mouse_can_use_global_state = false;
#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE
const char* sdl_backend = SDL_GetCurrentVideoDriver();
const char* global_mouse_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" };
for (int n = 0; n < IM_ARRAYSIZE(global_mouse_whitelist); n++)
if (strncmp(sdl_backend, global_mouse_whitelist[n], strlen(global_mouse_whitelist[n])) == 0)
mouse_can_use_global_state = true;
#endif
// Setup backend capabilities flags
ImGui_ImplSDL2_Data* bd = IM_NEW(ImGui_ImplSDL2_Data)();
io.BackendPlatformUserData = (void*)bd;
io.BackendPlatformName = "imgui_impl_sdl";
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
bd->Window = window;
bd->MouseCanUseGlobalState = mouse_can_use_global_state;
// Keyboard mapping. Dear ImGui will use those indices to peek into the io.KeysDown[] array.
io.KeyMap[ImGuiKey_Tab] = SDL_SCANCODE_TAB;
io.KeyMap[ImGuiKey_LeftArrow] = SDL_SCANCODE_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = SDL_SCANCODE_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = SDL_SCANCODE_UP;
io.KeyMap[ImGuiKey_DownArrow] = SDL_SCANCODE_DOWN;
io.KeyMap[ImGuiKey_PageUp] = SDL_SCANCODE_PAGEUP;
io.KeyMap[ImGuiKey_PageDown] = SDL_SCANCODE_PAGEDOWN;
io.KeyMap[ImGuiKey_Home] = SDL_SCANCODE_HOME;
io.KeyMap[ImGuiKey_End] = SDL_SCANCODE_END;
io.KeyMap[ImGuiKey_Insert] = SDL_SCANCODE_INSERT;
io.KeyMap[ImGuiKey_Delete] = SDL_SCANCODE_DELETE;
io.KeyMap[ImGuiKey_Backspace] = SDL_SCANCODE_BACKSPACE;
io.KeyMap[ImGuiKey_Space] = SDL_SCANCODE_SPACE;
io.KeyMap[ImGuiKey_Enter] = SDL_SCANCODE_RETURN;
io.KeyMap[ImGuiKey_Escape] = SDL_SCANCODE_ESCAPE;
io.KeyMap[ImGuiKey_KeyPadEnter] = SDL_SCANCODE_KP_ENTER;
io.KeyMap[ImGuiKey_A] = SDL_SCANCODE_A;
io.KeyMap[ImGuiKey_C] = SDL_SCANCODE_C;
io.KeyMap[ImGuiKey_V] = SDL_SCANCODE_V;
io.KeyMap[ImGuiKey_X] = SDL_SCANCODE_X;
io.KeyMap[ImGuiKey_Y] = SDL_SCANCODE_Y;
io.KeyMap[ImGuiKey_Z] = SDL_SCANCODE_Z;
io.SetClipboardTextFn = ImGui_ImplSDL2_SetClipboardText;
io.GetClipboardTextFn = ImGui_ImplSDL2_GetClipboardText;
io.ClipboardUserData = NULL;
// Load mouse cursors
bd->MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
bd->MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM);
bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL);
bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS);
bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE);
bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW);
bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE);
bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND);
bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO);
#ifdef _WIN32
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
if (SDL_GetWindowWMInfo(window, &info))
io.ImeWindowHandle = info.info.win.window;
#else
(void)window;
#endif
// Set SDL hint to receive mouse click events on window focus, otherwise SDL doesn't emit the event.
// Without this, when clicking to gain focus, our widgets wouldn't activate even though they showed as hovered.
// (This is unfortunately a global SDL setting, so enabling it might have a side-effect on your application.
// It is unlikely to make a difference, but if your app absolutely needs to ignore the initial on-focus click:
// you can ignore SDL_MOUSEBUTTONDOWN events coming right after a SDL_WINDOWEVENT_FOCUS_GAINED)
#if SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH
SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1");
#endif
return true;
}
bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context)
{
IM_UNUSED(sdl_gl_context); // Viewport branch will need this.
return ImGui_ImplSDL2_Init(window);
}
bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window)
{
#if !SDL_HAS_VULKAN
IM_ASSERT(0 && "Unsupported");
#endif
return ImGui_ImplSDL2_Init(window);
}
bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window)
{
#if !defined(_WIN32)
IM_ASSERT(0 && "Unsupported");
#endif
return ImGui_ImplSDL2_Init(window);
}
bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window)
{
return ImGui_ImplSDL2_Init(window);
}
void ImGui_ImplSDL2_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
if (bd->ClipboardTextData)
SDL_free(bd->ClipboardTextData);
for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++)
SDL_FreeCursor(bd->MouseCursors[cursor_n]);
io.BackendPlatformName = NULL;
io.BackendPlatformUserData = NULL;
IM_DELETE(bd);
}
static void ImGui_ImplSDL2_UpdateMousePosAndButtons()
{
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
ImGuiIO& io = ImGui::GetIO();
ImVec2 mouse_pos_prev = io.MousePos;
io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
// Update mouse buttons
int mouse_x_local, mouse_y_local;
Uint32 mouse_buttons = SDL_GetMouseState(&mouse_x_local, &mouse_y_local);
io.MouseDown[0] = bd->MousePressed[0] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
io.MouseDown[1] = bd->MousePressed[1] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0;
io.MouseDown[2] = bd->MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;
bd->MousePressed[0] = bd->MousePressed[1] = bd->MousePressed[2] = false;
// Obtain focused and hovered window. We forward mouse input when focused or when hovered (and no other window is capturing)
#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE
SDL_Window* focused_window = SDL_GetKeyboardFocus();
SDL_Window* hovered_window = SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH ? SDL_GetMouseFocus() : NULL; // This is better but is only reliably useful with SDL 2.0.5+ and SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH.
SDL_Window* mouse_window = NULL;
if (hovered_window && bd->Window == hovered_window)
mouse_window = hovered_window;
else if (focused_window && bd->Window == focused_window)
mouse_window = focused_window;
// SDL_CaptureMouse() let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't e.g. trigger other operations outside
SDL_CaptureMouse(ImGui::IsAnyMouseDown() ? SDL_TRUE : SDL_FALSE);
#else
// SDL 2.0.3 and non-windowed systems: single-viewport only
SDL_Window* mouse_window = (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) ? bd->Window : NULL;
#endif
if (mouse_window == NULL)
return;
// Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user)
if (io.WantSetMousePos)
SDL_WarpMouseInWindow(bd->Window, (int)mouse_pos_prev.x, (int)mouse_pos_prev.y);
// Set Dear ImGui mouse position from OS position + get buttons. (this is the common behavior)
if (bd->MouseCanUseGlobalState)
{
// Single-viewport mode: mouse position in client window coordinates (io.MousePos is (0,0) when the mouse is on the upper-left corner of the app window)
// Unlike local position obtained earlier this will be valid when straying out of bounds.
int mouse_x_global, mouse_y_global;
SDL_GetGlobalMouseState(&mouse_x_global, &mouse_y_global);
int window_x, window_y;
SDL_GetWindowPosition(mouse_window, &window_x, &window_y);
io.MousePos = ImVec2((float)(mouse_x_global - window_x), (float)(mouse_y_global - window_y));
}
else
{
io.MousePos = ImVec2((float)mouse_x_local, (float)mouse_y_local);
}
}
static void ImGui_ImplSDL2_UpdateMouseCursor()
{
ImGuiIO& io = ImGui::GetIO();
if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
return;
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None)
{
// Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
SDL_ShowCursor(SDL_FALSE);
}
else
{
// Show OS mouse cursor
SDL_SetCursor(bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow]);
SDL_ShowCursor(SDL_TRUE);
}
}
static void ImGui_ImplSDL2_UpdateGamepads()
{
ImGuiIO& io = ImGui::GetIO();
memset(io.NavInputs, 0, sizeof(io.NavInputs));
if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
return;
// Get gamepad
SDL_GameController* game_controller = SDL_GameControllerOpen(0);
if (!game_controller)
{
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
return;
}
// Update gamepad inputs
#define MAP_BUTTON(NAV_NO, BUTTON_NO) { io.NavInputs[NAV_NO] = (SDL_GameControllerGetButton(game_controller, BUTTON_NO) != 0) ? 1.0f : 0.0f; }
#define MAP_ANALOG(NAV_NO, AXIS_NO, V0, V1) { float vn = (float)(SDL_GameControllerGetAxis(game_controller, AXIS_NO) - V0) / (float)(V1 - V0); if (vn > 1.0f) vn = 1.0f; if (vn > 0.0f && io.NavInputs[NAV_NO] < vn) io.NavInputs[NAV_NO] = vn; }
const int thumb_dead_zone = 8000; // SDL_gamecontroller.h suggests using this value.
MAP_BUTTON(ImGuiNavInput_Activate, SDL_CONTROLLER_BUTTON_A); // Cross / A
MAP_BUTTON(ImGuiNavInput_Cancel, SDL_CONTROLLER_BUTTON_B); // Circle / B
MAP_BUTTON(ImGuiNavInput_Menu, SDL_CONTROLLER_BUTTON_X); // Square / X
MAP_BUTTON(ImGuiNavInput_Input, SDL_CONTROLLER_BUTTON_Y); // Triangle / Y
MAP_BUTTON(ImGuiNavInput_DpadLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT); // D-Pad Left
MAP_BUTTON(ImGuiNavInput_DpadRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); // D-Pad Right
MAP_BUTTON(ImGuiNavInput_DpadUp, SDL_CONTROLLER_BUTTON_DPAD_UP); // D-Pad Up
MAP_BUTTON(ImGuiNavInput_DpadDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN); // D-Pad Down
MAP_BUTTON(ImGuiNavInput_FocusPrev, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); // L1 / LB
MAP_BUTTON(ImGuiNavInput_FocusNext, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); // R1 / RB
MAP_BUTTON(ImGuiNavInput_TweakSlow, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); // L1 / LB
MAP_BUTTON(ImGuiNavInput_TweakFast, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); // R1 / RB
MAP_ANALOG(ImGuiNavInput_LStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumb_dead_zone, -32768);
MAP_ANALOG(ImGuiNavInput_LStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumb_dead_zone, +32767);
MAP_ANALOG(ImGuiNavInput_LStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumb_dead_zone, -32767);
MAP_ANALOG(ImGuiNavInput_LStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumb_dead_zone, +32767);
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
#undef MAP_BUTTON
#undef MAP_ANALOG
}
void ImGui_ImplSDL2_NewFrame()
{
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplSDL2_Init()?");
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w, h;
int display_w, display_h;
SDL_GetWindowSize(bd->Window, &w, &h);
if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED)
w = h = 0;
SDL_GL_GetDrawableSize(bd->Window, &display_w, &display_h);
io.DisplaySize = ImVec2((float)w, (float)h);
if (w > 0 && h > 0)
io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h);
// Setup time step (we don't use SDL_GetTicks() because it is using millisecond resolution)
static Uint64 frequency = SDL_GetPerformanceFrequency();
Uint64 current_time = SDL_GetPerformanceCounter();
io.DeltaTime = bd->Time > 0 ? (float)((double)(current_time - bd->Time) / frequency) : (float)(1.0f / 60.0f);
bd->Time = current_time;
ImGui_ImplSDL2_UpdateMousePosAndButtons();
ImGui_ImplSDL2_UpdateMouseCursor();
// Update game controllers (if enabled and available)
ImGui_ImplSDL2_UpdateGamepads();
}

34
backends/imgui_impl_sdl.h Normal file
View File

@ -0,0 +1,34 @@
// dear imgui: Platform Backend for SDL2
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
// (Info: SDL2 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.)
// Implemented features:
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// [X] Platform: Clipboard support.
// [X] Platform: Keyboard arrays indexed using SDL_SCANCODE_* codes, e.g. ImGui::IsKeyPressed(SDL_SCANCODE_SPACE).
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// Missing features:
// [ ] Platform: SDL2 handling of IME under Windows appears to be broken and it explicitly disable the regular Windows IME. You can restore Windows IME by compiling SDL with SDL_DISABLE_WINDOWS_IME.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
struct SDL_Window;
typedef union SDL_Event SDL_Event;
IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context);
IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window);
IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window);
IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window);
IMGUI_IMPL_API void ImGui_ImplSDL2_Shutdown();
IMGUI_IMPL_API void ImGui_ImplSDL2_NewFrame();
IMGUI_IMPL_API bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event);
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
static inline void ImGui_ImplSDL2_NewFrame(SDL_Window*) { ImGui_ImplSDL2_NewFrame(); } // 1.84: removed unnecessary parameter
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,149 @@
// dear imgui: Renderer Backend for Vulkan
// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
// Implemented features:
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// Missing features:
// [ ] Renderer: User texture binding. Changes of ImTextureID aren't supported by this backend! See https://github.com/ocornut/imgui/pull/914
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// The aim of imgui_impl_vulkan.h/.cpp is to be usable in your engine without any modification.
// IF YOU FEEL YOU NEED TO MAKE ANY CHANGE TO THIS CODE, please share them and your feedback at https://github.com/ocornut/imgui/
// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app.
// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h.
// You will use those if you want to use this rendering backend in your engine/app.
// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by
// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code.
// Read comments in imgui_impl_vulkan.h.
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
// [Configuration] in order to use a custom Vulkan function loader:
// (1) You'll need to disable default Vulkan function prototypes.
// We provide a '#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES' convenience configuration flag.
// In order to make sure this is visible from the imgui_impl_vulkan.cpp compilation unit:
// - Add '#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES' in your imconfig.h file
// - Or as a compilation flag in your build system
// - Or uncomment here (not recommended because you'd be modifying imgui sources!)
// - Do not simply add it in a .cpp file!
// (2) Call ImGui_ImplVulkan_LoadFunctions() before ImGui_ImplVulkan_Init() with your custom function.
// If you have no idea what this is, leave it alone!
//#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES
// Vulkan includes
#if defined(IMGUI_IMPL_VULKAN_NO_PROTOTYPES) && !defined(VK_NO_PROTOTYPES)
#define VK_NO_PROTOTYPES
#endif
#include <vulkan/vulkan.h>
// Initialization data, for ImGui_ImplVulkan_Init()
// [Please zero-clear before use!]
struct ImGui_ImplVulkan_InitInfo
{
VkInstance Instance;
VkPhysicalDevice PhysicalDevice;
VkDevice Device;
uint32_t QueueFamily;
VkQueue Queue;
VkPipelineCache PipelineCache;
VkDescriptorPool DescriptorPool;
uint32_t Subpass;
uint32_t MinImageCount; // >= 2
uint32_t ImageCount; // >= MinImageCount
VkSampleCountFlagBits MSAASamples; // >= VK_SAMPLE_COUNT_1_BIT
const VkAllocationCallbacks* Allocator;
void (*CheckVkResultFn)(VkResult err);
};
// Called by user code
IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass);
IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown();
IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame();
IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline = VK_NULL_HANDLE);
IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer);
IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontUploadObjects();
IMGUI_IMPL_API void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count); // To override MinImageCount after initialization (e.g. if swap chain is recreated)
// Optional: load Vulkan functions with a custom function loader
// This is only useful with IMGUI_IMPL_VULKAN_NO_PROTOTYPES / VK_NO_PROTOTYPES
IMGUI_IMPL_API bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data = NULL);
//-------------------------------------------------------------------------
// Internal / Miscellaneous Vulkan Helpers
// (Used by example's main.cpp. Used by multi-viewport features. PROBABLY NOT used by your own engine/app.)
//-------------------------------------------------------------------------
// You probably do NOT need to use or care about those functions.
// Those functions only exist because:
// 1) they facilitate the readability and maintenance of the multiple main.cpp examples files.
// 2) the upcoming multi-viewport feature will need them internally.
// Generally we avoid exposing any kind of superfluous high-level helpers in the backends,
// but it is too much code to duplicate everywhere so we exceptionally expose them.
//
// Your engine/app will likely _already_ have code to setup all that stuff (swap chain, render pass, frame buffers, etc.).
// You may read this code to learn about Vulkan, but it is recommended you use you own custom tailored code to do equivalent work.
// (The ImGui_ImplVulkanH_XXX functions do not interact with any of the state used by the regular ImGui_ImplVulkan_XXX functions)
//-------------------------------------------------------------------------
struct ImGui_ImplVulkanH_Frame;
struct ImGui_ImplVulkanH_Window;
// Helpers
IMGUI_IMPL_API void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wnd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
IMGUI_IMPL_API void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wnd, const VkAllocationCallbacks* allocator);
IMGUI_IMPL_API VkSurfaceFormatKHR ImGui_ImplVulkanH_SelectSurfaceFormat(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkFormat* request_formats, int request_formats_count, VkColorSpaceKHR request_color_space);
IMGUI_IMPL_API VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkPresentModeKHR* request_modes, int request_modes_count);
IMGUI_IMPL_API int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_mode);
// Helper structure to hold the data needed by one rendering frame
// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.)
// [Please zero-clear before use!]
struct ImGui_ImplVulkanH_Frame
{
VkCommandPool CommandPool;
VkCommandBuffer CommandBuffer;
VkFence Fence;
VkImage Backbuffer;
VkImageView BackbufferView;
VkFramebuffer Framebuffer;
};
struct ImGui_ImplVulkanH_FrameSemaphores
{
VkSemaphore ImageAcquiredSemaphore;
VkSemaphore RenderCompleteSemaphore;
};
// Helper structure to hold the data needed by one rendering context into one OS window
// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.)
struct ImGui_ImplVulkanH_Window
{
int Width;
int Height;
VkSwapchainKHR Swapchain;
VkSurfaceKHR Surface;
VkSurfaceFormatKHR SurfaceFormat;
VkPresentModeKHR PresentMode;
VkRenderPass RenderPass;
VkPipeline Pipeline; // The window pipeline may uses a different VkRenderPass than the one passed in ImGui_ImplVulkan_InitInfo
bool ClearEnable;
VkClearValue ClearValue;
uint32_t FrameIndex; // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount)
uint32_t ImageCount; // Number of simultaneous in-flight frames (returned by vkGetSwapchainImagesKHR, usually derived from min_image_count)
uint32_t SemaphoreIndex; // Current set of swapchain wait semaphores we're using (needs to be distinct from per frame data)
ImGui_ImplVulkanH_Frame* Frames;
ImGui_ImplVulkanH_FrameSemaphores* FrameSemaphores;
ImGui_ImplVulkanH_Window()
{
memset(this, 0, sizeof(*this));
PresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
ClearEnable = true;
}
};

View File

@ -0,0 +1,715 @@
// dear imgui: Renderer for WebGPU
// This needs to be used along with a Platform Binding (e.g. GLFW)
// (Please note that WebGPU is currently experimental, will not run on non-beta browsers, and may break.)
// Implemented features:
// [X] Renderer: User texture binding. Use 'WGPUTextureView' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-05-24: Add support for draw_data->FramebufferScale.
// 2021-05-19: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-05-16: Update to latest WebGPU specs (compatible with Emscripten 2.0.20 and Chrome Canary 92).
// 2021-02-18: Change blending equation to preserve alpha in output buffer.
// 2021-01-28: Initial version.
#include "imgui.h"
#include "imgui_impl_wgpu.h"
#include <limits.h>
#include <webgpu/webgpu.h>
#define HAS_EMSCRIPTEN_VERSION(major, minor, tiny) (__EMSCRIPTEN_major__ > (major) || (__EMSCRIPTEN_major__ == (major) && __EMSCRIPTEN_minor__ > (minor)) || (__EMSCRIPTEN_major__ == (major) && __EMSCRIPTEN_minor__ == (minor) && __EMSCRIPTEN_tiny__ >= (tiny)))
#if defined(__EMSCRIPTEN__) && !HAS_EMSCRIPTEN_VERSION(2, 0, 20)
#error "Requires at least emscripten 2.0.20"
#endif
// Dear ImGui prototypes from imgui_internal.h
extern ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed = 0);
// WebGPU data
static WGPUDevice g_wgpuDevice = NULL;
static WGPUQueue g_defaultQueue = NULL;
static WGPUTextureFormat g_renderTargetFormat = WGPUTextureFormat_Undefined;
static WGPURenderPipeline g_pipelineState = NULL;
struct RenderResources
{
WGPUTexture FontTexture; // Font texture
WGPUTextureView FontTextureView; // Texture view for font texture
WGPUSampler Sampler; // Sampler for the font texture
WGPUBuffer Uniforms; // Shader uniforms
WGPUBindGroup CommonBindGroup; // Resources bind-group to bind the common resources to pipeline
ImGuiStorage ImageBindGroups; // Resources bind-group to bind the font/image resources to pipeline (this is a key->value map)
WGPUBindGroup ImageBindGroup; // Default font-resource of Dear ImGui
WGPUBindGroupLayout ImageBindGroupLayout; // Cache layout used for the image bind group. Avoids allocating unnecessary JS objects when working with WebASM
};
static RenderResources g_resources;
struct FrameResources
{
WGPUBuffer IndexBuffer;
WGPUBuffer VertexBuffer;
ImDrawIdx* IndexBufferHost;
ImDrawVert* VertexBufferHost;
int IndexBufferSize;
int VertexBufferSize;
};
static FrameResources* g_pFrameResources = NULL;
static unsigned int g_numFramesInFlight = 0;
static unsigned int g_frameIndex = UINT_MAX;
struct Uniforms
{
float MVP[4][4];
};
//-----------------------------------------------------------------------------
// SHADERS
//-----------------------------------------------------------------------------
// glsl_shader.vert, compiled with:
// # glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert
/*
#version 450 core
layout(location = 0) in vec2 aPos;
layout(location = 1) in vec2 aUV;
layout(location = 2) in vec4 aColor;
layout(set=0, binding = 0) uniform transform { mat4 mvp; };
out gl_PerVertex { vec4 gl_Position; };
layout(location = 0) out struct { vec4 Color; vec2 UV; } Out;
void main()
{
Out.Color = aColor;
Out.UV = aUV;
gl_Position = mvp * vec4(aPos, 0, 1);
}
*/
static uint32_t __glsl_shader_vert_spv[] =
{
0x07230203,0x00010000,0x00080007,0x0000002c,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015,
0x0000001b,0x00000023,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,
0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43,
0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f,
0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005,
0x00000019,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x00000019,0x00000000,
0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001b,0x00000000,0x00050005,0x0000001d,
0x6e617274,0x726f6673,0x0000006d,0x00040006,0x0000001d,0x00000000,0x0070766d,0x00030005,
0x0000001f,0x00000000,0x00040005,0x00000023,0x736f5061,0x00000000,0x00040047,0x0000000b,
0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000002,0x00040047,0x00000015,
0x0000001e,0x00000001,0x00050048,0x00000019,0x00000000,0x0000000b,0x00000000,0x00030047,
0x00000019,0x00000002,0x00040048,0x0000001d,0x00000000,0x00000005,0x00050048,0x0000001d,
0x00000000,0x00000023,0x00000000,0x00050048,0x0000001d,0x00000000,0x00000007,0x00000010,
0x00030047,0x0000001d,0x00000002,0x00040047,0x0000001f,0x00000022,0x00000000,0x00040047,
0x0000001f,0x00000021,0x00000000,0x00040047,0x00000023,0x0000001e,0x00000000,0x00020013,
0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,
0x00000007,0x00000006,0x00000004,0x00040017,0x00000008,0x00000006,0x00000002,0x0004001e,
0x00000009,0x00000007,0x00000008,0x00040020,0x0000000a,0x00000003,0x00000009,0x0004003b,
0x0000000a,0x0000000b,0x00000003,0x00040015,0x0000000c,0x00000020,0x00000001,0x0004002b,
0x0000000c,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000001,0x00000007,0x0004003b,
0x0000000e,0x0000000f,0x00000001,0x00040020,0x00000011,0x00000003,0x00000007,0x0004002b,
0x0000000c,0x00000013,0x00000001,0x00040020,0x00000014,0x00000001,0x00000008,0x0004003b,
0x00000014,0x00000015,0x00000001,0x00040020,0x00000017,0x00000003,0x00000008,0x0003001e,
0x00000019,0x00000007,0x00040020,0x0000001a,0x00000003,0x00000019,0x0004003b,0x0000001a,
0x0000001b,0x00000003,0x00040018,0x0000001c,0x00000007,0x00000004,0x0003001e,0x0000001d,
0x0000001c,0x00040020,0x0000001e,0x00000002,0x0000001d,0x0004003b,0x0000001e,0x0000001f,
0x00000002,0x00040020,0x00000020,0x00000002,0x0000001c,0x0004003b,0x00000014,0x00000023,
0x00000001,0x0004002b,0x00000006,0x00000025,0x00000000,0x0004002b,0x00000006,0x00000026,
0x3f800000,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012,0x0000000b,
0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016,0x00000015,
0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018,0x00000016,
0x00050041,0x00000020,0x00000021,0x0000001f,0x0000000d,0x0004003d,0x0000001c,0x00000022,
0x00000021,0x0004003d,0x00000008,0x00000024,0x00000023,0x00050051,0x00000006,0x00000027,
0x00000024,0x00000000,0x00050051,0x00000006,0x00000028,0x00000024,0x00000001,0x00070050,
0x00000007,0x00000029,0x00000027,0x00000028,0x00000025,0x00000026,0x00050091,0x00000007,
0x0000002a,0x00000022,0x00000029,0x00050041,0x00000011,0x0000002b,0x0000001b,0x0000000d,
0x0003003e,0x0000002b,0x0000002a,0x000100fd,0x00010038
};
// glsl_shader.frag, compiled with:
// # glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag
/*
#version 450 core
layout(location = 0) out vec4 fColor;
layout(set=0, binding=1) uniform sampler s;
layout(set=1, binding=0) uniform texture2D t;
layout(location = 0) in struct { vec4 Color; vec2 UV; } In;
void main()
{
fColor = In.Color * texture(sampler2D(t, s), In.UV.st);
}
*/
static uint32_t __glsl_shader_frag_spv[] =
{
0x07230203,0x00010000,0x00080007,0x00000023,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000d,0x00030010,
0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,
0x00000000,0x00040005,0x00000009,0x6c6f4366,0x0000726f,0x00030005,0x0000000b,0x00000000,
0x00050006,0x0000000b,0x00000000,0x6f6c6f43,0x00000072,0x00040006,0x0000000b,0x00000001,
0x00005655,0x00030005,0x0000000d,0x00006e49,0x00030005,0x00000015,0x00000074,0x00030005,
0x00000019,0x00000073,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d,
0x0000001e,0x00000000,0x00040047,0x00000015,0x00000022,0x00000001,0x00040047,0x00000015,
0x00000021,0x00000000,0x00040047,0x00000019,0x00000022,0x00000000,0x00040047,0x00000019,
0x00000021,0x00000001,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,
0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017,0x0000000a,
0x00000006,0x00000002,0x0004001e,0x0000000b,0x00000007,0x0000000a,0x00040020,0x0000000c,
0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040015,0x0000000e,
0x00000020,0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040020,0x00000010,
0x00000001,0x00000007,0x00090019,0x00000013,0x00000006,0x00000001,0x00000000,0x00000000,
0x00000000,0x00000001,0x00000000,0x00040020,0x00000014,0x00000000,0x00000013,0x0004003b,
0x00000014,0x00000015,0x00000000,0x0002001a,0x00000017,0x00040020,0x00000018,0x00000000,
0x00000017,0x0004003b,0x00000018,0x00000019,0x00000000,0x0003001b,0x0000001b,0x00000013,
0x0004002b,0x0000000e,0x0000001d,0x00000001,0x00040020,0x0000001e,0x00000001,0x0000000a,
0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,
0x00000010,0x00000011,0x0000000d,0x0000000f,0x0004003d,0x00000007,0x00000012,0x00000011,
0x0004003d,0x00000013,0x00000016,0x00000015,0x0004003d,0x00000017,0x0000001a,0x00000019,
0x00050056,0x0000001b,0x0000001c,0x00000016,0x0000001a,0x00050041,0x0000001e,0x0000001f,
0x0000000d,0x0000001d,0x0004003d,0x0000000a,0x00000020,0x0000001f,0x00050057,0x00000007,
0x00000021,0x0000001c,0x00000020,0x00050085,0x00000007,0x00000022,0x00000012,0x00000021,
0x0003003e,0x00000009,0x00000022,0x000100fd,0x00010038
};
static void SafeRelease(ImDrawIdx*& res)
{
if (res)
delete[] res;
res = NULL;
}
static void SafeRelease(ImDrawVert*& res)
{
if (res)
delete[] res;
res = NULL;
}
static void SafeRelease(WGPUBindGroupLayout& res)
{
if (res)
wgpuBindGroupLayoutRelease(res);
res = NULL;
}
static void SafeRelease(WGPUBindGroup& res)
{
if (res)
wgpuBindGroupRelease(res);
res = NULL;
}
static void SafeRelease(WGPUBuffer& res)
{
if (res)
wgpuBufferRelease(res);
res = NULL;
}
static void SafeRelease(WGPURenderPipeline& res)
{
if (res)
wgpuRenderPipelineRelease(res);
res = NULL;
}
static void SafeRelease(WGPUSampler& res)
{
if (res)
wgpuSamplerRelease(res);
res = NULL;
}
static void SafeRelease(WGPUShaderModule& res)
{
if (res)
wgpuShaderModuleRelease(res);
res = NULL;
}
static void SafeRelease(WGPUTextureView& res)
{
if (res)
wgpuTextureViewRelease(res);
res = NULL;
}
static void SafeRelease(WGPUTexture& res)
{
if (res)
wgpuTextureRelease(res);
res = NULL;
}
static void SafeRelease(RenderResources& res)
{
SafeRelease(res.FontTexture);
SafeRelease(res.FontTextureView);
SafeRelease(res.Sampler);
SafeRelease(res.Uniforms);
SafeRelease(res.CommonBindGroup);
SafeRelease(res.ImageBindGroup);
SafeRelease(res.ImageBindGroupLayout);
};
static void SafeRelease(FrameResources& res)
{
SafeRelease(res.IndexBuffer);
SafeRelease(res.VertexBuffer);
SafeRelease(res.IndexBufferHost);
SafeRelease(res.VertexBufferHost);
}
static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModule(uint32_t* binary_data, uint32_t binary_data_size)
{
WGPUShaderModuleSPIRVDescriptor spirv_desc = {};
spirv_desc.chain.sType = WGPUSType_ShaderModuleSPIRVDescriptor;
spirv_desc.codeSize = binary_data_size;
spirv_desc.code = binary_data;
WGPUShaderModuleDescriptor desc;
desc.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&spirv_desc);
WGPUProgrammableStageDescriptor stage_desc = {};
stage_desc.module = wgpuDeviceCreateShaderModule(g_wgpuDevice, &desc);
stage_desc.entryPoint = "main";
return stage_desc;
}
static WGPUBindGroup ImGui_ImplWGPU_CreateImageBindGroup(WGPUBindGroupLayout layout, WGPUTextureView texture)
{
WGPUBindGroupEntry image_bg_entries[] = { { 0, 0, 0, 0, 0, texture } };
WGPUBindGroupDescriptor image_bg_descriptor = {};
image_bg_descriptor.layout = layout;
image_bg_descriptor.entryCount = sizeof(image_bg_entries) / sizeof(WGPUBindGroupEntry);
image_bg_descriptor.entries = image_bg_entries;
return wgpuDeviceCreateBindGroup(g_wgpuDevice, &image_bg_descriptor);
}
static void ImGui_ImplWGPU_SetupRenderState(ImDrawData* draw_data, WGPURenderPassEncoder ctx, FrameResources* fr)
{
// Setup orthographic projection matrix into our constant buffer
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
{
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
float mvp[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.5f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
};
wgpuQueueWriteBuffer(g_defaultQueue, g_resources.Uniforms, 0, mvp, sizeof(mvp));
}
// Setup viewport
wgpuRenderPassEncoderSetViewport(ctx, 0, 0, draw_data->FramebufferScale.x * draw_data->DisplaySize.x, draw_data->FramebufferScale.y * draw_data->DisplaySize.y, 0, 1);
// Bind shader and vertex buffers
wgpuRenderPassEncoderSetVertexBuffer(ctx, 0, fr->VertexBuffer, 0, 0);
wgpuRenderPassEncoderSetIndexBuffer(ctx, fr->IndexBuffer, sizeof(ImDrawIdx) == 2 ? WGPUIndexFormat_Uint16 : WGPUIndexFormat_Uint32, 0, 0);
wgpuRenderPassEncoderSetPipeline(ctx, g_pipelineState);
wgpuRenderPassEncoderSetBindGroup(ctx, 0, g_resources.CommonBindGroup, 0, NULL);
// Setup blend factor
WGPUColor blend_color = { 0.f, 0.f, 0.f, 0.f };
wgpuRenderPassEncoderSetBlendConstant(ctx, &blend_color);
}
// Render function
// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop)
void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURenderPassEncoder pass_encoder)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
// FIXME: Assuming that this only gets called once per frame!
// If not, we can't just re-allocate the IB or VB, we'll have to do a proper allocator.
g_frameIndex = g_frameIndex + 1;
FrameResources* fr = &g_pFrameResources[g_frameIndex % g_numFramesInFlight];
// Create and grow vertex/index buffers if needed
if (fr->VertexBuffer == NULL || fr->VertexBufferSize < draw_data->TotalVtxCount)
{
if (fr->VertexBuffer)
{
wgpuBufferDestroy(fr->VertexBuffer);
wgpuBufferRelease(fr->VertexBuffer);
}
SafeRelease(fr->VertexBufferHost);
fr->VertexBufferSize = draw_data->TotalVtxCount + 5000;
WGPUBufferDescriptor vb_desc =
{
NULL,
"Dear ImGui Vertex buffer",
WGPUBufferUsage_CopyDst | WGPUBufferUsage_Vertex,
fr->VertexBufferSize * sizeof(ImDrawVert),
false
};
fr->VertexBuffer = wgpuDeviceCreateBuffer(g_wgpuDevice, &vb_desc);
if (!fr->VertexBuffer)
return;
fr->VertexBufferHost = new ImDrawVert[fr->VertexBufferSize];
}
if (fr->IndexBuffer == NULL || fr->IndexBufferSize < draw_data->TotalIdxCount)
{
if (fr->IndexBuffer)
{
wgpuBufferDestroy(fr->IndexBuffer);
wgpuBufferRelease(fr->IndexBuffer);
}
SafeRelease(fr->IndexBufferHost);
fr->IndexBufferSize = draw_data->TotalIdxCount + 10000;
WGPUBufferDescriptor ib_desc =
{
NULL,
"Dear ImGui Index buffer",
WGPUBufferUsage_CopyDst | WGPUBufferUsage_Index,
fr->IndexBufferSize * sizeof(ImDrawIdx),
false
};
fr->IndexBuffer = wgpuDeviceCreateBuffer(g_wgpuDevice, &ib_desc);
if (!fr->IndexBuffer)
return;
fr->IndexBufferHost = new ImDrawIdx[fr->IndexBufferSize];
}
// Upload vertex/index data into a single contiguous GPU buffer
ImDrawVert* vtx_dst = (ImDrawVert*)fr->VertexBufferHost;
ImDrawIdx* idx_dst = (ImDrawIdx*)fr->IndexBufferHost;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
vtx_dst += cmd_list->VtxBuffer.Size;
idx_dst += cmd_list->IdxBuffer.Size;
}
int64_t vb_write_size = ((char*)vtx_dst - (char*)fr->VertexBufferHost + 3) & ~3;
int64_t ib_write_size = ((char*)idx_dst - (char*)fr->IndexBufferHost + 3) & ~3;
wgpuQueueWriteBuffer(g_defaultQueue, fr->VertexBuffer, 0, fr->VertexBufferHost, vb_write_size);
wgpuQueueWriteBuffer(g_defaultQueue, fr->IndexBuffer, 0, fr->IndexBufferHost, ib_write_size);
// Setup desired render state
ImGui_ImplWGPU_SetupRenderState(draw_data, pass_encoder, fr);
// Render command lists
// (Because we merged all buffers into a single one, we maintain our own offset into them)
int global_vtx_offset = 0;
int global_idx_offset = 0;
ImVec2 clip_scale = draw_data->FramebufferScale;
ImVec2 clip_off = draw_data->DisplayPos;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback != NULL)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplWGPU_SetupRenderState(draw_data, pass_encoder, fr);
else
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
// Bind custom texture
ImTextureID tex_id = pcmd->GetTexID();
ImGuiID tex_id_hash = ImHashData(&tex_id, sizeof(tex_id));
auto bind_group = g_resources.ImageBindGroups.GetVoidPtr(tex_id_hash);
if (bind_group)
{
wgpuRenderPassEncoderSetBindGroup(pass_encoder, 1, (WGPUBindGroup)bind_group, 0, NULL);
}
else
{
WGPUBindGroup image_bind_group = ImGui_ImplWGPU_CreateImageBindGroup(g_resources.ImageBindGroupLayout, (WGPUTextureView)tex_id);
g_resources.ImageBindGroups.SetVoidPtr(tex_id_hash, image_bind_group);
wgpuRenderPassEncoderSetBindGroup(pass_encoder, 1, image_bind_group, 0, NULL);
}
// Apply Scissor, Bind texture, Draw
uint32_t clip_rect[4];
clip_rect[0] = (uint32_t)(clip_scale.x * (pcmd->ClipRect.x - clip_off.x));
clip_rect[1] = (uint32_t)(clip_scale.y * (pcmd->ClipRect.y - clip_off.y));
clip_rect[2] = (uint32_t)(clip_scale.x * (pcmd->ClipRect.z - clip_off.x));
clip_rect[3] = (uint32_t)(clip_scale.y * (pcmd->ClipRect.w - clip_off.y));
wgpuRenderPassEncoderSetScissorRect(pass_encoder, clip_rect[0], clip_rect[1], clip_rect[2] - clip_rect[0], clip_rect[3] - clip_rect[1]);
wgpuRenderPassEncoderDrawIndexed(pass_encoder, pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0);
}
}
global_idx_offset += cmd_list->IdxBuffer.Size;
global_vtx_offset += cmd_list->VtxBuffer.Size;
}
}
static void ImGui_ImplWGPU_CreateFontsTexture()
{
// Build texture atlas
ImGuiIO& io = ImGui::GetIO();
unsigned char* pixels;
int width, height, size_pp;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &size_pp);
// Upload texture to graphics system
{
WGPUTextureDescriptor tex_desc = {};
tex_desc.label = "Dear ImGui Font Texture";
tex_desc.dimension = WGPUTextureDimension_2D;
tex_desc.size.width = width;
tex_desc.size.height = height;
tex_desc.size.depthOrArrayLayers = 1;
tex_desc.sampleCount = 1;
tex_desc.format = WGPUTextureFormat_RGBA8Unorm;
tex_desc.mipLevelCount = 1;
tex_desc.usage = WGPUTextureUsage_CopyDst | WGPUTextureUsage_Sampled;
g_resources.FontTexture = wgpuDeviceCreateTexture(g_wgpuDevice, &tex_desc);
WGPUTextureViewDescriptor tex_view_desc = {};
tex_view_desc.format = WGPUTextureFormat_RGBA8Unorm;
tex_view_desc.dimension = WGPUTextureViewDimension_2D;
tex_view_desc.baseMipLevel = 0;
tex_view_desc.mipLevelCount = 1;
tex_view_desc.baseArrayLayer = 0;
tex_view_desc.arrayLayerCount = 1;
tex_view_desc.aspect = WGPUTextureAspect_All;
g_resources.FontTextureView = wgpuTextureCreateView(g_resources.FontTexture, &tex_view_desc);
}
// Upload texture data
{
WGPUImageCopyTexture dst_view = {};
dst_view.texture = g_resources.FontTexture;
dst_view.mipLevel = 0;
dst_view.origin = { 0, 0, 0 };
dst_view.aspect = WGPUTextureAspect_All;
WGPUTextureDataLayout layout = {};
layout.offset = 0;
layout.bytesPerRow = width * size_pp;
layout.rowsPerImage = height;
WGPUExtent3D size = { (uint32_t)width, (uint32_t)height, 1 };
wgpuQueueWriteTexture(g_defaultQueue, &dst_view, pixels, (uint32_t)(width * size_pp * height), &layout, &size);
}
// Create the associated sampler
{
WGPUSamplerDescriptor sampler_desc = {};
sampler_desc.minFilter = WGPUFilterMode_Linear;
sampler_desc.magFilter = WGPUFilterMode_Linear;
sampler_desc.mipmapFilter = WGPUFilterMode_Linear;
sampler_desc.addressModeU = WGPUAddressMode_Repeat;
sampler_desc.addressModeV = WGPUAddressMode_Repeat;
sampler_desc.addressModeW = WGPUAddressMode_Repeat;
sampler_desc.maxAnisotropy = 1;
g_resources.Sampler = wgpuDeviceCreateSampler(g_wgpuDevice, &sampler_desc);
}
// Store our identifier
static_assert(sizeof(ImTextureID) >= sizeof(g_resources.FontTexture), "Can't pack descriptor handle into TexID, 32-bit not supported yet.");
io.Fonts->SetTexID((ImTextureID)g_resources.FontTextureView);
}
static void ImGui_ImplWGPU_CreateUniformBuffer()
{
WGPUBufferDescriptor ub_desc =
{
NULL,
"Dear ImGui Uniform buffer",
WGPUBufferUsage_CopyDst | WGPUBufferUsage_Uniform,
sizeof(Uniforms),
false
};
g_resources.Uniforms = wgpuDeviceCreateBuffer(g_wgpuDevice, &ub_desc);
}
bool ImGui_ImplWGPU_CreateDeviceObjects()
{
if (!g_wgpuDevice)
return false;
if (g_pipelineState)
ImGui_ImplWGPU_InvalidateDeviceObjects();
// Create render pipeline
WGPURenderPipelineDescriptor2 graphics_pipeline_desc = {};
graphics_pipeline_desc.primitive.topology = WGPUPrimitiveTopology_TriangleList;
graphics_pipeline_desc.primitive.stripIndexFormat = WGPUIndexFormat_Undefined;
graphics_pipeline_desc.primitive.frontFace = WGPUFrontFace_CW;
graphics_pipeline_desc.primitive.cullMode = WGPUCullMode_None;
graphics_pipeline_desc.multisample.count = 1;
graphics_pipeline_desc.multisample.mask = UINT_MAX;
graphics_pipeline_desc.multisample.alphaToCoverageEnabled = false;
graphics_pipeline_desc.layout = nullptr; // Use automatic layout generation
// Create the vertex shader
WGPUProgrammableStageDescriptor vertex_shader_desc = ImGui_ImplWGPU_CreateShaderModule(__glsl_shader_vert_spv, sizeof(__glsl_shader_vert_spv) / sizeof(uint32_t));
graphics_pipeline_desc.vertex.module = vertex_shader_desc.module;
graphics_pipeline_desc.vertex.entryPoint = vertex_shader_desc.entryPoint;
// Vertex input configuration
WGPUVertexAttribute attribute_desc[] =
{
{ WGPUVertexFormat_Float32x2, (uint64_t)IM_OFFSETOF(ImDrawVert, pos), 0 },
{ WGPUVertexFormat_Float32x2, (uint64_t)IM_OFFSETOF(ImDrawVert, uv), 1 },
{ WGPUVertexFormat_Unorm8x4, (uint64_t)IM_OFFSETOF(ImDrawVert, col), 2 },
};
WGPUVertexBufferLayout buffer_layouts[1];
buffer_layouts[0].arrayStride = sizeof(ImDrawVert);
buffer_layouts[0].stepMode = WGPUInputStepMode_Vertex;
buffer_layouts[0].attributeCount = 3;
buffer_layouts[0].attributes = attribute_desc;
graphics_pipeline_desc.vertex.bufferCount = 1;
graphics_pipeline_desc.vertex.buffers = buffer_layouts;
// Create the pixel shader
WGPUProgrammableStageDescriptor pixel_shader_desc = ImGui_ImplWGPU_CreateShaderModule(__glsl_shader_frag_spv, sizeof(__glsl_shader_frag_spv) / sizeof(uint32_t));
// Create the blending setup
WGPUBlendState blend_state = {};
blend_state.alpha.operation = WGPUBlendOperation_Add;
blend_state.alpha.srcFactor = WGPUBlendFactor_One;
blend_state.alpha.dstFactor = WGPUBlendFactor_OneMinusSrcAlpha;
blend_state.color.operation = WGPUBlendOperation_Add;
blend_state.color.srcFactor = WGPUBlendFactor_SrcAlpha;
blend_state.color.dstFactor = WGPUBlendFactor_OneMinusSrcAlpha;
WGPUColorTargetState color_state = {};
color_state.format = g_renderTargetFormat;
color_state.blend = &blend_state;
color_state.writeMask = WGPUColorWriteMask_All;
WGPUFragmentState fragment_state = {};
fragment_state.module = pixel_shader_desc.module;
fragment_state.entryPoint = pixel_shader_desc.entryPoint;
fragment_state.targetCount = 1;
fragment_state.targets = &color_state;
graphics_pipeline_desc.fragment = &fragment_state;
// Create depth-stencil State
WGPUDepthStencilState depth_stencil_state = {};
depth_stencil_state.depthBias = 0;
depth_stencil_state.depthBiasClamp = 0;
depth_stencil_state.depthBiasSlopeScale = 0;
// Configure disabled depth-stencil state
graphics_pipeline_desc.depthStencil = nullptr;
g_pipelineState = wgpuDeviceCreateRenderPipeline2(g_wgpuDevice, &graphics_pipeline_desc);
ImGui_ImplWGPU_CreateFontsTexture();
ImGui_ImplWGPU_CreateUniformBuffer();
// Create resource bind group
WGPUBindGroupLayout bg_layouts[2];
bg_layouts[0] = wgpuRenderPipelineGetBindGroupLayout(g_pipelineState, 0);
bg_layouts[1] = wgpuRenderPipelineGetBindGroupLayout(g_pipelineState, 1);
WGPUBindGroupEntry common_bg_entries[] =
{
{ 0, g_resources.Uniforms, 0, sizeof(Uniforms), 0, 0 },
{ 1, 0, 0, 0, g_resources.Sampler, 0 },
};
WGPUBindGroupDescriptor common_bg_descriptor = {};
common_bg_descriptor.layout = bg_layouts[0];
common_bg_descriptor.entryCount = sizeof(common_bg_entries) / sizeof(WGPUBindGroupEntry);
common_bg_descriptor.entries = common_bg_entries;
g_resources.CommonBindGroup = wgpuDeviceCreateBindGroup(g_wgpuDevice, &common_bg_descriptor);
WGPUBindGroup image_bind_group = ImGui_ImplWGPU_CreateImageBindGroup(bg_layouts[1], g_resources.FontTextureView);
g_resources.ImageBindGroup = image_bind_group;
g_resources.ImageBindGroupLayout = bg_layouts[1];
g_resources.ImageBindGroups.SetVoidPtr(ImHashData(&g_resources.FontTextureView, sizeof(ImTextureID)), image_bind_group);
SafeRelease(vertex_shader_desc.module);
SafeRelease(pixel_shader_desc.module);
SafeRelease(bg_layouts[0]);
return true;
}
void ImGui_ImplWGPU_InvalidateDeviceObjects()
{
if (!g_wgpuDevice)
return;
SafeRelease(g_pipelineState);
SafeRelease(g_resources);
ImGuiIO& io = ImGui::GetIO();
io.Fonts->SetTexID(NULL); // We copied g_pFontTextureView to io.Fonts->TexID so let's clear that as well.
for (unsigned int i = 0; i < g_numFramesInFlight; i++)
SafeRelease(g_pFrameResources[i]);
}
bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format)
{
// Setup backend capabilities flags
ImGuiIO& io = ImGui::GetIO();
io.BackendRendererName = "imgui_impl_webgpu";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
g_wgpuDevice = device;
g_defaultQueue = wgpuDeviceGetQueue(g_wgpuDevice);
g_renderTargetFormat = rt_format;
g_pFrameResources = new FrameResources[num_frames_in_flight];
g_numFramesInFlight = num_frames_in_flight;
g_frameIndex = UINT_MAX;
g_resources.FontTexture = NULL;
g_resources.FontTextureView = NULL;
g_resources.Sampler = NULL;
g_resources.Uniforms = NULL;
g_resources.CommonBindGroup = NULL;
g_resources.ImageBindGroups.Data.reserve(100);
g_resources.ImageBindGroup = NULL;
g_resources.ImageBindGroupLayout = NULL;
// Create buffers with a default size (they will later be grown as needed)
for (int i = 0; i < num_frames_in_flight; i++)
{
FrameResources* fr = &g_pFrameResources[i];
fr->IndexBuffer = NULL;
fr->VertexBuffer = NULL;
fr->IndexBufferHost = NULL;
fr->VertexBufferHost = NULL;
fr->IndexBufferSize = 10000;
fr->VertexBufferSize = 5000;
}
return true;
}
void ImGui_ImplWGPU_Shutdown()
{
ImGui_ImplWGPU_InvalidateDeviceObjects();
delete[] g_pFrameResources;
g_pFrameResources = NULL;
wgpuQueueRelease(g_defaultQueue);
g_wgpuDevice = NULL;
g_numFramesInFlight = 0;
g_frameIndex = UINT_MAX;
}
void ImGui_ImplWGPU_NewFrame()
{
if (!g_pipelineState)
ImGui_ImplWGPU_CreateDeviceObjects();
}

View File

@ -0,0 +1,25 @@
// dear imgui: Renderer for WebGPU
// This needs to be used along with a Platform Binding (e.g. GLFW)
// (Please note that WebGPU is currently experimental, will not run on non-beta browsers, and may break.)
// Implemented features:
// [X] Renderer: User texture binding. Use 'WGPUTextureView' as ImTextureID. Read the FAQ about ImTextureID!
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
#include <webgpu/webgpu.h>
IMGUI_IMPL_API bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format);
IMGUI_IMPL_API void ImGui_ImplWGPU_Shutdown();
IMGUI_IMPL_API void ImGui_ImplWGPU_NewFrame();
IMGUI_IMPL_API void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURenderPassEncoder pass_encoder);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API void ImGui_ImplWGPU_InvalidateDeviceObjects();
IMGUI_IMPL_API bool ImGui_ImplWGPU_CreateDeviceObjects();

View File

@ -0,0 +1,615 @@
// dear imgui: Platform Backend for Windows (standard windows API for 32 and 64 bits applications)
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
// Implemented features:
// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui)
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// [X] Platform: Keyboard arrays indexed using VK_* Virtual Key Codes, e.g. ImGui::IsKeyPressed(VK_SPACE).
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#include "imgui.h"
#include "imgui_impl_win32.h"
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <tchar.h>
#include <dwmapi.h>
// Configuration flags to add in your imconfig.h file:
//#define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD // Disable gamepad support. This was meaningful before <1.81 but we now load XInput dynamically so the option is now less relevant.
// Using XInput for gamepad (will load DLL dynamically)
#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
#include <xinput.h>
typedef DWORD (WINAPI *PFN_XInputGetCapabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*);
typedef DWORD (WINAPI *PFN_XInputGetState)(DWORD, XINPUT_STATE*);
#endif
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2021-08-17: Calling io.AddFocusEvent() on WM_SETFOCUS/WM_KILLFOCUS messages.
// 2021-08-02: Inputs: Fixed keyboard modifiers being reported when host windo doesn't have focus.
// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using TrackMouseEvent() to receive WM_MOUSELEAVE events).
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-06-08: Fixed ImGui_ImplWin32_EnableDpiAwareness() and ImGui_ImplWin32_GetDpiScaleForMonitor() to handle Windows 8.1/10 features without a manifest (per-monitor DPI, and properly calls SetProcessDpiAwareness() on 8.1).
// 2021-03-23: Inputs: Clearing keyboard down array when losing focus (WM_KILLFOCUS).
// 2021-02-18: Added ImGui_ImplWin32_EnableAlphaCompositing(). Non Visual Studio users will need to link with dwmapi.lib (MinGW/gcc: use -ldwmapi).
// 2021-02-17: Fixed ImGui_ImplWin32_EnableDpiAwareness() attempting to get SetProcessDpiAwareness from shcore.dll on Windows 8 whereas it is only supported on Windows 8.1.
// 2021-01-25: Inputs: Dynamically loading XInput DLL.
// 2020-12-04: Misc: Fixed setting of io.DisplaySize to invalid/uninitialized data when after hwnd has been closed.
// 2020-03-03: Inputs: Calling AddInputCharacterUTF16() to support surrogate pairs leading to codepoint >= 0x10000 (for more complete CJK inputs)
// 2020-02-17: Added ImGui_ImplWin32_EnableDpiAwareness(), ImGui_ImplWin32_GetDpiScaleForHwnd(), ImGui_ImplWin32_GetDpiScaleForMonitor() helper functions.
// 2020-01-14: Inputs: Added support for #define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD/IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT.
// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor.
// 2019-05-11: Inputs: Don't filter value from WM_CHAR before calling AddInputCharacter().
// 2019-01-17: Misc: Using GetForegroundWindow()+IsChild() instead of GetActiveWindow() to be compatible with windows created in a different thread or parent.
// 2019-01-17: Inputs: Added support for mouse buttons 4 and 5 via WM_XBUTTON* messages.
// 2019-01-15: Inputs: Added support for XInput gamepads (if ImGuiConfigFlags_NavEnableGamepad is set by user application).
// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window.
// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor.
// 2018-06-10: Inputs: Fixed handling of mouse wheel messages to support fine position messages (typically sent by track-pads).
// 2018-06-08: Misc: Extracted imgui_impl_win32.cpp/.h away from the old combined DX9/DX10/DX11/DX12 examples.
// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors and ImGuiBackendFlags_HasSetMousePos flags + honor ImGuiConfigFlags_NoMouseCursorChange flag.
// 2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value and WM_SETCURSOR message handling).
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
// 2018-02-06: Inputs: Honoring the io.WantSetMousePos by repositioning the mouse (when using navigation and ImGuiConfigFlags_NavMoveMouse is set).
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support.
// 2018-01-08: Inputs: Added mapping for ImGuiKey_Insert.
// 2018-01-05: Inputs: Added WM_LBUTTONDBLCLK double-click handlers for window classes with the CS_DBLCLKS flag.
// 2017-10-23: Inputs: Added WM_SYSKEYDOWN / WM_SYSKEYUP handlers so e.g. the VK_MENU key can be read.
// 2017-10-23: Inputs: Using Win32 ::SetCapture/::GetCapture() to retrieve mouse positions outside the client area when dragging.
// 2016-11-12: Inputs: Only call Win32 ::SetCursor(NULL) when io.MouseDrawCursor is set.
struct ImGui_ImplWin32_Data
{
HWND hWnd;
HWND MouseHwnd;
bool MouseTracked;
INT64 Time;
INT64 TicksPerSecond;
ImGuiMouseCursor LastMouseCursor;
bool HasGamepad;
bool WantUpdateHasGamepad;
#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
HMODULE XInputDLL;
PFN_XInputGetCapabilities XInputGetCapabilities;
PFN_XInputGetState XInputGetState;
#endif
ImGui_ImplWin32_Data() { memset(this, 0, sizeof(*this)); }
};
// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context.
static ImGui_ImplWin32_Data* ImGui_ImplWin32_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplWin32_Data*)ImGui::GetIO().BackendPlatformUserData : NULL;
}
// Functions
bool ImGui_ImplWin32_Init(void* hwnd)
{
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!");
INT64 perf_frequency, perf_counter;
if (!::QueryPerformanceFrequency((LARGE_INTEGER*)&perf_frequency))
return false;
if (!::QueryPerformanceCounter((LARGE_INTEGER*)&perf_counter))
return false;
// Setup backend capabilities flags
ImGui_ImplWin32_Data* bd = IM_NEW(ImGui_ImplWin32_Data)();
io.BackendPlatformUserData = (void*)bd;
io.BackendPlatformName = "imgui_impl_win32";
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
bd->hWnd = (HWND)hwnd;
bd->WantUpdateHasGamepad = true;
bd->TicksPerSecond = perf_frequency;
bd->Time = perf_counter;
bd->LastMouseCursor = ImGuiMouseCursor_COUNT;
io.ImeWindowHandle = hwnd;
// Keyboard mapping. Dear ImGui will use those indices to peek into the io.KeysDown[] array that we will update during the application lifetime.
io.KeyMap[ImGuiKey_Tab] = VK_TAB;
io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;
io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;
io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;
io.KeyMap[ImGuiKey_Home] = VK_HOME;
io.KeyMap[ImGuiKey_End] = VK_END;
io.KeyMap[ImGuiKey_Insert] = VK_INSERT;
io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
io.KeyMap[ImGuiKey_Space] = VK_SPACE;
io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
io.KeyMap[ImGuiKey_KeyPadEnter] = VK_RETURN;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
// Dynamically load XInput library
#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
const char* xinput_dll_names[] =
{
"xinput1_4.dll", // Windows 8+
"xinput1_3.dll", // DirectX SDK
"xinput9_1_0.dll", // Windows Vista, Windows 7
"xinput1_2.dll", // DirectX SDK
"xinput1_1.dll" // DirectX SDK
};
for (int n = 0; n < IM_ARRAYSIZE(xinput_dll_names); n++)
if (HMODULE dll = ::LoadLibraryA(xinput_dll_names[n]))
{
bd->XInputDLL = dll;
bd->XInputGetCapabilities = (PFN_XInputGetCapabilities)::GetProcAddress(dll, "XInputGetCapabilities");
bd->XInputGetState = (PFN_XInputGetState)::GetProcAddress(dll, "XInputGetState");
break;
}
#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
return true;
}
void ImGui_ImplWin32_Shutdown()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
// Unload XInput library
#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
if (bd->XInputDLL)
::FreeLibrary(bd->XInputDLL);
#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
io.BackendPlatformName = NULL;
io.BackendPlatformUserData = NULL;
IM_DELETE(bd);
}
static bool ImGui_ImplWin32_UpdateMouseCursor()
{
ImGuiIO& io = ImGui::GetIO();
if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
return false;
ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor)
{
// Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
::SetCursor(NULL);
}
else
{
// Show OS mouse cursor
LPTSTR win32_cursor = IDC_ARROW;
switch (imgui_cursor)
{
case ImGuiMouseCursor_Arrow: win32_cursor = IDC_ARROW; break;
case ImGuiMouseCursor_TextInput: win32_cursor = IDC_IBEAM; break;
case ImGuiMouseCursor_ResizeAll: win32_cursor = IDC_SIZEALL; break;
case ImGuiMouseCursor_ResizeEW: win32_cursor = IDC_SIZEWE; break;
case ImGuiMouseCursor_ResizeNS: win32_cursor = IDC_SIZENS; break;
case ImGuiMouseCursor_ResizeNESW: win32_cursor = IDC_SIZENESW; break;
case ImGuiMouseCursor_ResizeNWSE: win32_cursor = IDC_SIZENWSE; break;
case ImGuiMouseCursor_Hand: win32_cursor = IDC_HAND; break;
case ImGuiMouseCursor_NotAllowed: win32_cursor = IDC_NO; break;
}
::SetCursor(::LoadCursor(NULL, win32_cursor));
}
return true;
}
static void ImGui_ImplWin32_UpdateMousePos()
{
ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
ImGuiIO& io = ImGui::GetIO();
IM_ASSERT(bd->hWnd != 0);
const ImVec2 mouse_pos_prev = io.MousePos;
io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
// Obtain focused and hovered window. We forward mouse input when focused or when hovered (and no other window is capturing)
HWND focused_window = ::GetForegroundWindow();
HWND hovered_window = bd->MouseHwnd;
HWND mouse_window = NULL;
if (hovered_window && (hovered_window == bd->hWnd || ::IsChild(hovered_window, bd->hWnd)))
mouse_window = hovered_window;
else if (focused_window && (focused_window == bd->hWnd || ::IsChild(focused_window, bd->hWnd)))
mouse_window = focused_window;
if (mouse_window == NULL)
return;
// Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user)
if (io.WantSetMousePos)
{
POINT pos = { (int)mouse_pos_prev.x, (int)mouse_pos_prev.y };
if (::ClientToScreen(bd->hWnd, &pos))
::SetCursorPos(pos.x, pos.y);
}
// Set Dear ImGui mouse position from OS position
POINT pos;
if (::GetCursorPos(&pos) && ::ScreenToClient(mouse_window, &pos))
io.MousePos = ImVec2((float)pos.x, (float)pos.y);
}
// Gamepad navigation mapping
static void ImGui_ImplWin32_UpdateGamepads()
{
#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
memset(io.NavInputs, 0, sizeof(io.NavInputs));
if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
return;
// Calling XInputGetState() every frame on disconnected gamepads is unfortunately too slow.
// Instead we refresh gamepad availability by calling XInputGetCapabilities() _only_ after receiving WM_DEVICECHANGE.
if (bd->WantUpdateHasGamepad)
{
XINPUT_CAPABILITIES caps;
bd->HasGamepad = bd->XInputGetCapabilities ? (bd->XInputGetCapabilities(0, XINPUT_FLAG_GAMEPAD, &caps) == ERROR_SUCCESS) : false;
bd->WantUpdateHasGamepad = false;
}
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
XINPUT_STATE xinput_state;
if (bd->HasGamepad && bd->XInputGetState && bd->XInputGetState(0, &xinput_state) == ERROR_SUCCESS)
{
const XINPUT_GAMEPAD& gamepad = xinput_state.Gamepad;
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
#define MAP_BUTTON(NAV_NO, BUTTON_ENUM) { io.NavInputs[NAV_NO] = (gamepad.wButtons & BUTTON_ENUM) ? 1.0f : 0.0f; }
#define MAP_ANALOG(NAV_NO, VALUE, V0, V1) { float vn = (float)(VALUE - V0) / (float)(V1 - V0); if (vn > 1.0f) vn = 1.0f; if (vn > 0.0f && io.NavInputs[NAV_NO] < vn) io.NavInputs[NAV_NO] = vn; }
MAP_BUTTON(ImGuiNavInput_Activate, XINPUT_GAMEPAD_A); // Cross / A
MAP_BUTTON(ImGuiNavInput_Cancel, XINPUT_GAMEPAD_B); // Circle / B
MAP_BUTTON(ImGuiNavInput_Menu, XINPUT_GAMEPAD_X); // Square / X
MAP_BUTTON(ImGuiNavInput_Input, XINPUT_GAMEPAD_Y); // Triangle / Y
MAP_BUTTON(ImGuiNavInput_DpadLeft, XINPUT_GAMEPAD_DPAD_LEFT); // D-Pad Left
MAP_BUTTON(ImGuiNavInput_DpadRight, XINPUT_GAMEPAD_DPAD_RIGHT); // D-Pad Right
MAP_BUTTON(ImGuiNavInput_DpadUp, XINPUT_GAMEPAD_DPAD_UP); // D-Pad Up
MAP_BUTTON(ImGuiNavInput_DpadDown, XINPUT_GAMEPAD_DPAD_DOWN); // D-Pad Down
MAP_BUTTON(ImGuiNavInput_FocusPrev, XINPUT_GAMEPAD_LEFT_SHOULDER); // L1 / LB
MAP_BUTTON(ImGuiNavInput_FocusNext, XINPUT_GAMEPAD_RIGHT_SHOULDER); // R1 / RB
MAP_BUTTON(ImGuiNavInput_TweakSlow, XINPUT_GAMEPAD_LEFT_SHOULDER); // L1 / LB
MAP_BUTTON(ImGuiNavInput_TweakFast, XINPUT_GAMEPAD_RIGHT_SHOULDER); // R1 / RB
MAP_ANALOG(ImGuiNavInput_LStickLeft, gamepad.sThumbLX, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768);
MAP_ANALOG(ImGuiNavInput_LStickRight, gamepad.sThumbLX, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767);
MAP_ANALOG(ImGuiNavInput_LStickUp, gamepad.sThumbLY, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767);
MAP_ANALOG(ImGuiNavInput_LStickDown, gamepad.sThumbLY, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32767);
#undef MAP_BUTTON
#undef MAP_ANALOG
}
#endif // #ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
}
void ImGui_ImplWin32_NewFrame()
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
IM_ASSERT(bd != NULL && "Did you call ImGui_ImplWin32_Init()?");
// Setup display size (every frame to accommodate for window resizing)
RECT rect = { 0, 0, 0, 0 };
::GetClientRect(bd->hWnd, &rect);
io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));
// Setup time step
INT64 current_time = 0;
::QueryPerformanceCounter((LARGE_INTEGER*)&current_time);
io.DeltaTime = (float)(current_time - bd->Time) / bd->TicksPerSecond;
bd->Time = current_time;
// Update OS mouse position
ImGui_ImplWin32_UpdateMousePos();
// Update OS mouse cursor with the cursor requested by imgui
ImGuiMouseCursor mouse_cursor = io.MouseDrawCursor ? ImGuiMouseCursor_None : ImGui::GetMouseCursor();
if (bd->LastMouseCursor != mouse_cursor)
{
bd->LastMouseCursor = mouse_cursor;
ImGui_ImplWin32_UpdateMouseCursor();
}
// Update game controllers (if enabled and available)
ImGui_ImplWin32_UpdateGamepads();
}
// Allow compilation with old Windows SDK. MinGW doesn't have default _WIN32_WINNT/WINVER versions.
#ifndef WM_MOUSEHWHEEL
#define WM_MOUSEHWHEEL 0x020E
#endif
#ifndef DBT_DEVNODES_CHANGED
#define DBT_DEVNODES_CHANGED 0x0007
#endif
// Win32 message handler (process Win32 mouse/keyboard inputs, etc.)
// Call from your application's message handler.
// When implementing your own backend, you can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if Dear ImGui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to Dear ImGui, and hide them from your application based on those two flags.
// PS: In this Win32 handler, we use the capture API (GetCapture/SetCapture/ReleaseCapture) to be able to read mouse coordinates when dragging mouse outside of our window bounds.
// PS: We treat DBLCLK messages as regular mouse down messages, so this code will work on windows classes that have the CS_DBLCLKS flag set. Our own example app code doesn't set this flag.
#if 0
// Copy this line into your .cpp file to forward declare the function.
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
#endif
IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (ImGui::GetCurrentContext() == NULL)
return 0;
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
switch (msg)
{
case WM_MOUSEMOVE:
// We need to call TrackMouseEvent in order to receive WM_MOUSELEAVE events
bd->MouseHwnd = hwnd;
if (!bd->MouseTracked)
{
TRACKMOUSEEVENT tme = { sizeof(tme), TME_LEAVE, hwnd, 0 };
::TrackMouseEvent(&tme);
bd->MouseTracked = true;
}
break;
case WM_MOUSELEAVE:
if (bd->MouseHwnd == hwnd)
bd->MouseHwnd = NULL;
bd->MouseTracked = false;
break;
case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
{
int button = 0;
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; }
if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; }
if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; }
if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
if (!ImGui::IsAnyMouseDown() && ::GetCapture() == NULL)
::SetCapture(hwnd);
io.MouseDown[button] = true;
return 0;
}
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_XBUTTONUP:
{
int button = 0;
if (msg == WM_LBUTTONUP) { button = 0; }
if (msg == WM_RBUTTONUP) { button = 1; }
if (msg == WM_MBUTTONUP) { button = 2; }
if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
io.MouseDown[button] = false;
if (!ImGui::IsAnyMouseDown() && ::GetCapture() == hwnd)
::ReleaseCapture();
return 0;
}
case WM_MOUSEWHEEL:
io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
return 0;
case WM_MOUSEHWHEEL:
io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
return 0;
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
bool down = (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN);
if (wParam < 256)
io.KeysDown[wParam] = down;
if (wParam == VK_CONTROL)
io.KeyCtrl = down;
if (wParam == VK_SHIFT)
io.KeyShift = down;
if (wParam == VK_MENU)
io.KeyAlt = down;
return 0;
}
case WM_SETFOCUS:
case WM_KILLFOCUS:
io.AddFocusEvent(msg == WM_SETFOCUS);
return 0;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
if (wParam > 0 && wParam < 0x10000)
io.AddInputCharacterUTF16((unsigned short)wParam);
return 0;
case WM_SETCURSOR:
if (LOWORD(lParam) == HTCLIENT && ImGui_ImplWin32_UpdateMouseCursor())
return 1;
return 0;
case WM_DEVICECHANGE:
if ((UINT)wParam == DBT_DEVNODES_CHANGED)
bd->WantUpdateHasGamepad = true;
return 0;
}
return 0;
}
//--------------------------------------------------------------------------------------------------------
// DPI-related helpers (optional)
//--------------------------------------------------------------------------------------------------------
// - Use to enable DPI awareness without having to create an application manifest.
// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps.
// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc.
// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime,
// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies.
//---------------------------------------------------------------------------------------------------------
// This is the scheme successfully used by GLFW (from which we borrowed some of the code) and other apps aiming to be highly portable.
// ImGui_ImplWin32_EnableDpiAwareness() is just a helper called by main.cpp, we don't call it automatically.
// If you are trying to implement your own backend for your own engine, you may ignore that noise.
//---------------------------------------------------------------------------------------------------------
// Perform our own check with RtlVerifyVersionInfo() instead of using functions from <VersionHelpers.h> as they
// require a manifest to be functional for checks above 8.1. See https://github.com/ocornut/imgui/issues/4200
static BOOL _IsWindowsVersionOrGreater(WORD major, WORD minor, WORD)
{
typedef LONG(WINAPI* PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*, ULONG, ULONGLONG);
static PFN_RtlVerifyVersionInfo RtlVerifyVersionInfoFn = NULL;
if (RtlVerifyVersionInfoFn == NULL)
if (HMODULE ntdllModule = ::GetModuleHandleA("ntdll.dll"))
RtlVerifyVersionInfoFn = (PFN_RtlVerifyVersionInfo)GetProcAddress(ntdllModule, "RtlVerifyVersionInfo");
if (RtlVerifyVersionInfoFn == NULL)
return FALSE;
RTL_OSVERSIONINFOEXW versionInfo = { };
ULONGLONG conditionMask = 0;
versionInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
versionInfo.dwMajorVersion = major;
versionInfo.dwMinorVersion = minor;
VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
return (RtlVerifyVersionInfoFn(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, conditionMask) == 0) ? TRUE : FALSE;
}
#define _IsWindowsVistaOrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0600), LOBYTE(0x0600), 0) // _WIN32_WINNT_VISTA
#define _IsWindows8OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0602), LOBYTE(0x0602), 0) // _WIN32_WINNT_WIN8
#define _IsWindows8Point1OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0603), LOBYTE(0x0603), 0) // _WIN32_WINNT_WINBLUE
#define _IsWindows10OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0A00), LOBYTE(0x0A00), 0) // _WIN32_WINNT_WINTHRESHOLD / _WIN32_WINNT_WIN10
#ifndef DPI_ENUMS_DECLARED
typedef enum { PROCESS_DPI_UNAWARE = 0, PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2 } PROCESS_DPI_AWARENESS;
typedef enum { MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, MDT_RAW_DPI = 2, MDT_DEFAULT = MDT_EFFECTIVE_DPI } MONITOR_DPI_TYPE;
#endif
#ifndef _DPI_AWARENESS_CONTEXTS_
DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE (DPI_AWARENESS_CONTEXT)-3
#endif
#ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 (DPI_AWARENESS_CONTEXT)-4
#endif
typedef HRESULT(WINAPI* PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS); // Shcore.lib + dll, Windows 8.1+
typedef HRESULT(WINAPI* PFN_GetDpiForMonitor)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*); // Shcore.lib + dll, Windows 8.1+
typedef DPI_AWARENESS_CONTEXT(WINAPI* PFN_SetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT); // User32.lib + dll, Windows 10 v1607+ (Creators Update)
// Helper function to enable DPI awareness without setting up a manifest
void ImGui_ImplWin32_EnableDpiAwareness()
{
if (_IsWindows10OrGreater())
{
static HINSTANCE user32_dll = ::LoadLibraryA("user32.dll"); // Reference counted per-process
if (PFN_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContextFn = (PFN_SetThreadDpiAwarenessContext)::GetProcAddress(user32_dll, "SetThreadDpiAwarenessContext"))
{
SetThreadDpiAwarenessContextFn(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
return;
}
}
if (_IsWindows8Point1OrGreater())
{
static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process
if (PFN_SetProcessDpiAwareness SetProcessDpiAwarenessFn = (PFN_SetProcessDpiAwareness)::GetProcAddress(shcore_dll, "SetProcessDpiAwareness"))
{
SetProcessDpiAwarenessFn(PROCESS_PER_MONITOR_DPI_AWARE);
return;
}
}
#if _WIN32_WINNT >= 0x0600
::SetProcessDPIAware();
#endif
}
#if defined(_MSC_VER) && !defined(NOGDI)
#pragma comment(lib, "gdi32") // Link with gdi32.lib for GetDeviceCaps(). MinGW will require linking with '-lgdi32'
#endif
float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor)
{
UINT xdpi = 96, ydpi = 96;
if (_IsWindows8Point1OrGreater())
{
static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process
static PFN_GetDpiForMonitor GetDpiForMonitorFn = NULL;
if (GetDpiForMonitorFn == NULL && shcore_dll != NULL)
GetDpiForMonitorFn = (PFN_GetDpiForMonitor)::GetProcAddress(shcore_dll, "GetDpiForMonitor");
if (GetDpiForMonitorFn != NULL)
{
GetDpiForMonitorFn((HMONITOR)monitor, MDT_EFFECTIVE_DPI, &xdpi, &ydpi);
IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert!
return xdpi / 96.0f;
}
}
#ifndef NOGDI
const HDC dc = ::GetDC(NULL);
xdpi = ::GetDeviceCaps(dc, LOGPIXELSX);
ydpi = ::GetDeviceCaps(dc, LOGPIXELSY);
IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert!
::ReleaseDC(NULL, dc);
#endif
return xdpi / 96.0f;
}
float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd)
{
HMONITOR monitor = ::MonitorFromWindow((HWND)hwnd, MONITOR_DEFAULTTONEAREST);
return ImGui_ImplWin32_GetDpiScaleForMonitor(monitor);
}
//---------------------------------------------------------------------------------------------------------
// Transparency related helpers (optional)
//--------------------------------------------------------------------------------------------------------
#if defined(_MSC_VER)
#pragma comment(lib, "dwmapi") // Link with dwmapi.lib. MinGW will require linking with '-ldwmapi'
#endif
// [experimental]
// Borrowed from GLFW's function updateFramebufferTransparency() in src/win32_window.c
// (the Dwm* functions are Vista era functions but we are borrowing logic from GLFW)
void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd)
{
if (!_IsWindowsVistaOrGreater())
return;
BOOL composition;
if (FAILED(::DwmIsCompositionEnabled(&composition)) || !composition)
return;
BOOL opaque;
DWORD color;
if (_IsWindows8OrGreater() || (SUCCEEDED(::DwmGetColorizationColor(&color, &opaque)) && !opaque))
{
HRGN region = ::CreateRectRgn(0, 0, -1, -1);
DWM_BLURBEHIND bb = {};
bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
bb.hRgnBlur = region;
bb.fEnable = TRUE;
::DwmEnableBlurBehindWindow((HWND)hwnd, &bb);
::DeleteObject(region);
}
else
{
DWM_BLURBEHIND bb = {};
bb.dwFlags = DWM_BB_ENABLE;
::DwmEnableBlurBehindWindow((HWND)hwnd, &bb);
}
}
//---------------------------------------------------------------------------------------------------------

View File

@ -0,0 +1,42 @@
// dear imgui: Platform Backend for Windows (standard windows API for 32 and 64 bits applications)
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
// Implemented features:
// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui)
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// [X] Platform: Keyboard arrays indexed using VK_* Virtual Key Codes, e.g. ImGui::IsKeyPressed(VK_SPACE).
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
IMGUI_IMPL_API bool ImGui_ImplWin32_Init(void* hwnd);
IMGUI_IMPL_API void ImGui_ImplWin32_Shutdown();
IMGUI_IMPL_API void ImGui_ImplWin32_NewFrame();
// Win32 message handler your application need to call.
// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on <windows.h> from this helper.
// - You should COPY the line below into your .cpp code to forward declare the function and then you can call it.
#if 0
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
#endif
// DPI-related helpers (optional)
// - Use to enable DPI awareness without having to create an application manifest.
// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps.
// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc.
// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime,
// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies.
IMGUI_IMPL_API void ImGui_ImplWin32_EnableDpiAwareness();
IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd); // HWND hwnd
IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor); // HMONITOR monitor
// Transparency related helpers (optional) [experimental]
// - Use to enable alpha compositing transparency with the desktop.
// - Use together with e.g. clearing your framebuffer with zero-alpha.
IMGUI_IMPL_API void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd); // HWND hwnd

View File

@ -0,0 +1,6 @@
#!/bin/bash
## -V: create SPIR-V binary
## -x: save binary output as text-based 32-bit hexadecimal numbers
## -o: output file
glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag
glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert

View File

@ -0,0 +1,14 @@
#version 450 core
layout(location = 0) out vec4 fColor;
layout(set=0, binding=0) uniform sampler2D sTexture;
layout(location = 0) in struct {
vec4 Color;
vec2 UV;
} In;
void main()
{
fColor = In.Color * texture(sTexture, In.UV.st);
}

View File

@ -0,0 +1,25 @@
#version 450 core
layout(location = 0) in vec2 aPos;
layout(location = 1) in vec2 aUV;
layout(location = 2) in vec4 aColor;
layout(push_constant) uniform uPushConstant {
vec2 uScale;
vec2 uTranslate;
} pc;
out gl_PerVertex {
vec4 gl_Position;
};
layout(location = 0) out struct {
vec4 Color;
vec2 UV;
} Out;
void main()
{
Out.Color = aColor;
Out.UV = aUV;
gl_Position = vec4(aPos * pc.uScale + pc.uTranslate, 0, 1);
}

141
docs/BACKENDS.md Normal file
View File

@ -0,0 +1,141 @@
_(You may browse this at https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md or view this file with any Markdown viewer)_
## Dear ImGui: Backends
**The backends/ folder contains backends for popular platforms/graphics API, which you can use in
your application or engine to easily integrate Dear ImGui.** Each backend is typically self-contained in a pair of files: imgui_impl_XXXX.cpp + imgui_impl_XXXX.h.
- The 'Platform' backends are in charge of: mouse/keyboard/gamepad inputs, cursor shape, timing, windowing.<BR>
e.g. Windows ([imgui_impl_win32.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_win32.cpp)), GLFW ([imgui_impl_glfw.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_glfw.cpp)), SDL2 ([imgui_impl_sdl.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_sdl.cpp)), etc.
- The 'Renderer' backends are in charge of: creating atlas texture, rendering imgui draw data.<BR>
e.g. DirectX11 ([imgui_impl_dx11.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_dx11.cpp)), OpenGL/WebGL ([imgui_impl_opengl3.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_opengl3.cpp), Vulkan ([imgui_impl_vulkan.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_vulkan.cpp), etc.
- For some high-level frameworks, a single backend usually handle both 'Platform' and 'Renderer' parts.<BR>
e.g. Allegro 5 ([imgui_impl_allegro5.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_allegro5.cpp)), Marmalade ([imgui_impl_marmalade.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_marmalade.cpp)). If you end up creating a custom backend for your engine, you may want to do the same.
An application usually combines 1 Platform backend + 1 Renderer backend + main Dear ImGui sources.
For example, the [example_win32_directx11](https://github.com/ocornut/imgui/tree/master/examples/example_win32_directx11) application combines imgui_impl_win32.cpp + imgui_impl_dx11.cpp. There are 20+ examples in the [examples/](https://github.com/ocornut/imgui/blob/master/examples/) folder. See [EXAMPLES.MD](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md) for details.
**Once Dear ImGui is setup and running, run and refer to `ImGui::ShowDemoWindow()` in imgui_demo.cpp for usage of the end-user API.**
### What are backends
Dear ImGui is highly portable and only requires a few things to run and render, typically:
- Required: providing mouse/keyboard inputs (fed into the `ImGuiIO` structure).
- Required: uploading the font atlas texture into graphics memory.
- Required: rendering indexed textured triangles with a clipping rectangle.
Extra features are opt-in, our backends try to support as many as possible:
- Optional: custom texture binding support.
- Optional: clipboard support.
- Optional: gamepad support.
- Optional: mouse cursor shape support.
- Optional: IME support.
- Optional: multi-viewports support.
etc.
This is essentially what each backends are doing + obligatory portability cruft. Using default backends ensure you can get all those features including the ones that would be harder to implement on your side (e.g. multi-viewports support).
It is important to understand the difference between the core Dear ImGui library (files in the root folder)
and backends which we are describing here (backends/ folder).
- Some issues may only be backend or platform specific.
- You should be able to write backends for pretty much any platform and any 3D graphics API.
e.g. you can get creative and use software rendering or render remotely on a different machine.
### Integrating a backend
See "Getting Started" section of [EXAMPLES.MD](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md) for more details.
### List of backends
In the [backends/](https://github.com/ocornut/imgui/blob/master/backends) folder:
List of Platforms Backends:
imgui_impl_android.cpp ; Android native app API
imgui_impl_glfw.cpp ; GLFW (Windows, macOS, Linux, etc.) http://www.glfw.org/
imgui_impl_osx.mm ; macOS native API (not as feature complete as glfw/sdl backends)
imgui_impl_sdl.cpp ; SDL2 (Windows, macOS, Linux, iOS, Android) https://www.libsdl.org
imgui_impl_win32.cpp ; Win32 native API (Windows)
imgui_impl_glut.cpp ; GLUT/FreeGLUT (this is prehistoric software and absolutely not recommended today!)
List of Renderer Backends:
imgui_impl_dx9.cpp ; DirectX9
imgui_impl_dx10.cpp ; DirectX10
imgui_impl_dx11.cpp ; DirectX11
imgui_impl_dx12.cpp ; DirectX12
imgui_impl_metal.mm ; Metal (with ObjC)
imgui_impl_opengl2.cpp ; OpenGL 2 (legacy, fixed pipeline <- don't use with modern OpenGL context)
imgui_impl_opengl3.cpp ; OpenGL 3/4, OpenGL ES 2, OpenGL ES 3 (modern programmable pipeline)
imgui_impl_vulkan.cpp ; Vulkan
imgui_impl_wgpu.cpp ; WebGPU
List of high-level Frameworks Backends (combining Platform + Renderer):
imgui_impl_allegro5.cpp
imgui_impl_marmalade.cpp
Emscripten is also supported.
The [example_emscripten_opengl3](https://github.com/ocornut/imgui/tree/master/examples/example_emscripten_opengl3) app uses imgui_impl_sdl.cpp + imgui_impl_opengl3.cpp, but other combos are possible.
### Backends for third-party frameworks, graphics API or other languages
See https://github.com/ocornut/imgui/wiki/Bindings for the full list.
### Recommended Backends
If you are not sure which backend to use, the recommended platform/frameworks for portable applications:
|Library |Website |Backend |Note |
|--------|--------|--------|-----|
| GLFW | https://github.com/glfw/glfw | imgui_impl_glfw.cpp | |
| SDL2 | https://www.libsdl.org | imgui_impl_sdl.cpp | |
| Sokol | https://github.com/floooh/sokol | [util/sokol_imgui.h](https://github.com/floooh/sokol/blob/master/util/sokol_imgui.h) | Lower-level than GLFW/SDL |
### Using a custom engine?
You will likely be tempted to start by rewrite your own backend using your own custom/high-level facilities...<BR>
Think twice!
If you are new to Dear ImGui, first try using the existing backends as-is.
You will save lots of time integrating the library.
You can LATER decide to rewrite yourself a custom backend if you really need to.
In most situations, custom backends have less features and more bugs than the standard backends we provide.
If you want portability, you can use multiple backends and choose between them either at compile time
or at runtime.
**Example A**: your engine is built over Windows + DirectX11 but you have your own high-level rendering
system layered over DirectX11.<BR>
Suggestion: try using imgui_impl_win32.cpp + imgui_impl_dx11.cpp first.
Once it works, if you really need it you can replace the imgui_impl_dx11.cpp code with a
custom renderer using your own rendering functions, and keep using the standard Win32 code etc.
**Example B**: your engine runs on Windows, Mac, Linux and uses DirectX11, Metal, Vulkan respectively.<BR>
Suggestion: use multiple generic backends!
Once it works, if you really need it you can replace parts of backends with your own abstractions.
**Example C**: your engine runs on platforms we can't provide public backends for (e.g. PS4/PS5, Switch),
and you have high-level systems everywhere.<BR>
Suggestion: try using a non-portable backend first (e.g. win32 + underlying graphics API) to get
your desktop builds working first. This will get you running faster and get your acquainted with
how Dear ImGui works and is setup. You can then rewrite a custom backend using your own engine API.
Also:
The [multi-viewports feature](https://github.com/ocornut/imgui/issues/1542) of the 'docking' branch allows
Dear ImGui windows to be seamlessly detached from the main application window. This is achieved using an
extra layer to the Platform and Renderer backends, which allows Dear ImGui to communicate platform-specific
requests such as: "create an additional OS window", "create a render context", "get the OS position of this
window" etc. See 'ImGuiPlatformIO' for details.
Supporting the multi-viewports feature correctly using 100% of your own abstractions is more difficult
than supporting single-viewport.
If you decide to use unmodified imgui_impl_XXXX.cpp files, you can automatically benefit from
improvements and fixes related to viewports and platform windows without extra work on your side.

3201
docs/CHANGELOG.txt Normal file

File diff suppressed because it is too large Load Diff

240
docs/EXAMPLES.md Normal file
View File

@ -0,0 +1,240 @@
_(You may browse this at https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md or view this file with any Markdown viewer)_
## Dear ImGui: Examples
**The [examples/](https://github.com/ocornut/imgui/blob/master/examples) folder example applications (standalone, ready-to-build) for variety of
platforms and graphics APIs.** They all use standard backends from the [backends/](https://github.com/ocornut/imgui/blob/master/backends) folder (see [BACKENDS.md](https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md)).
The purpose of Examples is to showcase integration with backends, let you try Dear ImGui, and guide you toward
integrating Dear ImGui in your own application/game/engine.
**Once Dear ImGui is setup and running, run and refer to `ImGui::ShowDemoWindow()` in imgui_demo.cpp for usage of the end-user API.**
You can find Windows binaries for some of those example applications at:
http://www.dearimgui.org/binaries
### Getting Started
Integration in a typical existing application, should take <20 lines when using standard backends.
At initialization:
call ImGui::CreateContext()
call ImGui_ImplXXXX_Init() for each backend.
At the beginning of your frame:
call ImGui_ImplXXXX_NewFrame() for each backend.
call ImGui::NewFrame()
At the end of your frame:
call ImGui::Render()
call ImGui_ImplXXXX_RenderDrawData() for your Renderer backend.
At shutdown:
call ImGui_ImplXXXX_Shutdown() for each backend.
call ImGui::DestroyContext()
Example (using [backends/imgui_impl_win32.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_win32.cpp) + [backends/imgui_impl_dx11.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_dx11.cpp)):
// Create a Dear ImGui context, setup some options
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable some options
// Initialize Platform + Renderer backends (here: using imgui_impl_win32.cpp + imgui_impl_dx11.cpp)
ImGui_ImplWin32_Init(my_hwnd);
ImGui_ImplDX11_Init(my_d3d_device, my_d3d_device_context);
// Application main loop
while (true)
{
// Beginning of frame: update Renderer + Platform backend, start Dear ImGui frame
ImGui_ImplDX11_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
// Any application code here
ImGui::Text("Hello, world!");
// End of frame: render Dear ImGui
ImGui::Render();
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
// Swap
g_pSwapChain->Present(1, 0);
}
// Shutdown
ImGui_ImplDX11_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
Please read 'PROGRAMMER GUIDE' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
Please read the comments and instruction at the top of each file.
Please read FAQ at http://www.dearimgui.org/faq
If you are using of the backend provided here, you can add the backends/imgui_impl_xxxx(.cpp,.h)
files to your project and use as-in. Each imgui_impl_xxxx.cpp file comes with its own individual
Changelog, so if you want to update them later it will be easier to catch up with what changed.
### Examples Applications
[example_allegro5/](https://github.com/ocornut/imgui/blob/master/examples/example_allegro5/) <BR>
Allegro 5 example. <BR>
= main.cpp + imgui_impl_allegro5.cpp
[example_android_opengl3/](https://github.com/ocornut/imgui/blob/master/examples/example_android_opengl3/) <BR>
Android + OpenGL3 (ES) example. <BR>
= main.cpp + imgui_impl_android.cpp + imgui_impl_opengl3.cpp
[example_apple_metal/](https://github.com/ocornut/imgui/blob/master/examples/example_metal/) <BR>
OSX & iOS + Metal example. <BR>
= main.m + imgui_impl_osx.mm + imgui_impl_metal.mm <BR>
It is based on the "cross-platform" game template provided with Xcode as of Xcode 9.
(NB: imgui_impl_osx.mm is currently not as feature complete as other platforms backends.
You may prefer to use the GLFW Or SDL backends, which will also support Windows and Linux.)
[example_apple_opengl2/](https://github.com/ocornut/imgui/blob/master/examples/example_apple_opengl2/) <BR>
OSX + OpenGL2 example. <BR>
= main.mm + imgui_impl_osx.mm + imgui_impl_opengl2.cpp <BR>
(NB: imgui_impl_osx.mm is currently not as feature complete as other platforms backends.
You may prefer to use the GLFW Or SDL backends, which will also support Windows and Linux.)
[example_emscripten_opengl3/](https://github.com/ocornut/imgui/blob/master/examples/example_emscripten_opengl3/) <BR>
Emcripten + SDL2 + OpenGL3+/ES2/ES3 example. <BR>
= main.cpp + imgui_impl_sdl.cpp + imgui_impl_opengl3.cpp <BR>
Note that other examples based on SDL or GLFW + OpenGL could easily be modified to work with Emscripten.
We provide this to make the Emscripten differences obvious, and have them not pollute all other examples.
[example_emscripten_wgpu/](https://github.com/ocornut/imgui/blob/master/examples/example_emscripten_wgpu/) <BR>
Emcripten + GLFW + WebGPU example. <BR>
= main.cpp + imgui_impl_glfw.cpp + imgui_impl_wgpu.cpp
[example_glfw_metal/](https://github.com/ocornut/imgui/blob/master/examples/example_glfw_metal/) <BR>
GLFW (Mac) + Metal example. <BR>
= main.mm + imgui_impl_glfw.cpp + imgui_impl_metal.mm
[example_glfw_opengl2/](https://github.com/ocornut/imgui/blob/master/examples/example_glfw_opengl2/) <BR>
GLFW + OpenGL2 example (legacy, fixed pipeline). <BR>
= main.cpp + imgui_impl_glfw.cpp + imgui_impl_opengl2.cpp <BR>
**DO NOT USE THIS IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** <BR>
This code is mostly provided as a reference to learn about Dear ImGui integration, because it is shorter.
If your code is using GL3+ context or any semi modern OpenGL calls, using this renderer is likely to
make things more complicated, will require your code to reset many OpenGL attributes to their initial
state, and might confuse your GPU driver. One star, not recommended.
[example_glfw_opengl3/](https://github.com/ocornut/imgui/blob/master/examples/example_glfw_opengl3/) <BR>
GLFW (Win32, Mac, Linux) + OpenGL3+/ES2/ES3 example (modern, programmable pipeline). <BR>
= main.cpp + imgui_impl_glfw.cpp + imgui_impl_opengl3.cpp <BR>
This uses more modern OpenGL calls and custom shaders. <BR>
This may actually also work with OpenGL 2.x contexts! <BR>
Prefer using that if you are using modern OpenGL in your application (anything with shaders).
[example_glfw_vulkan/](https://github.com/ocornut/imgui/blob/master/examples/example_glfw_vulkan/) <BR>
GLFW (Win32, Mac, Linux) + Vulkan example. <BR>
= main.cpp + imgui_impl_glfw.cpp + imgui_impl_vulkan.cpp <BR>
This is quite long and tedious, because: Vulkan.
For this example, the main.cpp file exceptionally use helpers function from imgui_impl_vulkan.h/cpp.
[example_glut_opengl2/](https://github.com/ocornut/imgui/blob/master/examples/example_glut_opengl2/) <BR>
GLUT (e.g., FreeGLUT on Linux/Windows, GLUT framework on OSX) + OpenGL2 example. <BR>
= main.cpp + imgui_impl_glut.cpp + imgui_impl_opengl2.cpp <BR>
Note that GLUT/FreeGLUT is largely obsolete software, prefer using GLFW or SDL.
[example_marmalade/](https://github.com/ocornut/imgui/blob/master/examples/example_marmalade/) <BR>
Marmalade example using IwGx. <BR>
= main.cpp + imgui_impl_marmalade.cpp
[example_null/](https://github.com/ocornut/imgui/blob/master/examples/example_null/) <BR>
Null example, compile and link imgui, create context, run headless with no inputs and no graphics output. <BR>
= main.cpp <BR>
This is used to quickly test compilation of core imgui files in as many setups as possible.
Because this application doesn't create a window nor a graphic context, there's no graphics output.
[example_sdl_directx11/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_directx11/) <BR>
SDL2 + DirectX11 example, Windows only. <BR>
= main.cpp + imgui_impl_sdl.cpp + imgui_impl_dx11.cpp <BR>
This to demonstrate usage of DirectX with SDL.
[example_sdl_metal/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_metal/) <BR>
SDL2 (Mac) + Metal example. <BR>
= main.mm + imgui_impl_sdl.cpp + imgui_impl_metal.mm
[example_sdl_opengl2/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_opengl2/) <BR>
SDL2 (Win32, Mac, Linux etc.) + OpenGL example (legacy, fixed pipeline). <BR>
= main.cpp + imgui_impl_sdl.cpp + imgui_impl_opengl2.cpp <BR>
**DO NOT USE OPENGL2 CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** <BR>
This code is mostly provided as a reference to learn about Dear ImGui integration, because it is shorter.
If your code is using GL3+ context or any semi modern OpenGL calls, using this renderer is likely to
make things more complicated, will require your code to reset many OpenGL attributes to their initial
state, and might confuse your GPU driver. One star, not recommended.
[example_sdl_opengl3/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_opengl3/) <BR>
SDL2 (Win32, Mac, Linux, etc.) + OpenGL3+/ES2/ES3 example. <BR>
= main.cpp + imgui_impl_sdl.cpp + imgui_impl_opengl3.cpp <BR>
This uses more modern OpenGL calls and custom shaders. <BR>
This may actually also work with OpenGL 2.x contexts! <BR>
[example_sdl_vulkan/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_vulkan/) <BR>
SDL2 (Win32, Mac, Linux, etc.) + Vulkan example. <BR>
= main.cpp + imgui_impl_sdl.cpp + imgui_impl_vulkan.cpp <BR>
This is quite long and tedious, because: Vulkan. <BR>
For this example, the main.cpp file exceptionally use helpers function from imgui_impl_vulkan.h/cpp.
[example_win32_directx9/](https://github.com/ocornut/imgui/blob/master/examples/example_win32_directx9/) <BR>
DirectX9 example, Windows only. <BR>
= main.cpp + imgui_impl_win32.cpp + imgui_impl_dx9.cpp
[example_win32_directx10/](https://github.com/ocornut/imgui/blob/master/examples/example_win32_directx10/) <BR>
DirectX10 example, Windows only. <BR>
= main.cpp + imgui_impl_win32.cpp + imgui_impl_dx10.cpp
[example_win32_directx11/](https://github.com/ocornut/imgui/blob/master/examples/example_win32_directx11/) <BR>
DirectX11 example, Windows only. <BR>
= main.cpp + imgui_impl_win32.cpp + imgui_impl_dx11.cpp
[example_win32_directx12/](https://github.com/ocornut/imgui/blob/master/examples/example_win32_directx12/) <BR>
DirectX12 example, Windows only. <BR>
= main.cpp + imgui_impl_win32.cpp + imgui_impl_dx12.cpp <BR>
This is quite long and tedious, because: DirectX12.
### Miscallaneous
**Building**
Unfortunately nowadays it is still tedious to create and maintain portable build files using external
libraries (the kind we're using here to create a window and render 3D triangles) without relying on
third party software and build systems. For most examples here we choose to provide:
- Makefiles for Linux/OSX
- Batch files for Visual Studio 2008+
- A .sln project file for Visual Studio 2012+
- Xcode project files for the Apple examples
Please let us know if they don't work with your setup!
You can probably just import the imgui_impl_xxx.cpp/.h files into your own codebase or compile those
directly with a command-line compiler.
If you are interested in using Cmake to build and links examples, see:
https://github.com/ocornut/imgui/pull/1713 and https://github.com/ocornut/imgui/pull/3027
**About mouse cursor latency**
Dear ImGui has no particular extra lag for most behaviors,
e.g. the value of 'io.MousePos' provided at the time of NewFrame() will result in windows being moved
to the right spot at the time of EndFrame()/Render(). At 60 FPS your experience should be pleasant.
However, consider that OS mouse cursors are typically drawn through a very specific hardware accelerated
path and will feel smoother than the majority of contents rendered via regular graphics API (including,
but not limited to Dear ImGui windows). Because UI rendering and interaction happens on the same plane
as the mouse, that disconnect may be jarring to particularly sensitive users.
You may experiment with enabling the io.MouseDrawCursor flag to request Dear ImGui to draw a mouse cursor
using the regular graphics API, to help you visualize the difference between a "hardware" cursor and a
regularly rendered software cursor.
However, rendering a mouse cursor at 60 FPS will feel sluggish so you likely won't want to enable that at
all times. It might be beneficial for the user experience to switch to a software rendered cursor _only_
when an interactive drag is in progress.
Note that some setup or GPU drivers are likely to be causing extra display lag depending on their settings.
If you feel that dragging windows feels laggy and you are not sure what the cause is: try to build a simple
drawing a flat 2D shape directly under the mouse cursor!

667
docs/FAQ.md Normal file
View File

@ -0,0 +1,667 @@
# FAQ (Frequenty Asked Questions)
You may link to this document using short form:
https://www.dearimgui.org/faq
or its real address:
https://github.com/ocornut/imgui/blob/master/docs/FAQ.md
or view this file with any Markdown viewer.
## Index
| **Q&A: Basics** |
:---------------------------------------------------------- |
| [Where is the documentation?](#q-where-is-the-documentation) |
| [What is this library called?](#q-what-is-this-library-called) |
| [Which version should I get?](#q-which-version-should-i-get) |
| **Q&A: Integration** |
| **[How to get started?](#q-how-to-get-started)** |
| **[How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?](#q-how-can-i-tell-whether-to-dispatch-mousekeyboard-to-dear-imgui-or-my-application)** |
| [How can I enable keyboard or gamepad controls?](#q-how-can-i-enable-keyboard-or-gamepad-controls) |
| [How can I use this on a machine without mouse, keyboard or screen? (input share, remote display)](#q-how-can-i-use-this-on-a-machine-without-mouse-keyboard-or-screen-input-share-remote-display) |
| [I integrated Dear ImGui in my engine and little squares are showing instead of text...](#q-i-integrated-dear-imgui-in-my-engine-and-little-squares-are-showing-instead-of-text) |
| [I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around...](#q-i-integrated-dear-imgui-in-my-engine-and-some-elements-are-clipping-or-disappearing-when-i-move-windows-around) |
| [I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries...](#q-i-integrated-dear-imgui-in-my-engine-and-some-elements-are-displaying-outside-their-expected-windows-boundaries) |
| **Q&A: Usage** |
| **[Why is my widget not reacting when I click on it?<br>How can I have widgets with an empty label?<br>How can I have multiple widgets with the same label?](#q-why-is-my-widget-not-reacting-when-i-click-on-it)** |
| [How can I display an image? What is ImTextureID, how does it work?](#q-how-can-i-display-an-image-what-is-imtextureid-how-does-it-work)|
| [How can I use my own math types instead of ImVec2/ImVec4?](#q-how-can-i-use-my-own-math-types-instead-of-imvec2imvec4) |
| [How can I interact with standard C++ types (such as std::string and std::vector)?](#q-how-can-i-interact-with-standard-c-types-such-as-stdstring-and-stdvector) |
| [How can I display custom shapes? (using low-level ImDrawList API)](#q-how-can-i-display-custom-shapes-using-low-level-imdrawlist-api) |
| **Q&A: Fonts, Text** |
| [How should I handle DPI in my application?](#q-how-should-i-handle-dpi-in-my-application) |
| [How can I load a different font than the default?](#q-how-can-i-load-a-different-font-than-the-default) |
| [How can I easily use icons in my application?](#q-how-can-i-easily-use-icons-in-my-application) |
| [How can I load multiple fonts?](#q-how-can-i-load-multiple-fonts) |
| [How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?](#q-how-can-i-display-and-input-non-latin-characters-such-as-chinese-japanese-korean-cyrillic) |
| **Q&A: Concerns** |
| [Who uses Dear ImGui?](#q-who-uses-dear-imgui) |
| [Can you create elaborate/serious tools with Dear ImGui?](#q-can-you-create-elaborateserious-tools-with-dear-imgui) |
| [Can you reskin the look of Dear ImGui?](#q-can-you-reskin-the-look-of-dear-imgui) |
| [Why using C++ (as opposed to C)?](#q-why-using-c-as-opposed-to-c) |
| **Q&A: Community** |
| [How can I help?](#q-how-can-i-help) |
# Q&A: Basics
### Q: Where is the documentation?
**This library is poorly documented at the moment and expects the user to be acquainted with C/C++.**
- The [Wiki](https://github.com/ocornut/imgui/wiki) is a hub to many resources and links.
- Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the [examples/](https://github.com/ocornut/imgui/blob/master/examples/) folder to explain how to integrate Dear ImGui with your own engine/application. You can run those applications and explore them.
- See demo code in [imgui_demo.cpp](https://github.com/ocornut/imgui/blob/master/imgui_demo.cpp) and particularly the `ImGui::ShowDemoWindow()` function. The demo covers most features of Dear ImGui, so you can read the code and see its output.
- See documentation: [Backends](https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md), [Examples](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md), [Fonts](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md).
- See documentation and comments at the top of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp) + general API comments in [imgui.h](https://github.com/ocornut/imgui/blob/master/imgui.h).
- The [Glossary](https://github.com/ocornut/imgui/wiki/Glossary) page may be useful.
- The [Issues](https://github.com/ocornut/imgui/issues) and [Discussions](https://github.com/ocornut/imgui/discussions) sections can be searched for past questions and issues.
- Your programming IDE is your friend, find the type or function declaration to find comments associated with it.
- The `ImGui::ShowMetricsWindow()` function exposes lots of internal information and tools. Although it is primary designed as a debugging tool, having access to that information tends to help understands concepts.
##### [Return to Index](#index)
---
### Q. What is this library called?
**This library is called Dear ImGui**. Please refer to it as Dear ImGui (not ImGui, not IMGUI).
(The library misleadingly started its life in 2014 as "ImGui" due to the fact that I didn't give it a proper name when I released 1.0, and had no particular expectation that it would take off. However, the term IMGUI (immediate-mode graphical user interface) was coined before and is being used in variety of other situations e.g. Unity uses it own implementation of the IMGUI paradigm. To reduce the ambiguity without affecting existing code bases, I have decided in December 2015 a fully qualified name "Dear ImGui" for this library.
##### [Return to Index](#index)
---
### Q: Which version should I get?
I occasionally tag [Releases](https://github.com/ocornut/imgui/releases) but it is generally safe and recommended to sync to master/latest. The library is fairly stable and regressions tend to be fixed fast when reported.
You may use the [docking](https://github.com/ocornut/imgui/tree/docking) branch which includes:
- [Docking features](https://github.com/ocornut/imgui/issues/2109)
- [Multi-viewport features](https://github.com/ocornut/imgui/issues/1542)
Many projects are using this branch and it is kept in sync with master regularly.
##### [Return to Index](#index)
----
# Q&A: Integration
### Q: How to get started?
Read [EXAMPLES.md](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md). <BR>
Read [BACKENDS.md](https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md). <BR>
Read `PROGRAMMER GUIDE` section of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp). <BR>
The [Wiki](https://github.com/ocornut/imgui/wiki) is a hub to many resources and links.
##### [Return to Index](#index)
---
### Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?
You can read the `io.WantCaptureMouse`, `io.WantCaptureKeyboard` and `io.WantTextInput` flags from the ImGuiIO structure.
- When `io.WantCaptureMouse` is set, you need to discard/hide the mouse inputs from your underlying application.
- When `io.WantCaptureKeyboard` is set, you need to discard/hide the keyboard inputs from your underlying application.
- When `io.WantTextInput` is set, you can notify your OS/engine to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS).
Important: you should always pass your mouse/keyboard inputs to Dear ImGui, regardless of the value `io.WantCaptureMouse`/`io.WantCaptureKeyboard`. This is because e.g. we need to detect that you clicked in the void to unfocus its own windows, and other reasons.
```cpp
void MyLowLevelMouseButtonHandler(int button, bool down)
{
// (1) ALWAYS forward mouse data to ImGui! This is automatic with default backends. With your own backend:
ImGuiIO& io = ImGui::GetIO();
io.MouseDown[button] = down;
// (2) ONLY forward mouse data to your underlying app/game.
if (!io.WantCaptureMouse)
my_game->HandleMouseData(...);
}
```
**Note:** The `io.WantCaptureMouse` is more correct that any manual attempt to "check if the mouse is hovering a window" (don't do that!). It handle mouse dragging correctly (both dragging that started over your application or over a Dear ImGui window) and handle e.g. popup and modal windows blocking inputs.
**Note:** Those flags are updated by `ImGui::NewFrame()`. However it is generally more correct and easier that you poll flags from the previous frame, then submit your inputs, then call `NewFrame()`. If you attempt to do the opposite (which is generally harder) you are likely going to submit your inputs after `NewFrame()`, and therefore too late.
**Note:** If you are using a touch device, you may find use for an early call to `UpdateHoveredWindowAndCaptureFlags()` to correctly dispatch your initial touch. We will work on better out-of-the-box touch support in the future.
**Note:** Text input widget releases focus on the "KeyDown" event of the Return key, so the subsequent "KeyUp" event that your application receive will typically have `io.WantCaptureKeyboard == false`. Depending on your application logic it may or not be inconvenient to receive that KeyUp event. You might want to track which key-downs were targeted for Dear ImGui, e.g. with an array of bool, and filter out the corresponding key-ups.)
##### [Return to Index](#index)
---
### Q: How can I enable keyboard or gamepad controls?
- The gamepad/keyboard navigation is fairly functional and keeps being improved. The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable. Gamepad support is particularly useful to use Dear ImGui on a game console (e.g. PS4, Switch, XB1) without a mouse connected!
- Keyboard: set `io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard` to enable.
- Gamepad: set `io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad` to enable (with a supporting backend).
- See [Control Sheets for Gamepads](http://www.dearimgui.org/controls_sheets) (reference PNG/PSD for for PS4, XB1, Switch gamepads).
- See `USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS` section of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp) for more details.
##### [Return to Index](#index)
---
### Q: How can I use this on a machine without mouse, keyboard or screen? (input share, remote display)
- You can share your computer mouse seamlessly with your console/tablet/phone using solutions such as [Synergy](https://symless.com/synergy)
This is the preferred solution for developer productivity.
In particular, the [micro-synergy-client repository](https://github.com/symless/micro-synergy-client) has simple
and portable source code (uSynergy.c/.h) for a small embeddable client that you can use on any platform to connect
to your host computer, based on the Synergy 1.x protocol. Make sure you download the Synergy 1 server on your computer.
Console SDK also sometimes provide equivalent tooling or wrapper for Synergy-like protocols.
- Game console users: consider emulating a mouse cursor with DualShock4 touch pad or a spare analog stick as a mouse-emulation fallback.
- You may also use a third party solution such as [netImgui](https://github.com/sammyfreg/netImgui), [Remote ImGui](https://github.com/JordiRos/remoteimgui) or [imgui-ws](https://github.com/ggerganov/imgui-ws) which sends the vertices to render over the local network, allowing you to use Dear ImGui even on a screen-less machine. See [Wiki](https://github.com/ocornut/imgui/wiki) index for most details.
- For touch inputs, you can increase the hit box of widgets (via the `style.TouchPadding` setting) to accommodate for the lack of precision of touch inputs, but it is recommended you use a mouse or gamepad to allow optimizing for screen real-estate and precision.
##### [Return to Index](#index)
---
### Q: I integrated Dear ImGui in my engine and little squares are showing instead of text...
Your renderer is not using the font texture correctly or it hasn't be uploaded to GPU.
- If this happens using the standard backends: A) have you modified the font atlas after `ImGui_ImplXXX_NewFrame()`? B) maybe the texture failed to upload, which could happens if for some reason your texture is too big. Also see [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md).
- If this happens with a custom backend: make sure you have uploaded the font texture to the GPU, that all shaders are rendering states are setup properly (e.g. texture is bound). Compare your code to existing backends and use a graphics debugger such as [RenderDoc](https://renderdoc.org) to debug your rendering states.
##### [Return to Index](#index)
---
### Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around...
### Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries...
You are probably mishandling the clipping rectangles in your render function.
Each draw command needs the triangle rendered using the clipping rectangle provided in the ImDrawCmd structure (`ImDrawCmd->CllipRect`).
Rectangles provided by Dear ImGui are defined as
`(x1=left,y1=top,x2=right,y2=bottom)`
and **NOT** as
`(x1,y1,width,height)`
Refer to rendering backends in the [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder for references of how to handle the `ClipRect` field.
##### [Return to Index](#index)
---
# Q&A: Usage
### Q: Why is my widget not reacting when I click on it?
### Q: How can I have widgets with an empty label?
### Q: How can I have multiple widgets with the same label?
A primer on labels and the ID Stack...
Dear ImGui internally need to uniquely identify UI elements.
Elements that are typically not clickable (such as calls to the Text functions) don't need an ID.
Interactive widgets (such as calls to Button buttons) need a unique ID.
Unique ID are used internally to track active widgets and occasionally associate state to widgets.
Unique ID are implicitly built from the hash of multiple elements that identify the "path" to the UI element.
- Unique ID are often derived from a string label and at minimum scoped within their host window:
```cpp
Begin("MyWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyWindow", "OK")
Button("Cancel"); // Label = "Cancel", ID = hash of ("MyWindow", "Cancel")
End();
```
- Other elements such as tree nodes, etc. also pushes to the ID stack:
```cpp
Begin("MyWindow");
if (TreeNode("MyTreeNode"))
{
Button("OK"); // Label = "OK", ID = hash of ("MyWindow", "MyTreeNode", "OK")
TreePop();
}
End();
```
- Two items labeled "OK" in different windows or different tree locations won't collide:
```cpp
Begin("MyFirstWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyFirstWindow", "OK")
End();
Begin("MyOtherWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyOtherWindow", "OK")
End();
```
- If you have a same ID twice in the same location, you'll have a conflict:
```cpp
Begin("MyWindow");
Button("OK");
Button("OK"); // ERROR: ID collision with the first button! Interacting with either button will trigger the first one.
Button(""); // ERROR: ID collision with Begin("MyWindow")!
End();
```
Fear not! this is easy to solve and there are many ways to solve it!
- Solving ID conflict in a simple/local context:
When passing a label you can optionally specify extra ID information within string itself.
Use "##" to pass a complement to the ID that won't be visible to the end-user.
This helps solving the simple collision cases when you know e.g. at compilation time which items
are going to be created:
```cpp
Begin("MyWindow");
Button("Play"); // Label = "Play", ID = hash of ("MyWindow", "Play")
Button("Play##foo1"); // Label = "Play", ID = hash of ("MyWindow", "Play##foo1") // Different from other buttons
Button("Play##foo2"); // Label = "Play", ID = hash of ("MyWindow", "Play##foo2") // Different from other buttons
Button("##foo"); // Label = "", ID = hash of ("MyWindow", "##foo") // Different from window
End();
```
- If you want to completely hide the label, but still need an ID:
```cpp
Checkbox("##On", &b); // Label = "", ID = hash of (..., "##On") // No visible label, just a checkbox!
```
- Occasionally/rarely you might want change a label while preserving a constant ID. This allows
you to animate labels. For example you may want to include varying information in a window title bar,
but windows are uniquely identified by their ID. Use "###" to pass a label that isn't part of ID:
```cpp
Button("Hello###ID"); // Label = "Hello", ID = hash of (..., "###ID")
Button("World###ID"); // Label = "World", ID = hash of (..., "###ID") // Same ID, different label
sprintf(buf, "My game (%f FPS)###MyGame", fps);
Begin(buf); // Variable title, ID = hash of "MyGame"
```
- Solving ID conflict in a more general manner:
Use `PushID()` / `PopID()` to create scopes and manipulate the ID stack, as to avoid ID conflicts
within the same window. This is the most convenient way of distinguishing ID when iterating and
creating many UI elements programmatically.
You can push a pointer, a string or an integer value into the ID stack.
Remember that ID are formed from the concatenation of _everything_ pushed into the ID stack.
At each level of the stack we store the seed used for items at this level of the ID stack.
```cpp
Begin("Window");
for (int i = 0; i < 100; i++)
{
PushID(i); // Push i to the id tack
Button("Click"); // Label = "Click", ID = hash of ("Window", i, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj);
Button("Click"); // Label = "Click", ID = hash of ("Window", obj pointer, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj->Name);
Button("Click"); // Label = "Click", ID = hash of ("Window", obj->Name, "Click")
PopID();
}
End();
```
- You can stack multiple prefixes into the ID stack:
```cpp
Button("Click"); // Label = "Click", ID = hash of (..., "Click")
PushID("node");
Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
PushID(my_ptr);
Button("Click"); // Label = "Click", ID = hash of (..., "node", my_ptr, "Click")
PopID();
PopID();
```
- Tree nodes implicitly creates a scope for you by calling `PushID()`:
```cpp
Button("Click"); // Label = "Click", ID = hash of (..., "Click")
if (TreeNode("node")) // <-- this function call will do a PushID() for you (unless instructed not to, with a special flag)
{
Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
TreePop();
}
```
When working with trees, ID are used to preserve the open/close state of each tree node.
Depending on your use cases you may want to use strings, indices or pointers as ID.
- e.g. when following a single pointer that may change over time, using a static string as ID
will preserve your node open/closed state when the targeted object change.
- e.g. when displaying a list of objects, using indices or pointers as ID will preserve the
node open/closed state differently. See what makes more sense in your situation!
##### [Return to Index](#index)
---
### Q: How can I display an image? What is ImTextureID, how does it work?
Short explanation:
- Refer to [Image Loading and Displaying Examples](https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples) on the [Wiki](https://github.com/ocornut/imgui/wiki).
- You may use functions such as `ImGui::Image()`, `ImGui::ImageButton()` or lower-level `ImDrawList::AddImage()` to emit draw calls that will use your own textures.
- Actual textures are identified in a way that is up to the user/engine. Those identifiers are stored and passed as ImTextureID (void*) value.
- Loading image files from the disk and turning them into a texture is not within the scope of Dear ImGui (for a good reason).
**Please read documentations or tutorials on your graphics API to understand how to display textures on the screen before moving onward.**
Long explanation:
- Dear ImGui's job is to create "meshes", defined in a renderer-agnostic format made of draw commands and vertices. At the end of the frame those meshes (ImDrawList) will be displayed by your rendering function. They are made up of textured polygons and the code to render them is generally fairly short (a few dozen lines). In the examples/ folder we provide functions for popular graphics API (OpenGL, DirectX, etc.).
- Each rendering function decides on a data type to represent "textures". The concept of what is a "texture" is entirely tied to your underlying engine/graphics API.
We carry the information to identify a "texture" in the ImTextureID type.
ImTextureID is nothing more that a void*, aka 4/8 bytes worth of data: just enough to store 1 pointer or 1 integer of your choice.
Dear ImGui doesn't know or understand what you are storing in ImTextureID, it merely pass ImTextureID values until they reach your rendering function.
- In the [examples/](https://github.com/ocornut/imgui/tree/master/examples) backends, for each graphics API we decided on a type that is likely to be a good representation for specifying an image from the end-user perspective. This is what the _examples_ rendering functions are using:
```cpp
OpenGL:
- ImTextureID = GLuint
- See ImGui_ImplOpenGL3_RenderDrawData() function in imgui_impl_opengl3.cpp
```
```cpp
DirectX9:
- ImTextureID = LPDIRECT3DTEXTURE9
- See ImGui_ImplDX9_RenderDrawData() function in imgui_impl_dx9.cpp
```
```cpp
DirectX11:
- ImTextureID = ID3D11ShaderResourceView*
- See ImGui_ImplDX11_RenderDrawData() function in imgui_impl_dx11.cpp
```
```cpp
DirectX12:
- ImTextureID = D3D12_GPU_DESCRIPTOR_HANDLE
- See ImGui_ImplDX12_RenderDrawData() function in imgui_impl_dx12.cpp
```
For example, in the OpenGL example backend we store raw OpenGL texture identifier (GLuint) inside ImTextureID.
Whereas in the DirectX11 example backend we store a pointer to ID3D11ShaderResourceView inside ImTextureID, which is a higher-level structure tying together both the texture and information about its format and how to read it.
- If you have a custom engine built over e.g. OpenGL, instead of passing GLuint around you may decide to use a high-level data type to carry information about the texture as well as how to display it (shaders, etc.). The decision of what to use as ImTextureID can always be made better knowing how your codebase is designed. If your engine has high-level data types for "textures" and "material" then you may want to use them.
If you are starting with OpenGL or DirectX or Vulkan and haven't built much of a rendering engine over them, keeping the default ImTextureID representation suggested by the example backends is probably the best choice.
(Advanced users may also decide to keep a low-level type in ImTextureID, and use ImDrawList callback and pass information to their renderer)
User code may do:
```cpp
// Cast our texture type to ImTextureID / void*
MyTexture* texture = g_CoffeeTableTexture;
ImGui::Image((void*)texture, ImVec2(texture->Width, texture->Height));
```
The renderer function called after ImGui::Render() will receive that same value that the user code passed:
```cpp
// Cast ImTextureID / void* stored in the draw command as our texture type
MyTexture* texture = (MyTexture*)pcmd->GetTexID();
MyEngineBindTexture2D(texture);
```
Once you understand this design you will understand that loading image files and turning them into displayable textures is not within the scope of Dear ImGui.
This is by design and is actually a good thing, because it means your code has full control over your data types and how you display them.
If you want to display an image file (e.g. PNG file) into the screen, please refer to documentation and tutorials for the graphics API you are using.
Refer to [Image Loading and Displaying Examples](https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples) on the [Wiki](https://github.com/ocornut/imgui/wiki) to find simplified examples for loading textures with OpenGL, DirectX9 and DirectX11.
C/C++ tip: a void* is pointer-sized storage. You may safely store any pointer or integer into it by casting your value to ImTextureID / void*, and vice-versa.
Because both end-points (user code and rendering function) are under your control, you know exactly what is stored inside the ImTextureID / void*.
Examples:
```cpp
GLuint my_tex = XXX;
void* my_void_ptr;
my_void_ptr = (void*)(intptr_t)my_tex; // cast a GLuint into a void* (we don't take its address! we literally store the value inside the pointer)
my_tex = (GLuint)(intptr_t)my_void_ptr; // cast a void* into a GLuint
ID3D11ShaderResourceView* my_dx11_srv = XXX;
void* my_void_ptr;
my_void_ptr = (void*)my_dx11_srv; // cast a ID3D11ShaderResourceView* into an opaque void*
my_dx11_srv = (ID3D11ShaderResourceView*)my_void_ptr; // cast a void* into a ID3D11ShaderResourceView*
```
Finally, you may call `ImGui::ShowMetricsWindow()` to explore/visualize/understand how the ImDrawList are generated.
##### [Return to Index](#index)
---
### Q: How can I use my own math types instead of ImVec2/ImVec4?
You can edit [imconfig.h](https://github.com/ocornut/imgui/blob/master/imconfig.h) and setup the `IM_VEC2_CLASS_EXTRA`/`IM_VEC4_CLASS_EXTRA` macros to add implicit type conversions.
This way you'll be able to use your own types everywhere, e.g. passing `MyVector2` or `glm::vec2` to ImGui functions instead of `ImVec2`.
##### [Return to Index](#index)
---
### Q: How can I interact with standard C++ types (such as std::string and std::vector)?
- Being highly portable (backends/bindings for several languages, frameworks, programming style, obscure or older platforms/compilers), and aiming for compatibility & performance suitable for every modern real-time game engines, dear imgui does not use any of std C++ types. We use raw types (e.g. char* instead of std::string) because they adapt to more use cases.
- To use ImGui::InputText() with a std::string or any resizable string class, see [misc/cpp/imgui_stdlib.h](https://github.com/ocornut/imgui/blob/master/misc/cpp/imgui_stdlib.h).
- To use combo boxes and list boxes with `std::vector` or any other data structure: the `BeginCombo()/EndCombo()` API
lets you iterate and submit items yourself, so does the `ListBoxHeader()/ListBoxFooter()` API.
Prefer using them over the old and awkward `Combo()/ListBox()` api.
- Generally for most high-level types you should be able to access the underlying data type.
You may write your own one-liner wrappers to facilitate user code (tip: add new functions in ImGui:: namespace from your code).
- Dear ImGui applications often need to make intensive use of strings. It is expected that many of the strings you will pass
to the API are raw literals (free in C/C++) or allocated in a manner that won't incur a large cost on your application.
Please bear in mind that using `std::string` on applications with large amount of UI may incur unsatisfactory performances.
Modern implementations of `std::string` often include small-string optimization (which is often a local buffer) but those
are not configurable and not the same across implementations.
- If you are finding your UI traversal cost to be too large, make sure your string usage is not leading to excessive amount
of heap allocations. Consider using literals, statically sized buffers and your own helper functions. A common pattern
is that you will need to build lots of strings on the fly, and their maximum length can be easily be scoped ahead.
One possible implementation of a helper to facilitate printf-style building of strings: https://github.com/ocornut/Str
This is a small helper where you can instance strings with configurable local buffers length. Many game engines will
provide similar or better string helpers.
##### [Return to Index](#index)
---
### Q: How can I display custom shapes? (using low-level ImDrawList API)
- You can use the low-level `ImDrawList` api to render shapes within a window.
```cpp
ImGui::Begin("My shapes");
ImDrawList* draw_list = ImGui::GetWindowDrawList();
// Get the current ImGui cursor position
ImVec2 p = ImGui::GetCursorScreenPos();
// Draw a red circle
draw_list->AddCircleFilled(ImVec2(p.x + 50, p.y + 50), 30.0f, IM_COL32(255, 0, 0, 255), 16);
// Draw a 3 pixel thick yellow line
draw_list->AddLine(ImVec2(p.x, p.y), ImVec2(p.x + 100.0f, p.y + 100.0f), IM_COL32(255, 255, 0, 255), 3.0f);
// Advance the ImGui cursor to claim space in the window (otherwise the window will appears small and needs to be resized)
ImGui::Dummy(ImVec2(200, 200));
ImGui::End();
```
![ImDrawList usage](https://raw.githubusercontent.com/wiki/ocornut/imgui/tutorials/CustomRendering01.png)
- Refer to "Demo > Examples > Custom Rendering" in the demo window and read the code of `ShowExampleAppCustomRendering()` in `imgui_demo.cpp` from more examples.
- To generate colors: you can use the macro `IM_COL32(255,255,255,255)` to generate them at compile time, or use `ImGui::GetColorU32(IM_COL32(255,255,255,255))` or `ImGui::GetColorU32(ImVec4(1.0f,1.0f,1.0f,1.0f))` to generate a color that is multiplied by the current value of `style.Alpha`.
- Math operators: if you have setup `IM_VEC2_CLASS_EXTRA` in `imconfig.h` to bind your own math types, you can use your own math types and their natural operators instead of ImVec2. ImVec2 by default doesn't export any math operators in the public API. You may use `#define IMGUI_DEFINE_MATH_OPERATORS` `#include "imgui_internal.h"` to use the internally defined math operators, but instead prefer using your own math library and set it up in `imconfig.h`.
- You can use `ImGui::GetBackgroundDrawList()` or `ImGui::GetForegroundDrawList()` to access draw lists which will be displayed behind and over every other dear imgui windows (one bg/fg drawlist per viewport). This is very convenient if you need to quickly display something on the screen that is not associated to a dear imgui window.
- You can also create your own empty window and draw inside it. Call Begin() with the NoBackground | NoDecoration | NoSavedSettings | NoInputs flags (The `ImGuiWindowFlags_NoDecoration` flag itself is a shortcut for NoTitleBar | NoResize | NoScrollbar | NoCollapse). Then you can retrieve the ImDrawList* via `GetWindowDrawList()` and draw to it in any way you like.
`- You can create your own ImDrawList instance. You'll need to initialize them with `ImGui::GetDrawListSharedData()`, or create your own instancing ImDrawListSharedData`, and then call your renderer function with your own ImDrawList or ImDrawData data.
- Looking for fun? The [ImDrawList coding party 2020](https://github.com/ocornut/imgui/issues/3606) thread is full of "don't do this at home" extreme uses of the ImDrawList API.
##### [Return to Index](#index)
---
# Q&A: Fonts, Text
### Q: How should I handle DPI in my application?
The short answer is: obtain the desired DPI scale, load your fonts resized with that scale (always round down fonts size to nearest integer), and scale your Style structure accordingly using `style.ScaleAllSizes()`.
Your application may want to detect DPI change and reload the fonts and reset style between frames.
Your ui code should avoid using hardcoded constants for size and positioning. Prefer to express values as multiple of reference values such as `ImGui::GetFontSize()` or `ImGui::GetFrameHeight()`. So e.g. instead of seeing a hardcoded height of 500 for a given item/window, you may want to use `30*ImGui::GetFontSize()` instead.
Down the line Dear ImGui will provide a variety of standardized reference values to facilitate using this.
Applications in the `examples/` folder are not DPI aware partly because they are unable to load a custom font from the file-system (may change that in the future).
The reason DPI is not auto-magically solved in stock examples is that we don't yet have a satisfying solution for the "multi-dpi" problem (using the `docking` branch: when multiple viewport windows are over multiple monitors using different DPI scale). The current way to handle this on the application side is:
- Create and maintain one font atlas per active DPI scale (e.g. by iterating `platform_io.Monitors[]` before `NewFrame()`).
- Hook `platform_io.OnChangedViewport()` to detect when a `Begin()` call makes a Dear ImGui window change monitor (and therefore DPI).
- In the hook: swap atlas, swap style with correctly sized one, remap the current font from one atlas to the other (may need to maintain a remapping table of your fonts at variying DPI scale).
This approach is relatively easy and functional but come with two issues:
- It's not possibly to reliably size or position a window ahead of `Begin()` without knowing on which monitor it'll land.
- Style override may be lost during the `Begin()` call crossing monitor boundaries. You may need to do some custom scaling mumbo-jumbo if you want your `OnChangedViewport()` handler to preserve style overrides.
Please note that if you are not using multi-viewports with multi-monitors using different DPI scale, you can ignore all of this and use the simpler technique recommended at the top.
### Q: How can I load a different font than the default?
Use the font atlas to load the TTF/OTF file you want:
```cpp
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
```
Default is ProggyClean.ttf, monospace, rendered at size 13, embedded in dear imgui's source code.
(Tip: monospace fonts are convenient because they allow to facilitate horizontal alignment directly at the string level.)
(Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file for more details about font loading.)
New programmers: remember that in C/C++ and most programming languages if you want to use a
backslash \ within a string literal, you need to write it double backslash "\\":
```cpp
io.Fonts->AddFontFromFileTTF("MyFolder\MyFont.ttf", size); // WRONG (you are escaping the M here!)
io.Fonts->AddFontFromFileTTF("MyFolder\\MyFont.ttf", size; // CORRECT (Windows only)
io.Fonts->AddFontFromFileTTF("MyFolder/MyFont.ttf", size); // ALSO CORRECT
```
##### [Return to Index](#index)
---
### Q: How can I easily use icons in my application?
The most convenient and practical way is to merge an icon font such as FontAwesome inside you
main font. Then you can refer to icons within your strings.
You may want to see `ImFontConfig::GlyphMinAdvanceX` to make your icon look monospace to facilitate alignment.
(Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file for more details about icons font loading.)
With some extra effort, you may use colorful icon by registering custom rectangle space inside the font atlas,
and copying your own graphics data into it. See docs/FONTS.md about using the AddCustomRectFontGlyph API.
##### [Return to Index](#index)
---
### Q: How can I load multiple fonts?
Use the font atlas to pack them into a single texture:
(Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file and the code in ImFontAtlas for more details.)
```cpp
ImGuiIO& io = ImGui::GetIO();
ImFont* font0 = io.Fonts->AddFontDefault();
ImFont* font1 = io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
ImFont* font2 = io.Fonts->AddFontFromFileTTF("myfontfile2.ttf", size_in_pixels);
io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
// the first loaded font gets used by default
// use ImGui::PushFont()/ImGui::PopFont() to change the font at runtime
// Options
ImFontConfig config;
config.OversampleH = 2;
config.OversampleV = 1;
config.GlyphOffset.y -= 1.0f; // Move everything by 1 pixels up
config.GlyphExtraSpacing.x = 1.0f; // Increase spacing between characters
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels, &config);
// Combine multiple fonts into one (e.g. for icon fonts)
static ImWchar ranges[] = { 0xf000, 0xf3ff, 0 };
ImFontConfig config;
config.MergeMode = true;
io.Fonts->AddFontDefault();
io.Fonts->AddFontFromFileTTF("fontawesome-webfont.ttf", 16.0f, &config, ranges); // Merge icon font
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels, NULL, &config, io.Fonts->GetGlyphRangesJapanese()); // Merge japanese glyphs
```
##### [Return to Index](#index)
---
### Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
When loading a font, pass custom Unicode ranges to specify the glyphs to load.
```cpp
// Add default Japanese ranges
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());
// Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need)
ImVector<ImWchar> ranges;
ImFontGlyphRangesBuilder builder;
builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters)
builder.AddChar(0x7262); // Add a specific character
builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted)
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", 16.0f, NULL, ranges.Data);
```
All your strings needs to use UTF-8 encoding. In C++11 you can encode a string literal in UTF-8
by using the u8"hello" syntax. Specifying literal in your source code using a local code page
(such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work!
Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
Text input: it is up to your application to pass the right character code by calling `io.AddInputCharacter()`.
The applications in examples/ are doing that.
Windows: you can use the WM_CHAR or WM_UNICHAR or WM_IME_CHAR message (depending if your app is built using Unicode or MultiByte mode).
You may also use MultiByteToWideChar() or ToUnicode() to retrieve Unicode codepoints from MultiByte characters or keyboard state.
Windows: if your language is relying on an Input Method Editor (IME), you copy the HWND of your window to io.ImeWindowHandle in order for
the default implementation of io.ImeSetInputScreenPosFn() to set your Microsoft IME position correctly.
##### [Return to Index](#index)
---
# Q&A: Concerns
### Q: Who uses Dear ImGui?
You may take a look at:
- [Quotes](https://github.com/ocornut/imgui/wiki/Quotes)
- [Software using Dear ImGui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui)
- [Sponsors](https://github.com/ocornut/imgui/wiki/Sponsors)
- [Gallery](https://github.com/ocornut/imgui/issues/4451)
##### [Return to Index](#index)
---
### Q: Can you create elaborate/serious tools with Dear ImGui?
Yes. People have written game editors, data browsers, debuggers, profilers and all sort of non-trivial tools with the library. In my experience the simplicity of the API is very empowering. Your UI runs close to your live data. Make the tools always-on and everybody in the team will be inclined to create new tools (as opposed to more "offline" UI toolkits where only a fraction of your team effectively creates tools). The list of sponsors below is also an indicator that serious game teams have been using the library.
Dear ImGui is very programmer centric and the immediate-mode GUI paradigm might require you to readjust some habits before you can realize its full potential. Dear ImGui is about making things that are simple, efficient and powerful.
Dear ImGui is built to be efficient and scalable toward the needs for AAA-quality applications running all day. The IMGUI paradigm offers different opportunities for optimization that the more typical RMGUI paradigm.
##### [Return to Index](#index)
---
### Q: Can you reskin the look of Dear ImGui?
Somehow. You can alter the look of the interface to some degree: changing colors, sizes, padding, rounding, fonts. However, as Dear ImGui is designed and optimized to create debug tools, the amount of skinning you can apply is limited. There is only so much you can stray away from the default look and feel of the interface. Dear ImGui is NOT designed to create user interface for games, although with ingenious use of the low-level API you can do it.
A reasonably skinned application may look like (screenshot from [#2529](https://github.com/ocornut/imgui/issues/2529#issuecomment-524281119))
![minipars](https://user-images.githubusercontent.com/314805/63589441-d9794f00-c5b1-11e9-8d96-cfc1b93702f7.png)
##### [Return to Index](#index)
---
### Q: Why using C++ (as opposed to C)?
Dear ImGui takes advantage of a few C++ languages features for convenience but nothing anywhere Boost insanity/quagmire. Dear ImGui does NOT require C++11 so it can be used with most old C++ compilers. Dear ImGui doesn't use any C++ header file. Language-wise, function overloading and default parameters are used to make the API easier to use and code more terse. Doing so I believe the API is sitting on a sweet spot and giving up on those features would make the API more cumbersome. Other features such as namespace, constructors and templates (in the case of the ImVector<> class) are also relied on as a convenience.
There is an auto-generated [c-api for Dear ImGui (cimgui)](https://github.com/cimgui/cimgui) by Sonoro1234 and Stephan Dilly. It is designed for creating bindings to other languages. If possible, I would suggest using your target language functionalities to try replicating the function overloading and default parameters used in C++ else the API may be harder to use. Also see [Bindings](https://github.com/ocornut/imgui/wiki/Bindings) for various third-party bindings.
##### [Return to Index](#index)
---
# Q&A: Community
### Q: How can I help?
- Businesses: please reach out to `contact AT dearimgui.com` if you work in a place using Dear ImGui! We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts. This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people working on this project.
- Individuals: you can support continued maintenance and development via PayPal donations. See [README](https://github.com/ocornut/imgui/blob/master/docs/README.md).
- If you are experienced with Dear ImGui and C++, look at [GitHub Issues](https://github.com/ocornut/imgui/issues), [GitHub Discussions](https://github.com/ocornut/imgui/discussions), the [Wiki](https://github.com/ocornut/imgui/wiki), read [docs/TODO.txt](https://github.com/ocornut/imgui/blob/master/docs/TODO.txt) and see how you want to help and can help!
- Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
You may post screenshot or links in the [gallery threads](https://github.com/ocornut/imgui/issues/4451). Visuals are ideal as they inspire other programmers. Disclosing your use of Dear ImGui helps the library grow credibility, and help other teams and programmers with taking decisions.
- If you have issues or if you need to hack into the library, even if you don't expect any support it is useful that you share your issues or sometimes incomplete PR.
##### [Return to Index](#index)

397
docs/FONTS.md Normal file
View File

@ -0,0 +1,397 @@
_(You may browse this at https://github.com/ocornut/imgui/blob/master/docs/FONTS.md or view this file with any Markdown viewer)_
## Dear ImGui: Using Fonts
The code in imgui.cpp embeds a copy of 'ProggyClean.ttf' (by Tristan Grimmer),
a 13 pixels high, pixel-perfect font used by default. We embed it in the source code so you can use Dear ImGui without any file system access. ProggyClean does not scale smoothly, therefore it is recommended that you load your own file when using Dear ImGui in an application aiming to look nice and wanting to support multiple resolutions.
You may also load external .TTF/.OTF files.
In the [misc/fonts/](https://github.com/ocornut/imgui/tree/master/misc/fonts) folder you can find a few suggested fonts, provided as a convenience.
**Also read the FAQ:** https://www.dearimgui.org/faq (there is a Fonts section!)
## Index
- [Readme First](#readme-first)
- [How should I handle DPI in my application?](#how-should-i-handle-dpi-in-my-application)
- [Fonts Loading Instructions](#font-loading-instructions)
- [Using Icon Fonts](#using-icon-fonts)
- [Using FreeType Rasterizer (imgui_freetype)](#using-freetype-rasterizer-imgui_freetype)
- [Using Colorful Glyphs/Emojis](#using-colorful-glyphsemojis)
- [Using Custom Glyph Ranges](#using-custom-glyph-ranges)
- [Using Custom Colorful Icons](#using-custom-colorful-icons)
- [Using Font Data Embedded In Source Code](#using-font-data-embedded-in-source-code)
- [About filenames](#about-filenames)
- [Credits/Licenses For Fonts Included In Repository](#creditslicenses-for-fonts-included-in-repository)
- [Font Links](#font-links)
---------------------------------------
## Readme First
- All loaded fonts glyphs are rendered into a single texture atlas ahead of time. Calling either of `io.Fonts->GetTexDataAsAlpha8()`, `io.Fonts->GetTexDataAsRGBA32()` or `io.Fonts->Build()` will build the atlas.
- You can use the style editor `ImGui::ShowStyleEditor()` in the "Fonts" section to browse your fonts and understand what's going on if you have an issue. You can also reach it in `Demo->Tools->Style Editor->Fonts`:
![imgui_capture_0008](https://user-images.githubusercontent.com/8225057/84162822-1a731f00-aa71-11ea-9b6b-89c2332aa161.png)
- Make sure your font ranges data are persistent (available during the calls to `GetTexDataAsAlpha8()`/`GetTexDataAsRGBA32()/`Build()`.
- Use C++11 u8"my text" syntax to encode literal strings as UTF-8. e.g.:
```cpp
u8"hello"
u8"こんにちは" // this will be encoded as UTF-8
```
##### [Return to Index](#index)
## How should I handle DPI in my application?
See [FAQ entry](https://github.com/ocornut/imgui/blob/master/docs/FAQ.md#q-how-should-i-handle-dpi-in-my-application).
##### [Return to Index](#index)
## Font Loading Instructions
**Load default font:**
```cpp
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontDefault();
```
**Load .TTF/.OTF file with:**
```cpp
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels);
```
If you get an assert stating "Could not load font file!", your font filename is likely incorrect. Read "[About filenames](#about-filenames)" carefully.
**Load multiple fonts:**
```cpp
// Init
ImGuiIO& io = ImGui::GetIO();
ImFont* font1 = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels);
ImFont* font2 = io.Fonts->AddFontFromFileTTF("anotherfont.otf", size_pixels);
```
```cpp
// In application loop: select font at runtime
ImGui::Text("Hello"); // use the default font (which is the first loaded font)
ImGui::PushFont(font2);
ImGui::Text("Hello with another font");
ImGui::PopFont();
```
**For advanced options create a ImFontConfig structure and pass it to the AddFont() function (it will be copied internally):**
```cpp
ImFontConfig config;
config.OversampleH = 2;
config.OversampleV = 1;
config.GlyphExtraSpacing.x = 1.0f;
ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config);
```
**Combine multiple fonts into one:**
```cpp
// Load a first font
ImFont* font = io.Fonts->AddFontDefault();
// Add character ranges and merge into the previous font
// The ranges array is not copied by the AddFont* functions and is used lazily
// so ensure it is available at the time of building or calling GetTexDataAsRGBA32().
static const ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 }; // Will not be copied by AddFont* so keep in scope.
ImFontConfig config;
config.MergeMode = true;
io.Fonts->AddFontFromFileTTF("DroidSans.ttf", 18.0f, &config, io.Fonts->GetGlyphRangesJapanese()); // Merge into first font
io.Fonts->AddFontFromFileTTF("fontawesome-webfont.ttf", 18.0f, &config, icons_ranges); // Merge into first font
io.Fonts->Build();
```
**Add a fourth parameter to bake specific font ranges only:**
```cpp
// Basic Latin, Extended Latin
io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesDefault());
// Default + Selection of 2500 Ideographs used by Simplified Chinese
io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
// Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());
```
See [Using Custom Glyph Ranges](#using-custom-glyph-ranges) section to create your own ranges.
**Example loading and using a Japanese font:**
```cpp
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("NotoSansCJKjp-Medium.otf", 20.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
```
```cpp
ImGui::Text(u8"こんにちは!テスト %d", 123);
if (ImGui::Button(u8"ロード"))
{
// do stuff
}
ImGui::InputText("string", buf, IM_ARRAYSIZE(buf));
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
```
![sample code output](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v160/code_sample_02_jp.png)
<br>_(settings: Dark style (left), Light style (right) / Font: NotoSansCJKjp-Medium, 20px / Rounding: 5)_
**Font Atlas too large?**
- If you have very large number of glyphs or multiple fonts, the texture may become too big for your graphics API. The typical result of failing to upload a texture is if every glyphs appears as white rectangles.
- Mind the fact that some graphics drivers have texture size limitation. If you are building a PC application, mind the fact that your users may use hardware with lower limitations than yours.
Some solutions:
1. Reduce glyphs ranges by calculating them from source localization data.
You can use the `ImFontGlyphRangesBuilder` for this purpose and rebuilding your atlas between frames when new characters are needed. This will be the biggest win!
2. You may reduce oversampling, e.g. `font_config.OversampleH = 2`, this will largely reduce your texture size.
Note that while OversampleH = 2 looks visibly very close to 3 in most situations, with OversampleH = 1 the quality drop will be noticeable.
3. Set `io.Fonts.TexDesiredWidth` to specify a texture width to minimize texture height (see comment in `ImFontAtlas::Build()` function).
4. Set `io.Fonts.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight;` to disable rounding the texture height to the next power of two.
5. Read about oversampling [here](https://github.com/nothings/stb/blob/master/tests/oversample).
6. To support the extended range of unicode beyond 0xFFFF (e.g. emoticons, dingbats, symbols, shapes, ancient languages, etc...) add `#define IMGUI_USE_WCHAR32`in your `imconfig.h`.
##### [Return to Index](#index)
## Using Icon Fonts
Using an icon font (such as [FontAwesome](http://fontawesome.io) or [OpenFontIcons](https://github.com/traverseda/OpenFontIcons)) is an easy and practical way to use icons in your Dear ImGui application.
A common pattern is to merge the icon font within your main font, so you can embed icons directly from your strings without having to change fonts back and forth.
To refer to the icon UTF-8 codepoints from your C++ code, you may use those headers files created by Juliette Foucaut: https://github.com/juliettef/IconFontCppHeaders.
So you can use `ICON_FA_SEARCH` as a string that will render as a "Search" icon.
Example Setup:
```cpp
// Merge icons into default tool font
#include "IconsFontAwesome.h"
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontDefault();
ImFontConfig config;
config.MergeMode = true;
config.GlyphMinAdvanceX = 13.0f; // Use if you want to make the icon monospaced
static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
io.Fonts->AddFontFromFileTTF("fonts/fontawesome-webfont.ttf", 13.0f, &config, icon_ranges);
```
Example Usage:
```cpp
// Usage, e.g.
ImGui::Text("%s among %d items", ICON_FA_SEARCH, count);
ImGui::Button(ICON_FA_SEARCH " Search");
// C string _literals_ can be concatenated at compilation time, e.g. "hello" " world"
// ICON_FA_SEARCH is defined as a string literal so this is the same as "A" "B" becoming "AB"
```
See Links below for other icons fonts and related tools.
Here's an application using icons ("Avoyd", https://www.avoyd.com):
![avoyd](https://user-images.githubusercontent.com/8225057/81696852-c15d9e80-9464-11ea-9cab-2a4d4fc84396.jpg)
##### [Return to Index](#index)
## Using FreeType Rasterizer (imgui_freetype)
- Dear ImGui uses imstb\_truetype.h to rasterize fonts (with optional oversampling). This technique and its implementation are not ideal for fonts rendered at small sizes, which may appear a little blurry or hard to read.
- There is an implementation of the ImFontAtlas builder using FreeType that you can use in the [misc/freetype/](https://github.com/ocornut/imgui/tree/master/misc/freetype) folder.
- FreeType supports auto-hinting which tends to improve the readability of small fonts.
- Read documentation in the [misc/freetype/](https://github.com/ocornut/imgui/tree/master/misc/freetype) folder.
- Correct sRGB space blending will have an important effect on your font rendering quality.
##### [Return to Index](#index)
## Using Colorful Glyphs/Emojis
- Rendering of colored emojis is only supported by imgui_freetype with FreeType 2.10+.
- You will need to load fonts with the `ImGuiFreeTypeBuilderFlags_LoadColor` flag.
- Emojis are frequently encoded in upper Unicode layers (character codes >0x10000) and will need dear imgui compiled with `IMGUI_USE_WCHAR32`.
- Not all types of color fonts are supported by FreeType at the moment.
- Stateful Unicode features such as skin tone modifiers are not supported by the text renderer.
![colored glyphs](https://user-images.githubusercontent.com/8225057/106171241-9dc4ba80-6191-11eb-8a69-ca1467b206d1.png)
```cpp
io.Fonts->AddFontFromFileTTF("../../../imgui_dev/data/fonts/NotoSans-Regular.ttf", 16.0f);
static ImWchar ranges[] = { 0x1, 0x1FFFF, 0 };
static ImFontConfig cfg;
cfg.OversampleH = cfg.OversampleV = 1;
cfg.MergeMode = true;
cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_LoadColor;
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\seguiemj.ttf", 16.0f, &cfg, ranges);
```
##### [Return to Index](#index)
## Using Custom Glyph Ranges
You can use the `ImFontGlyphRangesBuilder` helper to create glyph ranges based on text input. For example: for a game where your script is known, if you can feed your entire script to it and only build the characters the game needs.
```cpp
ImVector<ImWchar> ranges;
ImFontGlyphRangesBuilder builder;
builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters)
builder.AddChar(0x7262); // Add a specific character
builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted)
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data);
io.Fonts->Build(); // Build the atlas while 'ranges' is still in scope and not deleted.
```
##### [Return to Index](#index)
## Using Custom Colorful Icons
As an alternative to rendering colorful glyphs using imgui_freetype with `ImGuiFreeTypeBuilderFlags_LoadColor`, you may allocate your own space in the texture atlas and write yourself into it. **(This is a BETA api, use if you are familiar with dear imgui and with your rendering backend)**
- You can use the `ImFontAtlas::AddCustomRect()` and `ImFontAtlas::AddCustomRectFontGlyph()` api to register rectangles that will be packed into the font atlas texture. Register them before building the atlas, then call Build()`.
- You can then use `ImFontAtlas::GetCustomRectByIndex(int)` to query the position/size of your rectangle within the texture, and blit/copy any graphics data of your choice into those rectangles.
- This API is beta because it is likely to change in order to support multi-dpi (multiple viewports on multiple monitors with varying DPI scale).
#### Pseudo-code:
```cpp
// Add font, then register two custom 13x13 rectangles mapped to glyph 'a' and 'b' of this font
ImFont* font = io.Fonts->AddFontDefault();
int rect_ids[2];
rect_ids[0] = io.Fonts->AddCustomRectFontGlyph(font, 'a', 13, 13, 13+1);
rect_ids[1] = io.Fonts->AddCustomRectFontGlyph(font, 'b', 13, 13, 13+1);
// Build atlas
io.Fonts->Build();
// Retrieve texture in RGBA format
unsigned char* tex_pixels = NULL;
int tex_width, tex_height;
io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_width, &tex_height);
for (int rect_n = 0; rect_n < IM_ARRAYSIZE(rect_ids); rect_n++)
{
int rect_id = rects_ids[rect_n];
if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id))
{
// Fill the custom rectangle with red pixels (in reality you would draw/copy your bitmap data here!)
for (int y = 0; y < rect->Height; y++)
{
ImU32* p = (ImU32*)tex_pixels + (rect->Y + y) * tex_width + (rect->X);
for (int x = rect->Width; x > 0; x--)
*p++ = IM_COL32(255, 0, 0, 255);
}
}
}
```
##### [Return to Index](#index)
## Using Font Data Embedded In Source Code
- Compile and use [binary_to_compressed_c.cpp](https://github.com/ocornut/imgui/blob/master/misc/fonts/binary_to_compressed_c.cpp) to create a compressed C style array that you can embed in source code.
- See the documentation in [binary_to_compressed_c.cpp](https://github.com/ocornut/imgui/blob/master/misc/fonts/binary_to_compressed_c.cpp) for instruction on how to use the tool.
- You may find a precompiled version binary_to_compressed_c.exe for Windows instead of demo binaries package (see [README](https://github.com/ocornut/imgui/blob/master/docs/README.md)).
- The tool can optionally output Base85 encoding to reduce the size of _source code_ but the read-only arrays in the actual binary will be about 20% bigger.
Then load the font with:
```cpp
ImFont* font = io.Fonts->AddFontFromMemoryCompressedTTF(compressed_data, compressed_data_size, size_pixels, ...);
```
or
```cpp
ImFont* font = io.Fonts->AddFontFromMemoryCompressedBase85TTF(compressed_data_base85, size_pixels, ...);
```
##### [Return to Index](#index)
## About filenames
**Please note that many new C/C++ users have issues their files _because the filename they provide is wrong_.**
Two things to watch for:
- Make sure your IDE/debugger settings starts your executable from the right working directory. In Visual Studio you can change your working directory in project `Properties > General > Debugging > Working Directory`. People assume that their execution will start from the root folder of the project, where by default it oftens start from the folder where object or executable files are stored.
```cpp
// Relative filename depends on your Working Directory when running your program!
io.Fonts->AddFontFromFileTTF("MyImage01.jpg", ...);
// Load from the parent folder of your Working Directory
io.Fonts->AddFontFromFileTTF("../MyImage01.jpg", ...);
```
- In C/C++ and most programming languages if you want to use a backslash `\` within a string literal, you need to write it double backslash `\\`. At it happens, Windows uses backslashes as a path separator, so be mindful.
```cpp
io.Fonts->AddFontFromFileTTF("MyFiles\MyImage01.jpg", ...); // This is INCORRECT!!
io.Fonts->AddFontFromFileTTF("MyFiles\\MyImage01.jpg", ...); // This is CORRECT
```
In some situations, you may also use `/` path separator under Windows.
##### [Return to Index](#index)
## Credits/Licenses For Fonts Included In Repository
Some fonts files are available in the `misc/fonts/` folder:
**Roboto-Medium.ttf**, by Christian Robetson
<br>Apache License 2.0
<br>https://fonts.google.com/specimen/Roboto
**Cousine-Regular.ttf**, by Steve Matteson
<br>Digitized data copyright (c) 2010 Google Corporation.
<br>Licensed under the SIL Open Font License, Version 1.1
<br>https://fonts.google.com/specimen/Cousine
**DroidSans.ttf**, by Steve Matteson
<br>Apache License 2.0
<br>https://www.fontsquirrel.com/fonts/droid-sans
**ProggyClean.ttf**, by Tristan Grimmer
<br>MIT License
<br>(recommended loading setting: Size = 13.0, GlyphOffset.y = +1)
<br>http://www.proggyfonts.net/
**ProggyTiny.ttf**, by Tristan Grimmer
<br>MIT License
<br>(recommended loading setting: Size = 10.0, GlyphOffset.y = +1)
<br>http://www.proggyfonts.net/
**Karla-Regular.ttf**, by Jonathan Pinhorn
<br>SIL OPEN FONT LICENSE Version 1.1
##### [Return to Index](#index)
## Font Links
#### ICON FONTS
- C/C++ header for icon fonts (#define with code points to use in source code string literals) https://github.com/juliettef/IconFontCppHeaders
- FontAwesome https://fortawesome.github.io/Font-Awesome
- OpenFontIcons https://github.com/traverseda/OpenFontIcons
- Google Icon Fonts https://design.google.com/icons/
- Kenney Icon Font (Game Controller Icons) https://github.com/nicodinh/kenney-icon-font
- IcoMoon - Custom Icon font builder https://icomoon.io/app
#### REGULAR FONTS
- Google Noto Fonts (worldwide languages) https://www.google.com/get/noto/
- Open Sans Fonts https://fonts.google.com/specimen/Open+Sans
- (Japanese) M+ fonts by Coji Morishita http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html
#### MONOSPACE FONTS
Pixel Perfect:
- Proggy Fonts, by Tristan Grimmer http://www.proggyfonts.net or http://upperbounds.net
- Sweet16, Sweet16 Mono, by Martin Sedlak (Latin + Supplemental + Extended A) https://github.com/kmar/Sweet16Font (also include an .inl file to use directly in dear imgui.)
Regular:
- Google Noto Mono Fonts https://www.google.com/get/noto/
- Typefaces for source code beautification https://github.com/chrissimpkins/codeface
- Programmation fonts http://s9w.github.io/font_compare/
- Inconsolata http://www.levien.com/type/myfonts/inconsolata.html
- Adobe Source Code Pro: Monospaced font family for ui & coding environments https://github.com/adobe-fonts/source-code-pro
- Monospace/Fixed Width Programmer's Fonts http://www.lowing.org/fonts/
Or use Arial Unicode or other Unicode fonts provided with Windows for full characters coverage (not sure of their licensing).
##### [Return to Index](#index)

241
docs/README.md Normal file
View File

@ -0,0 +1,241 @@
Dear ImGui
=====
[![Build Status](https://github.com/ocornut/imgui/workflows/build/badge.svg)](https://github.com/ocornut/imgui/actions?workflow=build) [![Static Analysis Status](https://github.com/ocornut/imgui/workflows/static-analysis/badge.svg)](https://github.com/ocornut/imgui/actions?workflow=static-analysis)
<sub>(This library is available under a free and permissive license, but needs financial support to sustain its continued improvements. In addition to maintenance and stability there are many desirable features yet to be added. If your company is using Dear ImGui, please consider reaching out.)</sub>
Businesses: support continued development and maintenance via invoiced technical support, maintenance, sponsoring contracts:
<br>&nbsp;&nbsp;_E-mail: contact @ dearimgui dot com_
Individuals: support continued development and maintenance [here](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=WGHNC6MBFLZ2S).
Also see [Sponsors](https://github.com/ocornut/imgui/wiki/Sponsors) page.
----
Dear ImGui is a **bloat-free graphical user interface library for C++**. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies).
Dear ImGui is designed to **enable fast iterations** and to **empower programmers** to create **content creation tools and visualization / debug tools** (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and lacks certain features normally found in more high-level libraries.
Dear ImGui is particularly suited to integration in games engine (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on consoles platforms where operating system features are non-standard.
| [Usage](#usage) - [How it works](#how-it-works) - [Releases & Changelogs](#releases--changelogs) - [Demo](#demo) - [Integration](#integration) |
:----------------------------------------------------------: |
| [Upcoming changes](#upcoming-changes) - [Gallery](#gallery) - [Support, FAQ](#support-frequently-asked-questions-faq) - [How to help](#how-to-help) - [Sponsors](#sponsors) - [Credits](#credits) - [License](#license) |
| [Wiki](https://github.com/ocornut/imgui/wiki) - [Languages & frameworks backends/bindings](https://github.com/ocornut/imgui/wiki/Bindings) - [Software using Dear ImGui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) - [User quotes](https://github.com/ocornut/imgui/wiki/Quotes) |
### Usage
**The core of Dear ImGui is self-contained within a few platform-agnostic files** which you can easily compile in your application/engine. They are all the files in the root folder of the repository (imgui*.cpp, imgui*.h).
**No specific build process is required**. You can add the .cpp files to your existing project.
You will need a backend to integrate Dear ImGui in your app. The backend passes mouse/keyboard/gamepad inputs and variety of settings to Dear ImGui, and is in charge of rendering the resulting vertices.
**Backends for a variety of graphics api and rendering platforms** are provided in the [backends/](https://github.com/ocornut/imgui/tree/master/backends) folder, along with example applications in the [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder. See the [Integration](#integration) section of this document for details. You may also create your own backend. Anywhere where you can render textured triangles, you can render Dear ImGui.
After Dear ImGui is setup in your application, you can use it from \_anywhere\_ in your program loop:
Code:
```cpp
ImGui::Text("Hello, world %d", 123);
if (ImGui::Button("Save"))
MySaveFunction();
ImGui::InputText("string", buf, IM_ARRAYSIZE(buf));
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
```
Result:
<br>![sample code output (dark)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v175/capture_readme_styles_0001.png) ![sample code output (light)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v175/capture_readme_styles_0002.png)
<br>_(settings: Dark style (left), Light style (right) / Font: Roboto-Medium, 16px)_
Code:
```cpp
// Create a window called "My First Tool", with a menu bar.
ImGui::Begin("My First Tool", &my_tool_active, ImGuiWindowFlags_MenuBar);
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("File"))
{
if (ImGui::MenuItem("Open..", "Ctrl+O")) { /* Do stuff */ }
if (ImGui::MenuItem("Save", "Ctrl+S")) { /* Do stuff */ }
if (ImGui::MenuItem("Close", "Ctrl+W")) { my_tool_active = false; }
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}
// Edit a color (stored as ~4 floats)
ImGui::ColorEdit4("Color", my_color);
// Plot some values
const float my_values[] = { 0.2f, 0.1f, 1.0f, 0.5f, 0.9f, 2.2f };
ImGui::PlotLines("Frame Times", my_values, IM_ARRAYSIZE(my_values));
// Display contents in a scrolling region
ImGui::TextColored(ImVec4(1,1,0,1), "Important Stuff");
ImGui::BeginChild("Scrolling");
for (int n = 0; n < 50; n++)
ImGui::Text("%04d: Some text", n);
ImGui::EndChild();
ImGui::End();
```
Result:
<br>![sample code output](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v180/code_sample_04_color.gif)
Dear ImGui allows you to **create elaborate tools** as well as very short-lived ones. On the extreme side of short-livedness: using the Edit&Continue (hot code reload) feature of modern compilers you can add a few widgets to tweaks variables while your application is running, and remove the code a minute later! Dear ImGui is not just for tweaking values. You can use it to trace a running algorithm by just emitting text commands. You can use it along with your own reflection data to browse your dataset live. You can use it to expose the internals of a subsystem in your engine, to create a logger, an inspection tool, a profiler, a debugger, an entire game making editor/framework, etc.
### How it works
Check out the Wiki's [About the IMGUI paradigm](https://github.com/ocornut/imgui/wiki#about-the-imgui-paradigm) section if you want to understand the core principles behind the IMGUI paradigm. An IMGUI tries to minimize superfluous state duplication, state synchronization and state retention from the user's point of view. It is less error prone (less code and less bugs) than traditional retained-mode interfaces, and lends itself to create dynamic user interfaces.
Dear ImGui outputs vertex buffers and command lists that you can easily render in your application. The number of draw calls and state changes required to render them is fairly small. Because Dear ImGui doesn't know or touch graphics state directly, you can call its functions anywhere in your code (e.g. in the middle of a running algorithm, or in the middle of your own rendering process). Refer to the sample applications in the examples/ folder for instructions on how to integrate Dear ImGui with your existing codebase.
_A common misunderstanding is to mistake immediate mode gui for immediate mode rendering, which usually implies hammering your driver/GPU with a bunch of inefficient draw calls and state changes as the gui functions are called. This is NOT what Dear ImGui does. Dear ImGui outputs vertex buffers and a small list of draw calls batches. It never touches your GPU directly. The draw call batches are decently optimal and you can render them later, in your app or even remotely._
### Releases & Changelogs
See [Releases](https://github.com/ocornut/imgui/releases) page.
Reading the changelogs 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!
### Demo
Calling the `ImGui::ShowDemoWindow()` function will create a demo window showcasing variety of features and examples. The code is always available for reference in `imgui_demo.cpp`.
![screenshot demo](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v167/v167-misc.png)
You should be able to build the examples from sources (tested on Windows/Mac/Linux). If you don't, let us know! If you want to have a quick look at some Dear ImGui features, you can download Windows binaries of the demo app here:
- [imgui-demo-binaries-20210331.zip](https://www.dearimgui.org/binaries/imgui-demo-binaries-20210331.zip) (Windows, 1.83 WIP, built 2021/03/31, master branch) or [older demo binaries](https://www.dearimgui.org/binaries).
The demo applications are not DPI aware so expect some blurriness on a 4K screen. For DPI awareness in your application, you can load/reload your font at different scale, and scale your style with `style.ScaleAllSizes()` (see [FAQ](https://www.dearimgui.org/faq)).
### Integration
On most platforms and when using C++, **you should be able to use a combination of the [imgui_impl_xxxx](https://github.com/ocornut/imgui/tree/master/backends) backends without modification** (e.g. `imgui_impl_win32.cpp` + `imgui_impl_dx11.cpp`). If your engine supports multiple platforms, consider using more of the imgui_impl_xxxx files instead of rewriting them: this will be less work for you and you can get Dear ImGui running immediately. You can _later_ decide to rewrite a custom backend using your custom engine functions if you wish so.
Integrating Dear ImGui within your custom engine is a matter of 1) wiring mouse/keyboard/gamepad inputs 2) uploading one texture to your GPU/render engine 3) providing a render function that can bind textures and render textured triangles. The [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder is populated with applications doing just that. If you are an experienced programmer at ease with those concepts, it should take you less than two hours to integrate Dear ImGui in your custom engine. **Make sure to spend time reading the [FAQ](https://www.dearimgui.org/faq), comments, and some of the examples/ application!**
Officially maintained backends/bindings (in repository):
- Renderers: DirectX9, DirectX10, DirectX11, DirectX12, Metal, OpenGL/ES/ES2, Vulkan, WebGPU.
- Platforms: GLFW, SDL2, Win32, Glut, OSX, Android.
- Frameworks: Emscripten, Allegro5, Marmalade.
[Third-party backends/bindings](https://github.com/ocornut/imgui/wiki/Bindings) wiki page:
- Languages: C, C# and: Beef, ChaiScript, Crystal, D, Go, Haskell, Haxe/hxcpp, Java, JavaScript, Julia, Kotlin, Lobster, Lua, Odin, Pascal, PureBasic, Python, Ruby, Rust, Swift...
- Frameworks: AGS/Adventure Game Studio, Amethyst, Blender, bsf, Cinder, Cocos2d-x, Diligent Engine, Flexium, GML/Game Maker Studio2, GLEQ, Godot, GTK3+OpenGL3, Irrlicht Engine, LÖVE+LUA, Magnum, Monogame, NanoRT, nCine, Nim Game Lib, Nintendo 3DS & Switch (homebrew), Ogre, openFrameworks, OSG/OpenSceneGraph, Orx, Photoshop, px_render, Qt/QtDirect3D, SDL_Renderer, SFML, Sokol, Unity, Unreal Engine 4, vtk, VulkanHpp, VulkanSceneGraph, Win32 GDI, WxWidgets.
- Note that C bindings ([cimgui](https://github.com/cimgui/cimgui)) are auto-generated, you can use its json/lua output to generate bindings for other languages.
[Useful Extensions/Widgets](https://github.com/ocornut/imgui/wiki/Useful-Extensions) wiki page:
- Text editors, node editors, timeline editors, plotting, software renderers, remote network access, memory editors, gizmos etc.
Also see [Wiki](https://github.com/ocornut/imgui/wiki) for more links and ideas.
### Upcoming Changes
Some of the goals for 2021 are:
- Work on Docking (see [#2109](https://github.com/ocornut/imgui/issues/2109), in public [docking](https://github.com/ocornut/imgui/tree/docking) branch)
- Work on Multi-Viewport / Multiple OS windows. (see [#1542](https://github.com/ocornut/imgui/issues/1542), in public [docking](https://github.com/ocornut/imgui/tree/docking) branch looking for feedback)
- Work on gamepad/keyboard controls. (see [#787](https://github.com/ocornut/imgui/issues/787))
- Work on automation and testing system, both to test the library and end-user apps. (see [#435](https://github.com/ocornut/imgui/issues/435))
- Make the examples look better, improve styles, improve font support, make the examples hi-DPI and multi-DPI aware.
### Gallery
For more user-submitted screenshots of projects using Dear ImGui, check out the [Gallery Threads](https://github.com/ocornut/imgui/issues/4451)!
For a list of third-party widgets and extensions, check out the [Useful Extensions/Widgets](https://github.com/ocornut/imgui/wiki/Useful-Extensions) wiki page.
Custom engine
[![screenshot game](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v149/gallery_TheDragonsTrap-01-thumb.jpg)](https://cloud.githubusercontent.com/assets/8225057/20628927/33e14cac-b329-11e6-80f6-9524e93b048a.png)
Custom engine
[![screenshot tool](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v160/editor_white_preview.jpg)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v160/editor_white.png)
[Tracy Profiler](https://github.com/wolfpld/tracy)
![tracy profiler](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v176/tracy_profiler.png)
### Support, Frequently Asked Questions (FAQ)
See: [Frequently Asked Questions (FAQ)](https://github.com/ocornut/imgui/blob/master/docs/FAQ.md) where common questions are answered.
See: [Wiki](https://github.com/ocornut/imgui/wiki) for many links, references, articles.
See: [Articles about the IMGUI paradigm](https://github.com/ocornut/imgui/wiki#about-the-imgui-paradigm) to read/learn about the Immediate Mode GUI paradigm.
For questions, bug reports, requests, feedback, you may post on [GitHub Issues](https://github.com/ocornut/imgui/issues) or [GitHub Discussions](https://github.com/ocornut/imgui/discussions). Please read and fill the New Issue template carefully.
Private support is available for paying business customers (E-mail: _contact @ dearimgui dot com_).
**Which version should I get?**
We occasionally tag [Releases](https://github.com/ocornut/imgui/releases) but it is generally safe and recommended to sync to master/latest. The library is fairly stable and regressions tend to be fixed fast when reported.
Advanced users may want to use the `docking` branch with [Multi-Viewport](https://github.com/ocornut/imgui/issues/1542) and [Docking](https://github.com/ocornut/imgui/issues/2109) features. This branch is kept in sync with master regularly.
**Who uses Dear ImGui?**
See the [Quotes](https://github.com/ocornut/imgui/wiki/Quotes), [Sponsors](https://github.com/ocornut/imgui/wiki/Sponsors), [Software using dear imgui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) Wiki pages for an idea of who is using Dear ImGui. Please add your game/software if you can! Also see the [Gallery Threads](https://github.com/ocornut/imgui/issues/4451)!
How to help
-----------
**How can I help?**
- See [GitHub Forum/issues](https://github.com/ocornut/imgui/issues) and [Github Discussions](https://github.com/ocornut/imgui/discussions).
- You may help with development and submit pull requests! Please understand that by submitting a PR you are also submitting a request for the maintainer to review your code and then take over its maintenance forever. PR should be crafted both in the interest in the end-users and also to ease the maintainer into understanding and accepting it.
- See [Help wanted](https://github.com/ocornut/imgui/wiki/Help-Wanted) on the [Wiki](https://github.com/ocornut/imgui/wiki/) for some more ideas.
- Have your company financially support this project (please reach by e-mail)
**How can I help financing further development of Dear ImGui?**
See [Sponsors](https://github.com/ocornut/imgui/wiki/Sponsors) page.
Sponsors
--------
Ongoing Dear ImGui development is currently financially supported by users and private sponsors:
*Platinum-chocolate sponsors*
- [Blizzard](https://careers.blizzard.com/en-us/openings/engineering/all/all/all/1)
*Double-chocolate sponsors*
- [Google](https://github.com/google/filament), [Nvidia](https://developer.nvidia.com/nvidia-omniverse), [Ubisoft](https://montreal.ubisoft.com/en/ubisoft-sponsors-user-interface-library-for-c-dear-imgui)
*Chocolate sponsors*
- [Activision](https://careers.activision.com/c/programmingsoftware-engineering-jobs), [Adobe](https://www.adobe.com/products/medium.html), [Aras Pranckevičius](https://aras-p.info), [Arkane Studios](https://www.arkane-studios.com), [Epic](https://www.unrealengine.com/en-US/megagrants), [RAD Game Tools](http://www.radgametools.com/)
*Salty-caramel sponsors*
- [Framefield](http://framefield.com), [Grinding Gear Games](https://www.grindinggear.com), [Kylotonn](https://www.kylotonn.com), [Next Level Games](https://www.nextlevelgames.com), [O-Net Communications (USA)](http://en.o-netcom.com), [Supercell](https://supercell.com).
Please see [detailed list of Dear ImGui supporters](https://github.com/ocornut/imgui/wiki/Sponsors) for past sponsors.
From November 2014 to December 2019, ongoing development has also been financially supported by its users on Patreon and through individual donations.
**THANK YOU to all past and present supporters for helping to keep this project alive and thriving!**
Dear ImGui is using software and services provided free of charge for open source projects:
- [PVS-Studio](https://www.viva64.com/en/b/0570/) for static analysis.
- [GitHub actions](https://github.com/features/actions) for continuous integration systems.
- [OpenCppCoverage](https://github.com/OpenCppCoverage/OpenCppCoverage) for code coverage analysis.
Credits
-------
Developed by [Omar Cornut](https://www.miracleworld.net) and every direct or indirect [contributors](https://github.com/ocornut/imgui/graphs/contributors) to the GitHub. The early version of this library was developed with the support of [Media Molecule](https://www.mediamolecule.com) and first used internally on the game [Tearaway](https://tearaway.mediamolecule.com) (PS Vita).
Recurring contributors (2020): Omar Cornut [@ocornut](https://github.com/ocornut), Rokas Kupstys [@rokups](https://github.com/rokups), Ben Carter [@ShironekoBen](https://github.com/ShironekoBen).
A large portion of work on automation systems, regression tests and other features are currently unpublished.
Sponsoring, support contracts and other B2B transactions are hosted and handled by [Lizardcube](https://www.lizardcube.com).
Omar: "I first discovered the IMGUI paradigm at [Q-Games](https://www.q-games.com) where Atman Binstock had dropped his own simple implementation in the codebase, which I spent quite some time improving and thinking about. It turned out that Atman was exposed to the concept directly by working with Casey. When I moved to Media Molecule I rewrote a new library trying to overcome the flaws and limitations of the first one I've worked with. It became this library and since then I have spent an unreasonable amount of time iterating and improving it."
Embeds [ProggyClean.ttf](http://upperbounds.net) font by Tristan Grimmer (MIT license).
Embeds [stb_textedit.h, stb_truetype.h, stb_rect_pack.h](https://github.com/nothings/stb/) by Sean Barrett (public domain).
Inspiration, feedback, and testing for early versions: Casey Muratori, Atman Binstock, Mikko Mononen, Emmanuel Briney, Stefan Kamoda, Anton Mikhailov, Matt Willis. Also thank you to everyone posting feedback, questions and patches on GitHub.
License
-------
Dear ImGui is licensed under the MIT License, see [LICENSE.txt](https://github.com/ocornut/imgui/blob/master/LICENSE.txt) for more information.

406
docs/TODO.txt Normal file
View File

@ -0,0 +1,406 @@
dear imgui
ISSUES & TODO LIST
Issue numbers (#) refer to github issues listed at https://github.com/ocornut/imgui/issues/XXXX
The list below consist mostly of ideas noted down before they are requested/discussed by users (at which point they usually exist on the github issue tracker).
It's mostly a bunch of personal notes, probably incomplete. Feel free to query if you have any questions.
- doc/test: add a proper documentation+regression testing system (#435)
- doc/test: checklist app to verify backends/integration of imgui (test inputs, rendering, callback, etc.).
- doc/tips: tips of the day: website? applet in imgui_club?
- doc/wiki: work on the wiki https://github.com/ocornut/imgui/wiki
- window: preserve/restore relative focus ordering (persistent or not) (#2304) -> also see docking reference to same #.
- window: calling SetNextWindowSize() every frame with <= 0 doesn't do anything, may be useful to allow (particularly when used for a single axis). (#690)
- window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list. perhaps a lightweight explicit cleanup pass.
- window: auto-fit feedback loop when user relies on any dynamic layout (window width multiplier, column) appears weird to end-user. clarify.
- window: begin with *p_open == false could return false.
- window: get size/pos helpers given names (see discussion in #249)
- window: a collapsed window can be stuck behind the main menu bar?
- window: when window is very small, prioritize resize button over close button.
- window: detect extra End() call that pop the "Debug" window out and assert at End() call site instead of at end of frame.
- window: increase minimum size of a window with menus or fix the menu rendering so that it doesn't look odd.
- window: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon?
- window: expose contents size. (#1045)
- window: using SetWindowPos() inside Begin() and moving the window with the mouse reacts a very ugly glitch. We should just defer the SetWindowPos() call.
- window: GetWindowSize() returns (0,0) when not calculated? (#1045)
- window: investigate better auto-positioning for new windows.
- window: top most window flag? (#2574)
- window/size: manually triggered auto-fit (double-click on grip) shouldn't resize window down to viewport size?
- window/size: how to allow to e.g. auto-size vertically to fit contents, but be horizontally resizable? Assuming SetNextWindowSize() is modified to treat -1.0f on each axis as "keep as-is" (would be good but might break erroneous code): Problem is UpdateWindowManualResize() and lots of code treat (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) together.
- window/opt: freeze window flag: if not focused/hovered, return false, render with previous ImDrawList. and/or reduce refresh rate. -> this may require enforcing that it is illegal to submit contents if Begin returns false.
- window/child: background options for child windows, border option (disable rounding).
- window/child: allow resizing of child windows (possibly given min/max for each axis?.)
- window/child: the first draw command of a child window could be moved into the current draw command of the parent window (unless child+tooltip?).
- window/child: border could be emitted in parent as well.
- window/child: allow SetNextWindowContentSize() to work on child windows.
- window/clipping: some form of clipping when DisplaySize (or corresponding viewport) is zero.
- window/tabbing: add a way to signify that a window or docked window requires attention (e.g. blinking title bar).
- window/id_stack: add e.g. window->GetIDFromPath() with support for leading / and ../ (#1390, #331)
! scrolling: exposing horizontal scrolling with Shift+Wheel even when scrollbar is disabled expose lots of issues (#2424, #1463)
- scrolling: while holding down a scrollbar, try to keep the same contents visible (at least while not moving mouse)
- scrolling: allow immediately effective change of scroll after Begin() if we haven't appended items yet.
- scrolling: forward mouse wheel scrolling to parent window when at the edge of scrolling limits? (useful for listbox,tables?)
- scrolling/clipping: separator on the initial position of a window is not visible (cursorpos.y <= clippos.y). (2017-08-20: can't repro)
- scrolling/style: shadows on scrollable areas to denote that there is more contents (see e.g. DaVinci Resolve ui)
- drawdata: make it easy to clone (or swap?) a full ImDrawData so user can easily save that data if they use threaded rendering. (e.g. #2646)
! drawlist: add calctextsize func to facilitate consistent code from user pov (currently need to use ImGui or ImFont alternatives!)
- drawlist: end-user probably can't call Clear() directly because we expect a texture to be pushed in the stack.
- drawlist: maintaining bounding box per command would allow to merge draw command when clipping isn't relied on (typical non-scrolling window or non-overflowing column would merge with previous command).
- drawlist: primitives/helpers to manipulate vertices post submission, so e.g. a quad/rect can be resized to fit later submitted content, _without_ using the ChannelSplit api
- drawlist: make it easier to toggle AA per primitive, so we can use e.g. non-AA fill + AA borders more naturally
- drawlist: non-AA strokes have gaps between points (#593, #288), glitch especially on RenderCheckmark() and ColorPicker4().
- drawlist: would be good to be able to deep copy of ImDrawData (we have a deep copy of ImDrawList now).
- drawlist: rendering: provide a way for imgui to output to a single/global vertex buffer, re-order indices only at the end of the frame (ref: https://gist.github.com/floooh/10388a0afbe08fce9e617d8aefa7d302)
- drawlist: callback: add an extra void* in ImDrawCallback to allow passing render-local data to the callback (would break API).
- drawlist: AddRect vs AddLine position confusing (#2441)
- drawlist: channel splitter should be external helper and not stored in ImDrawList.
- drawlist: Add quadratic bezier curves? (#3127)
- drawlist/opt: store rounded corners in texture to use 1 quad per corner (filled and wireframe) to lower the cost of rounding. (#1962)
- drawlist/opt: AddRect() axis aligned pixel aligned (no-aa) could use 8 triangles instead of 16 and no normal calculation.
- drawlist/opt: thick AA line could be doable in same number of triangles as 1.0 AA line by storing gradient+full color in atlas.
- main: find a way to preserve relative orders of multiple reappearing windows (so an app toggling between "modes" e.g. fullscreen vs all tools) won't lose relative ordering.
- main: IsItemHovered() make it more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes
- main: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode?
- widgets: display mode: widget-label, label-widget (aligned on column or using fixed size), label-newline-tab-widget etc. (#395)
- widgets: clean up widgets internal toward exposing everything and stabilizing imgui_internals.h.
- widgets: add visuals for Disabled/ReadOnly mode and expose publicly (#211)
- widgets: add always-allow-overlap mode. This should perhaps be the default? one problem is that highlight after mouse-wheel scrolling gets deferred, makes scrolling more flickery.
- widgets: start exposing PushItemFlag() and ImGuiItemFlags
- widgets: alignment options in style (e.g. center Selectable, Right-Align within Button, etc.) #1260
- widgets: activate by identifier (trigger button, focus given id)
- widgets: a way to represent "mixed" values, so e.g. all values replaced with *, including check-boxes, colors, etc. with support for multi-components widgets (e.g. SliderFloat3, make only "Y" mixed) (#2644)
- widgets: checkbox: checkbox with custom glyph inside frame.
- widgets: coloredit: keep reporting as active when picker is on?
- widgets: group/scalarn functions: expose more per-component information. e.g. store NextItemData.ComponentIdx set by scalarn function, groups can expose them back somehow.
- selectable: using (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported.
- selectable: generic BeginSelectable()/EndSelectable() mechanism.
- selectable: a way to visualize partial/mixed selection (e.g. parent tree node has children with mixed selection)
- input text: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now and super fragile.
- input text: preserve scrolling when unfocused?
- input text: reorganize event handling, allow CharFilter to modify buffers, allow multiple events? (#541)
- input text: expose CursorPos in char filter event (#816)
- input text: try usage idiom of using InputText with data only exposed through get/set accessors, without extraneous copy/alloc. (#3009)
- input text: access public fields via a non-callback API e.g. InputTextGetState("xxx") that may return NULL if not active.
- input text: flag to disable live update of the user buffer (also applies to float/int text input) (#701)
- input text: hover tooltip could show unclamped text
- input text: support for INSERT key to toggle overwrite mode. currently disabled because stb_textedit behavior is unsatisfactory on multi-line. (#2863)
- input text: option to Tab after an Enter validation.
- input text: add ImGuiInputTextFlags_EnterToApply? (off #218)
- input text: easier ways to update buffer (from source char*) while owned. preserve some sort of cursor position for multi-line text.
- input text: add flag (e.g. ImGuiInputTextFlags_EscapeClearsBuffer) to clear instead of revert. what to do with focus? (also see #2890)
- input text: add discard flag (e.g. ImGuiInputTextFlags_DiscardActiveBuffer) or make it easier to clear active focus for text replacement during edition (#725)
- input text: display bug when clicking a drag/slider after an input text in a different window has all-selected text (order dependent). actually a very old bug but no one appears to have noticed it.
- input text: allow centering/positioning text so that ctrl+clicking Drag or Slider keeps the textual value at the same pixel position.
- input text: decorrelate layout from inputs - e.g. what's the easiest way to implement a nice IP/Mac address input editor?
- input text: global callback system so user can plug in an expression evaluator easily. (#1691)
- input text: force scroll to end or scroll to a given line/contents (so user can implement a log or a search feature)
- input text: a way to preview completion (e.g. disabled text completing from the cursor)
- input text: a side bar that could e.g. preview where errors are. probably left to the user to draw but we'd need to give them the info there.
- input text: a way for the user to provide syntax coloring.
- input text: Shift+TAB with ImGuiInputTextFlags_AllowTabInput could eat preceding blanks, up to tab_count.
- input text: facilitate patterns like if (InputText(..., obj.get_string_ref()) { obj.set_string(...); } relying on internally held buffer.
- input text multi-line: don't directly call AddText() which does an unnecessary vertex reserve for character count prior to clipping. and/or more line-based clipping to AddText(). and/or reorganize TextUnformatted/RenderText for more efficiency for large text (e.g TextUnformatted could clip and log separately, etc).
- input text multi-line: support for cut/paste without selection (cut/paste the current line)
- input text multi-line: line numbers? status bar? (follow up on #200)
- input text multi-line: behave better when user changes input buffer while editing is active (even though it is illegal behavior). namely, the change of buffer can create a scrollbar glitch (#725)
- input text multi-line: better horizontal scrolling support (#383, #1224)
- input text multi-line: single call to AddText() should be coarse clipped on InputTextEx() end.
- input number: optional range min/max for Input*() functions
- input number: holding [-]/[+] buttons could increase the step speed non-linearly (or user-controlled)
- input number: use mouse wheel to step up/down
- input number: applying arithmetics ops (+,-,*,/) messes up with text edit undo stack.
- layout: helper or a way to express ImGui::SameLine(ImGui::GetCursorStartPos().x + ImGui::CalcItemWidth() + ImGui::GetStyle().ItemInnerSpacing.x); in a simpler manner.
- layout, font: horizontal tab support, A) text mode: forward only tabs (e.g. every 4 characters/N pixels from pos x1), B) manual mode: explicit tab stops acting as mini columns, no clipping (for menu items, many kind of uses, also vaguely relate to #267, #395)
- layout: horizontal layout helper (#97)
- layout: horizontal flow until no space left (#404)
- layout: more generic alignment state (left/right/centered) for single items?
- layout: clean up the InputFloatN/SliderFloatN/ColorEdit4 layout code. item width should include frame padding.
- layout: vertical alignment of mixed height items (e.g. buttons) within a same line (#1284)
- layout: null layout mode were items are not rendered but user can query GetItemRectMin()/Max/Size.
- layout: (R&D) local multi-pass layout mode.
- layout: (R&D) bind authored layout data (created by an off-line tool), items fetch their pos/size at submission, self-optimize data structures to stable linear access.
- group: BeginGroup() needs a border option. (~#1496)
- group: IsHovered() after EndGroup() covers whole aabb rather than the intersection of individual items. Is that desirable?
- group: merge deactivation/activation within same group (fwd WasEdited flag). (#2550)
!- color: the color conversion helpers/types are a mess and needs sorting out.
- color: (api breaking) ImGui::ColorConvertXXX functions should be loose ImColorConvertXX to match imgui_internals.h
- plot: full featured plot/graph api w/ scrolling, zooming etc. all bell & whistle. why not!
- plot: PlotLines() should use the polygon-stroke facilities, less vertices (currently issues with averaging normals)
- plot: make it easier for user to draw extra stuff into the graph (e.g: draw basis, highlight certain points, 2d plots, multiple plots)
- plot: "smooth" automatic scale over time, user give an input 0.0(full user scale) 1.0(full derived from value)
- plot: option/feature: draw the zero line
- plot: option/feature: draw grid, vertical markers
- plot: option/feature: draw unit
- plot: add a helper e.g. Plot(char* label, float value, float time_span=2.0f) that stores values and Plot them for you - probably another function name. and/or automatically allow to plot ANY displayed value (more reliance on stable ID)
- clipper: ability to force display 1 item in the list would be convenient (for patterns where we need to set active id etc.)
- clipper: ability to disable the clipping through a simple flag/bool.
- clipper: ability to run without knowing full count in advance.
- clipper: horizontal clipping support. (#2580)
- separator: expose flags (#759)
- separator: take indent into consideration (optional)
- separator: width, thickness, centering (#1643)
- splitter: formalize the splitter idiom into an official api (we want to handle n-way split) (#319)
- dock: merge docking branch (#2109)
- dock: dock out from a collapsing header? would work nicely but need emitting window to keep submitting the code.
- tabs: "there is currently a problem because TabItem() will try to submit their own tooltip after 0.50 second, and this will have the effect of making your tooltip flicker once." -> tooltip priority work
- tabs: close button tends to overlap unsaved-document star
- tabs: consider showing the star at the same spot as the close button, like VS Code does.
- tabs: make EndTabBar fail if users doesn't respect BeginTabBar return value, for consistency/future-proofing.
- tabs: persistent order/focus in BeginTabBar() api (#261, #351)
- tabs: TabItem could honor SetNextItemWidth()?
- tabs: explicit api (even if internal) to cleanly manipulate tab order.
- tabs: Mouse wheel over tab bar could scroll? (#2702)
- image/image button: misalignment on padded/bordered button?
- image/image button: parameters are confusing, image() has tint_col,border_col whereas imagebutton() has bg_col/tint_col. Even thou they are different parameters ordering could be more consistent. can we fix that?
- image button: not taking an explicit id can be problematic. (#2464, #1390)
- button: provide a button that looks framed. (?)
- slider/drag: ctrl+click when format doesn't include a % character.. disable? display underlying value in default format? (see TempInputTextScalar)
- slider: allow using the [-]/[+] buttons used by InputFloat()/InputInt()
- slider: initial absolute click is imprecise. change to relative movement slider (same as scrollbar). (#1946)
- slider: add dragging-based widgets to edit values with mouse (on 2 axises), saving screen real-estate.
- slider: tint background based on value (e.g. v_min -> v_max, or use 0.0f either side of the sign)
- slider: relative dragging? + precision dragging
- slider: step option (#1183)
- slider: style: fill % of the bar instead of positioning a drag.
- knob: rotating knob widget (#942)
- drag float: support for reversed drags (min > max) (removed is_locked, also see fdc526e)
- drag float: up/down axis
- drag float: power != 0.0f with current value being outside the range keeps the value stuck.
- drag float: added leeway on edge (e.g. a few invisible steps past the clamp limits)
- combo: use clipper: make it easier to disable clipper with a single flag.
- combo: flag for BeginCombo to not return true when unchanged (#1182)
- combo: a way/helper to customize the combo preview (#1658) -> exeperimental BeginComboPreview()
- combo/listbox: keyboard control. need InputText-like non-active focus + key handling. considering keyboard for custom listbox (pr #203)
- listbox: multiple selection.
- listbox: unselect option (#1208)
- listbox: make it easier/more natural to implement range-select (need some sort of info/ref about the last clicked/focused item that user can translate to an index?) (wip stash)
- listbox: user may want to initial scroll to focus on the one selected value?
- listbox: expose hovered item for a simplified ListBox api
- listbox: keyboard navigation.
- listbox: disable capturing mouse wheel if the listbox has no scrolling. (#1681)
- listbox: scrolling should track modified selection.
- listbox: future api should allow to enable horizontal scrolling (#2510)
!- popups/menus: clarify usage of popups id, how MenuItem/Selectable closing parent popups affects the ID, etc. this is quite fishy needs improvement! (#331, #402)
- modals: make modal title bar blink when trying to click outside the modal
- modals: technically speaking, we could make Begin() with ImGuiWindowFlags_Modal work without involving popup. May help untangle a few things, as modals are more like regular windows than popups.
- popups: if the popup functions took explicit ImGuiID it would allow the user to manage the scope of those ID. (#331)
- popups: clicking outside (to close popup) and holding shouldn't drag window below.
- popups: add variant using global identifier similar to Begin/End (#402)
- popups: border options. richer api like BeginChild() perhaps? (#197)
- popups: flags could be reworked to allow both mouse buttons as index (0..5 and as flags using higher-bit) allowing to or them.
- popups/modals: although it is sometimes convenient that popups/modals lifetime is owned by imgui, we could also a bool-owned-by-user api as long as Begin() return value testing is enforced.
- tooltip: drag and drop with tooltip near monitor edges lose/changes its last direction instead of locking one. The drag and drop tooltip should always follow without changing direction.
- tooltip: allow to set the width of a tooltip to allow TextWrapped() etc. while keeping the height automatic.
- tooltip: tooltips with delay timers? or general timer policy? (instantaneous vs timed): IsItemHovered() with timer + implicit aabb-id for items with no ID. (#1485)
- tooltip: drag tooltip hovering over source widget with IsItemHovered/SetTooltip flickers.
- menus: menu bars inside modal windows are acting weird.
- status-bar: add a per-window status bar helper similar to what menu-bar does.
- shortcuts: local-style shortcut api, e.g. parse "&Save"
- shortcuts,menus: global-style shortcut api e.g. "Save (CTRL+S)" -> explicit flag for recursing into closed menu
- shortcuts: programmatically access shortcuts "Focus("&Save"))
- menus: hovering a disabled BeginMenu or MenuItem won't close another menu
- menus: menu-bar: main menu-bar could affect clamping of windows position (~ akin to modifying DisplayMin)
- menus: hovering from menu to menu on a menu-bar has 1 frame without any menu, which is a little annoying. ideally either 0 either longer.
- menus: could merge draw call in most cases (how about storing an optional aabb in ImDrawCmd to move the burden of merging in a single spot).
- menus: would be nice if the Selectable() supported horizontal alignment (must be given the equivalent of WorkRect.Max.x matching the position of the shortcut column)
- tree node: add treenode/treepush int variants? not there because (void*) cast from int warns on some platforms/settings?
- tree node: try to apply scrolling at time of TreePop() if node was just opened and end of node is past scrolling limits?
- tree node / selectable render mismatch which is visible if you use them both next to each other (e.g. cf. property viewer)
- tree node: tweak color scheme to distinguish headers from selected tree node (#581)
- tree node: leaf/non-leaf highlight mismatch.
- tree node: flag to disable formatting and/or detect "%s"
- tree node/opt: could avoid formatting when clipped (flag assuming we don't care about width/height, assume single line height? format only %s/%c to be able to count height?)
- settings: write more decent code to allow saving/loading new fields: columns, selected tree nodes?
- settings: api for per-tool simple persistent data (bool,int,float,columns sizes,etc.) in .ini file (#437)
- settings/persistence: helpers to make TreeNodeBehavior persist (even during dev!) - may need to store some semantic and/or data type in ImGuiStoragePair
- style: better default styles. (#707)
- style: PushStyleVar: allow direct access to individual float X/Y elements.
- style: add a highlighted text color (for headers, etc.)
- style: border types: out-screen, in-screen, etc. (#447)
- style: add window shadow (fading away from the window. Paint-style calculation of vertices alpha after drawlist would be easier)
- style: a concept of "compact style" that the end-user can easily rely on (e.g. PushStyleCompact()?) that maps to other settings? avoid implementing duplicate helpers such as SmallCheckbox(), etc.
- style: try to make PushStyleVar() more robust to incorrect parameters (to be more friendly to edit & continues situation).
- style: global scale setting.
- style: FramePadding could be different for up vs down (#584)
- style: WindowPadding needs to be EVEN as the 0.5 multiplier used on this value probably have a subtle effect on clip rectangle
- style: have a more global HSV setter (e.g. alter hue on all elements). consider replacing active/hovered by offset in HSV space? (#438, #707, #1223)
- style: gradients fill (#1223) ~ 2 bg colors for each fill? tricky with rounded shapes and using textures for corners.
- style editor: color child window height expressed in multiple of line height.
- log: improve logging of ArrowButton, ListBox, TabItem
- log: carry on indent / tree depth when opening a child window
- log: enabling log ends up pushing and growing vertices buffers because we don't distinguish layout vs render clipping
- log: have more control over the log scope (e.g. stop logging when leaving current tree node scope)
- log: be able to log anything (e.g. right-click on a window/tree-node, shows context menu? log into tty/file/clipboard)
- log: let user copy any window content to clipboard easily (CTRL+C on windows? while moving it? context menu?). code is commented because it fails with multiple Begin/End pairs.
- log: obsolete LogButtons() all together.
- log: LogButtons() options for specifying depth and/or hiding depth slider
- filters: set a current filter that tree node can automatically query to hide themselves
- filters: handle wild-cards (with implicit leading/trailing *), reg-exprs
- filters: fuzzy matches (may use code at blog.forrestthewoods.com/4cffeed33fdb)
- drag and drop: fix/support/options for overlapping drag sources.
- drag and drop: focus drag target window on hold (even without open)
- drag and drop: releasing a drop shows the "..." tooltip for one frame - since e13e598 (#1725)
- drag and drop: drag source on a group object (would need e.g. an invisible button covering group in EndGroup) https://twitter.com/paniq/status/1121446364909535233
- drag and drop: have some way to know when a drag begin from BeginDragDropSource() pov. (see 2018/01/11 post in #143)
- drag and drop: allow preview tooltip to be submitted from a different place than the drag source. (#1725)
- drag and drop: allow using with other mouse buttons (where activeid won't be set). (#1637)
- drag and drop: make it easier and provide a demo to have tooltip both are source and target site, with a more detailed one on target site (tooltip ordering problem)
- drag and drop: demo with reordering nodes (in a list, or a tree node). (#143)
- drag and drop: test integrating with os drag and drop (make it easy to do a naive WM_DROPFILE integration)
- drag and drop: allow for multiple payload types. (#143)
- drag and drop: make payload optional? payload promise? (see 2018/01/11 post in #143)
- drag and drop: (#143) "both an in-process pointer and a promise to generate a serialized version, for whether the drag ends inside or outside the same process"
- drag and drop: feedback when hovering a region blocked by modal (mouse cursor "NO"?)
- node/graph editors (#306) (also see https://github.com/ocornut/imgui/wiki#node-editors)
- pie menus patterns (#434)
- markup: simple markup language for color change? (#902)
- text: selectable text (for copy) as a generic feature (ItemFlags?)
- text: proper alignment options in imgui_internal.h
- text: it's currently impossible to have a window title with "##". perhaps an official workaround would be nice. \ style inhibitor? non-visible ascii code to insert between #?
- text: provided a framed text helper, e.g. https://pastebin.com/1Laxy8bT
- text: refactor TextUnformatted (or underlying function) to more explicitly request if we need width measurement or not
- text/layout/tabs: \t pulling position from base pos + step, or offset array (e.g. could be used in text edit, menus for simple icon+text alignment, etc.)
- text link/url button: underlined. should api expose an ID or use text contents as ID? which colors enum to use?
- text/wrapped: should be a more first-class citizen, e.g. wrapped text within a Selectable with known width.
- text/wrapped: custom separator for text wrapping. (#3002)
- text/wrapped: figure out better way to use TextWrapped() in an always auto-resize context (tooltip, etc.) (#249)
- font: arbitrary line spacing. (#2945)
- font: MergeMode: flags to select overwriting or not (this is now very easy with refactored ImFontAtlasBuildWithStbTruetype)
- font: free the Alpha buffer if user only requested RGBA.
!- font: better CalcTextSizeA() API, at least for simple use cases. current one is horrible (perhaps have simple vs extended versions).
- font: for the purpose of RenderTextEllipsis(), it might be useful that CalcTextSizeA() can ignore the trailing padding?
- font: a CalcTextHeight() helper could run faster than CalcTextSize().y
- font: enforce monospace through ImFontConfig (for icons?) + create dual ImFont output from same input, reusing rasterized data but with different glyphs/AdvanceX
- font: finish CustomRectRegister() to allow mapping Unicode codepoint to custom texture data
- font: remove ID from CustomRect registration, it seems unnecessary!
- font: make it easier to submit own bitmap font (same texture, another texture?). (#2127, #2575)
- font: PushFontSize API (#1018)
- font: MemoryTTF taking ownership confusing/not obvious, maybe default should be opposite?
- font: storing MinAdvanceX per font would allow us to skip calculating line width (under a threshold of character count) in loops looking for block width
- font/demo: add tools to show glyphs used by a text blob, display U16 value, list missing glyphs.
- font/demo: demonstrate use of ImFontGlyphRangesBuilder.
- font/atlas: add a missing Glyphs.reserve()
- font/atlas: incremental updates
- font/atlas: dynamic font atlas to avoid baking huge ranges into bitmap and make scaling easier.
- font/draw: vertical and/or rotated text renderer (#705) - vertical is easier clipping wise
- font/draw: need to be able to specify wrap start position.
- font/draw: better reserve policy for large horizontal block of text (shouldn't reserve for all clipped lines). also see #3349.
- font/draw: fix for drawing 16k+ visible characters in same call.
- font/draw: underline, squiggle line rendering helpers.
- font: optimization: for monospace font (like the default one) we can trim IndexXAdvance as long as trailing value is == FallbackXAdvance (need to make sure TAB is still correct), would save on cache line.
- font: add support for kerning, probably optional. A) perhaps default to (32..128)^2 matrix ~ 9K entries = 36KB, then hash for non-ascii?. B) or sparse lookup into per-char list?
- font: add a simpler CalcTextSizeA() api? current one ok but not welcome if user needs to call it directly (without going through ImGui::CalcTextSize)
- font: fix AddRemapChar() to work before atlas has been built.
- font: support for unicode codepoints higher than 0xFFFF? (pr #2815)
- font: (api breaking) remove "TTF" from symbol names. also because it now supports OTF.
- font/opt: Considering storing standalone AdvanceX table as 16-bit fixed point integer?
- font/opt: Glyph currently 40 bytes (2+9*4). Consider storing UV as 16 bits integer? (->32 bytes). X0/Y0/X1/Y1 as 16 fixed-point integers? Or X0/Y0 as float and X1/Y1 as fixed8_8?
- nav: some features such as PageUp/Down/Home/End should probably work without ImGuiConfigFlags_NavEnableKeyboard? (where do we draw the line?)
- nav: configuration flag to disable global shortcuts (currently only CTRL-Tab) ?
! nav: never clear NavId on some setup (e.g. gamepad centric)
- nav: there's currently no way to completely clear focus with the keyboard. depending on patterns used by the application to dispatch inputs, it may be desirable.
- nav: code to focus child-window on restoring NavId appears to have issue: e.g. when focus change is implicit because of window closure.
- nav: Home/End behavior when navigable item is not fully visible at the edge of scrolling? should be backtrack to keep item into view?
- nav: NavScrollToBringItemIntoView() with item bigger than view should focus top-right? Repro: using Nav in "About Window"
- nav: wrap around logic to allow e.g. grid based layout (pressing NavRight on the right-most element would go to the next row, etc.). see internal's NavMoveRequestTryWrapping().
- nav: patterns to make it possible for arrows key to update selection (see JustMovedTo in range_select branch)
- nav: restore/find nearest NavId when current one disappear (e.g. pressed a button that disappear, or perhaps auto restoring when current button change name)
- nav: SetItemDefaultFocus() level of priority, so widget like Selectable when inside a popup could claim a low-priority default focus on the first selected iem
- nav: NavFlattened: ESC on a flattened child should select something.
- nav: NavFlattened: broken: in typical usage scenario, the items of a fully clipped child are currently not considered to enter into a NavFlattened child.
- nav: NavFlattened: init request doesn't select items that are part of a NavFlattened child
- nav: NavFlattened: cannot access menu-bar of a flattened child window with Alt/menu key (not a very common use case..).
- nav: simulate right-click or context activation? (SHIFT+F10)
- nav/tabbing: refactor old tabbing system and turn into navigation, should pass through all widgets (in submission order?).
- nav/popup: esc/enter default behavior for popups, e.g. be able to mark an "ok" or "cancel" button that would get triggered by those keys, default validation button, etc.
- nav/treenode: left within a tree node block as a fallback (ImGuiTreeNodeFlags_NavLeftJumpsBackHere by default?)
- nav/menus: pressing left-right on a vertically clipped menu bar tends to jump to the collapse/close buttons.
- nav/menus: allow pressing Menu to leave a sub-menu.
- nav/menus: a way to access the main menu bar with Alt? (currently needs CTRL+TAB) or last focused window menu bar?
- nav/menus: when using the main menu bar, even though we restore focus after, the underlying window loses its title bar highlight during menu manipulation. could we prevent it?
- nav/menus: main menu bar currently cannot restore a NULL focus. Could save NavWindow at the time of being focused, similarly to what popup do?
- nav/menus: Alt,Up could open the first menu (e.g. "File") currently it tends to nav into the window/collapse menu. Do do that we would need custom transition?
- nav/windowing: configure fade-in/fade-out delay on Ctrl+Tab?
- nav/windowing: when CTRL-Tab/windowing is active, the HoveredWindow detection doesn't take account of the window display re-ordering.
- nav/windowing: Resizing window will currently fail with certain types of resizing constraints/callback applied
- focus: preserve ActiveId/focus stack state, e.g. when opening a menu and close it, previously selected InputText() focus gets restored (#622)
- focus: SetKeyboardFocusHere() on with >= 0 offset could be done on same frame (else latch and modulate on beginning of next frame)
- focus: unable to use SetKeyboardFocusHere() on clipped widgets. (#787, #343)
- inputs: we need an explicit flag about whether the imgui window is focused, to be able to distinguish focused key releases vs alt-tabbing all release behaviors.
- inputs: rework IO system to be able to pass actual ordered/timestamped events. use an event queue? (~#335, #71)
- inputs: support track pad style scrolling & slider edit.
- inputs/io: backspace and arrows in the context of a text input could use system repeat rate.
- inputs/io: clarify/standardize/expose repeat rate and repeat delays (#1808)
- inputs/scrolling: support for smooth scrolling (#2462, #2569)
- misc: idle: expose "woken up" boolean (set by inputs) and/or animation time (for cursor blink) for backend to be able stop refreshing easily.
- misc: idle: if cursor blink if the _only_ visible animation, core imgui could rewrite vertex alpha to avoid CPU pass on ImGui:: calls.
- misc: idle: if cursor blink if the _only_ visible animation, could even expose a dirty rectangle that optionally can be leverage by some app to render in a smaller viewport, getting rid of much pixel shading cost.
- misc: no way to run a root-most GetID() with ImGui:: api since there's always a Debug window in the stack. (mentioned in #2960)
- misc: make the ImGuiCond values linear (non-power-of-two). internal storage for ImGuiWindow can use integers to combine into flags (Why?)
- misc: PushItemFlag(): add a flag to disable keyboard capture when used with mouse? (#1682)
- misc: use more size_t in public api?
- misc: possible compile-time support for string view/range instead of char* would e.g. facilitate usage with Rust (#683)
- misc: possible compile-time support for wchar_t instead of char*?
- remote: make a system like RemoteImGui first-class citizen/project (#75)
- demo: find a way to demonstrate textures in the examples application, as it such a common issue for new users.
- demo: demonstrate using PushStyleVar() in more details.
- demo: add vertical separator demo
- demo: add virtual scrolling example?
- demo: demonstrate Plot offset
- demo: window size constraint: square demo is broken when resizing from edges (#1975), would need to rework the callback system to solve this
- examples: window minimize, maximize (#583)
- examples: provide a zero frame-rate/idle example.
- examples: dx11/dx12: try to use new swapchain blit models (#2970)
- backends: move to backends/ folder?
- backends: report it better when not able to create texture?
- backends: apple: example_apple should be using modern GL3.
- backends: glfw: could go idle when minimized? if (glfwGetWindowAttrib(window, GLFW_ICONIFIED)) { glfwWaitEvents(); continue; } // issue: DeltaTime will be super high on resume, perhaps provide a way to let impl know (#440)
- backends: opengl: rename imgui_impl_opengl2 to impl_opengl_legacy and imgui_impl_opengl3 to imgui_impl_opengl? (#1900)
- backends: opengl: could use a single vertex buffer and glBufferSubData for uploads?
- backends: opengl: explicitly disable GL_STENCIL_TEST in bindings.
- backends: vulkan: viewport: support for synchronized swapping of multiple swap chains.
- backends: bgfx: https://gist.github.com/RichardGale/6e2b74bc42b3005e08397236e4be0fd0
- backends: mscriptem: with refactored examples, we could provide a direct imgui_impl_emscripten platform layer (see eg. https://github.com/floooh/sokol-samples/blob/master/html5/imgui-emsc.cc#L42)
- bindings: ways to use clang ast dump to generate bindings or helpers for bindings? (e.g. clang++ -Xclang -ast-dump=json imgui.h)
- optimization: replace vsnprintf with stb_printf? using IMGUI_USE_STB_SPRINTF.(#1038)
- optimization: add clipping for multi-component widgets (SliderFloatX, ColorEditX, etc.). one problem is that nav branch can't easily clip parent group when there is a move request.
- optimization: add a flag to disable most of rendering, for the case where the user expect to skip it (#335)
- optimization: fully covered window (covered by another with non-translucent bg + WindowRounding worth of padding) may want to clip rendering.
- optimization: use another hash function than crc32, e.g. FNV1a
- optimization/render: merge command-lists with same clip-rect into one even if they aren't sequential? (as long as in-between clip rectangle don't overlap)?
- optimization: turn some the various stack vectors into statically-sized arrays

28
examples/.gitignore vendored
View File

@ -1,28 +0,0 @@
## Visual Studio files
Debug/*
Release/*
ipch/*
x64/*
directx9_example/Debug/*
directx9_example/Release/*
directx9_example/ipch/*
directx9_example/x64/*
directx11_example/Debug/*
directx11_example/Release/*
directx11_example/ipch/*
directx11_example/x64/*
opengl_example/Debug/*
opengl_example/Release/*
opengl_example/ipch/*
opengl_example/x64/*
opengl3_example/Debug/*
opengl3_example/Release/*
opengl3_example/ipch/*
opengl3_example/x64/*
*.opensdf
*.sdf
*.suo
*.vcxproj.user
## Ini files
imgui.ini

View File

@ -1,50 +1,9 @@
Those are standalone ready-to-build applications to demonstrate ImGui.
Binaries of those demos are available from the main GitHub page.
See BACKENDS and EXAMPLES files in the docs/ folder, or on the web at: https://github.com/ocornut/imgui/tree/master/docs
TL;DR;
Refer to 'opengl_example' (not 'opengl3_example') to understand how the library is setup.
Copy the imgui_impl_xxx.cpp/.h file you need if you are using one of the rendering backend used in an example.
If you are using a different or your own backend, copy opengl_example/imgui_impl_opengl.cpp/.h to get started.
Backends = Helper code to facilitate integration with platforms/graphics api (used by Examples + should be used by your app).
Examples = Standalone applications showcasing integration with platforms/graphics api.
ImGui is highly portable and only requires a few things to run:
- Providing mouse/keyboard inputs
- Load the font atlas texture into GPU memory
- Providing a render function to process the drawing commands (we rendere indexed textured triangles)
- Extra just as clipboard support, mouse cursor supports, Windows IME support.
So this is essentially what those examples are doing + the obligatory cruft for portability.
Some Examples have extra README files in their respective directory, please check them too!
Unfortunately in 2015 it is still a massive pain to create and maintain portable build files using
external library like the ones we're using here.
For most example here I choose to provide Visual Studio 10 .sln files and Makefile for Linux/OSX.
Please let me know if they don't work with your setup!
You can probably just import the imgui_impl_xxx.cpp/.h files into your own codebase or compile those
directly with a command-line compiler.
opengl_example/
OpenGL example, using GLFW + fixed pipeline.
This is simple and should work for all OpenGL enabled applications.
Prefer following this example to learn how ImGui works!
opengl3_example/
OpenGL example, using GLFW/GL3W + programmable pipeline.
This uses more modern OpenGL calls and custom shaders.
Even if your application is using modern OpenGL you are better off copying the code from the fixed pipeline version!
I don't think there is an advantage using this over the simpler example, but it is provided for reference.
directx9_example/
DirectX9 example, Windows only.
directx11_example/
DirectX11 example, Windows only.
This is quite long and tedious, because: DirectX11.
ios_example/
iOS example.
Using Synergy to access keyboard/mouse data from server computer. Synergy keyboard integration is rather hacky.
sdl_opengl_example/
SDL2 + OpenGL example.
allegro5_example/
Allegro 5 example.
Once Dear ImGui is running (in either examples or your own application/game/engine),
run and refer to ImGui::ShowDemoWindow() in imgui_demo.cpp for the end-user API.

View File

@ -1,16 +0,0 @@
# How to Build
- On Ubuntu 14.04+
```bash
g++ -I ../imgui main.cpp imgui_impl_a5.cpp ../imgui/imgui.cpp -lallegro -lallegro_primitives
```
- On Windows with Visual Studio's CLI
\<a5path\> is your allegro5 folder.
```
cl /MD /I <a5path\include> /I ..\imgui main.cpp imgui_impl_a5.cpp ..\imgui\imgui.cpp /link /LIBPATH:<a5path\lib> allegro-5.0.10-monolith-md.lib user32.lib
```

View File

@ -1,290 +0,0 @@
// ImGui Allegro 5 bindings
// https://github.com/ocornut/imgui
// by @birthggd
#include <stdint.h> // uint64_t
#include <cstring> // memcpy
#include <imgui.h>
#include "imgui_impl_a5.h"
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#ifdef _WIN32
#include <allegro5/allegro_windows.h>
#endif
// Data
static ALLEGRO_DISPLAY* g_Display = NULL;
static ALLEGRO_BITMAP* g_Texture = NULL;
static double g_Time = 0.0;
static ALLEGRO_MOUSE_CURSOR* g_MouseCursorInvisible = NULL;
static ALLEGRO_VERTEX_DECL* g_VertexDecl = NULL;
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
struct ImDrawVertAllegro
{
ImVec2 pos;
ImVec2 uv;
ALLEGRO_COLOR col;
};
static void ImGui_ImplA5_RenderDrawLists(ImDrawData* draw_data)
{
int op, src, dst;
al_get_blender(&op, &src, &dst);
al_set_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA);
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
// FIXME-OPT: Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats
static ImVector<ImDrawVertAllegro> vertices;
vertices.resize(cmd_list->VtxBuffer.size());
for (int i = 0; i < cmd_list->VtxBuffer.size(); ++i)
{
const ImDrawVert &dv = cmd_list->VtxBuffer[i];
ImDrawVertAllegro v;
v.pos = dv.pos;
v.uv = dv.uv;
unsigned char *c = (unsigned char*)&dv.col;
v.col = al_map_rgba(c[0], c[1], c[2], c[3]);
vertices[i] = v;
}
// FIXME-OPT: Unfortunately Allegro doesn't support 16-bit vertices
static ImVector<int> indices;
indices.resize(cmd_list->IdxBuffer.size());
for (int i = 0; i < cmd_list->IdxBuffer.size(); ++i)
indices[i] = (int)cmd_list->IdxBuffer.Data[i];
int idx_offset = 0;
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
ALLEGRO_BITMAP* texture = (ALLEGRO_BITMAP*)pcmd->TextureId;
al_set_clipping_rectangle(pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z-pcmd->ClipRect.x, pcmd->ClipRect.w-pcmd->ClipRect.y);
al_draw_indexed_prim(&vertices[0], g_VertexDecl, texture, &indices[idx_offset], pcmd->ElemCount, ALLEGRO_PRIM_TRIANGLE_LIST);
}
idx_offset += pcmd->ElemCount;
}
}
// Restore modified state
al_set_blender(op, src, dst);
al_set_clipping_rectangle(0, 0, al_get_display_width(g_Display), al_get_display_height(g_Display));
}
bool Imgui_ImplA5_CreateDeviceObjects()
{
ImGuiIO &io = ImGui::GetIO();
// Build texture
unsigned char *pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Create texture
int flags = al_get_new_bitmap_flags();
int fmt = al_get_new_bitmap_format();
al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP|ALLEGRO_MIN_LINEAR|ALLEGRO_MAG_LINEAR);
al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE);
ALLEGRO_BITMAP* img = al_create_bitmap(width, height);
al_set_new_bitmap_flags(flags);
al_set_new_bitmap_format(fmt);
if (!img)
return false;
ALLEGRO_LOCKED_REGION *locked_img = al_lock_bitmap(img, al_get_bitmap_format(img), ALLEGRO_LOCK_WRITEONLY);
if (!locked_img)
{
al_destroy_bitmap(img);
return false;
}
memcpy(locked_img->data, pixels, sizeof(int)*width*height);
al_unlock_bitmap(img);
// Convert software texture to hardware texture.
ALLEGRO_BITMAP* cloned_img = al_clone_bitmap(img);
al_destroy_bitmap(img);
if (!cloned_img)
return false;
// Store our identifier
io.Fonts->TexID = (void*)cloned_img;
g_Texture = cloned_img;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
// Create an invisible mouse cursor
// Because al_hide_mouse_cursor() seems to mess up with the actual inputs..
ALLEGRO_BITMAP* mouse_cursor = al_create_bitmap(8,8);
g_MouseCursorInvisible = al_create_mouse_cursor(mouse_cursor, 0, 0);
al_destroy_bitmap(mouse_cursor);
return true;
}
void ImGui_ImplA5_InvalidateDeviceObjects()
{
if (g_Texture)
{
al_destroy_bitmap(g_Texture);
ImGui::GetIO().Fonts->TexID = NULL;
g_Texture = NULL;
}
if (g_MouseCursorInvisible)
{
al_destroy_mouse_cursor(g_MouseCursorInvisible);
g_MouseCursorInvisible = NULL;
}
}
bool ImGui_ImplA5_Init(ALLEGRO_DISPLAY* display)
{
g_Display = display;
// Create custom vertex declaration.
// Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats.
// We still use a custom declaration to use 'ALLEGRO_PRIM_TEX_COORD' instead of 'ALLEGRO_PRIM_TEX_COORD_PIXEL' else we can't do a reliable conversion.
ALLEGRO_VERTEX_ELEMENT elems[] =
{
{ ALLEGRO_PRIM_POSITION, ALLEGRO_PRIM_FLOAT_2, OFFSETOF(ImDrawVertAllegro, pos) },
{ ALLEGRO_PRIM_TEX_COORD, ALLEGRO_PRIM_FLOAT_2, OFFSETOF(ImDrawVertAllegro, uv) },
{ ALLEGRO_PRIM_COLOR_ATTR, 0, OFFSETOF(ImDrawVertAllegro, col) },
{ 0, 0, 0 }
};
g_VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro));
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = ALLEGRO_KEY_TAB;
io.KeyMap[ImGuiKey_LeftArrow] = ALLEGRO_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = ALLEGRO_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = ALLEGRO_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = ALLEGRO_KEY_DOWN;
io.KeyMap[ImGuiKey_PageUp] = ALLEGRO_KEY_PGUP;
io.KeyMap[ImGuiKey_PageDown] = ALLEGRO_KEY_PGDN;
io.KeyMap[ImGuiKey_Home] = ALLEGRO_KEY_HOME;
io.KeyMap[ImGuiKey_End] = ALLEGRO_KEY_END;
io.KeyMap[ImGuiKey_Delete] = ALLEGRO_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = ALLEGRO_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Enter] = ALLEGRO_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = ALLEGRO_KEY_ESCAPE;
io.KeyMap[ImGuiKey_A] = ALLEGRO_KEY_A;
io.KeyMap[ImGuiKey_C] = ALLEGRO_KEY_C;
io.KeyMap[ImGuiKey_V] = ALLEGRO_KEY_V;
io.KeyMap[ImGuiKey_X] = ALLEGRO_KEY_X;
io.KeyMap[ImGuiKey_Y] = ALLEGRO_KEY_Y;
io.KeyMap[ImGuiKey_Z] = ALLEGRO_KEY_Z;
io.RenderDrawListsFn = ImGui_ImplA5_RenderDrawLists;
#ifdef _WIN32
io.ImeWindowHandle = al_get_win_window_handle(g_Display);
#endif
return true;
}
void ImGui_ImplA5_Shutdown()
{
ImGui_ImplA5_InvalidateDeviceObjects();
ImGui::Shutdown();
}
bool ImGui_ImplA5_ProcessEvent(ALLEGRO_EVENT *ev)
{
ImGuiIO &io = ImGui::GetIO();
switch (ev->type)
{
case ALLEGRO_EVENT_MOUSE_AXES:
io.MouseWheel += ev->mouse.dz;
return true;
case ALLEGRO_EVENT_KEY_CHAR:
if (ev->keyboard.display == g_Display)
if (ev->keyboard.unichar > 0 && ev->keyboard.unichar < 0x10000)
io.AddInputCharacter((unsigned short)ev->keyboard.unichar);
return true;
case ALLEGRO_EVENT_KEY_DOWN:
case ALLEGRO_EVENT_KEY_UP:
if (ev->keyboard.display == g_Display)
io.KeysDown[ev->keyboard.keycode] = (ev->type == ALLEGRO_EVENT_KEY_DOWN);
return true;
}
return false;
}
void ImGui_ImplA5_NewFrame()
{
if (!g_Texture)
Imgui_ImplA5_CreateDeviceObjects();
ImGuiIO &io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w, h;
w = al_get_display_width(g_Display);
h = al_get_display_height(g_Display);
io.DisplaySize = ImVec2((float)w, (float)h);
// Setup time step
double current_time = al_get_time();
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
g_Time = current_time;
// Setup inputs
ALLEGRO_KEYBOARD_STATE keys;
al_get_keyboard_state(&keys);
io.KeyCtrl = al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL);
io.KeyShift = al_key_down(&keys, ALLEGRO_KEY_LSHIFT) || al_key_down(&keys, ALLEGRO_KEY_RSHIFT);
io.KeyAlt = al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR);
ALLEGRO_MOUSE_STATE mouse;
if (keys.display == g_Display)
{
al_get_mouse_state(&mouse);
io.MousePos = ImVec2((float)mouse.x, (float)mouse.y);
}
else
{
io.MousePos = ImVec2(-1, -1);
}
al_get_mouse_state(&mouse);
io.MouseDown[0] = mouse.buttons & (1 << 0);
io.MouseDown[1] = mouse.buttons & (1 << 1);
io.MouseDown[2] = mouse.buttons & (1 << 2);
// Hide OS mouse cursor if ImGui is drawing it
if (io.MouseDrawCursor)
{
al_set_mouse_cursor(g_Display, g_MouseCursorInvisible);
}
else
{
ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT;
switch (ImGui::GetMouseCursor())
{
case ImGuiMouseCursor_TextInput: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT; break;
case ImGuiMouseCursor_Move: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE; break;
case ImGuiMouseCursor_ResizeNS: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N; break;
case ImGuiMouseCursor_ResizeEW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E; break;
case ImGuiMouseCursor_ResizeNESW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE; break;
case ImGuiMouseCursor_ResizeNWSE: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW; break;
}
al_set_system_mouse_cursor(g_Display, cursor_id);
}
// Start the frame
ImGui::NewFrame();
}

View File

@ -1,18 +0,0 @@
// ImGui Allegro 5 bindings
// https://github.com/ocornut/imgui
// by @birthggd
#pragma once
struct ALLEGRO_DISPLAY;
union ALLEGRO_EVENT;
bool ImGui_ImplA5_Init(ALLEGRO_DISPLAY* display);
void ImGui_ImplA5_Shutdown();
void ImGui_ImplA5_NewFrame();
bool ImGui_ImplA5_ProcessEvent(ALLEGRO_EVENT* event);
// Use if you want to reset your rendering device without losing ImGui state.
bool Imgui_ImplA5_CreateDeviceObjects();
void ImGui_ImplA5_InvalidateDeviceObjects();

View File

@ -1,105 +0,0 @@
// ImGui - standalone example application for Allegro 5
#include <stdint.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <imgui.h>
#include "imgui_impl_a5.h"
int main(int, char**)
{
// Setup Allegro
al_init();
al_install_keyboard();
al_install_mouse();
al_init_primitives_addon();
al_set_new_display_flags(ALLEGRO_RESIZABLE);
ALLEGRO_DISPLAY* display = al_create_display(1280, 720);
al_set_window_title(display, "ImGui Allegro 5 example");
ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
al_register_event_source(queue, al_get_display_event_source(display));
al_register_event_source(queue, al_get_keyboard_event_source());
al_register_event_source(queue, al_get_mouse_event_source());
// Setup ImGui binding
ImGui_ImplA5_Init(display);
// Load Fonts
// (see extra_fonts/README.txt for more details)
//ImGuiIO& io = ImGui::GetIO();
//io.Fonts->AddFontDefault();
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f);
//io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
// Merge glyphs from multiple fonts into one (e.g. combine default font with another with Chinese glyphs, or add icons)
//ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 };
//ImFontConfig icons_config; icons_config.MergeMode = true; icons_config.PixelSnapH = true;
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 18.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/fontawesome-webfont.ttf", 18.0f, &icons_config, icons_ranges);
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImColor(114, 144, 154);
// Main loop
bool running = true;
while (running)
{
ALLEGRO_EVENT ev;
while (al_get_next_event(queue, &ev))
{
ImGui_ImplA5_ProcessEvent(&ev);
if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) running = false;
if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE)
{
ImGui_ImplA5_InvalidateDeviceObjects();
al_acknowledge_resize(display);
Imgui_ImplA5_CreateDeviceObjects();
}
}
ImGui_ImplA5_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::ColorEdit3("clear color", (float*)&clear_color);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f/ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::SetNextWindowSize(ImVec2(200, 100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver);
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
al_clear_to_color(al_map_rgba_f(clear_color.x, clear_color.y, clear_color.z, clear_color.w));
ImGui::Render();
al_flip_display();
}
// Cleanup
ImGui_ImplA5_Shutdown();
al_destroy_event_queue(queue);
al_destroy_display(display);
return 0;
}

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="imgui">
<UniqueIdentifier>{0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}</UniqueIdentifier>
</Filter>
<Filter Include="sources">
<UniqueIdentifier>{08e36723-ce4f-4cff-9662-c40801cf1acf}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="..\..\imgui.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="imgui_impl_dx11.h">
<Filter>sources</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\imgui.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="main.cpp">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="imgui_impl_dx11.cpp">
<Filter>sources</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -1,498 +0,0 @@
// ImGui Win32 + DirectX11 binding
// https://github.com/ocornut/imgui
#include <imgui.h>
#include "imgui_impl_dx11.h"
// DirectX
#include <d3d11.h>
#include <d3dcompiler.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// Data
static INT64 g_Time = 0;
static INT64 g_TicksPerSecond = 0;
static HWND g_hWnd = 0;
static ID3D11Device* g_pd3dDevice = NULL;
static ID3D11DeviceContext* g_pd3dDeviceContext = NULL;
static ID3D11Buffer* g_pVB = NULL;
static ID3D11Buffer* g_pIB = NULL;
static ID3D10Blob * g_pVertexShaderBlob = NULL;
static ID3D11VertexShader* g_pVertexShader = NULL;
static ID3D11InputLayout* g_pInputLayout = NULL;
static ID3D11Buffer* g_pVertexConstantBuffer = NULL;
static ID3D10Blob * g_pPixelShaderBlob = NULL;
static ID3D11PixelShader* g_pPixelShader = NULL;
static ID3D11SamplerState* g_pFontSampler = NULL;
static ID3D11ShaderResourceView*g_pFontTextureView = NULL;
static ID3D11RasterizerState* g_pRasterizerState = NULL;
static ID3D11BlendState* g_pBlendState = NULL;
static int VERTEX_BUFFER_SIZE = 20000; // TODO: Make buffers smaller and grow dynamically as needed.
static int INDEX_BUFFER_SIZE = 40000; // TODO: Make buffers smaller and grow dynamically as needed.
struct VERTEX_CONSTANT_BUFFER
{
float mvp[4][4];
};
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
static void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data)
{
// Copy and convert all vertices into a single contiguous buffer
D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;
if (g_pd3dDeviceContext->Map(g_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)
return;
if (g_pd3dDeviceContext->Map(g_pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)
return;
ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;
ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
memcpy(vtx_dst, &cmd_list->VtxBuffer[0], cmd_list->VtxBuffer.size() * sizeof(ImDrawVert));
memcpy(idx_dst, &cmd_list->IdxBuffer[0], cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx));
vtx_dst += cmd_list->VtxBuffer.size();
idx_dst += cmd_list->IdxBuffer.size();
}
g_pd3dDeviceContext->Unmap(g_pVB, 0);
g_pd3dDeviceContext->Unmap(g_pIB, 0);
// Setup orthographic projection matrix into our constant buffer
{
D3D11_MAPPED_SUBRESOURCE mappedResource;
if (g_pd3dDeviceContext->Map(g_pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource) != S_OK)
return;
VERTEX_CONSTANT_BUFFER* pConstantBuffer = (VERTEX_CONSTANT_BUFFER*)mappedResource.pData;
const float L = 0.0f;
const float R = ImGui::GetIO().DisplaySize.x;
const float B = ImGui::GetIO().DisplaySize.y;
const float T = 0.0f;
const float mvp[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f},
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f,},
{ 0.0f, 0.0f, 0.5f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
};
memcpy(&pConstantBuffer->mvp, mvp, sizeof(mvp));
g_pd3dDeviceContext->Unmap(g_pVertexConstantBuffer, 0);
}
// Setup viewport
{
D3D11_VIEWPORT vp;
memset(&vp, 0, sizeof(D3D11_VIEWPORT));
vp.Width = ImGui::GetIO().DisplaySize.x;
vp.Height = ImGui::GetIO().DisplaySize.y;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDeviceContext->RSSetViewports(1, &vp);
}
// Bind shader and vertex buffers
unsigned int stride = sizeof(ImDrawVert);
unsigned int offset = 0;
g_pd3dDeviceContext->IASetInputLayout(g_pInputLayout);
g_pd3dDeviceContext->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);
g_pd3dDeviceContext->IASetIndexBuffer(g_pIB, DXGI_FORMAT_R16_UINT, 0);
g_pd3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
g_pd3dDeviceContext->VSSetShader(g_pVertexShader, NULL, 0);
g_pd3dDeviceContext->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);
g_pd3dDeviceContext->PSSetShader(g_pPixelShader, NULL, 0);
g_pd3dDeviceContext->PSSetSamplers(0, 1, &g_pFontSampler);
// Setup render state
const float blendFactor[4] = { 0.f, 0.f, 0.f, 0.f };
g_pd3dDeviceContext->OMSetBlendState(g_pBlendState, blendFactor, 0xffffffff);
g_pd3dDeviceContext->RSSetState(g_pRasterizerState);
// Render command lists
int vtx_offset = 0;
int idx_offset = 0;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
const D3D11_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };
g_pd3dDeviceContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&pcmd->TextureId);
g_pd3dDeviceContext->RSSetScissorRects(1, &r);
g_pd3dDeviceContext->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset);
}
idx_offset += pcmd->ElemCount;
}
vtx_offset += cmd_list->VtxBuffer.size();
}
// Restore modified state
g_pd3dDeviceContext->IASetInputLayout(NULL);
g_pd3dDeviceContext->PSSetShader(NULL, NULL, 0);
g_pd3dDeviceContext->VSSetShader(NULL, NULL, 0);
}
LRESULT ImGui_ImplDX11_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
{
ImGuiIO& io = ImGui::GetIO();
switch (msg)
{
case WM_LBUTTONDOWN:
io.MouseDown[0] = true;
return true;
case WM_LBUTTONUP:
io.MouseDown[0] = false;
return true;
case WM_RBUTTONDOWN:
io.MouseDown[1] = true;
return true;
case WM_RBUTTONUP:
io.MouseDown[1] = false;
return true;
case WM_MOUSEWHEEL:
io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;
return true;
case WM_MOUSEMOVE:
io.MousePos.x = (signed short)(lParam);
io.MousePos.y = (signed short)(lParam >> 16);
return true;
case WM_KEYDOWN:
if (wParam < 256)
io.KeysDown[wParam] = 1;
return true;
case WM_KEYUP:
if (wParam < 256)
io.KeysDown[wParam] = 0;
return true;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
if (wParam > 0 && wParam < 0x10000)
io.AddInputCharacter((unsigned short)wParam);
return true;
}
return 0;
}
static void ImGui_ImplDX11_CreateFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
// Build
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Create DX11 texture
{
D3D11_TEXTURE2D_DESC texDesc;
ZeroMemory(&texDesc, sizeof(texDesc));
texDesc.Width = width;
texDesc.Height = height;
texDesc.MipLevels = 1;
texDesc.ArraySize = 1;
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texDesc.SampleDesc.Count = 1;
texDesc.Usage = D3D11_USAGE_DEFAULT;
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
texDesc.CPUAccessFlags = 0;
ID3D11Texture2D *pTexture = NULL;
D3D11_SUBRESOURCE_DATA subResource;
subResource.pSysMem = pixels;
subResource.SysMemPitch = texDesc.Width * 4;
subResource.SysMemSlicePitch = 0;
g_pd3dDevice->CreateTexture2D(&texDesc, &subResource, &pTexture);
// Create texture view
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = texDesc.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView);
pTexture->Release();
}
// Store our identifier
io.Fonts->TexID = (void *)g_pFontTextureView;
// Create texture sampler
{
D3D11_SAMPLER_DESC samplerDesc;
ZeroMemory(&samplerDesc, sizeof(samplerDesc));
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.MipLODBias = 0.f;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
samplerDesc.MinLOD = 0.f;
samplerDesc.MaxLOD = 0.f;
g_pd3dDevice->CreateSamplerState(&samplerDesc, &g_pFontSampler);
}
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
}
bool ImGui_ImplDX11_CreateDeviceObjects()
{
if (!g_pd3dDevice)
return false;
if (g_pVB)
ImGui_ImplDX11_InvalidateDeviceObjects();
// Create the vertex shader
{
static const char* vertexShader =
"cbuffer vertexBuffer : register(c0) \
{\
float4x4 ProjectionMatrix; \
};\
struct VS_INPUT\
{\
float2 pos : POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
PS_INPUT main(VS_INPUT input)\
{\
PS_INPUT output;\
output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
output.col = input.col;\
output.uv = input.uv;\
return output;\
}";
D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_5_0", 0, 0, &g_pVertexShaderBlob, NULL);
if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
return false;
if (g_pd3dDevice->CreateVertexShader((DWORD*)g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), NULL, &g_pVertexShader) != S_OK)
return false;
// Create the input layout
D3D11_INPUT_ELEMENT_DESC localLayout[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->uv), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
if (g_pd3dDevice->CreateInputLayout(localLayout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)
return false;
// Create the constant buffer
{
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
g_pd3dDevice->CreateBuffer(&cbDesc, NULL, &g_pVertexConstantBuffer);
}
}
// Create the pixel shader
{
static const char* pixelShader =
"struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
sampler sampler0;\
Texture2D texture0;\
\
float4 main(PS_INPUT input) : SV_Target\
{\
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \
}";
D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_5_0", 0, 0, &g_pPixelShaderBlob, NULL);
if (g_pPixelShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
return false;
if (g_pd3dDevice->CreatePixelShader((DWORD*)g_pPixelShaderBlob->GetBufferPointer(), g_pPixelShaderBlob->GetBufferSize(), NULL, &g_pPixelShader) != S_OK)
return false;
}
// Create the blending setup
{
D3D11_BLEND_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AlphaToCoverageEnable = false;
desc.RenderTarget[0].BlendEnable = true;
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
g_pd3dDevice->CreateBlendState(&desc, &g_pBlendState);
}
// Create the rasterizer state
{
D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.FillMode = D3D11_FILL_SOLID;
desc.CullMode = D3D11_CULL_NONE;
desc.ScissorEnable = true;
desc.DepthClipEnable = true;
g_pd3dDevice->CreateRasterizerState(&desc, &g_pRasterizerState);
}
// Create the vertex buffer
{
D3D11_BUFFER_DESC desc;
memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = VERTEX_BUFFER_SIZE * sizeof(ImDrawVert);
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVB) < 0)
return false;
}
// Create the index buffer
{
D3D11_BUFFER_DESC bufferDesc;
memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC));
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
bufferDesc.ByteWidth = INDEX_BUFFER_SIZE * sizeof(ImDrawIdx);
bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
if (g_pd3dDevice->CreateBuffer(&bufferDesc, NULL, &g_pIB) < 0)
return false;
}
ImGui_ImplDX11_CreateFontsTexture();
return true;
}
void ImGui_ImplDX11_InvalidateDeviceObjects()
{
if (!g_pd3dDevice)
return;
if (g_pFontSampler) { g_pFontSampler->Release(); g_pFontSampler = NULL; }
if (g_pFontTextureView) { g_pFontTextureView->Release(); ImGui::GetIO().Fonts->TexID = 0; }
if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }
if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }
if (g_pBlendState) { g_pBlendState->Release(); g_pBlendState = NULL; }
if (g_pRasterizerState) { g_pRasterizerState->Release(); g_pRasterizerState = NULL; }
if (g_pPixelShader) { g_pPixelShader->Release(); g_pPixelShader = NULL; }
if (g_pPixelShaderBlob) { g_pPixelShaderBlob->Release(); g_pPixelShaderBlob = NULL; }
if (g_pVertexConstantBuffer) { g_pVertexConstantBuffer->Release(); g_pVertexConstantBuffer = NULL; }
if (g_pInputLayout) { g_pInputLayout->Release(); g_pInputLayout = NULL; }
if (g_pVertexShader) { g_pVertexShader->Release(); g_pVertexShader = NULL; }
if (g_pVertexShaderBlob) { g_pVertexShaderBlob->Release(); g_pVertexShaderBlob = NULL; }
}
bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context)
{
g_hWnd = (HWND)hwnd;
g_pd3dDevice = device;
g_pd3dDeviceContext = device_context;
if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))
return false;
if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time))
return false;
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.
io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;
io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;
io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;
io.KeyMap[ImGuiKey_Home] = VK_HOME;
io.KeyMap[ImGuiKey_End] = VK_END;
io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
io.RenderDrawListsFn = ImGui_ImplDX11_RenderDrawLists;
io.ImeWindowHandle = g_hWnd;
return true;
}
void ImGui_ImplDX11_Shutdown()
{
ImGui_ImplDX11_InvalidateDeviceObjects();
ImGui::Shutdown();
g_pd3dDevice = NULL;
g_pd3dDeviceContext = NULL;
g_hWnd = (HWND)0;
}
void ImGui_ImplDX11_NewFrame()
{
if (!g_pVB)
ImGui_ImplDX11_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
RECT rect;
GetClientRect(g_hWnd, &rect);
io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));
// Setup time step
INT64 current_time;
QueryPerformanceCounter((LARGE_INTEGER *)&current_time);
io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;
g_Time = current_time;
// Read keyboard modifiers inputs
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
// io.MousePos : filled by WM_MOUSEMOVE events
// io.MouseDown : filled by WM_*BUTTON* events
// io.MouseWheel : filled by WM_MOUSEWHEEL events
// Hide OS mouse cursor if ImGui is drawing it
SetCursor(io.MouseDrawCursor ? NULL : LoadCursor(NULL, IDC_ARROW));
// Start the frame
ImGui::NewFrame();
}

View File

@ -1,20 +0,0 @@
// ImGui Win32 + DirectX11 binding
// https://github.com/ocornut/imgui
struct ID3D11Device;
struct ID3D11DeviceContext;
bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context);
void ImGui_ImplDX11_Shutdown();
void ImGui_ImplDX11_NewFrame();
// Use if you want to reset your rendering device without losing ImGui state.
void ImGui_ImplDX11_InvalidateDeviceObjects();
bool ImGui_ImplDX11_CreateDeviceObjects();
// Handler for Win32 messages, update mouse/keyboard data.
// You may or not need this for your implementation, but it can serve as reference for handling inputs.
// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code.
/*
extern LRESULT ImGui_ImplDX11_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
*/

View File

@ -1,225 +0,0 @@
// ImGui - standalone example application for DirectX 11
#include <imgui.h>
#include "imgui_impl_dx11.h"
#include <d3d11.h>
#include <d3dcompiler.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// Data
static ID3D11Device* g_pd3dDevice = NULL;
static ID3D11DeviceContext* g_pd3dDeviceContext = NULL;
static IDXGISwapChain* g_pSwapChain = NULL;
static ID3D11RenderTargetView* g_mainRenderTargetView = NULL;
void CreateRenderTarget()
{
DXGI_SWAP_CHAIN_DESC sd;
g_pSwapChain->GetDesc(&sd);
// Create the render target
ID3D11Texture2D* pBackBuffer;
D3D11_RENDER_TARGET_VIEW_DESC render_target_view_desc;
ZeroMemory(&render_target_view_desc, sizeof(render_target_view_desc));
render_target_view_desc.Format = sd.BufferDesc.Format;
render_target_view_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &render_target_view_desc, &g_mainRenderTargetView);
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL);
pBackBuffer->Release();
}
void CleanupRenderTarget()
{
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }
}
HRESULT CreateDeviceD3D(HWND hWnd)
{
// Setup swap chain
DXGI_SWAP_CHAIN_DESC sd;
{
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 2;
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
}
UINT createDeviceFlags = 0;
#ifdef _DEBUG
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_FEATURE_LEVEL featureLevel;
const D3D_FEATURE_LEVEL featureLevelArray[1] = { D3D_FEATURE_LEVEL_11_0, };
if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 1, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK)
return E_FAIL;
// Setup rasterizer
{
D3D11_RASTERIZER_DESC RSDesc;
memset(&RSDesc, 0, sizeof(D3D11_RASTERIZER_DESC));
RSDesc.FillMode = D3D11_FILL_SOLID;
RSDesc.CullMode = D3D11_CULL_NONE;
RSDesc.FrontCounterClockwise = FALSE;
RSDesc.DepthBias = 0;
RSDesc.SlopeScaledDepthBias = 0.0f;
RSDesc.DepthBiasClamp = 0;
RSDesc.DepthClipEnable = TRUE;
RSDesc.ScissorEnable = TRUE;
RSDesc.AntialiasedLineEnable = FALSE;
RSDesc.MultisampleEnable = (sd.SampleDesc.Count > 1) ? TRUE : FALSE;
ID3D11RasterizerState* pRState = NULL;
g_pd3dDevice->CreateRasterizerState(&RSDesc, &pRState);
g_pd3dDeviceContext->RSSetState(pRState);
pRState->Release();
}
CreateRenderTarget();
return S_OK;
}
void CleanupDeviceD3D()
{
CleanupRenderTarget();
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; }
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
}
extern LRESULT ImGui_ImplDX11_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (ImGui_ImplDX11_WndProcHandler(hWnd, msg, wParam, lParam))
return true;
switch (msg)
{
case WM_SIZE:
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
{
ImGui_ImplDX11_InvalidateDeviceObjects();
CleanupRenderTarget();
g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);
CreateRenderTarget();
ImGui_ImplDX11_CreateDeviceObjects();
}
return 0;
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int main(int, char**)
{
// Create application window
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, L"ImGui Example", NULL };
RegisterClassEx(&wc);
HWND hwnd = CreateWindow(L"ImGui Example", L"ImGui DirectX11 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
// Initialize Direct3D
if (CreateDeviceD3D(hwnd) < 0)
{
CleanupDeviceD3D();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 1;
}
// Show the window
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
// Setup ImGui binding
ImGui_ImplDX11_Init(hwnd, g_pd3dDevice, g_pd3dDeviceContext);
// Load Fonts
// (see extra_fonts/README.txt for more details)
//ImGuiIO& io = ImGui::GetIO();
//io.Fonts->AddFontDefault();
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f);
//io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
// Merge glyphs from multiple fonts into one (e.g. combine default font with another with Chinese glyphs, or add icons)
//ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 };
//ImFontConfig icons_config; icons_config.MergeMode = true; icons_config.PixelSnapH = true;
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 18.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/fontawesome-webfont.ttf", 18.0f, &icons_config, icons_ranges);
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_col = ImColor(114, 144, 154);
// Main loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
continue;
}
ImGui_ImplDX11_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f = 0.0f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::ColorEdit3("clear color", (float*)&clear_col);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver); // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, (float*)&clear_col);
ImGui::Render();
g_pSwapChain->Present(0, 0);
}
ImGui_ImplDX11_Shutdown();
CleanupDeviceD3D();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 0;
}

View File

@ -1,308 +0,0 @@
// ImGui Win32 + DirectX9 binding
// https://github.com/ocornut/imgui
#include <imgui.h>
#include "imgui_impl_dx9.h"
// DirectX
#include <d3dx9.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// Data
static HWND g_hWnd = 0;
static INT64 g_Time = 0;
static INT64 g_TicksPerSecond = 0;
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
static LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
static LPDIRECT3DINDEXBUFFER9 g_pIB = NULL;
static int VERTEX_BUFFER_SIZE = 20000; // TODO: Make buffers smaller and grow dynamically as needed.
static int INDEX_BUFFER_SIZE = 40000; // TODO: Make buffers smaller and grow dynamically as needed.
struct CUSTOMVERTEX
{
D3DXVECTOR3 pos;
D3DCOLOR col;
D3DXVECTOR2 uv;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
static void ImGui_ImplDX9_RenderDrawLists(ImDrawData* draw_data)
{
// Copy and convert all vertices into a single contiguous buffer
CUSTOMVERTEX* vtx_dst;
ImDrawIdx* idx_dst;
if (g_pVB->Lock(0, (UINT)(draw_data->TotalVtxCount * sizeof(CUSTOMVERTEX)), (void**)&vtx_dst, D3DLOCK_DISCARD) < 0)
return;
if (g_pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0)
return;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
const ImDrawVert* vtx_src = &cmd_list->VtxBuffer[0];
for (int i = 0; i < cmd_list->VtxBuffer.size(); i++)
{
vtx_dst->pos.x = vtx_src->pos.x;
vtx_dst->pos.y = vtx_src->pos.y;
vtx_dst->pos.z = 0.0f;
vtx_dst->col = (vtx_src->col & 0xFF00FF00) | ((vtx_src->col & 0xFF0000)>>16) | ((vtx_src->col & 0xFF) << 16); // RGBA --> ARGB for DirectX9
vtx_dst->uv.x = vtx_src->uv.x;
vtx_dst->uv.y = vtx_src->uv.y;
vtx_dst++;
vtx_src++;
}
memcpy(idx_dst, &cmd_list->IdxBuffer[0], cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx));
idx_dst += cmd_list->IdxBuffer.size();
}
g_pVB->Unlock();
g_pIB->Unlock();
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetIndices( g_pIB );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
// Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing
g_pd3dDevice->SetPixelShader( NULL );
g_pd3dDevice->SetVertexShader( NULL );
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, false );
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, false );
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
g_pd3dDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, false );
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_SCISSORTESTENABLE, true );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// Setup orthographic projection matrix
D3DXMATRIXA16 mat;
D3DXMatrixIdentity(&mat);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat);
D3DXMatrixOrthoOffCenterLH(&mat, 0.5f, ImGui::GetIO().DisplaySize.x+0.5f, ImGui::GetIO().DisplaySize.y+0.5f, 0.5f, -1.0f, +1.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat);
// Render command lists
int vtx_offset = 0;
int idx_offset = 0;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
pcmd->UserCallback(cmd_list, pcmd);
}
else
{
const RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };
g_pd3dDevice->SetTexture( 0, (LPDIRECT3DTEXTURE9)pcmd->TextureId );
g_pd3dDevice->SetScissorRect(&r);
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, vtx_offset, 0, (UINT)cmd_list->VtxBuffer.size(), idx_offset, pcmd->ElemCount/3);
}
idx_offset += pcmd->ElemCount;
}
vtx_offset += cmd_list->VtxBuffer.size();
}
}
LRESULT ImGui_ImplDX9_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
{
ImGuiIO& io = ImGui::GetIO();
switch (msg)
{
case WM_LBUTTONDOWN:
io.MouseDown[0] = true;
return true;
case WM_LBUTTONUP:
io.MouseDown[0] = false;
return true;
case WM_RBUTTONDOWN:
io.MouseDown[1] = true;
return true;
case WM_RBUTTONUP:
io.MouseDown[1] = false;
return true;
case WM_MOUSEWHEEL:
io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;
return true;
case WM_MOUSEMOVE:
io.MousePos.x = (signed short)(lParam);
io.MousePos.y = (signed short)(lParam >> 16);
return true;
case WM_KEYDOWN:
if (wParam < 256)
io.KeysDown[wParam] = 1;
return true;
case WM_KEYUP:
if (wParam < 256)
io.KeysDown[wParam] = 0;
return true;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
if (wParam > 0 && wParam < 0x10000)
io.AddInputCharacter((unsigned short)wParam);
return true;
}
return 0;
}
bool ImGui_ImplDX9_Init(void* hwnd, IDirect3DDevice9* device)
{
g_hWnd = (HWND)hwnd;
g_pd3dDevice = device;
if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))
return false;
if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time))
return false;
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.
io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;
io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;
io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;
io.KeyMap[ImGuiKey_Home] = VK_HOME;
io.KeyMap[ImGuiKey_End] = VK_END;
io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
io.RenderDrawListsFn = ImGui_ImplDX9_RenderDrawLists;
io.ImeWindowHandle = g_hWnd;
return true;
}
void ImGui_ImplDX9_Shutdown()
{
ImGui_ImplDX9_InvalidateDeviceObjects();
ImGui::Shutdown();
g_pd3dDevice = NULL;
g_hWnd = 0;
}
static void ImGui_ImplDX9_CreateFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
// Build
unsigned char* pixels;
int width, height, bytes_per_pixel;
io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height, &bytes_per_pixel);
// Create DX9 texture
LPDIRECT3DTEXTURE9 pTexture = NULL;
if (D3DXCreateTexture(g_pd3dDevice, width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8, D3DPOOL_DEFAULT, &pTexture) < 0)
{
IM_ASSERT(0);
return;
}
D3DLOCKED_RECT tex_locked_rect;
if (pTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK)
{
IM_ASSERT(0);
return;
}
for (int y = 0; y < height; y++)
memcpy((unsigned char *)tex_locked_rect.pBits + tex_locked_rect.Pitch * y, pixels + (width * bytes_per_pixel) * y, (width * bytes_per_pixel));
pTexture->UnlockRect(0);
// Store our identifier
io.Fonts->TexID = (void *)pTexture;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
}
bool ImGui_ImplDX9_CreateDeviceObjects()
{
if (!g_pd3dDevice)
return false;
if (g_pd3dDevice->CreateVertexBuffer(VERTEX_BUFFER_SIZE * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0)
return false;
if (g_pd3dDevice->CreateIndexBuffer(INDEX_BUFFER_SIZE * sizeof(ImDrawIdx), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIB, NULL) < 0)
return false;
ImGui_ImplDX9_CreateFontsTexture();
return true;
}
void ImGui_ImplDX9_InvalidateDeviceObjects()
{
if (!g_pd3dDevice)
return;
if (g_pVB)
{
g_pVB->Release();
g_pVB = NULL;
}
if (g_pIB)
{
g_pIB->Release();
g_pIB = NULL;
}
if (LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)ImGui::GetIO().Fonts->TexID)
{
tex->Release();
ImGui::GetIO().Fonts->TexID = 0;
}
}
void ImGui_ImplDX9_NewFrame()
{
if (!g_pVB)
ImGui_ImplDX9_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
RECT rect;
GetClientRect(g_hWnd, &rect);
io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));
// Setup time step
INT64 current_time;
QueryPerformanceCounter((LARGE_INTEGER *)&current_time);
io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;
g_Time = current_time;
// Read keyboard modifiers inputs
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
// io.MousePos : filled by WM_MOUSEMOVE events
// io.MouseDown : filled by WM_*BUTTON* events
// io.MouseWheel : filled by WM_MOUSEWHEEL events
// Hide OS mouse cursor if ImGui is drawing it
SetCursor(io.MouseDrawCursor ? NULL : LoadCursor(NULL, IDC_ARROW));
// Start the frame
ImGui::NewFrame();
}

View File

@ -1,19 +0,0 @@
// ImGui Win32 + DirectX9 binding
// https://github.com/ocornut/imgui
struct IDirect3DDevice9;
bool ImGui_ImplDX9_Init(void* hwnd, IDirect3DDevice9* device);
void ImGui_ImplDX9_Shutdown();
void ImGui_ImplDX9_NewFrame();
// Use if you want to reset your rendering device without losing ImGui state.
void ImGui_ImplDX9_InvalidateDeviceObjects();
bool ImGui_ImplDX9_CreateDeviceObjects();
// Handler for Win32 messages, update mouse/keyboard data.
// You may or not need this for your implementation, but it can serve as reference for handling inputs.
// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code.
/*
extern LRESULT ImGui_ImplDX9_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
*/

View File

@ -1,160 +0,0 @@
// ImGui - standalone example application for DirectX 9
#include <imgui.h>
#include "imgui_impl_dx9.h"
#include <d3dx9.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// Data
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
static D3DPRESENT_PARAMETERS g_d3dpp;
extern LRESULT ImGui_ImplDX9_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (ImGui_ImplDX9_WndProcHandler(hWnd, msg, wParam, lParam))
return true;
switch (msg)
{
case WM_SIZE:
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
{
ImGui_ImplDX9_InvalidateDeviceObjects();
g_d3dpp.BackBufferWidth = LOWORD(lParam);
g_d3dpp.BackBufferHeight = HIWORD(lParam);
HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp);
if (hr == D3DERR_INVALIDCALL)
IM_ASSERT(0);
ImGui_ImplDX9_CreateDeviceObjects();
}
return 0;
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int main(int, char**)
{
// Create application window
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, L"ImGui Example", NULL };
RegisterClassEx(&wc);
HWND hwnd = CreateWindow(L"ImGui Example", L"ImGui DirectX9 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
// Initialize Direct3D
LPDIRECT3D9 pD3D;
if ((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
{
UnregisterClass(L"ImGui Example", wc.hInstance);
return 0;
}
ZeroMemory(&g_d3dpp, sizeof(g_d3dpp));
g_d3dpp.Windowed = TRUE;
g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
g_d3dpp.EnableAutoDepthStencil = TRUE;
g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Create the D3DDevice
if (pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0)
{
pD3D->Release();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 0;
}
// Setup ImGui binding
ImGui_ImplDX9_Init(hwnd, g_pd3dDevice);
// Load Fonts
// (see extra_fonts/README.txt for more details)
//ImGuiIO& io = ImGui::GetIO();
//io.Fonts->AddFontDefault();
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f);
//io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
// Merge glyphs from multiple fonts into one (e.g. combine default font with another with Chinese glyphs, or add icons)
//ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 };
//ImFontConfig icons_config; icons_config.MergeMode = true; icons_config.PixelSnapH = true;
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 18.0f);
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/fontawesome-webfont.ttf", 18.0f, &icons_config, icons_ranges);
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_col = ImColor(114, 144, 154);
// Main loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
continue;
}
ImGui_ImplDX9_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f = 0.0f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::ColorEdit3("clear color", (float*)&clear_col);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver);
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, false);
D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_col.x*255.0f), (int)(clear_col.y*255.0f), (int)(clear_col.z*255.0f), (int)(clear_col.w*255.0f));
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0);
if (g_pd3dDevice->BeginScene() >= 0)
{
ImGui::Render();
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
ImGui_ImplDX9_Shutdown();
if (g_pd3dDevice) g_pd3dDevice->Release();
if (pD3D) pD3D->Release();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 0;
}

View File

@ -0,0 +1,36 @@
# Configuration
Dear ImGui outputs 16-bit vertex indices by default.
Allegro doesn't support them natively, so we have two solutions: convert the indices manually in imgui_impl_allegro5.cpp, or compile dear imgui with 32-bit indices.
You can either modify imconfig.h that comes with Dear ImGui (easier), or set a C++ preprocessor option IMGUI_USER_CONFIG to find to a filename.
We are providing `imconfig_allegro5.h` that enables 32-bit indices.
Note that the backend supports _BOTH_ 16-bit and 32-bit indices, but 32-bit indices will be slightly faster as they won't require a manual conversion.
# How to Build
### On Ubuntu 14.04+ and macOS
```bash
g++ -DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" -I .. -I ../.. main.cpp ../../backends/imgui_impl_allegro5.cpp ../../imgui*.cpp -lallegro -lallegro_main -lallegro_primitives -o allegro5_example
```
On macOS, install Allegro with homebrew: `brew install allegro`.
### On Windows with Visual Studio's CLI
You may install Allegro using vcpkg:
```
git clone https://github.com/Microsoft/vcpkg
cd vcpkg
bootstrap-vcpkg.bat
vcpkg install allegro5 --triplet=x86-windows ; for win32
vcpkg install allegro5 --triplet=x64-windows ; for win64
vcpkg integrate install ; register include / libs in Visual Studio
```
Build:
```
set ALLEGRODIR=path_to_your_allegro5_folder
cl /Zi /MD /I %ALLEGRODIR%\include /DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" /I .. /I ..\.. main.cpp ..\..\backends\imgui_impl_allegro5.cpp ..\..\imgui*.cpp /link /LIBPATH:%ALLEGRODIR%\lib allegro-5.0.10-monolith-md.lib user32.lib
```

View File

@ -0,0 +1,180 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{73F235B5-7D31-4FC6-8682-DDC5A097B9C1}</ProjectGuid>
<RootNamespace>example_allegro5</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<BufferSecurityCheck>false</BufferSecurityCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>
</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<BufferSecurityCheck>false</BufferSecurityCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>
</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\imgui.cpp" />
<ClCompile Include="..\..\imgui_demo.cpp" />
<ClCompile Include="..\..\imgui_draw.cpp" />
<ClCompile Include="..\..\imgui_tables.cpp" />
<ClCompile Include="..\..\imgui_widgets.cpp" />
<ClCompile Include="..\..\backends\imgui_impl_allegro5.cpp" />
<ClCompile Include="imconfig_allegro5.h" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h" />
<ClInclude Include="..\..\imgui.h" />
<ClInclude Include="..\..\imgui_internal.h" />
<ClInclude Include="..\..\backends\imgui_impl_allegro5.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\misc\debuggers\imgui.natvis" />
<None Include="..\README.txt" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -8,22 +8,31 @@
<UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="gl3w">
<UniqueIdentifier>{42f99867-3108-43b8-99d0-fabefaf1f2e3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="..\..\imgui.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="imgui_impl_glfw_gl3.cpp">
<ClCompile Include="..\..\imgui_demo.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="..\..\imgui_draw.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="main.cpp">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="..\libs\gl3w\GL\gl3w.c">
<Filter>gl3w</Filter>
<ClCompile Include="..\..\backends\imgui_impl_allegro5.cpp">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="imconfig_allegro5.h">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="..\..\imgui_tables.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="..\..\imgui_widgets.cpp">
<Filter>imgui</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@ -33,14 +42,17 @@
<ClInclude Include="..\..\imgui.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="imgui_impl_glfw_gl3.h">
<ClInclude Include="..\..\imgui_internal.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="..\..\backends\imgui_impl_allegro5.h">
<Filter>sources</Filter>
</ClInclude>
<ClInclude Include="..\libs\gl3w\GL\gl3w.h">
<Filter>gl3w</Filter>
</ClInclude>
<ClInclude Include="..\libs\gl3w\GL\glcorearb.h">
<Filter>gl3w</Filter>
</ClInclude>
</ItemGroup>
</Project>
<ItemGroup>
<None Include="..\README.txt" />
<None Include="..\..\misc\debuggers\imgui.natvis">
<Filter>sources</Filter>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,11 @@
//-----------------------------------------------------------------------------
// COMPILE-TIME OPTIONS FOR DEAR IMGUI ALLEGRO 5 EXAMPLE
// See imconfig.h for the full template
// Because Allegro doesn't support 16-bit vertex indices, we enable the compile-time option of imgui to use 32-bit indices
//-----------------------------------------------------------------------------
#pragma once
// Use 32-bit vertex indices because Allegro doesn't support 16-bit ones
// This allows us to avoid converting vertices format at runtime
#define ImDrawIdx int

View File

@ -0,0 +1,144 @@
// Dear ImGui: standalone example application for Allegro 5
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// On Windows, you can install Allegro5 using vcpkg:
// git clone https://github.com/Microsoft/vcpkg
// cd vcpkg
// bootstrap - vcpkg.bat
// vcpkg install allegro5 --triplet=x86-windows ; for win32
// vcpkg install allegro5 --triplet=x64-windows ; for win64
// vcpkg integrate install ; register include and libs in Visual Studio
#include <stdint.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include "imgui.h"
#include "imgui_impl_allegro5.h"
int main(int, char**)
{
// Setup Allegro
al_init();
al_install_keyboard();
al_install_mouse();
al_init_primitives_addon();
al_set_new_display_flags(ALLEGRO_RESIZABLE);
ALLEGRO_DISPLAY* display = al_create_display(1280, 720);
al_set_window_title(display, "Dear ImGui Allegro 5 example");
ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
al_register_event_source(queue, al_get_display_event_source(display));
al_register_event_source(queue, al_get_keyboard_event_source());
al_register_event_source(queue, al_get_mouse_event_source());
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
// Setup Dear ImGui style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer backends
ImGui_ImplAllegro5_Init(display);
// Load Fonts
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Read 'docs/FONTS.md' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
//io.Fonts->AddFontDefault();
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f);
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
bool show_demo_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// Main loop
bool running = true;
while (running)
{
// Poll and handle events (inputs, window resize, etc.)
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
ALLEGRO_EVENT ev;
while (al_get_next_event(queue, &ev))
{
ImGui_ImplAllegro5_ProcessEvent(&ev);
if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
running = false;
if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE)
{
ImGui_ImplAllegro5_InvalidateDeviceObjects();
al_acknowledge_resize(display);
ImGui_ImplAllegro5_CreateDeviceObjects();
}
}
// Start the Dear ImGui frame
ImGui_ImplAllegro5_NewFrame();
ImGui::NewFrame();
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
// Rendering
ImGui::Render();
al_clear_to_color(al_map_rgba_f(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w));
ImGui_ImplAllegro5_RenderDrawData(ImGui::GetDrawData());
al_flip_display();
}
// Cleanup
ImGui_ImplAllegro5_Shutdown();
ImGui::DestroyContext();
al_destroy_event_queue(queue);
al_destroy_display(display);
return 0;
}

View File

@ -0,0 +1,40 @@
cmake_minimum_required(VERSION 3.6)
project(ImGuiExample)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_library(${CMAKE_PROJECT_NAME} SHARED
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../imgui.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_demo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_draw.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_tables.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_widgets.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../backends/imgui_impl_android.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../backends/imgui_impl_opengl3.cpp
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c
)
set(CMAKE_SHARED_LINKER_FLAGS
"${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate"
)
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
IMGUI_IMPL_OPENGL_ES3
)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../..
${CMAKE_CURRENT_SOURCE_DIR}/../../backends
${ANDROID_NDK}/sources/android/native_app_glue
)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
android
EGL
GLESv3
log
)

View File

@ -0,0 +1,12 @@
.cxx
.externalNativeBuild
build/
*.iml
.idea
.gradle
local.properties
# Android Studio puts a Gradle wrapper here, that we don't want:
gradle/
gradlew*

View File

@ -0,0 +1,34 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
compileSdkVersion 29
buildToolsVersion "30.0.3"
ndkVersion "21.4.7075529"
defaultConfig {
applicationId "imgui.example.android"
minSdkVersion 23
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
}
}
externalNativeBuild {
cmake {
path "../../CMakeLists.txt"
}
}
}
repositories {
mavenCentral()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="imgui.example.android">
<application
android:label="ImGuiExample"
android:allowBackup="false"
android:fullBackupContent="false"
android:hasCode="true">
<activity
android:name="imgui.example.android.MainActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation|keyboardHidden|screenSize">
<meta-data android:name="android.app.lib_name"
android:value="ImGuiExample" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -0,0 +1,40 @@
package imgui.example.android
import android.app.NativeActivity
import android.os.Bundle
import android.content.Context
import android.view.inputmethod.InputMethodManager
import android.view.KeyEvent
import java.util.concurrent.LinkedBlockingQueue
class MainActivity : NativeActivity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
fun showSoftInput() {
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(this.window.decorView, 0)
}
fun hideSoftInput() {
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(this.window.decorView.windowToken, 0)
}
// Queue for the Unicode characters to be polled from native code (via pollUnicodeChar())
private var unicodeCharacterQueue: LinkedBlockingQueue<Int> = LinkedBlockingQueue()
// We assume dispatchKeyEvent() of the NativeActivity is actually called for every
// KeyEvent and not consumed by any View before it reaches here
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if (event.action == KeyEvent.ACTION_DOWN) {
unicodeCharacterQueue.offer(event.getUnicodeChar(event.metaState))
}
return super.dispatchKeyEvent(event)
}
fun pollUnicodeChar(): Int {
return unicodeCharacterQueue.poll() ?: 0
}
}

View File

@ -0,0 +1,24 @@
buildscript {
ext.kotlin_version = '1.4.31'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@ -0,0 +1 @@
include ':app'

View File

@ -0,0 +1,369 @@
// dear imgui: standalone example application for Android + OpenGL ES 3
// If you are new to dear imgui, see examples/README.txt and documentation at the top of imgui.cpp.
#include "imgui.h"
#include "imgui_impl_android.h"
#include "imgui_impl_opengl3.h"
#include <android/log.h>
#include <android_native_app_glue.h>
#include <android/asset_manager.h>
#include <EGL/egl.h>
#include <GLES3/gl3.h>
// Data
static EGLDisplay g_EglDisplay = EGL_NO_DISPLAY;
static EGLSurface g_EglSurface = EGL_NO_SURFACE;
static EGLContext g_EglContext = EGL_NO_CONTEXT;
static struct android_app* g_App = NULL;
static bool g_Initialized = false;
static char g_LogTag[] = "ImGuiExample";
// Forward declarations of helper functions
static int ShowSoftKeyboardInput();
static int PollUnicodeChars();
static int GetAssetData(const char* filename, void** out_data);
void init(struct android_app* app)
{
if (g_Initialized)
return;
g_App = app;
ANativeWindow_acquire(g_App->window);
// Initialize EGL
// This is mostly boilerplate code for EGL...
{
g_EglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (g_EglDisplay == EGL_NO_DISPLAY)
__android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglGetDisplay(EGL_DEFAULT_DISPLAY) returned EGL_NO_DISPLAY");
if (eglInitialize(g_EglDisplay, 0, 0) != EGL_TRUE)
__android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglInitialize() returned with an error");
const EGLint egl_attributes[] = { EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE };
EGLint num_configs = 0;
if (eglChooseConfig(g_EglDisplay, egl_attributes, nullptr, 0, &num_configs) != EGL_TRUE)
__android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglChooseConfig() returned with an error");
if (num_configs == 0)
__android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglChooseConfig() returned 0 matching config");
// Get the first matching config
EGLConfig egl_config;
eglChooseConfig(g_EglDisplay, egl_attributes, &egl_config, 1, &num_configs);
EGLint egl_format;
eglGetConfigAttrib(g_EglDisplay, egl_config, EGL_NATIVE_VISUAL_ID, &egl_format);
ANativeWindow_setBuffersGeometry(g_App->window, 0, 0, egl_format);
const EGLint egl_context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };
g_EglContext = eglCreateContext(g_EglDisplay, egl_config, EGL_NO_CONTEXT, egl_context_attributes);
if (g_EglContext == EGL_NO_CONTEXT)
__android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglCreateContext() returned EGL_NO_CONTEXT");
g_EglSurface = eglCreateWindowSurface(g_EglDisplay, egl_config, g_App->window, NULL);
eglMakeCurrent(g_EglDisplay, g_EglSurface, g_EglSurface, g_EglContext);
}
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
// Disable loading/saving of .ini file from disk.
// FIXME: Consider using LoadIniSettingsFromMemory() / SaveIniSettingsToMemory() to save in appropriate location for Android.
io.IniFilename = NULL;
// Setup Dear ImGui style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer backends
ImGui_ImplAndroid_Init(g_App->window);
ImGui_ImplOpenGL3_Init("#version 300 es");
// Load Fonts
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Read 'docs/FONTS.md' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
// - Android: The TTF files have to be placed into the assets/ directory (android/app/src/main/assets), we use our GetAssetData() helper to retrieve them.
// We load the default font with increased size to improve readability on many devices with "high" DPI.
// FIXME: Put some effort into DPI awareness.
// Important: when calling AddFontFromMemoryTTF(), ownership of font_data is transfered by Dear ImGui by default (deleted is handled by Dear ImGui), unless we set FontDataOwnedByAtlas=false in ImFontConfig
ImFontConfig font_cfg;
font_cfg.SizePixels = 22.0f;
io.Fonts->AddFontDefault(&font_cfg);
//void* font_data;
//int font_data_size;
//ImFont* font;
//font_data_size = GetAssetData("Roboto-Medium.ttf", &font_data);
//font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f);
//IM_ASSERT(font != NULL);
//font_data_size = GetAssetData("Cousine-Regular.ttf", &font_data);
//font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 15.0f);
//IM_ASSERT(font != NULL);
//font_data_size = GetAssetData("DroidSans.ttf", &font_data);
//font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f);
//IM_ASSERT(font != NULL);
//font_data_size = GetAssetData("ProggyTiny.ttf", &font_data);
//font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 10.0f);
//IM_ASSERT(font != NULL);
//font_data_size = GetAssetData("ArialUni.ttf", &font_data);
//font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
// Arbitrary scale-up
// FIXME: Put some effort into DPI awareness
ImGui::GetStyle().ScaleAllSizes(3.0f);
g_Initialized = true;
}
void tick()
{
ImGuiIO& io = ImGui::GetIO();
if (g_EglDisplay == EGL_NO_DISPLAY)
return;
// Our state
static bool show_demo_window = true;
static bool show_another_window = false;
static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// Poll Unicode characters via JNI
// FIXME: do not call this every frame because of JNI overhead
PollUnicodeChars();
// Open on-screen (soft) input if requested by Dear ImGui
static bool WantTextInputLast = false;
if (io.WantTextInput && !WantTextInputLast)
ShowSoftKeyboardInput();
WantTextInputLast = io.WantTextInput;
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplAndroid_NewFrame();
ImGui::NewFrame();
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
// Rendering
ImGui::Render();
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
eglSwapBuffers(g_EglDisplay, g_EglSurface);
}
void shutdown()
{
if (!g_Initialized)
return;
// Cleanup
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplAndroid_Shutdown();
ImGui::DestroyContext();
if (g_EglDisplay != EGL_NO_DISPLAY)
{
eglMakeCurrent(g_EglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
if (g_EglContext != EGL_NO_CONTEXT)
eglDestroyContext(g_EglDisplay, g_EglContext);
if (g_EglSurface != EGL_NO_SURFACE)
eglDestroySurface(g_EglDisplay, g_EglSurface);
eglTerminate(g_EglDisplay);
}
g_EglDisplay = EGL_NO_DISPLAY;
g_EglContext = EGL_NO_CONTEXT;
g_EglSurface = EGL_NO_SURFACE;
ANativeWindow_release(g_App->window);
g_Initialized = false;
}
static void handleAppCmd(struct android_app* app, int32_t appCmd)
{
switch (appCmd)
{
case APP_CMD_SAVE_STATE:
break;
case APP_CMD_INIT_WINDOW:
init(app);
break;
case APP_CMD_TERM_WINDOW:
shutdown();
break;
case APP_CMD_GAINED_FOCUS:
break;
case APP_CMD_LOST_FOCUS:
break;
}
}
static int32_t handleInputEvent(struct android_app* app, AInputEvent* inputEvent)
{
return ImGui_ImplAndroid_HandleInputEvent(inputEvent);
}
void android_main(struct android_app* app)
{
app->onAppCmd = handleAppCmd;
app->onInputEvent = handleInputEvent;
while (true)
{
int out_events;
struct android_poll_source* out_data;
// Poll all events. If the app is not visible, this loop blocks until g_Initialized == true.
while (ALooper_pollAll(g_Initialized ? 0 : -1, NULL, &out_events, (void**)&out_data) >= 0)
{
// Process one event
if (out_data != NULL)
out_data->process(app, out_data);
// Exit the app by returning from within the infinite loop
if (app->destroyRequested != 0)
{
// shutdown() should have been called already while processing the
// app command APP_CMD_TERM_WINDOW. But we play save here
if (!g_Initialized)
shutdown();
return;
}
}
// Initiate a new frame
tick();
}
}
// Unfortunately, there is no way to show the on-screen input from native code.
// Therefore, we call ShowSoftKeyboardInput() of the main activity implemented in MainActivity.kt via JNI.
static int ShowSoftKeyboardInput()
{
JavaVM* java_vm = g_App->activity->vm;
JNIEnv* java_env = NULL;
jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6);
if (jni_return == JNI_ERR)
return -1;
jni_return = java_vm->AttachCurrentThread(&java_env, NULL);
if (jni_return != JNI_OK)
return -2;
jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz);
if (native_activity_clazz == NULL)
return -3;
jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "showSoftInput", "()V");
if (method_id == NULL)
return -4;
java_env->CallVoidMethod(g_App->activity->clazz, method_id);
jni_return = java_vm->DetachCurrentThread();
if (jni_return != JNI_OK)
return -5;
return 0;
}
// Unfortunately, the native KeyEvent implementation has no getUnicodeChar() function.
// Therefore, we implement the processing of KeyEvents in MainActivity.kt and poll
// the resulting Unicode characters here via JNI and send them to Dear ImGui.
static int PollUnicodeChars()
{
JavaVM* java_vm = g_App->activity->vm;
JNIEnv* java_env = NULL;
jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6);
if (jni_return == JNI_ERR)
return -1;
jni_return = java_vm->AttachCurrentThread(&java_env, NULL);
if (jni_return != JNI_OK)
return -2;
jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz);
if (native_activity_clazz == NULL)
return -3;
jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "pollUnicodeChar", "()I");
if (method_id == NULL)
return -4;
// Send the actual characters to Dear ImGui
ImGuiIO& io = ImGui::GetIO();
jint unicode_character;
while ((unicode_character = java_env->CallIntMethod(g_App->activity->clazz, method_id)) != 0)
io.AddInputCharacter(unicode_character);
jni_return = java_vm->DetachCurrentThread();
if (jni_return != JNI_OK)
return -5;
return 0;
}
// Helper to retrieve data placed into the assets/ directory (android/app/src/main/assets)
static int GetAssetData(const char* filename, void** outData)
{
int num_bytes = 0;
AAsset* asset_descriptor = AAssetManager_open(g_App->activity->assetManager, filename, AASSET_MODE_BUFFER);
if (asset_descriptor)
{
num_bytes = AAsset_getLength(asset_descriptor);
*outData = IM_ALLOC(num_bytes);
int64_t num_bytes_read = AAsset_read(asset_descriptor, *outData, num_bytes);
AAsset_close(asset_descriptor);
IM_ASSERT(num_bytes_read == num_bytes);
}
return num_bytes;
}

View File

@ -0,0 +1,10 @@
# iOS / OSX Metal example
## Introduction
This example shows how to integrate Dear ImGui with Metal. It is based on the "cross-platform" game template provided with Xcode as of Xcode 9.
Consider basing your work off the example_glfw_metal/ or example_sdl_metal/ examples. They are better supported and will be portable unlike this one.

View File

@ -0,0 +1,499 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 48;
objects = {
/* Begin PBXBuildFile section */
07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; };
07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; };
5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822D257677DB0038A28D /* imgui_tables.cpp */; };
8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8309BD8E253CCAAA0045E2A1 /* UIKit.framework */; };
8309BDA5253CCC070045E2A1 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDA0253CCBC10045E2A1 /* main.mm */; };
8309BDA8253CCC080045E2A1 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDA0253CCBC10045E2A1 /* main.mm */; };
8309BDBB253CCCAD0045E2A1 /* imgui_impl_metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */; };
8309BDBE253CCCB60045E2A1 /* imgui_impl_metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */; };
8309BDBF253CCCB60045E2A1 /* imgui_impl_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */; };
8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8309BDC5253CCCFE0045E2A1 /* AppKit.framework */; };
8309BDFC253CDAB30045E2A1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */; };
8309BE04253CDAB60045E2A1 /* MainMenu.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */; };
83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9E420EB46B900295997 /* Metal.framework */; };
83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9E620EB46BD00295997 /* MetalKit.framework */; };
83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9EA20EB471700295997 /* MetalKit.framework */; };
83BBE9ED20EB471700295997 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9EB20EB471700295997 /* Metal.framework */; };
83BBEA0520EB54E700295997 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0120EB54E700295997 /* imgui_draw.cpp */; };
83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0120EB54E700295997 /* imgui_draw.cpp */; };
83BBEA0720EB54E700295997 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0220EB54E700295997 /* imgui_demo.cpp */; };
83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0220EB54E700295997 /* imgui_demo.cpp */; };
83BBEA0920EB54E700295997 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0320EB54E700295997 /* imgui.cpp */; };
83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0320EB54E700295997 /* imgui.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
07A82ED62139413C0078D120 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = "<group>"; };
07A82ED72139413C0078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = "<group>"; };
5079822D257677DB0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = "<group>"; };
8307E7C420E9F9C900473790 /* example_apple_metal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example_apple_metal.app; sourceTree = BUILT_PRODUCTS_DIR; };
8307E7DA20E9F9C900473790 /* example_apple_metal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example_apple_metal.app; sourceTree = BUILT_PRODUCTS_DIR; };
8309BD8E253CCAAA0045E2A1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
8309BDA0253CCBC10045E2A1 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_metal.mm; path = ../../backends/imgui_impl_metal.mm; sourceTree = "<group>"; };
8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_osx.mm; path = ../../backends/imgui_impl_osx.mm; sourceTree = "<group>"; };
8309BDC5253CCCFE0045E2A1 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
8309BDF8253CDAAE0045E2A1 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = "<group>"; };
8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MainMenu.storyboard; sourceTree = "<group>"; };
8309BDFB253CDAAE0045E2A1 /* Info-macOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-macOS.plist"; sourceTree = "<group>"; };
83BBE9E420EB46B900295997 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; };
83BBE9E620EB46BD00295997 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/MetalKit.framework; sourceTree = DEVELOPER_DIR; };
83BBE9E820EB46C100295997 /* ModelIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ModelIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/ModelIO.framework; sourceTree = DEVELOPER_DIR; };
83BBE9EA20EB471700295997 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
83BBE9EB20EB471700295997 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
83BBE9EE20EB471C00295997 /* ModelIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ModelIO.framework; path = System/Library/Frameworks/ModelIO.framework; sourceTree = SDKROOT; };
83BBEA0020EB54E700295997 /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = "<group>"; };
83BBEA0120EB54E700295997 /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = "<group>"; };
83BBEA0220EB54E700295997 /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../imgui_demo.cpp; sourceTree = "<group>"; };
83BBEA0320EB54E700295997 /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = "<group>"; };
83BBEA0420EB54E700295997 /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8307E7C120E9F9C900473790 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */,
83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */,
83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8307E7D720E9F9C900473790 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */,
83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */,
83BBE9ED20EB471700295997 /* Metal.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
8307E7B520E9F9C700473790 = {
isa = PBXGroup;
children = (
83BBE9F020EB544400295997 /* imgui */,
8309BD9E253CCBA70045E2A1 /* example */,
8307E7C520E9F9C900473790 /* Products */,
83BBE9E320EB46B800295997 /* Frameworks */,
);
sourceTree = "<group>";
};
8307E7C520E9F9C900473790 /* Products */ = {
isa = PBXGroup;
children = (
8307E7C420E9F9C900473790 /* example_apple_metal.app */,
8307E7DA20E9F9C900473790 /* example_apple_metal.app */,
);
name = Products;
sourceTree = "<group>";
};
8309BD9E253CCBA70045E2A1 /* example */ = {
isa = PBXGroup;
children = (
8309BDF6253CDAAE0045E2A1 /* iOS */,
8309BDF9253CDAAE0045E2A1 /* macOS */,
8309BDA0253CCBC10045E2A1 /* main.mm */,
);
name = example;
sourceTree = "<group>";
};
8309BDF6253CDAAE0045E2A1 /* iOS */ = {
isa = PBXGroup;
children = (
8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */,
8309BDF8253CDAAE0045E2A1 /* Info-iOS.plist */,
);
path = iOS;
sourceTree = "<group>";
};
8309BDF9253CDAAE0045E2A1 /* macOS */ = {
isa = PBXGroup;
children = (
8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */,
8309BDFB253CDAAE0045E2A1 /* Info-macOS.plist */,
);
path = macOS;
sourceTree = "<group>";
};
83BBE9E320EB46B800295997 /* Frameworks */ = {
isa = PBXGroup;
children = (
8309BDC5253CCCFE0045E2A1 /* AppKit.framework */,
8309BD8E253CCAAA0045E2A1 /* UIKit.framework */,
83BBE9EE20EB471C00295997 /* ModelIO.framework */,
83BBE9EB20EB471700295997 /* Metal.framework */,
83BBE9EA20EB471700295997 /* MetalKit.framework */,
83BBE9E820EB46C100295997 /* ModelIO.framework */,
83BBE9E620EB46BD00295997 /* MetalKit.framework */,
83BBE9E420EB46B900295997 /* Metal.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
83BBE9F020EB544400295997 /* imgui */ = {
isa = PBXGroup;
children = (
5079822D257677DB0038A28D /* imgui_tables.cpp */,
8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */,
8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */,
83BBEA0420EB54E700295997 /* imconfig.h */,
83BBEA0320EB54E700295997 /* imgui.cpp */,
83BBEA0020EB54E700295997 /* imgui.h */,
83BBEA0220EB54E700295997 /* imgui_demo.cpp */,
83BBEA0120EB54E700295997 /* imgui_draw.cpp */,
07A82ED62139413C0078D120 /* imgui_internal.h */,
07A82ED72139413C0078D120 /* imgui_widgets.cpp */,
);
name = imgui;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
8307E7C320E9F9C900473790 /* example_apple_metal_ios */ = {
isa = PBXNativeTarget;
buildConfigurationList = 8307E7F020E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_ios" */;
buildPhases = (
8307E7C020E9F9C900473790 /* Sources */,
8307E7C120E9F9C900473790 /* Frameworks */,
8307E7C220E9F9C900473790 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = example_apple_metal_ios;
productName = "imguiex iOS";
productReference = 8307E7C420E9F9C900473790 /* example_apple_metal.app */;
productType = "com.apple.product-type.application";
};
8307E7D920E9F9C900473790 /* example_apple_metal_macos */ = {
isa = PBXNativeTarget;
buildConfigurationList = 8307E7F320E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_macos" */;
buildPhases = (
8307E7D620E9F9C900473790 /* Sources */,
8307E7D720E9F9C900473790 /* Frameworks */,
8307E7D820E9F9C900473790 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = example_apple_metal_macos;
productName = "imguiex macOS";
productReference = 8307E7DA20E9F9C900473790 /* example_apple_metal.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
8307E7B620E9F9C700473790 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1200;
ORGANIZATIONNAME = "Warren Moore";
TargetAttributes = {
8307E7C320E9F9C900473790 = {
CreatedOnToolsVersion = 9.4.1;
ProvisioningStyle = Automatic;
};
8307E7D920E9F9C900473790 = {
CreatedOnToolsVersion = 9.4.1;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 8307E7B920E9F9C700473790 /* Build configuration list for PBXProject "example_apple_metal" */;
compatibilityVersion = "Xcode 8.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 8307E7B520E9F9C700473790;
productRefGroup = 8307E7C520E9F9C900473790 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
8307E7C320E9F9C900473790 /* example_apple_metal_ios */,
8307E7D920E9F9C900473790 /* example_apple_metal_macos */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8307E7C220E9F9C900473790 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8309BDFC253CDAB30045E2A1 /* LaunchScreen.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8307E7D820E9F9C900473790 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8309BE04253CDAB60045E2A1 /* MainMenu.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8307E7C020E9F9C900473790 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8309BDBB253CCCAD0045E2A1 /* imgui_impl_metal.mm in Sources */,
83BBEA0920EB54E700295997 /* imgui.cpp in Sources */,
83BBEA0720EB54E700295997 /* imgui_demo.cpp in Sources */,
83BBEA0520EB54E700295997 /* imgui_draw.cpp in Sources */,
5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */,
07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */,
8309BDA5253CCC070045E2A1 /* main.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8307E7D620E9F9C900473790 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8309BDBE253CCCB60045E2A1 /* imgui_impl_metal.mm in Sources */,
8309BDBF253CCCB60045E2A1 /* imgui_impl_osx.mm in Sources */,
83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */,
83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */,
83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */,
5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */,
07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */,
8309BDA8253CCC080045E2A1 /* main.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
8307E7EE20E9F9C900473790 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
};
name = Debug;
};
8307E7EF20E9F9C900473790 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MTL_ENABLE_DEBUG_INFO = NO;
};
name = Release;
};
8307E7F120E9F9C900473790 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "$(SRCROOT)/iOS/Info-iOS.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-ios";
PRODUCT_NAME = example_apple_metal;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**";
};
name = Debug;
};
8307E7F220E9F9C900473790 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "$(SRCROOT)/iOS/Info-iOS.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-ios";
PRODUCT_NAME = example_apple_metal;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
8307E7F420E9F9C900473790 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "$(SRCROOT)/macOS/Info-macOS.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-macos";
PRODUCT_NAME = example_apple_metal;
SDKROOT = macosx;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**";
};
name = Debug;
};
8307E7F520E9F9C900473790 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "$(SRCROOT)/macOS/Info-macOS.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-macos";
PRODUCT_NAME = example_apple_metal;
SDKROOT = macosx;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
8307E7B920E9F9C700473790 /* Build configuration list for PBXProject "example_apple_metal" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8307E7EE20E9F9C900473790 /* Debug */,
8307E7EF20E9F9C900473790 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8307E7F020E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_ios" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8307E7F120E9F9C900473790 /* Debug */,
8307E7F220E9F9C900473790 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8307E7F320E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_macos" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8307E7F420E9F9C900473790 /* Debug */,
8307E7F520E9F9C900473790 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 8307E7B620E9F9C700473790 /* Project object */;
}

View File

@ -3,33 +3,32 @@
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>org.imgui.example.$(PRODUCT_NAME:rfc1034identifier)</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<string>imgui</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
<string>metal</string>
</array>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIStatusBarHidden</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
@ -37,6 +36,7 @@
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
<color key="backgroundColor" red="0.27843137254901962" green="0.36078431372549019" blue="0.50196078431372548" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>imgui</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSMainStoryboardFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="ImGui" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="ImGui" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="Ady-hI-5gd" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-362" y="-38"/>
</scene>
</scenes>
</document>

View File

@ -0,0 +1,356 @@
// Dear ImGui: standalone example application for OSX + Metal.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#import <Foundation/Foundation.h>
#if TARGET_OS_OSX
#import <Cocoa/Cocoa.h>
#else
#import <UIKit/UIKit.h>
#endif
#import <Metal/Metal.h>
#import <MetalKit/MetalKit.h>
#include "imgui.h"
#include "imgui_impl_metal.h"
#if TARGET_OS_OSX
#include "imgui_impl_osx.h"
@interface AppViewController : NSViewController
@end
#else
@interface AppViewController : UIViewController
@end
#endif
@interface AppViewController () <MTKViewDelegate>
@property (nonatomic, readonly) MTKView *mtkView;
@property (nonatomic, strong) id <MTLDevice> device;
@property (nonatomic, strong) id <MTLCommandQueue> commandQueue;
@end
//-----------------------------------------------------------------------------------
// AppViewController
//-----------------------------------------------------------------------------------
@implementation AppViewController
-(instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
_device = MTLCreateSystemDefaultDevice();
_commandQueue = [_device newCommandQueue];
if (!self.device)
{
NSLog(@"Metal is not supported");
abort();
}
// Setup Dear ImGui context
// FIXME: This example doesn't have proper cleanup...
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// Setup Dear ImGui style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
// Setup Renderer backend
ImGui_ImplMetal_Init(_device);
// Load Fonts
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Read 'docs/FONTS.txt' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
//io.Fonts->AddFontDefault();
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f);
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
return self;
}
-(MTKView *)mtkView
{
return (MTKView *)self.view;
}
-(void)loadView
{
self.view = [[MTKView alloc] initWithFrame:CGRectMake(0, 0, 1200, 720)];
}
-(void)viewDidLoad
{
[super viewDidLoad];
self.mtkView.device = self.device;
self.mtkView.delegate = self;
#if TARGET_OS_OSX
// Add a tracking area in order to receive mouse events whenever the mouse is within the bounds of our view
NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect
options:NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways
owner:self
userInfo:nil];
[self.view addTrackingArea:trackingArea];
// If we want to receive key events, we either need to be in the responder chain of the key view,
// or else we can install a local monitor. The consequence of this heavy-handed approach is that
// we receive events for all controls, not just Dear ImGui widgets. If we had native controls in our
// window, we'd want to be much more careful than just ingesting the complete event stream.
// To match the behavior of other backends, we pass every event down to the OS.
NSEventMask eventMask = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged;
[NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^NSEvent * _Nullable(NSEvent *event)
{
ImGui_ImplOSX_HandleEvent(event, self.view);
return event;
}];
ImGui_ImplOSX_Init();
#endif
}
-(void)drawInMTKView:(MTKView*)view
{
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize.x = view.bounds.size.width;
io.DisplaySize.y = view.bounds.size.height;
#if TARGET_OS_OSX
CGFloat framebufferScale = view.window.screen.backingScaleFactor ?: NSScreen.mainScreen.backingScaleFactor;
#else
CGFloat framebufferScale = view.window.screen.scale ?: UIScreen.mainScreen.scale;
#endif
io.DisplayFramebufferScale = ImVec2(framebufferScale, framebufferScale);
io.DeltaTime = 1 / float(view.preferredFramesPerSecond ?: 60);
id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer];
MTLRenderPassDescriptor* renderPassDescriptor = view.currentRenderPassDescriptor;
if (renderPassDescriptor == nil)
{
[commandBuffer commit];
return;
}
// Start the Dear ImGui frame
ImGui_ImplMetal_NewFrame(renderPassDescriptor);
#if TARGET_OS_OSX
ImGui_ImplOSX_NewFrame(view);
#endif
ImGui::NewFrame();
// Our state (make them static = more or less global) as a convenience to keep the example terse.
static bool show_demo_window = true;
static bool show_another_window = false;
static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
// Rendering
ImGui::Render();
ImDrawData* draw_data = ImGui::GetDrawData();
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
[renderEncoder pushDebugGroup:@"Dear ImGui rendering"];
ImGui_ImplMetal_RenderDrawData(draw_data, commandBuffer, renderEncoder);
[renderEncoder popDebugGroup];
[renderEncoder endEncoding];
// Present
[commandBuffer presentDrawable:view.currentDrawable];
[commandBuffer commit];
}
-(void)mtkView:(MTKView*)view drawableSizeWillChange:(CGSize)size
{
}
//-----------------------------------------------------------------------------------
// Input processing
//-----------------------------------------------------------------------------------
#if TARGET_OS_OSX
// Forward Mouse/Keyboard events to Dear ImGui OSX backend.
// Other events are registered via addLocalMonitorForEventsMatchingMask()
-(void)mouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)rightMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)otherMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)mouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)rightMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)otherMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)mouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)mouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)rightMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)rightMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)otherMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)otherMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
-(void)scrollWheel:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); }
#else
// This touch mapping is super cheesy/hacky. We treat any touch on the screen
// as if it were a depressed left mouse button, and we don't bother handling
// multitouch correctly at all. This causes the "cursor" to behave very erratically
// when there are multiple active touches. But for demo purposes, single-touch
// interaction actually works surprisingly well.
-(void)updateIOWithTouchEvent:(UIEvent *)event
{
UITouch *anyTouch = event.allTouches.anyObject;
CGPoint touchLocation = [anyTouch locationInView:self.view];
ImGuiIO &io = ImGui::GetIO();
io.MousePos = ImVec2(touchLocation.x, touchLocation.y);
BOOL hasActiveTouch = NO;
for (UITouch *touch in event.allTouches)
{
if (touch.phase != UITouchPhaseEnded && touch.phase != UITouchPhaseCancelled)
{
hasActiveTouch = YES;
break;
}
}
io.MouseDown[0] = hasActiveTouch;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; }
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; }
-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; }
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; }
#endif
@end
//-----------------------------------------------------------------------------------
// AppDelegate
//-----------------------------------------------------------------------------------
#if TARGET_OS_OSX
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (nonatomic, strong) NSWindow *window;
@end
@implementation AppDelegate
-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
{
return YES;
}
-(instancetype)init
{
if (self = [super init])
{
NSViewController *rootViewController = [[AppViewController alloc] initWithNibName:nil bundle:nil];
self.window = [[NSWindow alloc] initWithContentRect:NSZeroRect
styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable
backing:NSBackingStoreBuffered
defer:NO];
self.window.contentViewController = rootViewController;
[self.window orderFront:self];
[self.window center];
[self.window becomeKeyWindow];
}
return self;
}
@end
#else
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
@implementation AppDelegate
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions
{
UIViewController *rootViewController = [[AppViewController alloc] init];
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
#endif
//-----------------------------------------------------------------------------------
// Application main() function
//-----------------------------------------------------------------------------------
#if TARGET_OS_OSX
int main(int argc, const char * argv[])
{
return NSApplicationMain(argc, argv);
}
#else
int main(int argc, char * argv[])
{
@autoreleasepool
{
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
#endif

View File

@ -0,0 +1,328 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 48;
objects = {
/* Begin PBXBuildFile section */
07A82EDB213941D00078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82EDA213941D00078D120 /* imgui_widgets.cpp */; };
4080A99820B02D340036BA46 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4080A98A20B02CD90036BA46 /* main.mm */; };
4080A9A220B034280036BA46 /* imgui_impl_opengl2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */; };
4080A9AD20B0343C0036BA46 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9A620B0343C0036BA46 /* imgui_demo.cpp */; };
4080A9AE20B0343C0036BA46 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9A720B0343C0036BA46 /* imgui.cpp */; };
4080A9AF20B0343C0036BA46 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */; };
4080A9B020B0347A0036BA46 /* imgui_impl_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4080A99F20B034280036BA46 /* imgui_impl_osx.mm */; };
4080A9B320B034E40036BA46 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4080A9B220B034E40036BA46 /* Cocoa.framework */; };
4080A9B520B034EA0036BA46 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4080A9B420B034EA0036BA46 /* OpenGL.framework */; };
50798230257677FD0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822F257677FC0038A28D /* imgui_tables.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
4080A96920B029B00036BA46 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
07A82EDA213941D00078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = "<group>"; };
4080A96B20B029B00036BA46 /* example_osx_opengl2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = example_osx_opengl2; sourceTree = BUILT_PRODUCTS_DIR; };
4080A98A20B02CD90036BA46 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = SOURCE_ROOT; };
4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_impl_opengl2.cpp; path = ../../backends/imgui_impl_opengl2.cpp; sourceTree = "<group>"; };
4080A99F20B034280036BA46 /* imgui_impl_osx.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_osx.mm; path = ../../backends/imgui_impl_osx.mm; sourceTree = "<group>"; };
4080A9A020B034280036BA46 /* imgui_impl_opengl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_opengl2.h; path = ../../backends/imgui_impl_opengl2.h; sourceTree = "<group>"; };
4080A9A120B034280036BA46 /* imgui_impl_osx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_osx.h; path = ../../backends/imgui_impl_osx.h; sourceTree = "<group>"; };
4080A9A520B0343C0036BA46 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = "<group>"; };
4080A9A620B0343C0036BA46 /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../imgui_demo.cpp; sourceTree = "<group>"; };
4080A9A720B0343C0036BA46 /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = "<group>"; };
4080A9A820B0343C0036BA46 /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = "<group>"; };
4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = "<group>"; };
4080A9AC20B0343C0036BA46 /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = "<group>"; };
4080A9B220B034E40036BA46 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
4080A9B420B034EA0036BA46 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
5079822F257677FC0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
4080A96820B029B00036BA46 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4080A9B520B034EA0036BA46 /* OpenGL.framework in Frameworks */,
4080A9B320B034E40036BA46 /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
4080A96220B029B00036BA46 = {
isa = PBXGroup;
children = (
5079822F257677FC0038A28D /* imgui_tables.cpp */,
4080A9AC20B0343C0036BA46 /* imconfig.h */,
4080A9A720B0343C0036BA46 /* imgui.cpp */,
4080A9A820B0343C0036BA46 /* imgui.h */,
07A82EDA213941D00078D120 /* imgui_widgets.cpp */,
4080A9A620B0343C0036BA46 /* imgui_demo.cpp */,
4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */,
4080A9A520B0343C0036BA46 /* imgui_internal.h */,
4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */,
4080A9A020B034280036BA46 /* imgui_impl_opengl2.h */,
4080A9A120B034280036BA46 /* imgui_impl_osx.h */,
4080A99F20B034280036BA46 /* imgui_impl_osx.mm */,
4080A98A20B02CD90036BA46 /* main.mm */,
4080A96C20B029B00036BA46 /* Products */,
4080A9B120B034E40036BA46 /* Frameworks */,
);
sourceTree = "<group>";
};
4080A96C20B029B00036BA46 /* Products */ = {
isa = PBXGroup;
children = (
4080A96B20B029B00036BA46 /* example_osx_opengl2 */,
);
name = Products;
sourceTree = "<group>";
};
4080A9B120B034E40036BA46 /* Frameworks */ = {
isa = PBXGroup;
children = (
4080A9B420B034EA0036BA46 /* OpenGL.framework */,
4080A9B220B034E40036BA46 /* Cocoa.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
4080A96A20B029B00036BA46 /* example_osx_opengl2 */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4080A97220B029B00036BA46 /* Build configuration list for PBXNativeTarget "example_osx_opengl2" */;
buildPhases = (
4080A96720B029B00036BA46 /* Sources */,
4080A96820B029B00036BA46 /* Frameworks */,
4080A96920B029B00036BA46 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = example_osx_opengl2;
productName = example_osx_opengl2;
productReference = 4080A96B20B029B00036BA46 /* example_osx_opengl2 */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
4080A96320B029B00036BA46 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0930;
ORGANIZATIONNAME = ImGui;
TargetAttributes = {
4080A96A20B029B00036BA46 = {
CreatedOnToolsVersion = 9.3.1;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 4080A96620B029B00036BA46 /* Build configuration list for PBXProject "example_apple_opengl2" */;
compatibilityVersion = "Xcode 8.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 4080A96220B029B00036BA46;
productRefGroup = 4080A96C20B029B00036BA46 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
4080A96A20B029B00036BA46 /* example_osx_opengl2 */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
4080A96720B029B00036BA46 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4080A99820B02D340036BA46 /* main.mm in Sources */,
4080A9AD20B0343C0036BA46 /* imgui_demo.cpp in Sources */,
4080A9AF20B0343C0036BA46 /* imgui_draw.cpp in Sources */,
4080A9A220B034280036BA46 /* imgui_impl_opengl2.cpp in Sources */,
4080A9B020B0347A0036BA46 /* imgui_impl_osx.mm in Sources */,
4080A9AE20B0343C0036BA46 /* imgui.cpp in Sources */,
50798230257677FD0038A28D /* imgui_tables.cpp in Sources */,
07A82EDB213941D00078D120 /* imgui_widgets.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
4080A97020B029B00036BA46 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
4080A97120B029B00036BA46 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
};
name = Release;
};
4080A97320B029B00036BA46 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_NAME = "$(TARGET_NAME)";
USER_HEADER_SEARCH_PATHS = ../..;
};
name = Debug;
};
4080A97420B029B00036BA46 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_NAME = "$(TARGET_NAME)";
USER_HEADER_SEARCH_PATHS = ../..;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4080A96620B029B00036BA46 /* Build configuration list for PBXProject "example_apple_opengl2" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4080A97020B029B00036BA46 /* Debug */,
4080A97120B029B00036BA46 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4080A97220B029B00036BA46 /* Build configuration list for PBXNativeTarget "example_osx_opengl2" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4080A97320B029B00036BA46 /* Debug */,
4080A97420B029B00036BA46 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 4080A96320B029B00036BA46 /* Project object */;
}

View File

@ -0,0 +1,282 @@
// Dear ImGui: standalone example application for OSX + OpenGL2, using legacy fixed pipeline
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#import <Cocoa/Cocoa.h>
#import <OpenGL/gl.h>
#import <OpenGL/glu.h>
#include "imgui.h"
#include "imgui_impl_opengl2.h"
#include "imgui_impl_osx.h"
//-----------------------------------------------------------------------------------
// AppView
//-----------------------------------------------------------------------------------
@interface AppView : NSOpenGLView
{
NSTimer* animationTimer;
}
@end
@implementation AppView
-(void)prepareOpenGL
{
[super prepareOpenGL];
#ifndef DEBUG
GLint swapInterval = 1;
[[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
if (swapInterval == 0)
NSLog(@"Error: Cannot set swap interval.");
#endif
}
-(void)initialize
{
// Some events do not raise callbacks of AppView in some circumstances (for example when CMD key is held down).
// This monitor taps into global event stream and captures these events.
NSEventMask eventMask = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged;
[NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^NSEvent * _Nullable(NSEvent *event)
{
ImGui_ImplOSX_HandleEvent(event, self);
return event;
}];
// Setup Dear ImGui context
// FIXME: This example doesn't have proper cleanup...
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// Setup Dear ImGui style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer backends
ImGui_ImplOSX_Init();
ImGui_ImplOpenGL2_Init();
// Load Fonts
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Read 'docs/FONTS.txt' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
//io.Fonts->AddFontDefault();
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f);
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
}
-(void)updateAndDrawDemoView
{
// Start the Dear ImGui frame
ImGui_ImplOpenGL2_NewFrame();
ImGui_ImplOSX_NewFrame(self);
ImGui::NewFrame();
// Our state (make them static = more or less global) as a convenience to keep the example terse.
static bool show_demo_window = true;
static bool show_another_window = false;
static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
// Rendering
ImGui::Render();
ImDrawData* draw_data = ImGui::GetDrawData();
[[self openGLContext] makeCurrentContext];
GLsizei width = (GLsizei)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
GLsizei height = (GLsizei)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
glViewport(0, 0, width, height);
glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL2_RenderDrawData(draw_data);
// Present
[[self openGLContext] flushBuffer];
if (!animationTimer)
animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.017 target:self selector:@selector(animationTimerFired:) userInfo:nil repeats:YES];
}
-(void)reshape { [[self openGLContext] update]; [self updateAndDrawDemoView]; }
-(void)drawRect:(NSRect)bounds { [self updateAndDrawDemoView]; }
-(void)animationTimerFired:(NSTimer*)timer { [self setNeedsDisplay:YES]; }
-(BOOL)acceptsFirstResponder { return (YES); }
-(BOOL)becomeFirstResponder { return (YES); }
-(BOOL)resignFirstResponder { return (YES); }
-(void)dealloc { animationTimer = nil; }
//-----------------------------------------------------------------------------------
// Input processing
//-----------------------------------------------------------------------------------
// Forward Mouse/Keyboard events to Dear ImGui OSX backend.
// Other events are registered via addLocalMonitorForEventsMatchingMask()
-(void)mouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)rightMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)otherMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)mouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)rightMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)otherMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)mouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)mouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)rightMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)rightMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)otherMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)otherMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)scrollWheel:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
@end
//-----------------------------------------------------------------------------------
// AppDelegate
//-----------------------------------------------------------------------------------
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (nonatomic, readonly) NSWindow* window;
@end
@implementation AppDelegate
@synthesize window = _window;
-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{
return YES;
}
-(NSWindow*)window
{
if (_window != nil)
return (_window);
NSRect viewRect = NSMakeRect(100.0, 100.0, 100.0 + 1280.0, 100 + 720.0);
_window = [[NSWindow alloc] initWithContentRect:viewRect styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable|NSWindowStyleMaskClosable backing:NSBackingStoreBuffered defer:YES];
[_window setTitle:@"Dear ImGui OSX+OpenGL2 Example"];
[_window setAcceptsMouseMovedEvents:YES];
[_window setOpaque:YES];
[_window makeKeyAndOrderFront:NSApp];
return (_window);
}
-(void)setupMenu
{
NSMenu* mainMenuBar = [[NSMenu alloc] init];
NSMenu* appMenu;
NSMenuItem* menuItem;
appMenu = [[NSMenu alloc] initWithTitle:@"Dear ImGui OSX+OpenGL2 Example"];
menuItem = [appMenu addItemWithTitle:@"Quit Dear ImGui OSX+OpenGL2 Example" action:@selector(terminate:) keyEquivalent:@"q"];
[menuItem setKeyEquivalentModifierMask:NSEventModifierFlagCommand];
menuItem = [[NSMenuItem alloc] init];
[menuItem setSubmenu:appMenu];
[mainMenuBar addItem:menuItem];
appMenu = nil;
[NSApp setMainMenu:mainMenuBar];
}
-(void)dealloc
{
_window = nil;
}
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Make the application a foreground application (else it won't receive keyboard events)
ProcessSerialNumber psn = {0, kCurrentProcess};
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
// Menu
[self setupMenu];
NSOpenGLPixelFormatAttribute attrs[] =
{
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, 32,
0
};
NSOpenGLPixelFormat* format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
AppView* view = [[AppView alloc] initWithFrame:self.window.frame pixelFormat:format];
format = nil;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
[view setWantsBestResolutionOpenGLSurface:YES];
#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
[self.window setContentView:view];
if ([view openGLContext] == nil)
NSLog(@"No OpenGL Context!");
[view initialize];
}
@end
//-----------------------------------------------------------------------------------
// Application main() function
//-----------------------------------------------------------------------------------
int main(int argc, const char* argv[])
{
@autoreleasepool
{
NSApp = [NSApplication sharedApplication];
AppDelegate* delegate = [[AppDelegate alloc] init];
[[NSApplication sharedApplication] setDelegate:delegate];
[NSApp run];
}
return NSApplicationMain(argc, argv);
}

View File

@ -0,0 +1,91 @@
#
# Makefile to use with emscripten
# See https://emscripten.org/docs/getting_started/downloads.html
# for installation instructions.
#
# This Makefile assumes you have loaded emscripten's environment.
# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead)
#
# Running `make` will produce three files:
# - web/index.html
# - web/index.js
# - web/index.wasm
#
# All three are needed to run the demo.
CC = emcc
CXX = em++
WEB_DIR = web
EXE = $(WEB_DIR)/index.html
IMGUI_DIR = ../..
SOURCES = main.cpp
SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp
SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp
OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES))))
UNAME_S := $(shell uname -s)
CPPFLAGS =
LDFLAGS =
EMS =
##---------------------------------------------------------------------
## EMSCRIPTEN OPTIONS
##---------------------------------------------------------------------
# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only)
EMS += -s USE_SDL=2
EMS += -s DISABLE_EXCEPTION_CATCHING=1
LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1
# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877)
#EMS += -s BINARYEN_TRAP_MODE=clamp
#EMS += -s SAFE_HEAP=1 ## Adds overhead
# Emscripten allows preloading a file or folder to be accessible at runtime.
# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts"
# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html
# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.)
USE_FILE_SYSTEM ?= 0
ifeq ($(USE_FILE_SYSTEM), 0)
LDFLAGS += -s NO_FILESYSTEM=1
CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS
endif
ifeq ($(USE_FILE_SYSTEM), 1)
LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts
endif
##---------------------------------------------------------------------
## FINAL BUILD FLAGS
##---------------------------------------------------------------------
CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends
#CPPFLAGS += -g
CPPFLAGS += -Wall -Wformat -Os $(EMS)
LDFLAGS += --shell-file shell_minimal.html $(EMS)
##---------------------------------------------------------------------
## BUILD RULES
##---------------------------------------------------------------------
%.o:%.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
%.o:$(IMGUI_DIR)/%.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
%.o:$(IMGUI_DIR)/backends/%.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
all: $(EXE)
@echo Build complete for $(EXE)
$(WEB_DIR):
mkdir $@
serve: all
python3 -m http.server -d $(WEB_DIR)
$(EXE): $(OBJS) $(WEB_DIR)
$(CXX) -o $@ $(OBJS) $(LDFLAGS)
clean:
rm -rf $(OBJS) $(WEB_DIR)

View File

@ -0,0 +1,22 @@
## How to Build
- You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions
- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup.
- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools.
- Then build using `make` while in the `example_emscripten_opengl3/` directory.
## How to Run
To run on a local machine:
- `make serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build.
- Otherwise, generally you will need a local webserver:
- Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):<br>
_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and cant load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers youll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_
- Emscripten SDK has a handy `emrun` command: `emrun web/example_emscripten_opengl3.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details.
- You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses).
- You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`.
## Obsolete features:
- Emscripten 2.0 (August 2020) obsoleted the fastcomp backend, only llvm is supported.
- Emscripten 1.39.0 (October 2019) obsoleted the `BINARYEN_TRAP_MODE=clamp` compilation flag which was required with version older than 1.39.0 to avoid rendering artefacts. See [#2877](https://github.com/ocornut/imgui/issues/2877) for details. If you use an older version, uncomment this line in the Makefile: `#EMS += -s BINARYEN_TRAP_MODE=clamp`

View File

@ -0,0 +1,174 @@
// Dear ImGui: standalone example application for Emscripten, using SDL2 + OpenGL3
// (Emscripten is a C++-to-javascript compiler, used to publish executables for the web. See https://emscripten.org/)
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// This is mostly the same code as the SDL2 + OpenGL3 example, simply with the modifications needed to run on Emscripten.
// It is possible to combine both code into a single source file that will compile properly on Desktop and using Emscripten.
// See https://github.com/ocornut/imgui/pull/2492 as an example on how to do just that.
#include "imgui.h"
#include "imgui_impl_sdl.h"
#include "imgui_impl_opengl3.h"
#include <stdio.h>
#include <emscripten.h>
#include <SDL.h>
#include <SDL_opengles2.h>
// Emscripten requires to have full control over the main loop. We're going to store our SDL book-keeping variables globally.
// Having a single function that acts as a loop prevents us to store state in the stack of said function. So we need some location for this.
SDL_Window* g_Window = NULL;
SDL_GLContext g_GLContext = NULL;
// For clarity, our main loop code is declared at the end.
static void main_loop(void*);
int main(int, char**)
{
// Setup SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0)
{
printf("Error: %s\n", SDL_GetError());
return -1;
}
// For the browser using Emscripten, we are going to use WebGL1 with GL ES2. See the Makefile. for requirement details.
// It is very likely the generated file won't work in many browsers. Firefox is the only sure bet, but I have successfully
// run this code on Chrome for Android for example.
const char* glsl_version = "#version 100";
//const char* glsl_version = "#version 300 es";
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
// Create window with graphics context
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
SDL_DisplayMode current;
SDL_GetCurrentDisplayMode(0, &current);
SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
g_Window = SDL_CreateWindow("Dear ImGui Emscripten example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags);
g_GLContext = SDL_GL_CreateContext(g_Window);
if (!g_GLContext)
{
fprintf(stderr, "Failed to initialize WebGL context!\n");
return 1;
}
SDL_GL_SetSwapInterval(1); // Enable vsync
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file.
// You may manually call LoadIniSettingsFromMemory() to load settings from your own storage.
io.IniFilename = NULL;
// Setup Dear ImGui style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer backends
ImGui_ImplSDL2_InitForOpenGL(g_Window, g_GLContext);
ImGui_ImplOpenGL3_Init(glsl_version);
// Load Fonts
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Read 'docs/FONTS.md' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
// - Emscripten allows preloading a file or folder to be accessible at runtime. See Makefile for details.
//io.Fonts->AddFontDefault();
#ifndef IMGUI_DISABLE_FILE_FUNCTIONS
io.Fonts->AddFontFromFileTTF("fonts/Roboto-Medium.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("fonts/ProggyTiny.ttf", 10.0f);
//ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
#endif
// This function call won't return, and will engage in an infinite loop, processing events from the browser, and dispatching them.
emscripten_set_main_loop_arg(main_loop, NULL, 0, true);
}
static void main_loop(void* arg)
{
ImGuiIO& io = ImGui::GetIO();
IM_UNUSED(arg); // We can pass this argument as the second parameter of emscripten_set_main_loop_arg(), but we don't use that.
// Our state (make them static = more or less global) as a convenience to keep the example terse.
static bool show_demo_window = true;
static bool show_another_window = false;
static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// Poll and handle events (inputs, window resize, etc.)
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
SDL_Event event;
while (SDL_PollEvent(&event))
{
ImGui_ImplSDL2_ProcessEvent(&event);
// Capture events here, based on io.WantCaptureMouse and io.WantCaptureKeyboard
}
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL2_NewFrame();
ImGui::NewFrame();
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
// Rendering
ImGui::Render();
SDL_GL_MakeCurrent(g_Window, g_GLContext);
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
SDL_GL_SwapWindow(g_Window);
}

View File

@ -0,0 +1,64 @@
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
<title>Dear ImGui Emscripten example</title>
<style>
body { margin: 0; background-color: black }
.emscripten {
position: absolute;
top: 0px;
left: 0px;
margin: 0px;
border: 0;
width: 100%;
height: 100%;
overflow: hidden;
display: block;
image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: -o-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: optimize-contrast;
image-rendering: crisp-edges;
image-rendering: pixelated;
-ms-interpolation-mode: nearest-neighbor;
}
</style>
</head>
<body>
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
<script type='text/javascript'>
var Module = {
preRun: [],
postRun: [],
print: (function() {
return function(text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.log(text);
};
})(),
printErr: function(text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.error(text);
},
canvas: (function() {
var canvas = document.getElementById('canvas');
//canvas.addEventListener("webglcontextlost", function(e) { alert('FIXME: WebGL context lost, please reload the page'); e.preventDefault(); }, false);
return canvas;
})(),
setStatus: function(text) {
console.log("status: " + text);
},
monitorRunDependencies: function(left) {
// no run dependencies to log
}
};
window.onerror = function() {
console.log("onerror: " + event);
};
</script>
{{{ SCRIPT }}}
</body>
</html>

View File

@ -0,0 +1,88 @@
#
# Makefile to use with emscripten
# See https://emscripten.org/docs/getting_started/downloads.html
# for installation instructions.
#
# This Makefile assumes you have loaded emscripten's environment.
# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead)
#
# Running `make` will produce three files:
# - web/index.html (current stored in the repository)
# - web/index.js
# - web/index.wasm
#
# All three are needed to run the demo.
CC = emcc
CXX = em++
WEB_DIR = web
EXE = $(WEB_DIR)/index.js
IMGUI_DIR = ../..
SOURCES = main.cpp
SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp
SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_wgpu.cpp
OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES))))
UNAME_S := $(shell uname -s)
CPPFLAGS =
LDFLAGS =
EMS =
##---------------------------------------------------------------------
## EMSCRIPTEN OPTIONS
##---------------------------------------------------------------------
# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only)
EMS += -s DISABLE_EXCEPTION_CATCHING=1
LDFLAGS += -s USE_GLFW=3 -s USE_WEBGPU=1
LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1
# Emscripten allows preloading a file or folder to be accessible at runtime.
# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts"
# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html
# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.)
USE_FILE_SYSTEM ?= 0
ifeq ($(USE_FILE_SYSTEM), 0)
LDFLAGS += -s NO_FILESYSTEM=1
CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS
endif
ifeq ($(USE_FILE_SYSTEM), 1)
LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts
endif
##---------------------------------------------------------------------
## FINAL BUILD FLAGS
##---------------------------------------------------------------------
CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends
#CPPFLAGS += -g
CPPFLAGS += -Wall -Wformat -Os $(EMS)
#LDFLAGS += --shell-file shell_minimal.html
LDFLAGS += $(EMS)
##---------------------------------------------------------------------
## BUILD RULES
##---------------------------------------------------------------------
%.o:%.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
%.o:$(IMGUI_DIR)/%.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
%.o:$(IMGUI_DIR)/backends/%.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
all: $(EXE)
@echo Build complete for $(EXE)
$(WEB_DIR):
mkdir $@
serve: all
python3 -m http.server -d $(WEB_DIR)
$(EXE): $(OBJS) $(WEB_DIR)
$(CXX) -o $@ $(OBJS) $(LDFLAGS)
clean:
rm -f $(EXE) $(OBJS) $(WEB_DIR)/*.js $(WEB_DIR)/*.wasm $(WEB_DIR)/*.wasm.pre

View File

@ -0,0 +1,10 @@
# How to Build
- You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions
- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools.
- Then build using `make` while in the `example_emscripten_wgpu/` directory.
- Requires Emscripten 2.0.10 (December 2020) due to GLFW adaptations

View File

@ -0,0 +1,245 @@
// Dear ImGui: standalone example application for Emscripten, using GLFW + WebGPU
// (Emscripten is a C++-to-javascript compiler, used to publish executables for the web. See https://emscripten.org/)
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_wgpu.h"
#include <stdio.h>
#include <emscripten.h>
#include <emscripten/html5.h>
#include <emscripten/html5_webgpu.h>
#include <GLFW/glfw3.h>
#include <webgpu/webgpu.h>
#include <webgpu/webgpu_cpp.h>
// Global WebGPU required states
static WGPUDevice wgpu_device = NULL;
static WGPUSurface wgpu_surface = NULL;
static WGPUSwapChain wgpu_swap_chain = NULL;
static int wgpu_swap_chain_width = 0;
static int wgpu_swap_chain_height = 0;
// States tracked across render frames
static bool show_demo_window = true;
static bool show_another_window = false;
static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// Forward declarations
static bool init_wgpu();
static void main_loop(void* window);
static void print_glfw_error(int error, const char* description);
static void print_wgpu_error(WGPUErrorType error_type, const char* message, void*);
int main(int, char**)
{
glfwSetErrorCallback(print_glfw_error);
if (!glfwInit())
return 1;
// Make sure GLFW does not initialize any graphics context.
// This needs to be done explicitly later
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+WebGPU example", NULL, NULL);
if (!window)
{
glfwTerminate();
return 1;
}
// Initialize the WebGPU environment
if (!init_wgpu())
{
if (window)
glfwDestroyWindow(window);
glfwTerminate();
return 1;
}
glfwShowWindow(window);
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file.
// You may manually call LoadIniSettingsFromMemory() to load settings from your own storage.
io.IniFilename = NULL;
// Setup Dear ImGui style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer backends
ImGui_ImplGlfw_InitForOther(window, true);
ImGui_ImplWGPU_Init(wgpu_device, 3, WGPUTextureFormat_RGBA8Unorm);
// Load Fonts
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Read 'docs/FONTS.md' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
// - Emscripten allows preloading a file or folder to be accessible at runtime. See Makefile for details.
//io.Fonts->AddFontDefault();
#ifndef IMGUI_DISABLE_FILE_FUNCTIONS
io.Fonts->AddFontFromFileTTF("fonts/Roboto-Medium.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("fonts/ProggyTiny.ttf", 10.0f);
//ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
#endif
// This function will directly return and exit the main function.
// Make sure that no required objects get cleaned up.
// This way we can use the browsers 'requestAnimationFrame' to control the rendering.
emscripten_set_main_loop_arg(main_loop, window, 0, false);
return 0;
}
static bool init_wgpu()
{
wgpu_device = emscripten_webgpu_get_device();
if (!wgpu_device)
return false;
wgpuDeviceSetUncapturedErrorCallback(wgpu_device, print_wgpu_error, NULL);
// Use C++ wrapper due to misbehavior in Emscripten.
// Some offset computation for wgpuInstanceCreateSurface in JavaScript
// seem to be inline with struct alignments in the C++ structure
wgpu::SurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {};
html_surface_desc.selector = "#canvas";
wgpu::SurfaceDescriptor surface_desc = {};
surface_desc.nextInChain = &html_surface_desc;
// Use 'null' instance
wgpu::Instance instance = {};
wgpu_surface = instance.CreateSurface(&surface_desc).Release();
return true;
}
static void main_loop(void* window)
{
glfwPollEvents();
int width, height;
glfwGetFramebufferSize((GLFWwindow*) window, &width, &height);
// React to changes in screen size
if (width != wgpu_swap_chain_width && height != wgpu_swap_chain_height)
{
ImGui_ImplWGPU_InvalidateDeviceObjects();
if (wgpu_swap_chain)
wgpuSwapChainRelease(wgpu_swap_chain);
wgpu_swap_chain_width = width;
wgpu_swap_chain_height = height;
WGPUSwapChainDescriptor swap_chain_desc = {};
swap_chain_desc.usage = WGPUTextureUsage_RenderAttachment;
swap_chain_desc.format = WGPUTextureFormat_RGBA8Unorm;
swap_chain_desc.width = width;
swap_chain_desc.height = height;
swap_chain_desc.presentMode = WGPUPresentMode_Fifo;
wgpu_swap_chain = wgpuDeviceCreateSwapChain(wgpu_device, wgpu_surface, &swap_chain_desc);
ImGui_ImplWGPU_CreateDeviceObjects();
}
// Start the Dear ImGui frame
ImGui_ImplWGPU_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
// Rendering
ImGui::Render();
WGPURenderPassColorAttachment color_attachments = {};
color_attachments.loadOp = WGPULoadOp_Clear;
color_attachments.storeOp = WGPUStoreOp_Store;
color_attachments.clearColor = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w };
color_attachments.view = wgpuSwapChainGetCurrentTextureView(wgpu_swap_chain);
WGPURenderPassDescriptor render_pass_desc = {};
render_pass_desc.colorAttachmentCount = 1;
render_pass_desc.colorAttachments = &color_attachments;
render_pass_desc.depthStencilAttachment = NULL;
WGPUCommandEncoderDescriptor enc_desc = {};
WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(wgpu_device, &enc_desc);
WGPURenderPassEncoder pass = wgpuCommandEncoderBeginRenderPass(encoder, &render_pass_desc);
ImGui_ImplWGPU_RenderDrawData(ImGui::GetDrawData(), pass);
wgpuRenderPassEncoderEndPass(pass);
WGPUCommandBufferDescriptor cmd_buffer_desc = {};
WGPUCommandBuffer cmd_buffer = wgpuCommandEncoderFinish(encoder, &cmd_buffer_desc);
WGPUQueue queue = wgpuDeviceGetQueue(wgpu_device);
wgpuQueueSubmit(queue, 1, &cmd_buffer);
}
static void print_glfw_error(int error, const char* description)
{
printf("Glfw Error %d: %s\n", error, description);
}
static void print_wgpu_error(WGPUErrorType error_type, const char* message, void*)
{
const char* error_type_lbl = "";
switch (error_type)
{
case WGPUErrorType_Validation: error_type_lbl = "Validation"; break;
case WGPUErrorType_OutOfMemory: error_type_lbl = "Out of memory"; break;
case WGPUErrorType_Unknown: error_type_lbl = "Unknown"; break;
case WGPUErrorType_DeviceLost: error_type_lbl = "Device lost"; break;
default: error_type_lbl = "Unknown";
}
printf("%s error: %s\n", error_type_lbl, message);
}

View File

@ -0,0 +1,80 @@
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
<title>Dear ImGui Emscripten+WebGPU example</title>
<style>
body { margin: 0; background-color: black }
.emscripten {
position: absolute;
top: 0px;
left: 0px;
margin: 0px;
border: 0;
width: 100%;
height: 100%;
overflow: hidden;
display: block;
image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: -o-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: optimize-contrast;
image-rendering: crisp-edges;
image-rendering: pixelated;
-ms-interpolation-mode: nearest-neighbor;
}
</style>
</head>
<body>
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
<script type='text/javascript'>
var Module;
(async () => {
Module = {
preRun: [],
postRun: [],
print: (function() {
return function(text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.log(text);
};
})(),
printErr: function(text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.error(text);
},
canvas: (function() {
var canvas = document.getElementById('canvas');
//canvas.addEventListener("webglcontextlost", function(e) { alert('FIXME: WebGL context lost, please reload the page'); e.preventDefault(); }, false);
return canvas;
})(),
setStatus: function(text) {
console.log("status: " + text);
},
monitorRunDependencies: function(left) {
// no run dependencies to log
}
};
window.onerror = function() {
console.log("onerror: " + event);
};
// Initialize the graphics adapter
{
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
Module.preinitializedWebGPUDevice = device;
}
{
const js = document.createElement('script');
js.async = true;
js.src = "index.js";
document.body.appendChild(js);
}
})();
</script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More