SDLPainter 1.2.0
SDL3 + OpenGL/Vulkan 2B çizim kütüphanesi
Yüklüyor...
Arıyor...
Eşleşme Yok
renderer.h
1#pragma once
2
3#include "sdl_painter/export.h"
4
5#include <cstddef>
6#include <cstdint>
7#include <memory>
8#include <vector>
9
10// SDL forward declaration
11struct SDL_Window;
12
13namespace sdl_painter {
14
15struct Color;
16struct Vertex;
17struct TexturedVertex;
18
20using TextureHandle = uint32_t;
21
23constexpr TextureHandle kInvalidTexture = 0;
24
26using RenderTargetHandle = uint32_t;
27
30constexpr RenderTargetHandle kInvalidRenderTarget = 0;
31
32// Çizim hedeflerinin piksel formatı her backend'de **doğrusal RGBA8**'dir ve
33// ekran yüzeyinin formatından (Vulkan'da tipik olarak B8G8R8A8_UNORM)
34// kasıtlı olarak ayrıştırılmıştır — gerekçe ReadRenderTarget'ta.
35
37enum class TextureFilter : uint8_t {
39 kLinear,
42 kNearest,
43};
44
49enum class BlendMode : uint8_t {
51 kAlpha,
54 kAdditive,
56 kMultiply,
59 kNone,
60};
61
63inline constexpr std::size_t kBlendModeCount = 4;
64
66enum class RendererBackend : uint8_t {
67 kOpenGL,
68 kVulkan,
69};
70
75class IRenderer {
76 public:
77 IRenderer() = default;
78 virtual ~IRenderer() = default;
79
80 // Soyut arayüz: kopyalama/taşıma kapalı (object slicing önlenir).
81 // Sahiplik daima std::unique_ptr<IRenderer> üzerinden taşınır.
82 IRenderer(const IRenderer&) = delete;
83 IRenderer& operator=(const IRenderer&) = delete;
84 IRenderer(IRenderer&&) = delete;
85 IRenderer& operator=(IRenderer&&) = delete;
86
87 // --- Yaşam döngüsü ---
88
90 virtual bool Initialize(SDL_Window* window) = 0;
91
93 virtual void Shutdown() = 0;
94
96 virtual void BeginFrame() = 0;
97
99 virtual void EndFrame() = 0;
100
101 // --- Durum ---
102
104 virtual void SetViewport(int32_t x, int32_t y, int32_t width,
105 int32_t height) = 0;
106
108 virtual void SetScissor(int32_t x, int32_t y, int32_t width,
109 int32_t height) = 0;
110
112 virtual void ClearScissor() = 0;
113
115 virtual void Clear(const Color& color) = 0;
116
118 virtual void SetOpacity(float alpha) = 0;
119
126 virtual void SetBlendMode(BlendMode mode) { (void)mode; }
127
128 // --- Çizim primitifleri (tessellated vertex'ler) ---
129
131 virtual void DrawTriangles(const std::vector<Vertex>& vertices) = 0;
132
133 // --- Texture işlemleri ---
134
136 virtual TextureHandle CreateTexture(const uint8_t* data, int32_t width,
137 int32_t height, int32_t channels) = 0;
138
146 virtual TextureHandle CreateTexture(const uint8_t* data, int32_t width,
147 int32_t height, int32_t channels,
148 TextureFilter filter) {
149 (void)filter;
150 return CreateTexture(data, width, height, channels);
151 }
152
171 virtual void UpdateTexture(TextureHandle handle, int32_t x, int32_t y,
172 int32_t width, int32_t height,
173 const uint8_t* data) = 0;
174
176 virtual void DestroyTexture(TextureHandle handle) = 0;
177
179 virtual void DrawTextured(const std::vector<TexturedVertex>& vertices,
180 TextureHandle texture) = 0;
181
182 // --- Çizim hedefleri (offscreen render target) ---
183 //
184 // Aşağıdakilerin hiçbiri saf sanal DEĞİLDİR; varsayılan gövdeler "hedef
185 // desteklenmiyor" anlamına gelir. Böylece bu arayüzü dışarıda implemente
186 // etmiş kod derlenmeye devam eder (aynı yaklaşım SetBlendMode, filtreli
187 // CreateTexture ve GetLastGpuFrameMs için de kullanılıyor).
188
200 virtual RenderTargetHandle CreateRenderTarget(int32_t width, int32_t height,
201 TextureFilter filter) {
202 (void)width;
203 (void)height;
204 (void)filter;
205 return kInvalidRenderTarget;
206 }
207
209 virtual void DestroyRenderTarget(RenderTargetHandle handle) { (void)handle; }
210
215 [[nodiscard]] virtual TextureHandle GetRenderTargetTexture(
216 RenderTargetHandle handle) const {
217 (void)handle;
218 return kInvalidTexture;
219 }
220
229 virtual bool SetRenderTarget(RenderTargetHandle handle) {
230 (void)handle;
231 return false;
232 }
233
251 virtual bool ReadRenderTarget(RenderTargetHandle handle, uint8_t* out_rgba,
252 std::size_t byte_capacity) {
253 (void)handle;
254 (void)out_rgba;
255 (void)byte_capacity;
256 return false;
257 }
258
259 // --- Transform ---
260
262 [[nodiscard]] virtual RendererBackend GetBackend() const = 0;
263
265 virtual void SetProjectionMatrix(const float* mat4) = 0;
266
275 virtual void SetModelMatrix(const float* mat3) = 0;
276
277 // --- Profilleme (isteğe bağlı) ---
278
288 [[nodiscard]] virtual double GetLastGpuFrameMs() const { return 0.0; }
289};
290
292SDLPAINTER_API std::unique_ptr<IRenderer> CreateRenderer(
293 RendererBackend backend);
294
295} // namespace sdl_painter
Backend-agnostik soyut renderer arayüzü.
Definition renderer.h:75
virtual void DestroyTexture(TextureHandle handle)=0
Texture'ı sil.
virtual void BeginFrame()=0
Yeni frame'e başla.
virtual void ClearScissor()=0
Scissor kırpmasını kaldır.
virtual bool Initialize(SDL_Window *window)=0
Renderer'ı verilen pencere için başlat.
virtual bool SetRenderTarget(RenderTargetHandle handle)
Sonraki çizimlerin gideceği hedefi seç.
Definition renderer.h:229
virtual void UpdateTexture(TextureHandle handle, int32_t x, int32_t y, int32_t width, int32_t height, const uint8_t *data)=0
Var olan bir texture'ın alt bölgesini güncelle (sub-image yükleme).
virtual void SetScissor(int32_t x, int32_t y, int32_t width, int32_t height)=0
Scissor (kırpma) dikdörtgeni ayarla.
virtual RendererBackend GetBackend() const =0
Backend tipini döndür — projeksiyon yönü için kullanılır.
virtual void EndFrame()=0
Frame'i tamamla ve ekrana sun.
virtual TextureHandle CreateTexture(const uint8_t *data, int32_t width, int32_t height, int32_t channels)=0
Ham piksel verisinden texture oluştur. Başarısızlıkta kInvalidTexture döner.
virtual void DestroyRenderTarget(RenderTargetHandle handle)
Hedefi ve ona ait tüm kaynakları serbest bırak.
Definition renderer.h:209
virtual void SetProjectionMatrix(const float *mat4)=0
Ortografik projeksiyon matrisini ayarla (4x4, sütun-major).
virtual void Shutdown()=0
Kaynakları serbest bırak.
virtual void DrawTextured(const std::vector< TexturedVertex > &vertices, TextureHandle texture)=0
Texture'lı vertex'leri çiz. Tint rengi vertex'te taşınır.
virtual void SetBlendMode(BlendMode mode)
Renk karıştırma modunu ayarla.
Definition renderer.h:126
virtual void SetViewport(int32_t x, int32_t y, int32_t width, int32_t height)=0
Viewport'u ayarla (piksel koordinatları).
virtual TextureHandle GetRenderTargetTexture(RenderTargetHandle handle) const
Hedefin içeriğini örneklemek için kullanılacak texture.
Definition renderer.h:215
virtual void SetModelMatrix(const float *mat3)=0
Model dönüşüm matrisini ayarla (3x3, sütun-major — glm::mat3 / glm::value_ptr düzeni).
virtual double GetLastGpuFrameMs() const
Son tamamlanan karenin GPU süresi (milisaniye).
Definition renderer.h:288
virtual void DrawTriangles(const std::vector< Vertex > &vertices)=0
Üçgenler çiz. Vertex listesi 3'ün katı olmalı. Renk vertex'te taşınır.
virtual bool ReadRenderTarget(RenderTargetHandle handle, uint8_t *out_rgba, std::size_t byte_capacity)
Hedefin piksellerini ana belleğe oku.
Definition renderer.h:251
virtual void Clear(const Color &color)=0
Ekranı belirtilen renkle temizle.
virtual RenderTargetHandle CreateRenderTarget(int32_t width, int32_t height, TextureFilter filter)
Çizilebilir bir offscreen hedef oluştur.
Definition renderer.h:200
virtual void SetOpacity(float alpha)=0
Global opaklığı ayarla [0.0, 1.0].
virtual TextureHandle CreateTexture(const uint8_t *data, int32_t width, int32_t height, int32_t channels, TextureFilter filter)
Örnekleme filtresi belirterek texture oluştur.
Definition renderer.h:146
RGBA renk temsili. Her kanal [0, 255] aralığında.
Definition color.h:8