Files
fn_registry/cpp/functions/gfx/sprite_batch.h
T

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