@ -20,6 +20,7 @@
// - Introduction, links and more at the top of imgui.cpp
// CHANGELOG
// 2024-05-14: *BREAKING CHANGE* ImGui_ImplSDLRenderer3_RenderDrawData() requires SDL_Renderer* passed as parameter.
// 2024-02-12: Amend to query SDL_RenderViewportSet() and restore viewport accordingly.
// 2023-05-30: Initial version.
@ -43,9 +44,9 @@
// SDL_Renderer data
struct ImGui_ImplSDLRenderer3_Data
{
SDL_Renderer * SDL Renderer;
SDL_Renderer * Renderer ; // Main viewport's renderer
SDL_Texture * FontTexture ;
ImGui_ImplSDLRenderer3_Data ( ) { memset ( ( void * ) this , 0 , sizeof ( * this ) ) ; }
ImGui_ImplSDLRenderer3_Data ( ) { memset ( ( void * ) this , 0 , sizeof ( * this ) ) ; }
} ;
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
@ -69,7 +70,7 @@ bool ImGui_ImplSDLRenderer3_Init(SDL_Renderer* renderer)
io . BackendRendererName = " imgui_impl_sdlrenderer3 " ;
io . BackendFlags | = ImGuiBackendFlags_RendererHasVtxOffset ; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
bd - > SDL Renderer = renderer ;
bd - > Renderer = renderer ;
return true ;
}
@ -88,14 +89,12 @@ void ImGui_ImplSDLRenderer3_Shutdown()
IM_DELETE ( bd ) ;
}
static void ImGui_ImplSDLRenderer3_SetupRenderState ( )
static void ImGui_ImplSDLRenderer3_SetupRenderState ( SDL_Renderer * renderer )
{
ImGui_ImplSDLRenderer3_Data * bd = ImGui_ImplSDLRenderer3_GetBackendData ( ) ;
// Clear out any viewports and cliprect set by the user
// FIXME: Technically speaking there are lots of other things we could backup/setup/restore during our render process.
SDL_SetRenderViewport ( bd - > SDLR enderer, nullptr ) ;
SDL_SetRenderClipRect ( bd - > SDLR enderer, nullptr ) ;
SDL_SetRenderViewport ( r enderer, nullptr ) ;
SDL_SetRenderClipRect ( r enderer, nullptr ) ;
}
void ImGui_ImplSDLRenderer3_NewFrame ( )
@ -107,16 +106,14 @@ void ImGui_ImplSDLRenderer3_NewFrame()
ImGui_ImplSDLRenderer3_CreateDeviceObjects ( ) ;
}
void ImGui_ImplSDLRenderer3_RenderDrawData ( ImDrawData * draw_data )
void ImGui_ImplSDLRenderer3_RenderDrawData ( ImDrawData * draw_data , SDL_Renderer * renderer )
{
ImGui_ImplSDLRenderer3_Data * bd = ImGui_ImplSDLRenderer3_GetBackendData ( ) ;
// If there's a scale factor set by the user, use that instead
// If the user has specified a scale factor to SDL_Renderer already via SDL_RenderSetScale(), SDL will scale whatever we pass
// to SDL_RenderGeometryRaw() by that scale factor. In that case we don't want to be also scaling it ourselves here.
float rsx = 1.0f ;
float rsy = 1.0f ;
SDL_GetRenderScale ( bd - > SDLR enderer, & rsx , & rsy ) ;
SDL_GetRenderScale ( r enderer, & rsx , & rsy ) ;
ImVec2 render_scale ;
render_scale . x = ( rsx = = 1.0f ) ? draw_data - > FramebufferScale . x : 1.0f ;
render_scale . y = ( rsy = = 1.0f ) ? draw_data - > FramebufferScale . y : 1.0f ;
@ -136,17 +133,17 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
SDL_Rect ClipRect ;
} ;
BackupSDLRendererState old = { } ;
old . ViewportEnabled = SDL_RenderViewportSet ( bd - > SDLR enderer) = = SDL_TRUE ;
old . ClipEnabled = SDL_RenderClipEnabled ( bd - > SDLR enderer) = = SDL_TRUE ;
SDL_GetRenderViewport ( bd - > SDLR enderer, & old . Viewport ) ;
SDL_GetRenderClipRect ( bd - > SDLR enderer, & old . ClipRect ) ;
old . ViewportEnabled = SDL_RenderViewportSet ( r enderer) = = SDL_TRUE ;
old . ClipEnabled = SDL_RenderClipEnabled ( r enderer) = = SDL_TRUE ;
SDL_GetRenderViewport ( r enderer, & old . Viewport ) ;
SDL_GetRenderClipRect ( r enderer, & old . ClipRect ) ;
// Will project scissor/clipping rectangles into framebuffer space
ImVec2 clip_off = draw_data - > DisplayPos ; // (0,0) unless using multi-viewports
ImVec2 clip_scale = render_scale ;
// Render command lists
ImGui_ImplSDLRenderer3_SetupRenderState ( ) ;
ImGui_ImplSDLRenderer3_SetupRenderState ( renderer ) ;
for ( int n = 0 ; n < draw_data - > CmdListsCount ; n + + )
{
const ImDrawList * cmd_list = draw_data - > CmdLists [ n ] ;
@ -161,7 +158,7 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
// 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_ImplSDLRenderer3_SetupRenderState ( ) ;
ImGui_ImplSDLRenderer3_SetupRenderState ( renderer ) ;
else
pcmd - > UserCallback ( cmd_list , pcmd ) ;
}
@ -178,7 +175,7 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
continue ;
SDL_Rect r = { ( int ) ( clip_min . x ) , ( int ) ( clip_min . y ) , ( int ) ( clip_max . x - clip_min . x ) , ( int ) ( clip_max . y - clip_min . y ) } ;
SDL_SetRenderClipRect ( bd - > SDLR enderer, & r ) ;
SDL_SetRenderClipRect ( r enderer, & r ) ;
const float * xy = ( const float * ) ( const void * ) ( ( const char * ) ( vtx_buffer + pcmd - > VtxOffset ) + offsetof ( ImDrawVert , pos ) ) ;
const float * uv = ( const float * ) ( const void * ) ( ( const char * ) ( vtx_buffer + pcmd - > VtxOffset ) + offsetof ( ImDrawVert , uv ) ) ;
@ -186,7 +183,7 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
// Bind texture, Draw
SDL_Texture * tex = ( SDL_Texture * ) pcmd - > GetTexID ( ) ;
SDL_RenderGeometryRaw ( bd - > SDLR enderer, tex ,
SDL_RenderGeometryRaw ( r enderer, tex ,
xy , ( int ) sizeof ( ImDrawVert ) ,
color , ( int ) sizeof ( ImDrawVert ) ,
uv , ( int ) sizeof ( ImDrawVert ) ,
@ -197,8 +194,8 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
}
// Restore modified SDL_Renderer state
SDL_SetRenderViewport ( bd - > SDLR enderer, old . ViewportEnabled ? & old . Viewport : nullptr ) ;
SDL_SetRenderClipRect ( bd - > SDLR enderer, old . ClipEnabled ? & old . ClipRect : nullptr ) ;
SDL_SetRenderViewport ( r enderer, old . ViewportEnabled ? & old . Viewport : nullptr ) ;
SDL_SetRenderClipRect ( r enderer, old . ClipEnabled ? & old . ClipRect : nullptr ) ;
}
// Called by Init/NewFrame/Shutdown
@ -214,7 +211,7 @@ bool ImGui_ImplSDLRenderer3_CreateFontsTexture()
// Upload texture to graphics system
// (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling)
bd - > FontTexture = SDL_CreateTexture ( bd - > SDL Renderer, SDL_PIXELFORMAT_ABGR8888 , SDL_TEXTUREACCESS_STATIC , width , height ) ;
bd - > FontTexture = SDL_CreateTexture ( bd - > Renderer , SDL_PIXELFORMAT_ABGR8888 , SDL_TEXTUREACCESS_STATIC , width , height ) ;
if ( bd - > FontTexture = = nullptr )
{
SDL_Log ( " error creating texture " ) ;