From fbd6c1054744724387e37ae69b1636782f703ca0 Mon Sep 17 00:00:00 2001 From: James Johnson Date: Thu, 23 Jan 2025 21:42:36 -0500 Subject: [PATCH] Provide ImGui implementation for SDL Add header Add newline at end of file Fix for format Add header Move include to header --- Imgui/CMakeLists.txt | 2 + Imgui/interface/ImGuiImplSDL.hpp | 59 ++++++++++++++++++++ Imgui/src/ImGuiImplSDL.cpp | 95 ++++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 Imgui/interface/ImGuiImplSDL.hpp create mode 100644 Imgui/src/ImGuiImplSDL.cpp diff --git a/Imgui/CMakeLists.txt b/Imgui/CMakeLists.txt index e8541057..efd7deaf 100644 --- a/Imgui/CMakeLists.txt +++ b/Imgui/CMakeLists.txt @@ -6,6 +6,7 @@ set(SOURCE src/ImGuiDiligentRenderer.cpp src/ImGuiImplDiligent.cpp src/ImGuiUtils.cpp + src/ImGuiImplSDL.cpp ) set(IMGUIZMO_QUAT_SOURCE @@ -17,6 +18,7 @@ set(INTERFACE interface/ImGuiDiligentRenderer.hpp interface/ImGuiImplDiligent.hpp interface/ImGuiUtils.hpp + interface/ImGuiImplSDL.hpp ) if(PLATFORM_WIN32) diff --git a/Imgui/interface/ImGuiImplSDL.hpp b/Imgui/interface/ImGuiImplSDL.hpp new file mode 100644 index 00000000..98743765 --- /dev/null +++ b/Imgui/interface/ImGuiImplSDL.hpp @@ -0,0 +1,59 @@ +/* + * Copyright 2025 Diligent Graphics LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +#include +#include "ImGuiImplDiligent.hpp" + +extern "C" struct SDL_Window; +extern "C" union SDL_Event; + +namespace Diligent +{ +class ImGuiImplSDL final : public ImGuiImplDiligent +{ +public: + static std::unique_ptr + Create(const ImGuiDiligentCreateInfo& CI, SDL_Window* pWindow); + + ImGuiImplSDL(const ImGuiDiligentCreateInfo& CI, SDL_Window* pWindow); + ~ImGuiImplSDL(); + + // clang-format off + ImGuiImplSDL (const ImGuiImplSDL&) = delete; + ImGuiImplSDL ( ImGuiImplSDL&&) = delete; + ImGuiImplSDL& operator = (const ImGuiImplSDL&) = delete; + ImGuiImplSDL& operator = ( ImGuiImplSDL&&) = delete; + // clang-format on + + virtual void NewFrame(Uint32 RenderSurfaceWidth, + Uint32 RenderSurfaceHeight, + SURFACE_TRANSFORM SurfacePreTransform) override final; + virtual void Render(IDeviceContext* pCtx) override final; + bool HandleSDLEvent(const SDL_Event* ev); +}; +} // namespace Diligent diff --git a/Imgui/src/ImGuiImplSDL.cpp b/Imgui/src/ImGuiImplSDL.cpp new file mode 100644 index 00000000..b219c3d9 --- /dev/null +++ b/Imgui/src/ImGuiImplSDL.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2025 Diligent Graphics LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#include "ImGuiImplSDL.hpp" + +#include "Errors.hpp" +#include "RenderDevice.h" +#include "backends/imgui_impl_sdl.h" + +namespace Diligent +{ + +std::unique_ptr +ImGuiImplSDL::Create(const ImGuiDiligentCreateInfo& CI, SDL_Window* pWindow) +{ + return std::make_unique(CI, pWindow); +} + +ImGuiImplSDL::ImGuiImplSDL(const ImGuiDiligentCreateInfo& CI, + SDL_Window* pWindow) : + ImGuiImplDiligent(CI) +{ + switch (CI.pDevice->GetDeviceInfo().Type) + { + case RENDER_DEVICE_TYPE_UNDEFINED: + LOG_ERROR_AND_THROW("Undefined device type"); + break; + case RENDER_DEVICE_TYPE_D3D11: + case RENDER_DEVICE_TYPE_D3D12: + ImGui_ImplSDL2_InitForD3D(pWindow); + break; + case RENDER_DEVICE_TYPE_GL: + case RENDER_DEVICE_TYPE_GLES: + ImGui_ImplSDL2_InitForOpenGL(pWindow, nullptr); + break; + case RENDER_DEVICE_TYPE_VULKAN: + ImGui_ImplSDL2_InitForVulkan(pWindow); + break; + case RENDER_DEVICE_TYPE_METAL: + ImGui_ImplSDL2_InitForMetal(pWindow); + break; + case RENDER_DEVICE_TYPE_WEBGPU: + LOG_ERROR_AND_THROW("WebGPU not supported"); + break; + case RENDER_DEVICE_TYPE_COUNT: + LOG_ERROR_AND_THROW("Unsupported device type"); + break; + } +} + +ImGuiImplSDL::~ImGuiImplSDL() { ImGui_ImplSDL2_Shutdown(); } + +void ImGuiImplSDL::NewFrame(Uint32 RenderSurfaceWidth, + Uint32 RenderSurfaceHeight, + SURFACE_TRANSFORM SurfacePreTransform) +{ + ImGui_ImplSDL2_NewFrame(); + ImGuiImplDiligent::NewFrame(RenderSurfaceWidth, RenderSurfaceHeight, + SurfacePreTransform); +} + +void ImGuiImplSDL::Render(IDeviceContext* pCtx) +{ + ImGuiImplDiligent::Render(pCtx); +} + +bool ImGuiImplSDL::HandleSDLEvent(const SDL_Event* ev) +{ + return ImGui_ImplSDL2_ProcessEvent(ev); +} + +} // namespace Diligent