Added 2D renderer header.

This commit is contained in:
Patrick 2025-02-14 22:39:37 +01:00
parent 2d531dafa9
commit e3f2da430f
2 changed files with 235 additions and 4 deletions

231
public/sdlpp/renderer.hpp Normal file
View File

@ -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<SDL_Texture, Texture>
{
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<SDL_PixelFormat>(args.format),
/* access = */ static_cast<SDL_TextureAccess>(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<SDL_Renderer, Renderer>
{
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<const SDL_FRect> rects) noexcept
{
SDL_RenderRects(mHandle, rects.data(), static_cast<int>(rects.size()));
}
void fillRect(const SDL_FRect& rect) noexcept
{
SDL_RenderFillRect(mHandle, &rect);
}
void fillRects(std::span<const SDL_FRect> rects) noexcept
{
SDL_RenderFillRects(mHandle, rects.data(), static_cast<int>(rects.size()));
}
};
} // namespace sdlpp
#endif // !defined(SDLPP_RENDERER_HPP_INCLUDED)

View File

@ -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)