From 0fb63352a2d7541eacd5238f2526a2095dfa5198 Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 5 May 2025 16:16:56 -0500 Subject: [PATCH] add RendererSDL3 --- include/utils/Renderer/Renderer.h | 8 +- .../Renderer/RendererOpenGL/RendererOpenGL.h | 2 +- .../Renderer/RendererSDL3/RendererSDL3.h | 49 ++++++++ include/utils/Window/Window.h | 4 +- include/utils/Window/WindowSDL3/WindowSDL3.h | 105 +++++++++++------- modules/ImguiModule/src/ImguiModule.cpp | 4 + modules/ImguiModule/src/ImguiModule.h | 13 +++ modules/WindowModule/src/WindowModule.cpp | 2 +- 8 files changed, 143 insertions(+), 44 deletions(-) create mode 100644 include/utils/Renderer/RendererSDL3/RendererSDL3.h diff --git a/include/utils/Renderer/Renderer.h b/include/utils/Renderer/Renderer.h index e99a5b7..4b63394 100644 --- a/include/utils/Renderer/Renderer.h +++ b/include/utils/Renderer/Renderer.h @@ -3,6 +3,7 @@ #include "pch.hpp" #include "RendererOpenGL/RendererOpenGL.h" +#include "RendererSDL3/RendererSDL3.h" namespace Archimedes { class Renderer { @@ -10,9 +11,11 @@ namespace Archimedes { public: int w, h; + Renderer(void* p = nullptr) : ptr(p) {} + ~Renderer() {} - bool init() { return r.init(); } + bool init() { return r.init(ptr); } void render() { r.render(rc, w, h); @@ -22,9 +25,12 @@ namespace Archimedes { return rc; } + RendererImpl& getRendererImpl() { return r; } + private: std::list> rc; RendererImpl r; + void* ptr; }; } diff --git a/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h b/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h index 0481cbf..85f3b74 100644 --- a/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h +++ b/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h @@ -19,7 +19,7 @@ namespace Archimedes { RendererOpenGL() {}; ~RendererOpenGL() {}; - bool init() { + bool init(void* p) { return glewInit() == GLEW_OK; }; diff --git a/include/utils/Renderer/RendererSDL3/RendererSDL3.h b/include/utils/Renderer/RendererSDL3/RendererSDL3.h new file mode 100644 index 0000000..69a95cd --- /dev/null +++ b/include/utils/Renderer/RendererSDL3/RendererSDL3.h @@ -0,0 +1,49 @@ +#if RENDERER == 2 + +#ifndef RENDERER_SDL3 +#define RENDERER_SDL3 + +#include "pch.hpp" + +#include + + +namespace Archimedes { + + class RendererSDL3 { + + public: + typedef void renderCmd(); + + RendererSDL3() {}; + ~RendererSDL3() { SDL_DestroyRenderer(renderer); }; + + bool init(void* window) { + renderer = SDL_CreateRenderer((SDL_Window*) window, nullptr); + SDL_SetRenderVSync(renderer, 1); + return renderer != nullptr; + }; + + void render(std::list> cmdList, int& w, int& h) { + + //SDL_SetRenderScale(renderer, w, h); + + SDL_RenderClear(renderer); + + for(auto f : cmdList) + f(); + + SDL_RenderPresent(renderer); + } + + SDL_Renderer* renderer = nullptr; + }; + + typedef RendererSDL3 RendererImpl; + + +} + +#endif + +#endif diff --git a/include/utils/Window/Window.h b/include/utils/Window/Window.h index 6dba140..0651e66 100644 --- a/include/utils/Window/Window.h +++ b/include/utils/Window/Window.h @@ -25,11 +25,11 @@ namespace Archimedes { void doFrame() { - window.pollEvents(); - renderer->render(); window.doFrame(); + + window.pollEvents(); } Renderer* getRenderer() { return renderer; } diff --git a/include/utils/Window/WindowSDL3/WindowSDL3.h b/include/utils/Window/WindowSDL3/WindowSDL3.h index 13723a8..52b1f0c 100644 --- a/include/utils/Window/WindowSDL3/WindowSDL3.h +++ b/include/utils/Window/WindowSDL3/WindowSDL3.h @@ -24,26 +24,50 @@ namespace Archimedes { data.window = p; data.sendEvent = sendEvent; - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); - Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; - w = SDL_CreateWindow("Archimedes", 1280, 720, window_flags); - if (w == nullptr) - { - printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); - std::abort(); - } - SDL_SetWindowPosition(w, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); - - gl_context = SDL_GL_CreateContext(w); - - if (gl_context == nullptr) - { - printf("Error: SDL_GL_CreateContext(): %s\n", SDL_GetError()); + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD)) { + std::cerr << "Error: SDL_Init(): " << SDL_GetError() << std::endl; std::abort(); } +#if RENDERER == 1 + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + + SDL_WindowFlags window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; +#elif RENDERER == 2 + SDL_WindowFlags window_flags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN | SDL_WINDOW_HIGH_PIXEL_DENSITY; +#endif + + w = SDL_CreateWindow("Archimedes", 1280, 720, window_flags); + if (w == nullptr) + { + std::cerr << "Error: SDL_CreateWindow(): " << SDL_GetError() << std::endl; + std::abort(); + } + SDL_SetWindowPosition(w, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + +#if RENDERER == 1 + gl_context = SDL_GL_CreateContext(w); + + if (gl_context == nullptr) + { + std::cerr << "Error: SDL_GL_CreateContext(): " << SDL_GetError() << std::endl; + std::abort(); + } + + SDL_GL_MakeCurrent(w, gl_context); + SDL_GL_SetSwapInterval(1); // Enable vsync + +#elif RENDERER == 2 + SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr); + SDL_SetRenderVSync(renderer, 1); + if (renderer == nullptr) + { + std::cerr << "Error: SDL_CreateRenderer(): " << SDL_GetError() << std::endl; + std::abort(); + } +#endif /*SDL_AddEventWatch([](void* ptr, SDL_Event* e) -> bool { WindowData& data = (WindowData&) *ptr; @@ -52,65 +76,66 @@ namespace Archimedes { case SDL_EVENT_WINDOW_CLOSE_REQUESTED: case SDL_EVENT_QUIT: - data.sendEvent(new CloseWindowEvent(data.window, (void*) &e)); + data.sendEvent(new CloseWindowEvent(data.window, &e)); break; case SDL_EVENT_WINDOW_RESIZED: width = e.window.data1; height = e.window.data2; - data.sendEvent(new ResizeWindowEvent(e.window.data1, e.window.data2, (void*) &e)); + data.sendEvent(new ResizeWindowEvent(e.window.data1, e.window.data2, &e)); break; case SDL_EVENT_WINDOW_MOUSE_ENTER: case SDL_EVENT_WINDOW_FOCUS_GAINED: - data.sendEvent(new FocusedWindowEvent(data.window, (void*) &e)); + data.sendEvent(new FocusedWindowEvent(data.window, &e)); break; case SDL_EVENT_WINDOW_MOUSE_LEAVE: case SDL_EVENT_WINDOW_FOCUS_LOST: - data.sendEvent(new FocusLostWindowEvent(data.window, (void*) &e)); + data.sendEvent(new FocusLostWindowEvent(data.window, &e)); break; case SDL_EVENT_KEY_DOWN: - data.sendEvent(new KeyPressedWindowEvent(e.key.key, e.key.repeat ? 1 : 0, (void*) &e)); + data.sendEvent(new KeyPressedWindowEvent(e.key.key, e.key.repeat ? 1 : 0, &e)); break; case SDL_EVENT_KEY_UP: - data.sendEvent(new KeyReleasedWindowEvent(e.key.key, (void*) &e)); - break; - case SDL_EVENT_TEXT_EDITING: - break; - case SDL_EVENT_TEXT_INPUT: + data.sendEvent(new KeyReleasedWindowEvent(e.key.key, &e)); break; case SDL_EVENT_MOUSE_MOTION: - data.sendEvent(new MouseMovedWindowEvent(e.motion.x, e.motion.y, (void*) &e)); + data.sendEvent(new MouseMovedWindowEvent(e.motion.x, e.motion.y, &e)); break; case SDL_EVENT_MOUSE_BUTTON_DOWN: - data.sendEvent(new MouseButtonPressedWindowEvent(e.button.button, (void*) &e)); + data.sendEvent(new MouseButtonPressedWindowEvent(e.button.button, &e)); break; case SDL_EVENT_MOUSE_BUTTON_UP: - data.sendEvent(new MouseButtonReleasedWindowEvent(e.button.button, (void*) &e)); + data.sendEvent(new MouseButtonReleasedWindowEvent(e.button.button, &e)); break; case SDL_EVENT_MOUSE_WHEEL: - data.sendEvent(new ScrollWindowEvent(e.wheel.x, e.wheel.y, (void*) &e)); + data.sendEvent(new ScrollWindowEvent(e.wheel.x, e.wheel.y, &e)); break; default: + data.sendEvent(new AnonymousEvent(&e)); break; } return true; }, &data);*/ - - SDL_GL_MakeCurrent(w, gl_context); - SDL_GL_SetSwapInterval(1); // Enable vsync SDL_ShowWindow(w); } ~WindowSDL3() { +#if RENDERER == 1 SDL_GL_DestroyContext(gl_context); +#endif SDL_DestroyWindow(w); SDL_Quit(); } bool shouldClose() { return false; } - void doFrame() { restoreContext(); SDL_GL_SwapWindow(w); } + void doFrame() { +#if RENDERER == 1 + restoreContext(); + SDL_GL_SwapWindow(w); +#endif + } void pollEvents() { while(SDL_PollEvent(&e)) { @@ -157,24 +182,26 @@ namespace Archimedes { } } } - +#if RENDERER == 1 void restoreContext() { SDL_GL_MakeCurrent(w, gl_context); } - +#endif void getSize(int& w, int& h) { w = this->width; h = this->height; } SDL_Window* getWindow() { return w; } - +#if RENDERER == 1 SDL_GLContext getContext() { return gl_context; } - +#endif WindowData data; private: SDL_Window* w; int width = 0, height = 0; +#if RENDERER == 1 SDL_GLContext gl_context; +#endif SDL_Event e; }; diff --git a/modules/ImguiModule/src/ImguiModule.cpp b/modules/ImguiModule/src/ImguiModule.cpp index 8fff57e..32c307f 100644 --- a/modules/ImguiModule/src/ImguiModule.cpp +++ b/modules/ImguiModule/src/ImguiModule.cpp @@ -39,6 +39,10 @@ void ImguiModule::onLoad() { } window = wm->aquireWindow(); + +#if WINDOW == 2 + renderer = window->getRenderer().renderer; +#endif IMGUI_CHECKVERSION(); context = ImGui::CreateContext(); diff --git a/modules/ImguiModule/src/ImguiModule.h b/modules/ImguiModule/src/ImguiModule.h index 501f474..0045138 100644 --- a/modules/ImguiModule/src/ImguiModule.h +++ b/modules/ImguiModule/src/ImguiModule.h @@ -10,6 +10,10 @@ #include "backends/imgui_impl_opengl3.h" +#elif RENDERER == 2 + +#include "backends/imgui_impl_sdlrenderer3.h" + #endif #if WINDOW == 1 @@ -69,6 +73,13 @@ class ImguiModule : public Archimedes::Module { void rendererNewFrame() { ImGui_ImplOpenGL3_NewFrame(); } void rendererRenderDrawData() { ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); } +#elif RENDERER == 2 + SDL_Renderer* renderer; + auto rendererInit() { return ImGui_ImplSDLRenderer3_Init(renderer); } + void rendererShutdown() { ImGui_ImplSDLRenderer3_Shutdown(); } + + void rendererNewFrame() { ImGui_ImplSDLRenderer3_NewFrame(); } + void rendererRenderDrawData() { ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer); } #endif #if WINDOW == 1 @@ -83,6 +94,8 @@ class ImguiModule : public Archimedes::Module { #elif WINDOW == 2 #if RENDERER == 1 auto windowInit() { return ImGui_ImplSDL3_InitForOpenGL(window->getWindowImpl().getWindow(), window->getWindowImpl().getContext()); } +#elif RENDERER == 2 + auto windowInit() { return ImGui_ImplSDL3_InitForSDLRenderer(window->getWindowImpl().getWindow(), renderer); } #endif void windowShutdown() { ImGui_ImplSDL3_Shutdown(); } diff --git a/modules/WindowModule/src/WindowModule.cpp b/modules/WindowModule/src/WindowModule.cpp index 0b9af56..d8f2efe 100644 --- a/modules/WindowModule/src/WindowModule.cpp +++ b/modules/WindowModule/src/WindowModule.cpp @@ -38,7 +38,7 @@ void WindowModule::onLoad() { app->registerEvent(Archimedes::FocusLostWindowEvent()); app->registerEvent(Archimedes::MovedWindowEvent()); - renderer = new Archimedes::Renderer(); + renderer = new Archimedes::Renderer(window->getWindowImpl().getWindow()); } void WindowModule::run() {