--- name: sprite_batch kind: function lang: cpp domain: gfx version: "0.1.0" purity: impure signature: "sprite_batch_create(int cap=4096) -> SpriteBatch; sprite_batch_begin/draw/end" description: "Batched textured quad renderer sobre sokol_gfx. Begin/draw/end con auto-flush por atlas change o capacity full. Vertex layout pos+uv+color, alpha blending estandar, GLSL 330 / GLES 300. Issue 0072b runtime gamedev — base de plataformeros, top-down, UI sprites." tags: [gamedev, gfx, sokol, sprite, batch, 2d] uses_functions: - sokol_setup_cpp_gfx uses_types: - Rect_cpp_core - Color_cpp_core returns: [] returns_optional: false error_type: "error_go_core" imports: [] example: | fn::gfx::SpriteBatch b = fn::gfx::sprite_batch_create(4096); // por frame, dentro de un sg_pass: fn::gfx::sprite_batch_begin(b, view_proj); fn::gfx::sprite_batch_draw(b, atlas_img, 1024, 1024, {0,0,32,32}, {100,100,32,32}, fn::math2d::Color::white()); fn::gfx::sprite_batch_draw(b, atlas_img, 1024, 1024, {32,0,32,32}, {200,100,32,32}, fn::math2d::Color::rgba(255,0,0)); fn::gfx::sprite_batch_end(b); tested: false tests: [] test_file_path: "" file_path: "cpp/functions/gfx/sprite_batch.cpp" params: - name: cap desc: "Capacidad de quads por flush (CPU buffer). Default 4096 (~96 KB)." - name: img desc: "sg_image atlas. Cambio de img = auto-flush." - name: src desc: "Rect en pixeles dentro del atlas (UV se calculan dividiendo por img_w/img_h)." - name: dst desc: "Rect destino en coordenadas world (la matriz view-proj traduce a clip space)." - name: tint desc: "Color multiplicativo. Default Color::white()." output: "Quads renderizados via sg_draw cuando flush. Una sola draw call por atlas binding." --- # sprite_batch Renderer batched de sprites 2D sobre sokol_gfx. Patron clasico: 1. `sprite_batch_create` una vez (despues de `sg_setup`). 2. Por frame, dentro de un sg_pass: - `sprite_batch_begin(b, view_proj)` — pasa la matriz view-projection del camera_2d. - `sprite_batch_draw(...)` por sprite. Auto-flush cuando cambia atlas o se llena. - `sprite_batch_end(b)` — flush final. **Alpha blending** activado por defecto (premultiplicado o no — usar el atlas que tengas; el shader hace `texture(u_tex, v_uv) * tint`). **Sampler** linear filter + clamp-to-edge. Para pixel art, crear sampler propio con `SG_FILTER_NEAREST` y bindearlo manualmente (override no soportado por ahora — sub-issue futuro si hace falta). **Performance**: 1 draw call por atlas. 10K sprites @ 60 FPS sobre WebGL2 modesto. Cap por defecto 4096 quads/flush; subir si tu juego dibuja >4K sprites del mismo atlas.