3f0699cf0 Backends: Vulkan: Fix failing assertion for platforms where viewports are not supported (#8734) adfa5364c Merge branch 'master' into docking 673eb7de9 Version 1.92.0 da3c86925 Demo: added TextLinkOpenURL() call in Widgets section. 2819ab32f Layout: commented out legacy ErrorCheckUsingSetCursorPosToExtendParentBoundaries() fallback. (#5548, #4510, #3355, #1760, #1490, #4152, #150) 6f21bed66 Fonts: removing assert from legacy PushFont() to mirror new PushFont(). for consistency. 719a3fe98 Additional comments on ErrorCheckUsingSetCursorPosToExtendParentBoundaries(). (#5548) 5bc70c68e Fonts: fix PushFont(NULL) to work as advertised. dcf14505e Backends: SDLGPU: fixes call to SDL_MapGPUTransferBuffer(). Fixes artifacts on OSX/Metal. (#8465, #8703) d8c695371 Fonts: comments. e4bba0b53 Merge branch 'master' into docking 89b5a2c3d (Breaking) Fonts: removed ImFontFlags_DefaultToLegacySize. 97e0d5961 (Breaking) Fonts: removed PushFontSize(), PopFontSize(). ca72eb059 (Breaking) Fonts: obsolete PushFont() default parameter. 04a5b9c2c Backends: SDL3: fixed pulling SDL_PROP_WINDOW_COCOA_WINDOW_POINTER into viewport->PlatformHandleRaw. (#8725, #8726) 776897d3c Fonts: fixed PVS Studio false positive "expression 'cmd_count != draw_list->CmdBuffer.Size' is always false." (#8720, #8465) 7cd567202 Merge branch 'master' into docking 0218ddd57 Fonts: moved GetFont(), GetFontSize(), GetFontBaked() to higher section. 6722d789e (Breaking) Fonts: Removed support for PushFont(NULL) which was a shortcut for "default font". 6e846c56b Demo: fixed ID conflicts. (#8723) 608dd96de Fonts: fixed RenderText() asserting when crossing VtxOffset change boundaries. (#8720, #8465) a49ddaac8 Fonts: add comments and examples for GlyphExcludeRanges[]. 613a6a964 Fonts: AddFontDefault() adds to GlyphOffset.y instead of overriding it. 0dc2885f3 InputText: fix for InsertChars() to work on read-only buffer. (#8714, #8689, #8242) efe2b21a5 Backends: GLFW: Fixed not installing WndProc hook in all GLFW version, so AddMouseSourceEvent() logic was missing for some viewports. e132b444a Backends: GLFW: Fixed crash when using GLFW 3.3 (#8713, #8676, #8239, #8069) 4fde473f3 Backends: warning fixes (for docking branch). afe20dc9b Backends: warning fix. b580c1130 Merge branch 'master' into docking e97e55adb Backends: Fixed various warnings discovered when using MinGW GCC 15/Clang on latest backends. 2f9c518ca Textures: ImTextureData::GetPixels() returns void* for clarity. 9a50c0917 Bsckends: SDL2, GLFW: fixed ImGui_ImplXXXX_GetContentScaleXXX functions never using SDL 2.0.4 & GLFW 3.3 path in master. 3a964d18e Comments on ImGuiMod_XXXX and ImGuiKey_GamepadXXXX values. 8d6e66d38 Backends: DX10, DX11, DX12, OpenGL3, Vulkan, WGPU: Assert when CreateDeviceObjects() calls return false. f7dabede8 Backends: Allegro5: Fixed missing invisible mouse cursor, broken by ee8941e0d. 725d185a3 Backends: DirectX12: fixed build on MinGW. (#8702, #4594) 2a8c75f3e Backends: GLFW: amend for multi-context support with multi-viewport. (#8676, #8239, #8069) c2c38beec Merge branch 'master' into docking f633a6058 Backends: GLFW: Added support for multiple Dear ImGui contexts. (#8676, #8239, #8069) d290e583c Backends: GLFW: fixed WndProc relying on current context. (#8676, #8239, #8069) c56e8b496 imgui_freetype: fixed NULL that creeped in instead of nullptr. 344d5ff4b Merge branch 'master' into docking b2c73596a InputText: fixed a buffer overrun that could happen when using dynamically resizing buffers. (#8689) 12626b85c InputText: minor changes to match for both insert chars paths to look more similar. 08bb34814 Misc: removed static linkage from operators to facilitate using in C++ modules. (#8682, #8358) 041abe852 Revert "Misc: removed static linkage from operators to facilitate using in C++ modules. (#8682, #8358) [@radjkarl]" 39a90ac4d Misc: removed static linkage from operators to facilitate using in C++ modules. (#8682, #8358) [@radjkarl] f2e4e8039 Windows: BeginChild(): fixed being unable to combine manual resize on one axis and automatic resize on the other axis. (#8690) fe048efea DrawList, Fonts: fixed PushFont()/AddImage() not restoring correct atlas texture id when using multiple atlas (#8694) 24f7328e5 DrawList, Fonts: fixed ImFontAtlasTextureRepack() overwriting draw list shared data UV's etc. even when not bound. (#8694, #8465) 842837e35 imgui_freetype: fix conversion null -> bool in FontBakedLoadGlyph (#8696) 6b3cbb10a Backends: Vulkan: correct minimum pool size assertion (#8691) d896eab16 Backends: OSX: ImGui_ImplOSX_HandleEvent() only process event for window containing our viewports. Amend 7ac99a4 for docking. (#8644) 4cf85ee54 Merge branch 'master' into docking cfa43e721 Windows: clicking on a window close button doesn't claim focus and bring to front. (#8683) d8da97f75 Fonts: UpdateCurrentFontSize() early out doesn't need to clear FontBaked. ca3169310 Fonts: fixed FontBaked=NULL in initial call to SetCurrentWindow() in Begin() using previous frame value of SkipItems. (#8465) 1ec1510ef Fonts: clarify assert. (#8680) 7ac99a436 Backends: OSX: ImGui_ImplOSX_HandleEvent() only process event for window containing our view. (#8644) b7f13df13 Docs: reformat Changelog. 571dae966 Backends: WGPU: added ImGuiBackendFlags_RendererHasTextures support. (#8465) b178fd428 Backends: WebGPU: moved sampler creation out of ImGui_ImplWGPU_CreateFontsTexture(). 115a8e74c Fonts: update misc comments, docs. 41f4acfb4 Fonts: add has_textures parameters to ImFontAtlasUpdateNewFrame(). 7b8e00013 Fixed duplicate symbols in some compile-time configurations. 1ce75e2bc Fixed duplicate symbols in some compile-time configurations. e8f831dea Merge branch 'master' into docking f6fc16658 TreeNode: fixed runtime asan warning (#2920) a0b3eceec Fixed using IMGUI_DISABLE_DEMO_WINDOWS without IMGUI_DISABLE_DEBUG_TOOLS and without linking with imgui_demo.cpp 7d70c0ff9 Merge branch 'master' into docking 7a42233d4 imgui_freetype: fixed using legacy names. 895bff652 Removed unneeded check in RenderText() loop + disable static analyzer false-positive warnings. e43fd7537 Merge branch 'master' into docking df068ce11 Various/misc fixes following back-and-forth dynamic_fonts->master->docking merges. Added missing API BREAKING CHANGES section. e4055e763 Fonts: Misc merge fixes. 1e130e045 Examples: set ConfigDpiScaleFonts / ConfigDpiScaleViewports in all examples already setup for scaling. 65857236c Backends: GLFW, SDL2, SDL3, update for docking to use helpers. 6af6cec23 Merge branch 'master_fonts' into docking 96be95731 Docs: update Changelog, FAQ, Fonts docs. 4acce8565 Fonts: tweaks demo and exposure to sliders, etc. cc3d4cab2 (Breaking) renamed ImFontConfig::FontBuilderFlags -> FontLoaderFlags. ImFontAtlas::FontBuilderFlags -> FontLoaderFlags. ImGuiFreeTypeBuilderFlags -> ImGuiFreeTypeLoaderFlags. e1481a731 Fonts: fixed NewFrame() when atlas builder has been created but fonts not added. Fixed GetCustomRect() after atlas clear. 29fbf3c1e Fonts: demote ImFont::GetFontBaked() as slighty internal. 0e769c541 Fonts: amend UpdateCurentFontSize() early out optimization. 573f08135 Fonts: fixed PopFont() broken recovery. 2e67bd4de Fonts: rename to ImFontAtlasBuildLegacyPreloadAllGlyphRanges(). c18301f35 Examples: remove explicit font sizes from AddFontXXX() calls. Add commented out style.FontSizeBase assignment. 02f58b320 Fonts: AddFont() functions now allow size_pixels==0.0f (only required when using certain functions) bc394410a Examples: Win32+DX9/DX10/DX11/DX12, SDL2+DX11/OpenGL2/OpenGL3/SDLRenderer/Vulkan, SDL3+OpenGL/SDLGPU/SDLRenderer/Vulkan: made example DPI aware by default. (master + docking: partial support for multi-dpi by scaling fonts + viewports but not style) b98e92839 Backends: SDL2, SDL3, GLFW: Backport small part of c90ea13 from docking. 8269924c3 Backends: GLFW: added ImGui_ImplGlfw_GetContentScaleForMonitor(), ImGui_ImplGlfw_GetContentScaleForWindow() helpers. 9da3e6696 Backends: SDL2: added ImGui_ImplSDL2_GetDpiScaleForDisplay(), ImGui_ImplSDL2_GetContentScaleForWindow() helpers. d72e66cde Examples: remove comments/references about baking and GetGlyphRangesJapanese(). 2d2b1cee6 Fonts: internals: renamed g.FontSizeBeforeScaling to g.FontSizeBase for consistency. 3c27c643a Fonts: internals: renamed g.FontScale to g.FontBakedScale for clarity. Comments. d85e22d20 Added style.FontScaleDpi which is the field overwritten by ImGuiConfigFlags_DpiEnableScaleFonts. 8766efcba (Breaking) Renamed io.FontGlobalScale to style.FontScaleMain. 80c08f228 (Breaking) Fonts: obsoleting SetWindowFontScale(). 59a11363a Fonts: ground work for allowing SizePixels to be optional. 402db2ef3 Fonts: fixed passing negative sizes to stb_truetype loader. 1e118ab89 Fonts: added ImGuiStyle::FontSizeBase. Ensuring PushFontSize() works before main loop and across NewFrame(). b029be6b6 Fonts: avoid calling GetFontBaked() during SetFontSize(). Also fixes loading extraneous baked on atlas that will be locked 033cdc413 Fonts: comments and slight packing of ImFontConfig fields. 69547bd4b Fonts: ImFont::DefaultSize -> ImFont::LegacySize. ImFontFlags_UseDefaultSize -> ImFontFlags_DefaultToLegacySize. e3860aa6a (Breaking) Fonts: removing obsolete ImFont::Scale. 25f9c318e Fonts: added "Input Glyphs Overlap Detection Tool". Added "Clear bakes", "Clear unused" buttons. Move code. 5926c877a Fonts: detect if ImFontAtlasUpdateNewFrame() is not being called. 9f8b4bdaf Fonts: fixed edge case calling RenderText() without priming with CalcTextSize(). b2343d624 Fonts: fallback to default default rasterizer density + pick one from existing viewports at the time of calling AddUpdateViewport(). 83aad8127 Fonts: comments + made IMGUI_DEBUG_LOG_FONT() work without an ImGui context. f3780c735 Fonts: adding GetFontBaked() in public API. 92ff15376 Fonts: added notes/comments and dummy type about renaming ImFontBuilderIO::GetBuilderForFreeType() to ImFontLoader::GetFontLoader(). 3d848a886 Fonts: fixed support for IMGUI_STB_NAMESPACE. 822903e56 Fonts: fixed ImFontAtlas::RemoveFont() with multiple sources. 5ee984555 Fonts: automatically set current rasterizer density to viewport density. Effectively should fix most things on macOS. ea756ede1 Fonts: reorder ImFontFlags according likelihood of being useful. 1b51a88bb Fonts: moved compare operators to internal. Removed commented out ones aimed legacy backends: not needed anymore since we didn't rename ImTextureID. 39f6c793b Fonts: proof of concept support for user textures. 91ed6e67b Fonts: fixed support for multiple atlases. fad5280d4 Fonts: fixed broken support for legacy backend due to a mismatch with initial pre-build baked id. 65e603997 Fonts: remove unnecessary ImDrawListSharedData::FontAtlas which is actually getting in the way of using multiple atlases. 46fa9e8ef Fonts: Debug display status. Fixed truncated raw texture id. Fixed FormatTextureIDForDebugDisplay(). Comments. f6735c223 Fonts: remove ImFontHooks in favor of a AddRemapChar() implementation. 89e880dfd Fonts: adding ImFontHooks for codepoint remapping. 8523cbdf5 Fonts: rework ImFontLoader::FontBakedLoadGlyph() interface 4dec946ae Fonts: don't pretend to half recover from OOM for now + debug log filename on load failure. b32ef3c05 Fonts: make RasterizerDensity a dynamic field. (temporarily exposed as SetFontRasterizerDensity()). 8140a9d8a Fonts: comments on ImTextureData fields. 42e7bb80b imgui_freetype: removed anonymous namespace + extracting two functions outside of ImGui_ImplFreeType_FontSrcData. 6a455e128 imgui_freetype: moving data out of ImGui_ImplFreeType_FontSrcData. 5310f5fba Fonts: rework toward reducing reliance on ImFontConfig::DstFont since we ought to separate them. 2b0d49a90 Fonts: make ImFont::Sources a vector. e7efe94fd Fonts: shallow rework of ImFontAtlasBakedAddFontGlyph() to facilitate upcoming change. 890fff92f Fonts: rename many internal functions for consistency. No other changes. c4fa9bb61 Fonts: add ImFontGlyph::SourceIdx. Extract code out of DebugNodeFont() into DebugNodeFontGlyphesForSrcMask(). bcd1a94b8 Fonts: Extract ImFontAtlasBuildGetFontBaked() out of ImFont::GetFontBaked() mostly for consistency with upcoming changes + tweak locals in AddFont(). 7840e453b Fonts: ImFontAtlasBuildInit() is always called with atlas->Builder == NULL. eb650c468 Fonts: fixed unused variable warning. c43b138a6 Fonts: no need to load current baked on SkipItems window? + removed unused field. cdfa537ad Fonts: packing of shared basic/line/cursor data uses more public API. ed2bb2cff Fonts: encode additional data in ImFontAtlasRectId to detect invalid id + added Rects debug browser. 0436fba13 Fonts: fixed compaction gc-ing baked fonts used in the current frame + rename. e8035b94e Fonts: misc tidying up. d789263e0 Fonts: internal rendering uses higher level functions. 12599da53 Fonts: do not mark whole ImTextureData struct as IMGUI_API to fix warning when used in ImVector<> (8559) fb5c53708 Fonts: changing loader/backend or loader flags may be done without losing custom rects. Sharing more code. 526a5d0f8 Fonts: tidying up. 1ea9ff367 Fonts: add optional out parameter to AddCustomRect() 074bf39e4 Fonts: GC Compact All exposed in Metrics->Memory Allocations includes compacting texture data. 23dc46c4f Fonts: added RemoveCustomRect(). e9cf3de58 Fonts: moved ImFontAtlasRectId back to public API. 69d28f867 Fonts: added ImFontAtlasRectId_Invalid == -1 db30e1b5b (Breaking) Fonts: rework GetCustomRect() api. Reintroduce ImFontAtlasRect. f40274702 (Breaking) Fonts: renamed AddCustomRectRegular() -> AddCustomRect(). 253dff765 Fonts: Comments. fc8708113 Fonts: fixed GetCustomRectUV(). 9324961cd Fonts: fixed calling AddFontXXX not invalidating texture for legacy backends. 44498825c (Breaking) Fonts: PushFont() default to preserve current font size. 168b97c29 Fonts: removed size rounding in AddFont() which breaks relative sizing of merged fonts (8502) 2de15dc64 Fonts: fixed legacy backend path preloading all sources sizes erroneously + failing to use ellipsis. 5460903f9 Fonts: awkwardly alias old TexID name to TexRef using an union (may backtrack and just keep old name) cb4c03756 Fonts: detect if backend assign to texture on creation but doesn't update Status. a548cd993 Fonts: avoid both ImTextureRef fields being set simultaneously. 0fff7ceda Fonts: comments, tweaks, minor amends. e41bf16ff Fonts: fixed ImTextureID() being zero-cleared instead of using ImTextureUserID_Invalid. . 8bd1fc4f0 Textures: Added ImTextureRef::GetTexID() mostly for consistency. cc65015e4 Fonts: fixed crashing password fields. 41517bca0 (Breaking) Fonts: renamed CalcCustomRectUV() to GetCustomRectUV() for simplicity. 4048494aa Fonts: rename ImFontAtlasBuildClearTexture() to ImFontAtlasBuildClear(). f816b861f (Breaking) Fonts: rename GetCustomRectByIndex() to GetCustomRect(). Made return struct const. 85d050758 Fonts: narrowed invalid value for ImFontAtlasRectId to -1 a we will change implementation. b12c42e75 Fonts: change uses of ImFontAtlasRect to ImTextureRect for simplicity. e76cfe5aa Fonts: fixed implicit init when calling AddCustomRectRegular(). LoaderShutdown match BuildDestroy. 7ac1bff48 Fonts: fixed an issue calling legacy ImFontAtlas::Clear(). 144f44421 Fonts: fixed memory leaks, shutting down font loader, and on AddFont() failure in FreeType backend. 52a686377 Textures: ImTextureData pixels are not immediately destroyed on setting ImTextureStatus_WantDestroy. 8ea0ae454 Fonts: fixed a bug using size specified by secondary font sources. 735d31e54 Demo: Exposed some basic UI in demo for sanity. 41a0e991f Fonts: Added UI to edit FreeType loader flags. Added ImFontAtlasBuildReloadAll() / ImFontAtlasBuildReloadFont() 40f988ce2 Fonts: in ShowFontAtlas() preserve open-state for latest texture. Improve debug display. c98e3c0ef Fonts: ImFontConfig::GlyphExcludeRanges is owner and copied. da51485e1 Fonts: Obsolete GetGlyphRangesXXX() functions. Update font documentation. 93410c47e Fonts: Fixed various small warnings / build issues. dec8d3863 Fonts: Added a ImFontFlags_NoLoadError flag to let user code try file paths. (3611) 131f5c57a Textures: Detect when using a texture that's about to be destroyed. 0b7133912 Demo: Add a "Fonts" section for visibility. 161e22232 Fonts: GetFontBaked() default to searching for closest size font. e98a314e0 Textures: Added ImTextureData::UsedRect. 2bf6879da Fonts: tidying up font scale logic. ef6beaeff Fonts: removed LockSingleSrcConfigIdx which isn't needed anymore since we don't load glyphs in ImFontAtlasBuildAddFont(). d8a612f73 Fonts: Fallback glyph is now lazily loaded on demand (yay!). Moving ImFontBaked:: functions outside of class. 78a17038c imgui_freetype: no need to store metrics locally. 18c8a93cc Fonts: Rework ImFontLoader signatures. c06a7585a Fonts: A font source can specify its own loader/backend. 1cfc0de31 Fonts: Core allocates per-baked-per-src backend buffers, to allow having custom backend per font source. Backend BakedInit/Destroy/AddGlyph process a single source. d59f10d7f Fonts: reinstated ImFontAtlasBuildSetupFontCreateEllipsisFromDot() compatible with baked system, lazily baked. 76b252f80 Fonts: Added ImFontAtlasBakedSetFontGlyphBitmap(). 92993e68c Fonts: Baked system, fix subsequent sources overriding shared font metrics. dc1320df6 Fonts: ImFontFlags: ImFontFlags_NoLoadGlyphs + add ImFontFlags_LockBakedSizes 8a8d8a7b3 Fonts: Exposed CompactCache(). Hide ClearCache(). eb79e3ab3 Fonts: Restore a functional AddCustomRectFontGlyph(). 815553c4b Fonts: ImFontConfig: added GlyphExcludeRanges[]. 96786a183 Fonts: Create a fallback glyph if none is available (fix crash on fonts with no fallback) 066b24d74 Fonts: Fixed _OnChangedTextureID() asserting when calling on e.g. finalized drawlists. 82b81fce6 Fonts: PushFontSize() with -1 uses sources[0]'s size for now (backward compat design) 658059022 Fonts: Allow PushFont/NewFrame/PopFont idioms to function. 842c313db Fonts: Reordered ImFont fields. 99f6b305c Fonts: Baked system, v12: support GlyphOffset / GlyphMinAdvanceX / GlyphMaxAdvanceX by scaling from ref value. df694c89b Fonts: Baked system, v11. 57d345ff8 Textures: Comments around ImTextureID type. 3ce753c48 Fonts: Debug dump to disk, debug log. be151977c Fonts: Texture resizing favor growing height, halve pack nodes. daaf0e4ef Fonts: Added PushFontSize(), PopFontSize() api. Added font_size param to PushFont() as well. 80404fae3 Fonts: clarify ClearTexData() as not supported with dynamic atlases. 093d01269 Fonts: Baked system, with auto-bind, v10. 7aba8da55 (Breaking) Fonts: CalcWordWrapPositionA() -> CalcWordWrapPosition(), takes size instead of scale as this will be needed. a2371ef90 Internals: added ImStableVector<> helper. fb69a09d6 Fonts: Fixed leak due to indirectly recursing ImFontAtlasPackInit(). c5653d5f3 Fonts: stb_truetype loader: Reworked scale handling to suggest this is not required caching. b203ac1e0 Fonts: Reduced reliance on ImFontConfig::DstFont. 722f6013f Fonts: Added a bit of user facing tooling. bd19bc508 Fonts: Removed BuildClearGlyphs(), conflated with ClearOutputData() 2bf6552f2 Fonts: Fixed/improved support for legacy backend. SetTexID() writes into our ImTextureData to keep the indirection, clear TexIsBuilt. ba62becb7 (Breaking) Fonts: remove ImFontAtlasCustomRect which is now the same as ImTextureRect a509790a1 Fonts: Added back support for AddCustomRectFontGlyph() 953ce90d2 Fonts: ImFontAtlasBuildInit() uses the occasion to sync HasTexUpdates from imgui context, narrowing the scope where it isn't set. 288055180 Fonts: Comments, remove ImFontAtlas facing BuildGrowTexture(), BuildCompactTexture(). Make IsBuilt() obsolete. 8ed4e2dde Fonts: Basic heuristic to repack instead of growing. Moved rects count/surface to internals. 2137b3448 Textures: Added atlas's TexMinWidth/TexMinHeight/TexMaxWidth/TexMaxHeight. 14614f561 Textures: Ensure UpdateBox is set on texture _WantCreate state too. b06f3c6d1 Fonts: turn public facing BuildRegisterGlyph() into ImFontAtlasBuildAddFontGlyph() thats sets up UV. 4ff1631b3 Fonts: Rasterizing ellipsis character from dot as one glyph + avoid preloading if it not needed. a2bc3d81c Fonts: Fixed support for multiple contexts. cec3e945f Fonts: added ImFontAtlas::RemoveFont(), fixed various leaks. df8450d92 Fonts: marked ImFontAtlas::Build() as obsolete 4399599de Fonts: ClearCache(), ImFontAtlasBuildGetTextureSizeEstimate(), tweak clearing functions. ef1521b47 Fonts: fix for password fields a51a26e2a Fonts: use a structure for post-processing - easier to pass things around and iterate on. 553b1c301 Fonts: repack without full reload, discard rectangle, fixed CustomRect api with stable id, remove public BuildInit(). a6c780192 Fonts: Measured and tweaked CalcTextSize() computation to minimize cost in our stress tests. 076a1ab85 Fonts: Misc amends, remove _PackNodesFactor, comments. ac13683c2 Fonts: ImFontAtlas accept DrawListSharedData not being set. 43cc3fc8b Fonts: optimization bake FallbackAdvanceX into IndexAdvanceX[]. 4f27792ff (Breaking) Removed atlas->TexDesiredWidth now unnecessary (github 327) b670f799d Fonts: use TexGlyphPadding. Fixed packing issues. Removed old code. 0f553c57b Fonts: AddFont() actually does the work, so we can handle errors & return an accurate return value. 1269467fa imgui_freetype: Removing old code. 08e1e7681 imgui_freetype: Added Freetype implementation for new architecture. 26c017d5e Backends: Metal: added ImGuiBackendFlags_RendererHasTextures support. ee8941e0d Backends: Allegro5: added ImGuiBackendFlags_RendererHasTextures support. 16fe666e3 Backends: SDLGPU3: added ImGuiBackendFlags_RendererHasTextures support. e538883a2 Backends: SDL_Renderer3: added ImGuiBackendFlags_RendererHasTextures support. 9fa65cd19 Backends: SDL_Renderer2: added ImGuiBackendFlags_RendererHasTextures support. abe294bfd Backends: Vulkan: added ImGuiBackendFlags_RendererHasTextures support. 0430c55b8 Backends: OpenGL2: added ImGuiBackendFlags_RendererHasTextures support. dbb91a574 Backends: OpenGL3: added ImGuiBackendFlags_RendererHasTextures support. eefe5d5aa Backends: DirectX12: added ImGuiBackendFlags_RendererHasTextures support. 2d2b1bc1c Backends: DirectX10: added ImGuiBackendFlags_RendererHasTextures support. 75efba7ec Backends: DirectX9: added ImGuiBackendFlags_RendererHasTextures support 372fd27e7 Backends: DirectX11: added ImGuiBackendFlags_RendererHasTextures support. c20e160e0 Textures: added texture list pointer in ImDrawData. 208705368 Textures: Adding a RefCount to textures so backend can avoid destroying them on shutdown if atlas is shared. a21a2e855 Textures: Single Textures[] array allows backend to not have to care about atlases. ee357aadd Textures: Add ImTextureUserID_Invalid + introducing SetTexID(). 2cde9125d Fonts: Selecting font config source list done by shared code. 0f0473bf1 Fonts, Textures: main code for ImGuiBackendFlags_RendererHasTextures feature. 191a728ec (Breaking) added ImTextureRef struct. Changed ImDrawCmd::TextureId to TexRef. e55415bfe (Breaking) renamed/moved ImGuiConfigFlags_DpiEnableScaleFonts -> ioConfigDpiScaleFonts, ImGuiConfigFlags_DpiEnableScaleViewports -> io.ConfigDpiScaleViewports b2f39318c Adding .cache to ignore list. (#8674) 201899b61 Backends: OpenGL3: Fixed using non-existing features on GLES 3.20 which would push a GL error. (#8664) eaac68ca2 Merge branch 'master' into docking c3d7ada9d Demo: add indentation to simplify upcoming merges. 91f72bbe1 Demo: omit ImGui:: prefix from ShowStyleEditor(), ShowUserGuide() code. 9485aeb5c Demo: changed default framed item width to use Min(GetFontSize() * 12, GetContentRegionAvail().x * 0.40f). e877f78b0 TreeNode: minor amend to b7ab2b7. (#2920) ef503ab0c TreeNode: fixed out of bound access in ImGuiTreeNodeFlags_DrawLinesXXX feature. (#2920) b7ab2b752 TreeNode: fixed an issue where tree lines are not drawn on node opening frame. (#2920) a92b53df7 Backends: Win32: Viewports: handle WM_DPICHANGED in backend when ImGuiConfigFlags_DpiEnableScaleViewports flag is enabled. ac6b84a7d Viewports: fixed handling of simultaneous move + resize (e.g. toggling maximized) when ImGuiConfigFlags_DpiEnableScaleViewports is enabled. 5e17c0801 Merge branch 'master' into docking 69e1fb50c Docs: fixed missing commit credit. (#8656) e6913f58b imgui_freetype: Update lunasvg API to support v3.0+ (#8656, #6842, #6591) c3a3a39e9 Nav: fixed abnormal clipping disable over large ranges, could lead to stall. (#3841, #1725) 19289d587 Nav: fixed scroll fallback (when there are no interactive widgets to jump to) not being enabled on windows with menu or title bar. c53c9a864 Clipper: further mitigation/improvements for abnormally large contents ranges (larger than e.g. 2^31). (#3609, #8215) 87a6443c5 Scroll: fixed contents size, scrollbar visibility and scrolling reet issue with abnormally large contents ranges. (#3609, #8215) 2bf57bbad Refactor: move SetCurrentFont(), PushFont(), PopFont() to a section. 77f1d3b31 Refactor: move SetCurrentFont(), PushFont(), PopFont() to a section. 407a0b972 (Breaking) Fonts: CalcWordWrapPositionA() -> CalcWordWrapPosition(), takes size instead of scale. 346f5c681 Platform IME: Fixed multi-viewports IME support, affecting SDL backends. (#8648, #8584, #7492, #6341) 5f0acadf7 RenderTextEllipsis() added breaking comments. 143924bbf Image(), ImageWithBg(): added extra comments. (#8131, #8238) 1ffa7a40a TextLinkOpenURL(): added bool return value on click. (#8645, #8451, #7660) e11ad6b77 Merge branch 'master' into docking 415dddf0f Tooltips: tooltips have a maximum size corresponding to host display/monitor size. 10a0eb3e1 Alter windows min/max size logic to prioritize enforcing size_max bounds rather than size_min. cdb5cbe6f (Breaking) Commented out ImGuiListClipper::ForceDisplayRangeByIndices() which was obsoleted in 1.89.6. d93d918ec (Breaking) Commented out PushAllowKeyboardFocus()/PopAllowKeyboardFocus() which was obsoleted in 1.89.4. (#3092) 6d939fced (Breaking) TreeNode: renamed ImGuiTreeNodeFlags_NavLeftJumpsBackHere to ImGuiTreeNodeFlags_NavLeftJumpsToParent for clarity. (#1079, #8639) 9361c3517 Backends: SDL2, SDL3: maximum room for sanitizer to not be zealous. c008c7d49 Merge remote-tracking branch 'origin/master' into docking c90ea1315 Viewports: added per-viewport FramebufferScale, Platform_GetWindowFramebufferScale() + Backends: GLFW, SDL2, SDL3, Apple: added support. (#1065, #1542, #1676, #1786, #2826, #3757, #5081, #5580, #5592, #6465, #7273, #7779 etc.) ) 63554bcee Backends: OSX: rename internal struct for consistency with other backends. b5a73033a Examples: Apple: Amend build scripts and gitignore, fix misc OSX warnings. (#8637) 2df9e9b10 Examples: Apple: add Makefile for example_apple_metal, example_apple_opengl2. (#8637) 2fd474132 Update pull_request_template.md 4e487cfa9 stb_textedit: subsequent comments to match ocornut/stb branch. (#8635, #7925) 1387d356a stb_textedit: subsequent fixes for next/prev word impl (not used by imgui) + PageUp/Home/End (no side effect but more correct) (#8635, #7925) 5c3ac9333 stb_textedit: minor edits to match PR submitted upstream. 61242e2e6 InputText: fixed cursor positioning issue using up/down keys on non-ASCII text. (#8635, #7925) 08689c51a Backends: GLFW, SDL2, SDL3: include GLFW/SDL version number in io.BackendPlatformName. 4a6ba9539 Backends: SDL3: Comments (#6146) e33069ce5 Viewports: fallback DpiScale pulled from fallback Monitor for consistency. b9ac32a0d Backends: DirectX12: Make sure texture sampling in the dx12 backend is not limited to the highest mip. (#8631) f484af34c Font: rename ImFont::AddRemapChar() parameters for clarity. (#609) ba513ba80 Backends: DX10, DX11, DX12: honor FramebufferScale. (#8412) 0a222a3e2 Backends: Vulkan: fixed build with VK_NO_PROTOTYPES. bf68040dc Backends: Vulkan: fixed build with VK_NO_PROTOTYPES. 37fba4bed Backends: Vulkan: fixed validation errors during window detach in multi-viewport mode. [docking branch amend] (#8600, #8176) 1c8fad73f Merge branch 'master' into docking bbc89b639 Backends: Vulkan: fixed validation errors during window detach in multi-viewport mode. (#8600, #8176) 64a5e2748 Docs: bad merge error. d1dc2a329 Backends: Vulkan: Load dynamic rendering functions using vkGetDeviceProcAddr() + try both non-KHR and KHR versions. (#8600, #8326, #8365) 46235e91f Examples: SDL3: specify SDL_WINDOW_HIGH_PIXEL_DENSITY and make centering consistent + call SDL_RenderScale(). afd3a36f6 Demo: added basic Fonts section under main demo (same as Metrics one) for visibility. c5e2bb7cd Backends: SDLGPU3: Fixed creating atlas texture earlier than other backends. ef62aa733 Backends: SDL3: macOS: Fixed secondary-viewports not appearing on a different monitor than the main viewport. e3bfaab3f Examples: update xcode projects. c0dfd65d6 Backends: Win32: Fixed an issue where externally losing mouse capture (due to e.g. focus loss) would fail to claim it again the next subsequent click. (#8594) 20066a896 Examples: DirectX12+Win32: also test for IsIconic() for sleeping since we don't seem to get a DXGI_STATUS_OCCLUDED signal when minimized. (#8603) 3f8033324 Demo: Dual List Box: fix sorting function, in theory should return 0 when equal. (#8601) 75ddd9a6c Backends: SDLGPU3: added support for ImDrawCallback_ResetRenderState. (#8599) b3c96bde8 Demo: use IM_ARRAYSIZE more consistently InputText calls in demo window (#8596) cbb8edb0b Tables: fixed an assert when combining Tables, Frozen Rows, Clipper and BeginMultiSelect() in a certain order. (#8595, #8250) fcdaa3279 Backends: GLFW: Disable multi-viewports under Wayland. (#8587) fe298cf98 Revert "Backends: SDL2, SDL3: viewports created with ImGuiViewportFlags_NoInputs are passing SDL_WINDOW_TOOLTIP to SDL_CreateWindow(). (#8576)" 75964a986 CI: run on ubuntu-latest. b81991ac0 Backends: SDLGPU3: clear ImGuiBackendFlags_RendererHasViewports flag on shutdown. 2a000ee09 Backends: SDL2, SDL3: viewports created with ImGuiViewportFlags_NoInputs are passing SDL_WINDOW_TOOLTIP to SDL_CreateWindow(). (#8576) f53de38e1 Viewports, Backends: Debug logging. 3563f4db3 Rework TextAligned() api to fix issues with baseline alignment + use standard CalcItemSize(). (#7024) f2ba3a937 Rework TextAligned() api to take size input. (#7024) 0fc4967eb Rework TextAligned() api to fix issues with baseline alignment + use standard CalcItemSize(). (#7024) aed1bcc12 Rework TextAligned() api to take size input. (#7024) 839e3274e Merge branch 'master' into docking 6a42d6b33 Added wp TextAligned() TextAlignedV(), TextAlignedExV() to internal API. (#7024) dcf0d8cab Tables: fixed TableHeader() eager vertical clipping of text. (#6236) 7c6ce12fa Platform IME: minor amend to bf0f586 (#8584) bf0f586b6 Platform IME: added ImGuiPlatformImeData::WantTextInput, ViewportId. Backends: SDL3: honor WantTextInput. (#8584, #7492, #6341) facf671ec Demo: rename DockingSplitterSize slider label to DockingSeparatorSize for consistency. (#8579) af987eb11 Backends: DX12: build fix for Clang. (#8582) 87f12e56f Backends: SDL_GPU: Added multi-viewport support. Amends + update example. (#8573, #8163, #7998, #7988) baffc4e8b Backends: SDL_GPU: Added multi-viewport support. (#8573, #8163, #7998, #7988) 0ddc36f54 RenderTextEllipsis()): pixel align every dot for consistent display. 88d2df24b Merge branch 'master' into docking 69d572bb1 Fonts: reworked text ellipsis logic to ensure a "..." is always displayed instead of a single character. (#7024) 97d85338e Tabs: adjust handling of ellipsis now that Close Button visibility changed. (#8387) Internals: remove extra parameter to RenderTextEllipsis(). e4a865177 ImFont: added cpu clip fine option for ImFont::RenderChar() (which is technically internal). faea19380 Internals: minor refactor of TabItemLabelAndCloseButton(), should be no-op. 7ab4728a3 Error Handling: added better error report and recovery when calling EndFrame() or Render() without NewFrame(). b23a216ec Examples: added SDL2+Vulkan, SDL3+Vulkan, GLFW+Vulkan makefiles. Amend ignore list. (#2480) d3bb3336f Backends: OSX: remove duplicate variable. (#8565) 3ab50c334 TreeNode, Style: added style.TreeLinesRounding support. (#2920) git-subtree-dir: external/imgui git-subtree-split: 3f0699cf02b07c8312edbcd937f1881e3564d1ac
640 lines
30 KiB
C++
640 lines
30 KiB
C++
// 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 texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
|
|
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
|
|
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
|
|
// [X] Renderer: IMGUI_USE_BGRA_PACKED_COLOR support, as this is the optimal color encoding for DirectX9.
|
|
// [X] Renderer: Multi-viewport support (multiple windows). Enable with 'io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable'.
|
|
|
|
// 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.
|
|
// Learn about Dear ImGui:
|
|
// - FAQ https://dearimgui.com/faq
|
|
// - Getting Started https://dearimgui.com/getting-started
|
|
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
|
|
// - Introduction, links and more at the top of imgui.cpp
|
|
|
|
// CHANGELOG
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
// 2025-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
|
// 2025-06-11: DirectX9: Added support for ImGuiBackendFlags_RendererHasTextures, for dynamic font atlas.
|
|
// 2024-10-07: DirectX9: Changed default texture sampler to Clamp instead of Repeat/Wrap.
|
|
// 2024-02-12: DirectX9: Using RGBA format when supported by the driver to avoid CPU side conversion. (#6575)
|
|
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
|
|
// 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"
|
|
#ifndef IMGUI_DISABLE
|
|
#include "imgui_impl_dx9.h"
|
|
|
|
// DirectX
|
|
#include <d3d9.h>
|
|
|
|
// Clang/GCC warnings with -Weverything
|
|
#if defined(__clang__)
|
|
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
|
|
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
|
|
#endif
|
|
|
|
// DirectX data
|
|
struct ImGui_ImplDX9_Data
|
|
{
|
|
LPDIRECT3DDEVICE9 pd3dDevice;
|
|
LPDIRECT3DVERTEXBUFFER9 pVB;
|
|
LPDIRECT3DINDEXBUFFER9 pIB;
|
|
int VertexBufferSize;
|
|
int IndexBufferSize;
|
|
bool HasRgbaSupport;
|
|
|
|
ImGui_ImplDX9_Data() { memset((void*)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 : nullptr;
|
|
}
|
|
|
|
// Forward Declarations
|
|
static void ImGui_ImplDX9_InitMultiViewportSupport();
|
|
static void ImGui_ImplDX9_ShutdownMultiViewportSupport();
|
|
static void ImGui_ImplDX9_CreateDeviceObjectsForPlatformWindows();
|
|
static void ImGui_ImplDX9_InvalidateDeviceObjectsForPlatformWindows();
|
|
|
|
// 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;
|
|
|
|
LPDIRECT3DDEVICE9 device = bd->pd3dDevice;
|
|
device->SetViewport(&vp);
|
|
|
|
// Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing, shade mode (for gradient), bilinear sampling.
|
|
device->SetPixelShader(nullptr);
|
|
device->SetVertexShader(nullptr);
|
|
device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
|
|
device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
|
|
device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
|
|
device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
|
|
device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
|
device->SetRenderState(D3DRS_ZENABLE, FALSE);
|
|
device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
|
|
device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
|
|
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
|
|
device->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE);
|
|
device->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA);
|
|
device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE);
|
|
device->SetRenderState(D3DRS_FOGENABLE, FALSE);
|
|
device->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
|
|
device->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
|
|
device->SetRenderState(D3DRS_STENCILENABLE, FALSE);
|
|
device->SetRenderState(D3DRS_CLIPPING, TRUE);
|
|
device->SetRenderState(D3DRS_LIGHTING, FALSE);
|
|
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
|
device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
|
device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
|
|
device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
|
|
device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
device->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
|
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
|
|
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
|
|
// 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
|
|
} } };
|
|
device->SetTransform(D3DTS_WORLD, &mat_identity);
|
|
device->SetTransform(D3DTS_VIEW, &mat_identity);
|
|
device->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;
|
|
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
LPDIRECT3DDEVICE9 device = bd->pd3dDevice;
|
|
|
|
// Catch up with texture updates. Most of the times, the list will have 1 element with an OK status, aka nothing to do.
|
|
// (This almost always points to ImGui::GetPlatformIO().Textures[] but is part of ImDrawData to allow overriding or disabling texture updates).
|
|
if (draw_data->Textures != nullptr)
|
|
for (ImTextureData* tex : *draw_data->Textures)
|
|
if (tex->Status != ImTextureStatus_OK)
|
|
ImGui_ImplDX9_UpdateTexture(tex);
|
|
|
|
// Create and grow buffers if needed
|
|
if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount)
|
|
{
|
|
if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; }
|
|
bd->VertexBufferSize = draw_data->TotalVtxCount + 5000;
|
|
if (device->CreateVertexBuffer(bd->VertexBufferSize * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &bd->pVB, nullptr) < 0)
|
|
return;
|
|
}
|
|
if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount)
|
|
{
|
|
if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; }
|
|
bd->IndexBufferSize = draw_data->TotalIdxCount + 10000;
|
|
if (device->CreateIndexBuffer(bd->IndexBufferSize * sizeof(ImDrawIdx), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, sizeof(ImDrawIdx) == 2 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, D3DPOOL_DEFAULT, &bd->pIB, nullptr) < 0)
|
|
return;
|
|
}
|
|
|
|
// Backup the DX9 state
|
|
IDirect3DStateBlock9* state_block = nullptr;
|
|
if (device->CreateStateBlock(D3DSBT_ALL, &state_block) < 0)
|
|
return;
|
|
if (state_block->Capture() < 0)
|
|
{
|
|
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;
|
|
device->GetTransform(D3DTS_WORLD, &last_world);
|
|
device->GetTransform(D3DTS_VIEW, &last_view);
|
|
device->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)
|
|
{
|
|
state_block->Release();
|
|
return;
|
|
}
|
|
if (bd->pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0)
|
|
{
|
|
bd->pVB->Unlock();
|
|
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* draw_list = draw_data->CmdLists[n];
|
|
const ImDrawVert* vtx_src = draw_list->VtxBuffer.Data;
|
|
for (int i = 0; i < draw_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, draw_list->IdxBuffer.Data, draw_list->IdxBuffer.Size * sizeof(ImDrawIdx));
|
|
idx_dst += draw_list->IdxBuffer.Size;
|
|
}
|
|
bd->pVB->Unlock();
|
|
bd->pIB->Unlock();
|
|
device->SetStreamSource(0, bd->pVB, 0, sizeof(CUSTOMVERTEX));
|
|
device->SetIndices(bd->pIB);
|
|
device->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* draw_list = draw_data->CmdLists[n];
|
|
for (int cmd_i = 0; cmd_i < draw_list->CmdBuffer.Size; cmd_i++)
|
|
{
|
|
const ImDrawCmd* pcmd = &draw_list->CmdBuffer[cmd_i];
|
|
if (pcmd->UserCallback != nullptr)
|
|
{
|
|
// 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(draw_list, pcmd);
|
|
}
|
|
else
|
|
{
|
|
// Project scissor/clipping rectangles into framebuffer space
|
|
ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y);
|
|
ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y);
|
|
if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
|
|
continue;
|
|
|
|
// Apply scissor/clipping rectangle
|
|
const RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y };
|
|
device->SetScissorRect(&r);
|
|
|
|
// Bind texture, Draw
|
|
const LPDIRECT3DTEXTURE9 texture = (LPDIRECT3DTEXTURE9)pcmd->GetTexID();
|
|
device->SetTexture(0, texture);
|
|
device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, pcmd->VtxOffset + global_vtx_offset, 0, (UINT)draw_list->VtxBuffer.Size, pcmd->IdxOffset + global_idx_offset, pcmd->ElemCount / 3);
|
|
}
|
|
}
|
|
global_idx_offset += draw_list->IdxBuffer.Size;
|
|
global_vtx_offset += draw_list->VtxBuffer.Size;
|
|
}
|
|
|
|
// When using multi-viewports, it appears that there's an odd logic in DirectX9 which prevent subsequent windows
|
|
// from rendering until the first window submits at least one draw call, even once. That's our workaround. (see #2560)
|
|
if (global_vtx_offset == 0)
|
|
bd->pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, 0);
|
|
|
|
// Restore the DX9 transform
|
|
device->SetTransform(D3DTS_WORLD, &last_world);
|
|
device->SetTransform(D3DTS_VIEW, &last_view);
|
|
device->SetTransform(D3DTS_PROJECTION, &last_projection);
|
|
|
|
// Restore the DX9 state
|
|
state_block->Apply();
|
|
state_block->Release();
|
|
}
|
|
|
|
static bool ImGui_ImplDX9_CheckFormatSupport(LPDIRECT3DDEVICE9 pDevice, D3DFORMAT format)
|
|
{
|
|
LPDIRECT3D9 pd3d = nullptr;
|
|
if (pDevice->GetDirect3D(&pd3d) != D3D_OK)
|
|
return false;
|
|
D3DDEVICE_CREATION_PARAMETERS param = {};
|
|
D3DDISPLAYMODE mode = {};
|
|
if (pDevice->GetCreationParameters(¶m) != D3D_OK || pDevice->GetDisplayMode(0, &mode) != D3D_OK)
|
|
{
|
|
pd3d->Release();
|
|
return false;
|
|
}
|
|
// Font texture should support linear filter, color blend and write to render-target
|
|
bool support = (pd3d->CheckDeviceFormat(param.AdapterOrdinal, param.DeviceType, mode.Format, D3DUSAGE_DYNAMIC | D3DUSAGE_QUERY_FILTER | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, format)) == D3D_OK;
|
|
pd3d->Release();
|
|
return support;
|
|
}
|
|
|
|
bool ImGui_ImplDX9_Init(IDirect3DDevice9* device)
|
|
{
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
IMGUI_CHECKVERSION();
|
|
IM_ASSERT(io.BackendRendererUserData == nullptr && "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.
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; // We can honor ImGuiPlatformIO::Textures[] requests during render.
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the Renderer side (optional)
|
|
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
platform_io.Renderer_TextureMaxWidth = platform_io.Renderer_TextureMaxHeight = 4096;
|
|
|
|
bd->pd3dDevice = device;
|
|
bd->pd3dDevice->AddRef();
|
|
bd->HasRgbaSupport = ImGui_ImplDX9_CheckFormatSupport(bd->pd3dDevice, D3DFMT_A8B8G8R8);
|
|
|
|
ImGui_ImplDX9_InitMultiViewportSupport();
|
|
|
|
return true;
|
|
}
|
|
|
|
void ImGui_ImplDX9_Shutdown()
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?");
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
ImGui_ImplDX9_ShutdownMultiViewportSupport();
|
|
ImGui_ImplDX9_InvalidateDeviceObjects();
|
|
if (bd->pd3dDevice) { bd->pd3dDevice->Release(); }
|
|
io.BackendRendererName = nullptr;
|
|
io.BackendRendererUserData = nullptr;
|
|
io.BackendFlags &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasTextures | ImGuiBackendFlags_RendererHasViewports);
|
|
IM_DELETE(bd);
|
|
}
|
|
|
|
// Convert RGBA32 to BGRA32 (because RGBA32 is not well supported by DX9 devices)
|
|
static void ImGui_ImplDX9_CopyTextureRegion(bool tex_use_colors, const ImU32* src, int src_pitch, ImU32* dst, int dst_pitch, int w, int h)
|
|
{
|
|
#ifndef IMGUI_USE_BGRA_PACKED_COLOR
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
const bool convert_rgba_to_bgra = (!bd->HasRgbaSupport && tex_use_colors);
|
|
#else
|
|
const bool convert_rgba_to_bgra = false;
|
|
IM_UNUSED(tex_use_colors);
|
|
#endif
|
|
for (int y = 0; y < h; y++)
|
|
{
|
|
const ImU32* src_p = (const ImU32*)(const void*)((const unsigned char*)src + src_pitch * y);
|
|
ImU32* dst_p = (ImU32*)(void*)((unsigned char*)dst + dst_pitch * y);
|
|
if (convert_rgba_to_bgra)
|
|
for (int x = w; x > 0; x--, src_p++, dst_p++) // Convert copy
|
|
*dst_p = IMGUI_COL_TO_DX9_ARGB(*src_p);
|
|
else
|
|
memcpy(dst_p, src_p, w * 4); // Raw copy
|
|
}
|
|
}
|
|
|
|
void ImGui_ImplDX9_UpdateTexture(ImTextureData* tex)
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
|
|
if (tex->Status == ImTextureStatus_WantCreate)
|
|
{
|
|
// Create and upload new texture to graphics system
|
|
//IMGUI_DEBUG_LOG("UpdateTexture #%03d: WantCreate %dx%d\n", tex->UniqueID, tex->Width, tex->Height);
|
|
IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == nullptr);
|
|
IM_ASSERT(tex->Format == ImTextureFormat_RGBA32);
|
|
LPDIRECT3DTEXTURE9 dx_tex = nullptr;
|
|
HRESULT hr = bd->pd3dDevice->CreateTexture(tex->Width, tex->Height, 1, D3DUSAGE_DYNAMIC, bd->HasRgbaSupport ? D3DFMT_A8B8G8R8 : D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &dx_tex, nullptr);
|
|
if (hr < 0)
|
|
{
|
|
IM_ASSERT(hr >= 0 && "Backend failed to create texture!");
|
|
return;
|
|
}
|
|
|
|
D3DLOCKED_RECT locked_rect;
|
|
if (dx_tex->LockRect(0, &locked_rect, nullptr, 0) == D3D_OK)
|
|
{
|
|
ImGui_ImplDX9_CopyTextureRegion(tex->UseColors, (ImU32*)tex->GetPixels(), tex->Width * 4, (ImU32*)locked_rect.pBits, (ImU32)locked_rect.Pitch, tex->Width, tex->Height);
|
|
dx_tex->UnlockRect(0);
|
|
}
|
|
|
|
// Store identifiers
|
|
tex->SetTexID((ImTextureID)(intptr_t)dx_tex);
|
|
tex->SetStatus(ImTextureStatus_OK);
|
|
}
|
|
else if (tex->Status == ImTextureStatus_WantUpdates)
|
|
{
|
|
// Update selected blocks. We only ever write to textures regions which have never been used before!
|
|
// This backend choose to use tex->Updates[] but you can use tex->UpdateRect to upload a single region.
|
|
LPDIRECT3DTEXTURE9 backend_tex = (LPDIRECT3DTEXTURE9)(intptr_t)tex->TexID;
|
|
RECT update_rect = { (LONG)tex->UpdateRect.x, (LONG)tex->UpdateRect.y, (LONG)(tex->UpdateRect.x + tex->UpdateRect.w), (LONG)(tex->UpdateRect.y + tex->UpdateRect.h) };
|
|
D3DLOCKED_RECT locked_rect;
|
|
if (backend_tex->LockRect(0, &locked_rect, &update_rect, 0) == D3D_OK)
|
|
for (ImTextureRect& r : tex->Updates)
|
|
ImGui_ImplDX9_CopyTextureRegion(tex->UseColors, (ImU32*)tex->GetPixelsAt(r.x, r.y), tex->Width * 4,
|
|
(ImU32*)locked_rect.pBits + (r.x - update_rect.left) + (r.y - update_rect.top) * (locked_rect.Pitch / 4), (int)locked_rect.Pitch, r.w, r.h);
|
|
backend_tex->UnlockRect(0);
|
|
tex->SetStatus(ImTextureStatus_OK);
|
|
}
|
|
else if (tex->Status == ImTextureStatus_WantDestroy)
|
|
{
|
|
LPDIRECT3DTEXTURE9 backend_tex = (LPDIRECT3DTEXTURE9)tex->TexID;
|
|
if (backend_tex == nullptr)
|
|
return;
|
|
IM_ASSERT(tex->TexID == (ImTextureID)(intptr_t)backend_tex);
|
|
backend_tex->Release();
|
|
|
|
// Clear identifiers and mark as destroyed (in order to allow e.g. calling InvalidateDeviceObjects while running)
|
|
tex->SetTexID(ImTextureID_Invalid);
|
|
tex->SetStatus(ImTextureStatus_Destroyed);
|
|
}
|
|
}
|
|
|
|
bool ImGui_ImplDX9_CreateDeviceObjects()
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
if (!bd || !bd->pd3dDevice)
|
|
return false;
|
|
ImGui_ImplDX9_CreateDeviceObjectsForPlatformWindows();
|
|
return true;
|
|
}
|
|
|
|
void ImGui_ImplDX9_InvalidateDeviceObjects()
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
if (!bd || !bd->pd3dDevice)
|
|
return;
|
|
|
|
// Destroy all textures
|
|
for (ImTextureData* tex : ImGui::GetPlatformIO().Textures)
|
|
if (tex->RefCount == 1)
|
|
{
|
|
tex->SetStatus(ImTextureStatus_WantDestroy);
|
|
ImGui_ImplDX9_UpdateTexture(tex);
|
|
}
|
|
if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; }
|
|
if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; }
|
|
ImGui_ImplDX9_InvalidateDeviceObjectsForPlatformWindows();
|
|
}
|
|
|
|
void ImGui_ImplDX9_NewFrame()
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX9_Init()?");
|
|
IM_UNUSED(bd);
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------------
|
|
// MULTI-VIEWPORT / PLATFORM INTERFACE SUPPORT
|
|
// This is an _advanced_ and _optional_ feature, allowing the backend to create and handle multiple viewports simultaneously.
|
|
// If you are new to dear imgui or creating a new binding for dear imgui, it is recommended that you completely ignore this section first..
|
|
//--------------------------------------------------------------------------------------------------------
|
|
|
|
// Helper structure we store in the void* RendererUserData field of each ImGuiViewport to easily retrieve our backend data.
|
|
struct ImGui_ImplDX9_ViewportData
|
|
{
|
|
IDirect3DSwapChain9* SwapChain;
|
|
D3DPRESENT_PARAMETERS d3dpp;
|
|
|
|
ImGui_ImplDX9_ViewportData() { SwapChain = nullptr; ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS)); }
|
|
~ImGui_ImplDX9_ViewportData() { IM_ASSERT(SwapChain == nullptr); }
|
|
};
|
|
|
|
static void ImGui_ImplDX9_CreateWindow(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
ImGui_ImplDX9_ViewportData* vd = IM_NEW(ImGui_ImplDX9_ViewportData)();
|
|
viewport->RendererUserData = vd;
|
|
|
|
// PlatformHandleRaw should always be a HWND, whereas PlatformHandle might be a higher-level handle (e.g. GLFWWindow*, SDL's WindowID).
|
|
// Some backends will leave PlatformHandleRaw == 0, in which case we assume PlatformHandle will contain the HWND.
|
|
HWND hwnd = viewport->PlatformHandleRaw ? (HWND)viewport->PlatformHandleRaw : (HWND)viewport->PlatformHandle;
|
|
IM_ASSERT(hwnd != 0);
|
|
|
|
ZeroMemory(&vd->d3dpp, sizeof(D3DPRESENT_PARAMETERS));
|
|
vd->d3dpp.Windowed = TRUE;
|
|
vd->d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
|
vd->d3dpp.BackBufferWidth = (UINT)viewport->Size.x;
|
|
vd->d3dpp.BackBufferHeight = (UINT)viewport->Size.y;
|
|
vd->d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
|
|
vd->d3dpp.hDeviceWindow = hwnd;
|
|
vd->d3dpp.EnableAutoDepthStencil = FALSE;
|
|
vd->d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
|
|
vd->d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Present without vsync
|
|
|
|
HRESULT hr = bd->pd3dDevice->CreateAdditionalSwapChain(&vd->d3dpp, &vd->SwapChain); IM_UNUSED(hr);
|
|
IM_ASSERT(hr == D3D_OK);
|
|
IM_ASSERT(vd->SwapChain != nullptr);
|
|
}
|
|
|
|
static void ImGui_ImplDX9_DestroyWindow(ImGuiViewport* viewport)
|
|
{
|
|
// The main viewport (owned by the application) will always have RendererUserData == 0 since we didn't create the data for it.
|
|
if (ImGui_ImplDX9_ViewportData* vd = (ImGui_ImplDX9_ViewportData*)viewport->RendererUserData)
|
|
{
|
|
if (vd->SwapChain)
|
|
vd->SwapChain->Release();
|
|
vd->SwapChain = nullptr;
|
|
ZeroMemory(&vd->d3dpp, sizeof(D3DPRESENT_PARAMETERS));
|
|
IM_DELETE(vd);
|
|
}
|
|
viewport->RendererUserData = nullptr;
|
|
}
|
|
|
|
static void ImGui_ImplDX9_SetWindowSize(ImGuiViewport* viewport, ImVec2 size)
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
ImGui_ImplDX9_ViewportData* vd = (ImGui_ImplDX9_ViewportData*)viewport->RendererUserData;
|
|
if (vd->SwapChain)
|
|
{
|
|
vd->SwapChain->Release();
|
|
vd->SwapChain = nullptr;
|
|
vd->d3dpp.BackBufferWidth = (UINT)size.x;
|
|
vd->d3dpp.BackBufferHeight = (UINT)size.y;
|
|
HRESULT hr = bd->pd3dDevice->CreateAdditionalSwapChain(&vd->d3dpp, &vd->SwapChain); IM_UNUSED(hr);
|
|
IM_ASSERT(hr == D3D_OK);
|
|
}
|
|
}
|
|
|
|
static void ImGui_ImplDX9_RenderWindow(ImGuiViewport* viewport, void*)
|
|
{
|
|
ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
|
|
ImGui_ImplDX9_ViewportData* vd = (ImGui_ImplDX9_ViewportData*)viewport->RendererUserData;
|
|
ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
LPDIRECT3DSURFACE9 render_target = nullptr;
|
|
LPDIRECT3DSURFACE9 last_render_target = nullptr;
|
|
LPDIRECT3DSURFACE9 last_depth_stencil = nullptr;
|
|
vd->SwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &render_target);
|
|
bd->pd3dDevice->GetRenderTarget(0, &last_render_target);
|
|
bd->pd3dDevice->GetDepthStencilSurface(&last_depth_stencil);
|
|
bd->pd3dDevice->SetRenderTarget(0, render_target);
|
|
bd->pd3dDevice->SetDepthStencilSurface(nullptr);
|
|
|
|
if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear))
|
|
{
|
|
D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_color.x*255.0f), (int)(clear_color.y*255.0f), (int)(clear_color.z*255.0f), (int)(clear_color.w*255.0f));
|
|
bd->pd3dDevice->Clear(0, nullptr, D3DCLEAR_TARGET, clear_col_dx, 1.0f, 0);
|
|
}
|
|
|
|
ImGui_ImplDX9_RenderDrawData(viewport->DrawData);
|
|
|
|
// Restore render target
|
|
bd->pd3dDevice->SetRenderTarget(0, last_render_target);
|
|
bd->pd3dDevice->SetDepthStencilSurface(last_depth_stencil);
|
|
render_target->Release();
|
|
last_render_target->Release();
|
|
if (last_depth_stencil) last_depth_stencil->Release();
|
|
}
|
|
|
|
static void ImGui_ImplDX9_SwapBuffers(ImGuiViewport* viewport, void*)
|
|
{
|
|
ImGui_ImplDX9_ViewportData* vd = (ImGui_ImplDX9_ViewportData*)viewport->RendererUserData;
|
|
HRESULT hr = vd->SwapChain->Present(nullptr, nullptr, vd->d3dpp.hDeviceWindow, nullptr, 0);
|
|
// Let main application handle D3DERR_DEVICELOST by resetting the device.
|
|
IM_ASSERT(SUCCEEDED(hr) || hr == D3DERR_DEVICELOST);
|
|
}
|
|
|
|
static void ImGui_ImplDX9_InitMultiViewportSupport()
|
|
{
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
platform_io.Renderer_CreateWindow = ImGui_ImplDX9_CreateWindow;
|
|
platform_io.Renderer_DestroyWindow = ImGui_ImplDX9_DestroyWindow;
|
|
platform_io.Renderer_SetWindowSize = ImGui_ImplDX9_SetWindowSize;
|
|
platform_io.Renderer_RenderWindow = ImGui_ImplDX9_RenderWindow;
|
|
platform_io.Renderer_SwapBuffers = ImGui_ImplDX9_SwapBuffers;
|
|
}
|
|
|
|
static void ImGui_ImplDX9_ShutdownMultiViewportSupport()
|
|
{
|
|
ImGui::DestroyPlatformWindows();
|
|
}
|
|
|
|
static void ImGui_ImplDX9_CreateDeviceObjectsForPlatformWindows()
|
|
{
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
if (!platform_io.Viewports[i]->RendererUserData)
|
|
ImGui_ImplDX9_CreateWindow(platform_io.Viewports[i]);
|
|
}
|
|
|
|
static void ImGui_ImplDX9_InvalidateDeviceObjectsForPlatformWindows()
|
|
{
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
if (platform_io.Viewports[i]->RendererUserData)
|
|
ImGui_ImplDX9_DestroyWindow(platform_io.Viewports[i]);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#endif // #ifndef IMGUI_DISABLE
|