a27dcc028c
El doctor reportaba el dominio gamedev en doble FAIL: el tag plano `gamedev` (44 funciones) como `ungrouped_candidate` y la pagina `gamedev-2d.md` como `doc_orphan`. Causa raiz: el INDEX declaraba `[gamedev](gamedev-2d.md)` y el auditor solo registra el slug cuando label==target, asi que ni casaba la pagina ni declaraba el tag. Al revisar las 44 funciones habia dos clusters reales bajo el mismo tag, asi que se separan en dos grupos honestos: - gamedev-2d (tag canonico): 31 builders de workflow ComfyUI + 5 de apoyo (post-proceso + puente a Godot) = 36. Se elimina el tag plano `gamedev` de los builders (ya tenian `gamedev-2d`) y se reemplaza por `gamedev-2d` en las de apoyo. - gamedev-engine (grupo nuevo, pagina madre nueva): runtime de juego C++ multiplataforma (SDL3 + sokol_gfx + miniaudio, Issue 0072b) = 8. Game loop, camara 2D, input unificado, sprite batch, setup render/audio, build wasm. El tag plano `gamedev` queda eliminado (count 0). INDEX corregido: fila gamedev-2d con label==target y conteo 36 + fila nueva gamedev-engine (8). Verificacion: `fn index` + `fn doctor capabilities` -> ambos grupos OK (declared_in_index=yes, doc_exists=yes, sin issues); `gamedev` plano = 0. Solo se modifico el campo `tags` de los .md, ningun archivo de codigo. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
62 lines
2.6 KiB
Markdown
62 lines
2.6 KiB
Markdown
---
|
|
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-engine, 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.
|