From e3f2da430f0fc48b4bdf142aa10501345259e0f8 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Fri, 14 Feb 2025 22:39:37 +0100 Subject: [PATCH] Added 2D renderer header. --- public/sdlpp/renderer.hpp | 231 ++++++++++++++++++++++++++++++++++++++ public/sdlpp/window.hpp | 8 +- 2 files changed, 235 insertions(+), 4 deletions(-) create mode 100644 public/sdlpp/renderer.hpp diff --git a/public/sdlpp/renderer.hpp b/public/sdlpp/renderer.hpp new file mode 100644 index 0000000..f9aa580 --- /dev/null +++ b/public/sdlpp/renderer.hpp @@ -0,0 +1,231 @@ + +#pragma once + +#if !defined(SDLPP_RENDERER_HPP_INCLUDED) +#define SDLPP_RENDERER_HPP_INCLUDED 1 + +#include "./common.hpp" + +namespace sdlpp +{ +enum class PixelFormat +{ + UNKNOWN = SDL_PIXELFORMAT_UNKNOWN, + INDEX1LSB = SDL_PIXELFORMAT_INDEX1LSB, + INDEX1MSB = SDL_PIXELFORMAT_INDEX1MSB, + INDEX2LSB = SDL_PIXELFORMAT_INDEX2LSB, + INDEX2MSB = SDL_PIXELFORMAT_INDEX2MSB, + INDEX4LSB = SDL_PIXELFORMAT_INDEX4LSB, + INDEX4MSB = SDL_PIXELFORMAT_INDEX4MSB, + INDEX8 = SDL_PIXELFORMAT_INDEX8, + RGB332 = SDL_PIXELFORMAT_RGB332, + XRGB4444 = SDL_PIXELFORMAT_XRGB4444, + XBGR4444 = SDL_PIXELFORMAT_XBGR4444, + XRGB1555 = SDL_PIXELFORMAT_XRGB1555, + XBGR1555 = SDL_PIXELFORMAT_XBGR1555, + ARGB4444 = SDL_PIXELFORMAT_ARGB4444, + RGBA4444 = SDL_PIXELFORMAT_RGBA4444, + ABGR4444 = SDL_PIXELFORMAT_ABGR4444, + BGRA4444 = SDL_PIXELFORMAT_BGRA4444, + ARGB1555 = SDL_PIXELFORMAT_ARGB1555, + RGBA5551 = SDL_PIXELFORMAT_RGBA5551, + ABGR1555 = SDL_PIXELFORMAT_ABGR1555, + BGRA5551 = SDL_PIXELFORMAT_BGRA5551, + RGB565 = SDL_PIXELFORMAT_RGB565, + BGR565 = SDL_PIXELFORMAT_BGR565, + RGB24 = SDL_PIXELFORMAT_RGB24, + BGR24 = SDL_PIXELFORMAT_BGR24, + XRGB8888 = SDL_PIXELFORMAT_XRGB8888, + RGBX8888 = SDL_PIXELFORMAT_RGBX8888, + XBGR8888 = SDL_PIXELFORMAT_XBGR8888, + BGRX8888 = SDL_PIXELFORMAT_BGRX8888, + ARGB8888 = SDL_PIXELFORMAT_ARGB8888, + RGBA8888 = SDL_PIXELFORMAT_RGBA8888, + ABGR8888 = SDL_PIXELFORMAT_ABGR8888, + BGRA8888 = SDL_PIXELFORMAT_BGRA8888, + XRGB2101010 = SDL_PIXELFORMAT_XRGB2101010, + XBGR2101010 = SDL_PIXELFORMAT_XBGR2101010, + ARGB2101010 = SDL_PIXELFORMAT_ARGB2101010, + ABGR2101010 = SDL_PIXELFORMAT_ABGR2101010, + RGB48 = SDL_PIXELFORMAT_RGB48, + BGR48 = SDL_PIXELFORMAT_BGR48, + RGBA64 = SDL_PIXELFORMAT_RGBA64, + ARGB64 = SDL_PIXELFORMAT_ARGB64, + BGRA64 = SDL_PIXELFORMAT_BGRA64, + ABGR64 = SDL_PIXELFORMAT_ABGR64, + RGB48_FLOAT = SDL_PIXELFORMAT_RGB48_FLOAT, + BGR48_FLOAT = SDL_PIXELFORMAT_BGR48_FLOAT, + RGBA64_FLOAT = SDL_PIXELFORMAT_RGBA64_FLOAT, + ARGB64_FLOAT = SDL_PIXELFORMAT_ARGB64_FLOAT, + BGRA64_FLOAT = SDL_PIXELFORMAT_BGRA64_FLOAT, + ABGR64_FLOAT = SDL_PIXELFORMAT_ABGR64_FLOAT, + RGB96_FLOAT = SDL_PIXELFORMAT_RGB96_FLOAT, + BGR96_FLOAT = SDL_PIXELFORMAT_BGR96_FLOAT, + RGBA128_FLOAT = SDL_PIXELFORMAT_RGBA128_FLOAT, + ARGB128_FLOAT = SDL_PIXELFORMAT_ARGB128_FLOAT, + BGRA128_FLOAT = SDL_PIXELFORMAT_BGRA128_FLOAT, + ABGR128_FLOAT = SDL_PIXELFORMAT_ABGR128_FLOAT, + YV12 = SDL_PIXELFORMAT_YV12, + IYUV = SDL_PIXELFORMAT_IYUV, + YUY2 = SDL_PIXELFORMAT_YUY2, + UYVY = SDL_PIXELFORMAT_UYVY, + YVYU = SDL_PIXELFORMAT_YVYU, + NV12 = SDL_PIXELFORMAT_NV12, + NV21 = SDL_PIXELFORMAT_NV21, + P010 = SDL_PIXELFORMAT_P010, + EXTERNAL_OES = SDL_PIXELFORMAT_EXTERNAL_OES, + RGBA32 = SDL_PIXELFORMAT_RGBA32, + ARGB32 = SDL_PIXELFORMAT_ARGB32, + BGRA32 = SDL_PIXELFORMAT_BGRA32, + ABGR32 = SDL_PIXELFORMAT_ABGR32, + RGBX32 = SDL_PIXELFORMAT_RGBX32, + XRGB32 = SDL_PIXELFORMAT_XRGB32, + BGRX32 = SDL_PIXELFORMAT_BGRX32, + XBGR32 = SDL_PIXELFORMAT_XBGR32 +}; + +enum class TextureAccess +{ + STATIC = SDL_TEXTUREACCESS_STATIC, + STREAMING = SDL_TEXTUREACCESS_STREAMING, + TARGET = SDL_TEXTUREACCESS_TARGET +}; + +struct TextureCreateArgs +{ + PixelFormat format; + TextureAccess access; + int w; + int h; +}; + +class Texture : public Base +{ +public: + Texture() noexcept = default; + Texture(const Texture&) = delete; + Texture(Texture&& other) noexcept : Base(std::move(other)) {} + + Texture& operator=(const Texture&) = delete; + Texture& operator=(Texture&& other) noexcept + { + Base::operator=(std::move(other)); + return *this; + } + auto operator<=>(const Texture&) const noexcept = default; + + void create(SDL_Renderer* renderer, const TextureCreateArgs& args) + { + mHandle = SDL_CreateTexture( + /* renderer = */ renderer, + /* format = */ static_cast(args.format), + /* access = */ static_cast(args.access), + /* w = */ args.w, + /* h = */ args.h + ); + if (mHandle == nullptr) + { + throw SDLError(); + } + } + + void destroy() noexcept + { + if (mHandle != nullptr) + { + SDL_DestroyTexture(mHandle); + } + } + + void update(const SDL_Rect& rect, const void* pixels, int pitch) + { + if (!SDL_UpdateTexture(mHandle, &rect, pixels, pitch)) + { + throw SDLError(); + } + } +}; + +struct RendererCreateArgs +{ + SDL_Window* window; + const char* driver = nullptr; +}; + +class Renderer : public Base +{ +public: + Renderer() noexcept = default; + Renderer(const Renderer&) = delete; + Renderer(Renderer&& other) noexcept : Base(std::move(other)) {} + + Renderer& operator=(const Renderer&) = delete; + Renderer& operator=(Renderer&& other) noexcept + { + Base::operator=(std::move(other)); + return *this; + } + auto operator<=>(const Renderer&) const noexcept = default; + + void create(const RendererCreateArgs& args) + { + MIJIN_ASSERT(mHandle == nullptr, "Renderer has already been created."); + mHandle = SDL_CreateRenderer(args.window, args.driver); + if (mHandle == nullptr) + { + throw SDLError(); + } + } + + void destroy() noexcept + { + if (mHandle != nullptr) + { + SDL_DestroyRenderer(mHandle); + mHandle = nullptr; + } + } + + void clear() noexcept + { + SDL_RenderClear(mHandle); + } + + void present() noexcept + { + SDL_RenderPresent(mHandle); + } + + void setDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a) noexcept + { + SDL_SetRenderDrawColor(mHandle, r, g, b, a); + } + + void setDrawColorFloat(float r, float g, float b, float a) noexcept + { + SDL_SetRenderDrawColorFloat(mHandle, r, g, b, a); + } + + void rect(const SDL_FRect& rect) noexcept + { + SDL_RenderRect(mHandle, &rect); + } + + void rects(std::span rects) noexcept + { + SDL_RenderRects(mHandle, rects.data(), static_cast(rects.size())); + } + + void fillRect(const SDL_FRect& rect) noexcept + { + SDL_RenderFillRect(mHandle, &rect); + } + + void fillRects(std::span rects) noexcept + { + SDL_RenderFillRects(mHandle, rects.data(), static_cast(rects.size())); + } +}; +} // namespace sdlpp + +#endif // !defined(SDLPP_RENDERER_HPP_INCLUDED) diff --git a/public/sdlpp/window.hpp b/public/sdlpp/window.hpp index 4723e6d..921000e 100644 --- a/public/sdlpp/window.hpp +++ b/public/sdlpp/window.hpp @@ -1,8 +1,8 @@ #pragma once -#if !defined(SDL_GPU_TEST_PRIVATE_SDL_GPU_TEST_SDLPP_WINDOW_HPP_INCLUDED) -#define SDL_GPU_TEST_PRIVATE_SDL_GPU_TEST_SDLPP_WINDOW_HPP_INCLUDED 1 +#if !defined(SDLPP_WINDOW_HPP_INCLUDED) +#define SDLPP_WINDOW_HPP_INCLUDED 1 #include "./common.hpp" @@ -70,7 +70,7 @@ public: Base::operator=(std::move(other)); return *this; } - auto operator<=>(const Window& other) const noexcept = default; + auto operator<=>(const Window&) const noexcept = default; void create(const WindowCreateArgs& args = {}) { @@ -110,4 +110,4 @@ public: }; } // namespace sdlpp -#endif // !defined(SDL_GPU_TEST_PRIVATE_SDL_GPU_TEST_SDLPP_WINDOW_HPP_INCLUDED) +#endif // !defined(SDLPP_WINDOW_HPP_INCLUDED)