From fba756176d659a8de8f711f68a4a04c675add942 Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 21 Sep 2021 19:29:39 +0200 Subject: [PATCH] Backends: SDL_Renderer: Amend 1d2d246, various tweaks, fixes, sync to latest. (#3926) --- backends/imgui_impl_sdl.cpp | 10 +- backends/imgui_impl_sdl.h | 2 +- backends/imgui_impl_sdlrenderer.cpp | 152 +++++++++--------- backends/imgui_impl_sdlrenderer.h | 12 +- docs/BACKENDS.md | 2 +- docs/CHANGELOG.txt | 2 + docs/EXAMPLES.md | 11 +- examples/example_sdl_sdlrenderer/README.md | 2 +- .../example_sdl_sdlrenderer.vcxproj | 12 +- examples/example_sdl_sdlrenderer/main.cpp | 45 +++--- 10 files changed, 126 insertions(+), 124 deletions(-) diff --git a/backends/imgui_impl_sdl.cpp b/backends/imgui_impl_sdl.cpp index 651fda51..b725e0ac 100644 --- a/backends/imgui_impl_sdl.cpp +++ b/backends/imgui_impl_sdl.cpp @@ -251,11 +251,6 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window) return true; } -bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window) -{ - return ImGui_ImplSDL2_Init(window); -} - bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context) { IM_UNUSED(sdl_gl_context); // Viewport branch will need this. @@ -283,6 +278,11 @@ bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window) return ImGui_ImplSDL2_Init(window); } +bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window) +{ + return ImGui_ImplSDL2_Init(window); +} + void ImGui_ImplSDL2_Shutdown() { ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); diff --git a/backends/imgui_impl_sdl.h b/backends/imgui_impl_sdl.h index f85233af..d2439eb7 100644 --- a/backends/imgui_impl_sdl.h +++ b/backends/imgui_impl_sdl.h @@ -21,11 +21,11 @@ struct SDL_Window; typedef union SDL_Event SDL_Event; -IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window); 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 bool ImGui_ImplSDL2_InitForSDLRenderer(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); diff --git a/backends/imgui_impl_sdlrenderer.cpp b/backends/imgui_impl_sdlrenderer.cpp index a268deec..4f564f47 100644 --- a/backends/imgui_impl_sdlrenderer.cpp +++ b/backends/imgui_impl_sdlrenderer.cpp @@ -1,15 +1,21 @@ -// dear imgui: Renderer Backend for SDL_Renderer, with Platform Backend SDL +// dear imgui: Renderer Backend for SDL_Renderer // (Requires: SDL 2.0.17+) +// Important to understand: SDL_Renderer is an _optional_ component of SDL. We do not recommend you use SDL_Renderer +// because it provide a rather limited API to the end-user. We provide this backend for the sake of completeness. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. + // Implemented features: +// [X] Renderer: User texture binding. Use 'SDL_Texture*' as ImTextureID. Read the FAQ about ImTextureID! +// Missing features: +// [ ] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices. // You can copy and use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // 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 -// 2021-16-03: Creation +// 2021-09-21: Initial version. #include "imgui.h" #include "imgui_impl_sdlrenderer.h" @@ -19,16 +25,17 @@ #include // intptr_t #endif -#include "SDL.h" - -#if SDL_MAJOR_VERSION < 2 || SDL_MINOR_VERSION < 0 || SDL_PATCHLEVEL < 17 -# error Requires: SDL 2.0.17+ because of SDL_RenderGeometry function +// SDL +#include +#if !SDL_VERSION_ATLEAST(2,0,17) +#error This backend requires SDL 2.0.17+ because of SDL_RenderGeometry() function #endif +// SDL_Renderer data struct ImGui_ImplSDLRenderer_Data { - SDL_Renderer *SDLRenderer; - SDL_Texture *FontTexture; + SDL_Renderer* SDLRenderer; + SDL_Texture* FontTexture; ImGui_ImplSDLRenderer_Data() { memset(this, 0, sizeof(*this)); } }; @@ -40,7 +47,7 @@ static ImGui_ImplSDLRenderer_Data* ImGui_ImplSDLRenderer_GetBackendData() } // Functions -bool ImGui_ImplSDLRenderer_Init(SDL_Renderer *renderer) +bool ImGui_ImplSDLRenderer_Init(SDL_Renderer* renderer) { ImGuiIO& io = ImGui::GetIO(); IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!"); @@ -49,16 +56,18 @@ bool ImGui_ImplSDLRenderer_Init(SDL_Renderer *renderer) // Setup backend capabilities flags ImGui_ImplSDLRenderer_Data* bd = IM_NEW(ImGui_ImplSDLRenderer_Data)(); io.BackendRendererUserData = (void*)bd; - io.BackendRendererName = "imgui_impl_SDLRenderer"; + io.BackendRendererName = "imgui_impl_sdlrenderer"; bd->SDLRenderer = renderer; + return true; } void ImGui_ImplSDLRenderer_Shutdown() { - ImGuiIO& io = ImGui::GetIO(); ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); + IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); ImGui_ImplSDLRenderer_DestroyDeviceObjects(); @@ -69,9 +78,10 @@ void ImGui_ImplSDLRenderer_Shutdown() static void ImGui_ImplSDLRenderer_SetupRenderState() { - ImGui_ImplSDLRenderer_Data *bd = ImGui_ImplSDLRenderer_GetBackendData(); + ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); - // Clear out any viewports and cliprects set by the user + // 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_RenderSetViewport(bd->SDLRenderer, NULL); SDL_RenderSetClipRect(bd->SDLRenderer, NULL); } @@ -81,9 +91,8 @@ void ImGui_ImplSDLRenderer_NewFrame() ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); IM_ASSERT(bd != NULL && "Did you call ImGui_ImplSDLRenderer_Init()?"); - if (!bd->FontTexture) { + if (!bd->FontTexture) ImGui_ImplSDLRenderer_CreateDeviceObjects(); - } } void ImGui_ImplSDLRenderer_RenderDrawData(ImDrawData* draw_data) @@ -91,35 +100,33 @@ void ImGui_ImplSDLRenderer_RenderDrawData(ImDrawData* draw_data) ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); // If there's a scale factor set by the user, use that instead - float rsX = 1.0f; - float rsY = 1.0f; - SDL_RenderGetScale(bd->SDLRenderer, &rsX, &rsY); - - ImVec2 renderScale; - // 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. - renderScale.x = (rsX == 1.0f) ? draw_data->FramebufferScale.x : 1.0f; - renderScale.y = (rsY == 1.0f) ? draw_data->FramebufferScale.y : 1.0f; + // 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_RenderGetScale(bd->SDLRenderer, &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; // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) - int fb_width = (int)(draw_data->DisplaySize.x * renderScale.x); - int fb_height = (int)(draw_data->DisplaySize.y * renderScale.y); + int fb_width = (int)(draw_data->DisplaySize.x * render_scale.x); + int fb_height = (int)(draw_data->DisplaySize.y * render_scale.y); if (fb_width == 0 || fb_height == 0) return; - // Will project scissor/clipping rectangles into framebuffer space ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports - ImVec2 clip_scale = renderScale; + ImVec2 clip_scale = render_scale; + // Render command lists ImGui_ImplSDLRenderer_SetupRenderState(); - - for (int n = 0; n < draw_data->CmdListsCount; n++) { - + 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; - + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; @@ -127,53 +134,39 @@ void ImGui_ImplSDLRenderer_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) { + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) ImGui_ImplSDLRenderer_SetupRenderState(); - } else { + 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) - { - SDL_Rect r; - r.x = clip_rect.x; - r.y = clip_rect.y; - r.w = clip_rect.z - clip_rect.x; - r.h = clip_rect.w - clip_rect.y; - - SDL_RenderSetClipRect(bd->SDLRenderer, &r); - - - int xy_stride = sizeof(ImDrawVert); - float *xy = (float *)((char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)); - - int uv_stride = sizeof(ImDrawVert); - float *uv = (float*)((char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)); - - int col_stride = sizeof(ImDrawVert); - int *color = (int*)((char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)); - - SDL_Texture *tex = (SDL_Texture*)pcmd->TextureId; - - SDL_RenderGeometryRaw(bd->SDLRenderer, tex, - xy, xy_stride, color, - col_stride, - uv, uv_stride, - cmd_list->VtxBuffer.Size, - idx_buffer, pcmd->ElemCount, sizeof (ImDrawIdx)); - - } + ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_min.x < 0.0f) { clip_min.x = 0.0f; } + if (clip_min.y < 0.0f) { clip_min.y = 0.0f; } + if (clip_max.x > fb_width) { clip_max.x = (float)fb_width; } + if (clip_max.y > fb_height) { clip_max.y = (float)fb_height; } + if (clip_max.x < clip_min.x || clip_max.y < clip_min.y) + 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_RenderSetClipRect(bd->SDLRenderer, &r); + + const float* xy = (const float*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)); + const float* uv = (const float*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)); + const int* color = (const int*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)); + + // Bind texture, Draw + SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID(); + SDL_RenderGeometryRaw(bd->SDLRenderer, tex, + xy, (int)sizeof(ImDrawVert), + color, (int)sizeof(ImDrawVert), + uv, (int)sizeof(ImDrawVert), + cmd_list->VtxBuffer.Size, + idx_buffer + pcmd->IdxOffset, pcmd->ElemCount, sizeof(ImDrawIdx)); } - idx_buffer += pcmd->ElemCount; } } } @@ -181,19 +174,24 @@ void ImGui_ImplSDLRenderer_RenderDrawData(ImDrawData* draw_data) // Called by Init/NewFrame/Shutdown bool ImGui_ImplSDLRenderer_CreateFontsTexture() { - // Build texture atlas ImGuiIO& io = ImGui::GetIO(); ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_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 bd->FontTexture = SDL_CreateTexture(bd->SDLRenderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STATIC, width, height); - if (bd->FontTexture == NULL) { + if (bd->FontTexture == NULL) + { SDL_Log("error creating texture"); return false; } SDL_UpdateTexture(bd->FontTexture, NULL, pixels, 4 * width); SDL_SetTextureBlendMode(bd->FontTexture, SDL_BLENDMODE_BLEND); + // Store our identifier io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture); @@ -204,7 +202,8 @@ void ImGui_ImplSDLRenderer_DestroyFontsTexture() { ImGuiIO& io = ImGui::GetIO(); ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); - if (bd->FontTexture) { + if (bd->FontTexture) + { io.Fonts->SetTexID(0); SDL_DestroyTexture(bd->FontTexture); bd->FontTexture = NULL; @@ -220,4 +219,3 @@ void ImGui_ImplSDLRenderer_DestroyDeviceObjects() { ImGui_ImplSDLRenderer_DestroyFontsTexture(); } - diff --git a/backends/imgui_impl_sdlrenderer.h b/backends/imgui_impl_sdlrenderer.h index 7b439618..8c67fa3a 100644 --- a/backends/imgui_impl_sdlrenderer.h +++ b/backends/imgui_impl_sdlrenderer.h @@ -1,13 +1,21 @@ -// dear imgui: Renderer Backend for SDL using SDL_Renderer +// dear imgui: Renderer Backend for SDL_Renderer // (Requires: SDL 2.0.17+) +// Important to understand: SDL_Renderer is an _optional_ component of SDL. We do not recommend you use SDL_Renderer +// because it provide a rather limited API to the end-user. We provide this backend for the sake of completeness. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. + +// Implemented features: +// [X] Renderer: User texture binding. Use 'SDL_Texture*' as ImTextureID. Read the FAQ about ImTextureID! +// Missing features: +// [ ] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices. #pragma once #include "imgui.h" // IMGUI_IMPL_API struct SDL_Renderer; -IMGUI_IMPL_API bool ImGui_ImplSDLRenderer_Init(SDL_Renderer *renderer); +IMGUI_IMPL_API bool ImGui_ImplSDLRenderer_Init(SDL_Renderer* renderer); IMGUI_IMPL_API void ImGui_ImplSDLRenderer_Shutdown(); IMGUI_IMPL_API void ImGui_ImplSDLRenderer_NewFrame(); IMGUI_IMPL_API void ImGui_ImplSDLRenderer_RenderDrawData(ImDrawData* draw_data); diff --git a/docs/BACKENDS.md b/docs/BACKENDS.md index bbd66854..c878132b 100644 --- a/docs/BACKENDS.md +++ b/docs/BACKENDS.md @@ -75,7 +75,7 @@ List of Renderer Backends: 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_sdlrenderer.cpp; use SDL2 and SDL_Renderer, any SDL backend (opengl, gles, gles2, d3d9, d3d11, metal or software) can be used underneath + imgui_impl_sdlrenderer.cpp; SDL_Renderer (optional component of SDL2 available from SDL 2.0.18+) imgui_impl_vulkan.cpp ; Vulkan imgui_impl_wgpu.cpp ; WebGPU diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index b12ce98f..16334834 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -84,10 +84,12 @@ Other Changes: - Backends: Added more implicit asserts to detect invalid/redundant calls to Shutdown functions. (#4562) - Backends: OpenGL3: Fixed our custom GL loader conflicting with user using GL3W. (#4445) [@rokups] - Backends: WebGPU: Fixed for latest specs. (#4472) [@Kangz] +- Backends: SDL_Renderer: Added SDL_Renderer backend compatible with upcoming SDL 2.0.18. (#3926) [@1bsyl] - Backends: Metal: Fixed a crash when clipping rect larger than framebuffer is submitted via a direct unclipped PushClipRect() call. (#4464) - Backends: OSX: Use mach_absolute_time as CFAbsoluteTimeGetCurrent can jump backwards. (#4557, #4563) [@lfnoise] - Backends: All renderers: Normalize clipping rect handling across backends. (#4464) +- Examples: Added SDL + SDL_Renderer example in "examples/example_sdl_sdlrenderer/" folder. (#3926) [@1bsyl] ----------------------------------------------------------------------- diff --git a/docs/EXAMPLES.md b/docs/EXAMPLES.md index 69ecfa87..63b64d2e 100644 --- a/docs/EXAMPLES.md +++ b/docs/EXAMPLES.md @@ -130,11 +130,6 @@ This uses more modern OpenGL calls and custom shaders.
This may actually also work with OpenGL 2.x contexts!
Prefer using that if you are using modern OpenGL in your application (anything with shaders). -[example_sdl_sdlrenderer/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_sdlrenderer/)
-Use SDL2 and SDL_Renderer, any SDL backend (opengl, gles, gles2, d3d9, d3d11, metal or software) can be used underneath
-= main.cpp + imgui_impl_sdl.cpp + imgui_impl_sdlrenderer.cpp
-It requires SDL 2.0.17+ - [example_glfw_vulkan/](https://github.com/ocornut/imgui/blob/master/examples/example_glfw_vulkan/)
GLFW (Win32, Mac, Linux) + Vulkan example.
= main.cpp + imgui_impl_glfw.cpp + imgui_impl_vulkan.cpp
@@ -180,6 +175,12 @@ SDL2 (Win32, Mac, Linux, etc.) + OpenGL3+/ES2/ES3 example.
This uses more modern OpenGL calls and custom shaders.
This may actually also work with OpenGL 2.x contexts!
+[example_sdl_sdlrenderer/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_sdlrenderer/)
+SDL2 (Win32, Mac, Linux, etc.) + SDL_Renderer (most graphics backends are supported underneath)
+= main.cpp + imgui_impl_sdl.cpp + imgui_impl_sdlrenderer.cpp
+This requires SDL 2.0.17+ (expected to release November 2021)
+We do not really recommend using SDL_Renderer as it is a rather primitive API. + [example_sdl_vulkan/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl_vulkan/)
SDL2 (Win32, Mac, Linux, etc.) + Vulkan example.
= main.cpp + imgui_impl_sdl.cpp + imgui_impl_vulkan.cpp
diff --git a/examples/example_sdl_sdlrenderer/README.md b/examples/example_sdl_sdlrenderer/README.md index 5f431240..209f15ac 100644 --- a/examples/example_sdl_sdlrenderer/README.md +++ b/examples/example_sdl_sdlrenderer/README.md @@ -6,7 +6,7 @@ ``` set SDL2_DIR=path_to_your_sdl2_folder cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /subsystem:console -# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries # or for 64-bit: cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib /subsystem:console ``` diff --git a/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj b/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj index 376a2275..4d502ab6 100644 --- a/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj +++ b/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -28,27 +28,27 @@ Application true MultiByte - v110 + v140 Application true MultiByte - v110 + v140 Application false true MultiByte - v110 + v140 Application false true MultiByte - v110 + v140 @@ -178,4 +178,4 @@ - + \ No newline at end of file diff --git a/examples/example_sdl_sdlrenderer/main.cpp b/examples/example_sdl_sdlrenderer/main.cpp index 4fd04028..aee4a785 100644 --- a/examples/example_sdl_sdlrenderer/main.cpp +++ b/examples/example_sdl_sdlrenderer/main.cpp @@ -3,8 +3,9 @@ // 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 -// See imgui_impl_sdl.cpp for details. -// (Requires: SDL 2.0.17+) +// Important to understand: SDL_Renderer is an _optional_ component of SDL. We do not recommend you use SDL_Renderer +// because it provide a rather limited API to the end-user. We provide this backend for the sake of completeness. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. #include "imgui.h" #include "imgui_impl_sdl.h" @@ -12,8 +13,8 @@ #include #include -#if SDL_MAJOR_VERSION < 2 || SDL_MINOR_VERSION < 0 || SDL_PATCHLEVEL < 17 -# error Requires: SDL 2.0.17+ because of SDL_RenderGeometry function +#if !SDL_VERSION_ATLEAST(2,0,17) +#error This backend requires SDL 2.0.17+ because of SDL_RenderGeometry() function #endif // Main code @@ -28,18 +29,20 @@ int main(int, char**) return -1; } - // SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengles2"); - // SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); - // SDL_SetHint(SDL_HINT_RENDER_DRIVER, "software"); - // Setup window - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+SDL_Renderer example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + + // Setup SDL_Renderer instance + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + if (renderer == NULL) + { + SDL_Log("Error creating SDL_Renderer!"); + return false; + } + //SDL_RendererInfo info; + //SDL_GetRendererInfo(renderer, &info); + //SDL_Log("Current SDL_Renderer: %s", info.name); // Setup Dear ImGui context IMGUI_CHECKVERSION(); @@ -54,17 +57,6 @@ int main(int, char**) // Setup Platform/Renderer backends ImGui_ImplSDL2_InitForSDLRenderer(window); - - SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); - if (renderer == NULL) { - SDL_Log("Error creating SDL renderer"); - return false; - } else { - SDL_RendererInfo info; - SDL_GetRendererInfo(renderer, &info); - SDL_Log("Current SDL Renderer: %s", info.name); - } - ImGui_ImplSDLRenderer_Init(renderer); // Load Fonts @@ -150,8 +142,9 @@ int main(int, char**) // Rendering ImGui::Render(); + SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255)); + SDL_RenderClear(renderer); ImGui_ImplSDLRenderer_RenderDrawData(ImGui::GetDrawData()); - SDL_RenderPresent(renderer); }