cb6d9e61d1
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
44 lines
1.6 KiB
C++
44 lines
1.6 KiB
C++
#pragma once
|
|
|
|
// sprite_batch — batched textured quad renderer on top of sokol_gfx.
|
|
// Single draw call per atlas binding. Issue 0072b runtime gamedev.
|
|
|
|
#include "sokol_gfx.h"
|
|
#include "math2d.h"
|
|
|
|
namespace fn::gfx {
|
|
|
|
struct SpriteBatch {
|
|
sg_pipeline pipeline{};
|
|
sg_buffer vbo{};
|
|
sg_view current_view{}; // texture view bound this batch
|
|
sg_sampler sampler{};
|
|
void* cpu_buffer = nullptr; // Vertex* on heap
|
|
int cpu_capacity_quads = 0;
|
|
int cpu_count_quads = 0;
|
|
float proj[16]{}; // current view-proj matrix (column-major)
|
|
bool in_pass = false;
|
|
bool ok = false;
|
|
};
|
|
|
|
// Create the batcher. Allocates CPU buffer + sokol resources. cpu_capacity_quads
|
|
// caps the per-flush quads (auto-flush when reached). Default 4096.
|
|
SpriteBatch sprite_batch_create(int cpu_capacity_quads = 4096);
|
|
void sprite_batch_destroy(SpriteBatch& b);
|
|
|
|
// Begin a batch with a column-major 4x4 view-projection.
|
|
// Call between sg_begin_pass and sg_end_pass.
|
|
void sprite_batch_begin(SpriteBatch& b, const float view_proj_col_major[16]);
|
|
|
|
// Queue one textured quad. dst is the screen rect. src is the UV rect inside the
|
|
// texture, in pixels (0..image_size). tint multiplies the texture sample.
|
|
// view must be a sg_view created with sg_make_view({.texture.image = ...}).
|
|
void sprite_batch_draw(SpriteBatch& b, sg_view view, int img_w, int img_h,
|
|
fn::math2d::Rect src, fn::math2d::Rect dst,
|
|
fn::math2d::Color tint = fn::math2d::Color::white());
|
|
|
|
// Flush remaining quads.
|
|
void sprite_batch_end(SpriteBatch& b);
|
|
|
|
} // namespace fn::gfx
|