From 72f9bd45797dd69a21edf935bdecc2eeef18c885 Mon Sep 17 00:00:00 2001 From: DcruBro Date: Tue, 10 Mar 2026 22:06:38 +0100 Subject: [PATCH] renderer --- CMakeLists.txt | 5 +++++ include/renderer/renderer.hpp | 19 +++++++++++++++++++ include/window/window.hpp | 2 ++ src/renderer/renderer.cpp | 35 +++++++++++++++++++++++++++++++++++ src/window/window.cpp | 19 ++++++++++++++++++- 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 include/renderer/renderer.hpp create mode 100644 src/renderer/renderer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index cff9031..45933a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,11 @@ FetchContent_Declare( GIT_TAG release-2.30.3 ) +# Work around PipeWire API mismatch on some Linux distributions. +# Disable PipeWire backend in SDL; PulseAudio/ALSA backends remain available. +set(SDL_PIPEWIRE OFF CACHE BOOL "Disable SDL PipeWire backend" FORCE) +set(SDL_PIPEWIRE_SHARED OFF CACHE BOOL "Disable dynamic PipeWire loading in SDL" FORCE) + # Make SDL available FetchContent_MakeAvailable(SDL2) diff --git a/include/renderer/renderer.hpp b/include/renderer/renderer.hpp new file mode 100644 index 0000000..ac76fe3 --- /dev/null +++ b/include/renderer/renderer.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace Game::Renderer { + class Renderer { + public: + Renderer(); + ~Renderer(); + + bool init(SDL_Window* window); + void clear(); + void present(); + + private: + SDL_Renderer* mRenderer; + }; +} \ No newline at end of file diff --git a/include/window/window.hpp b/include/window/window.hpp index 3bad14b..8146736 100644 --- a/include/window/window.hpp +++ b/include/window/window.hpp @@ -5,6 +5,7 @@ #include #include +#include namespace Game::Window { class Window { @@ -18,6 +19,7 @@ namespace Game::Window { private: SDL_Window *mWindow; + Renderer::Renderer mRenderer; bool mRunning; }; } \ No newline at end of file diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp new file mode 100644 index 0000000..d044fd1 --- /dev/null +++ b/src/renderer/renderer.cpp @@ -0,0 +1,35 @@ +#include +#include + +namespace Game::Renderer { + Renderer::Renderer() : mRenderer(nullptr) {} + + Renderer::~Renderer() { + if (mRenderer) { + SDL_DestroyRenderer(mRenderer); + } + } + + bool Renderer::init(SDL_Window* window) { + mRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!mRenderer) { + std::string errorMsg = "Failed to create renderer: " + std::string(SDL_GetError()); + ERROR(errorMsg.c_str()); + return false; + } + + SDL_SetRenderDrawColor(mRenderer, 0, 0, 255, 255); // Temp + + LOG("Renderer created successfully"); + + return true; + } + + void Renderer::clear() { + SDL_RenderClear(mRenderer); + } + + void Renderer::present() { + SDL_RenderPresent(mRenderer); + } +} \ No newline at end of file diff --git a/src/window/window.cpp b/src/window/window.cpp index 7a29e88..4f90e77 100644 --- a/src/window/window.cpp +++ b/src/window/window.cpp @@ -1,13 +1,14 @@ #include namespace Game::Window { - Window::Window() : mWindow(nullptr), mRunning(false) {} + Window::Window() : mWindow(nullptr), mRunning(false), mRenderer() {} Window::~Window() { if (mWindow) { SDL_DestroyWindow(mWindow); mWindow = nullptr; mRunning = false; + LOG("Window destroyed successfully"); SDL_Quit(); } } @@ -16,6 +17,16 @@ namespace Game::Window { if (SDL_Init(SDL_INIT_VIDEO) < 0) { return false; } mWindow = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_SHOWN); if (!mWindow) { + ERROR("Failed to create window: " << SDL_GetError()); + SDL_Quit(); + return false; + } + + LOG("Window created successfully"); + + if (!mRenderer.init(mWindow)) { + SDL_DestroyWindow(mWindow); + mWindow = nullptr; SDL_Quit(); return false; } @@ -32,7 +43,13 @@ namespace Game::Window { if (event.type == SDL_QUIT) { mRunning = false; } + + // Handle other events (e.g., keyboard, mouse) here } + + mRenderer.clear(); + // Render game objects here + mRenderer.present(); } } } \ No newline at end of file