Auditoria del issue 0044: anota en notes: el contexto de consumo de
huerfanos que no pueden registrarse en uses_functions porque sus
consumidores no son funciones del registry:
- consumido por cpp/framework/app_base.cpp (framework no indexado)
- consumido por cpp/apps/{shaders_lab,chart_demo,text_editor_smoke}/main.cpp
- scaffolding/demo en primitives_gallery
31 huerfanas anotadas. Las que quedan en uses_functions=[] tras esto
son hojas legitimas (no llaman a nada) o realmente sin uso (lista
DEAD reportada en el issue 0044).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.4 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, params, output, notes
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | params | output | notes | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dag_catalog | function | cpp | gfx | 1.0.0 | pure | const std::vector<DagNodeDef>& dag_catalog(); const DagNodeDef* dag_find(const std::string& name) | Catalogo global de nodos DAG para el pipeline de shaders. dag_catalog() devuelve referencia estable a los 10 nodos hardcoded (4 gen, 3 op, 3 blend) portados desde shader-dag-blends.jsx. dag_find() busca por nombre. |
|
|
false |
|
false | cpp/functions/gfx/dag_catalog.cpp | dag_catalog(): referencia const estable al vector de DagNodeDef (instancia estatica, no se invalida). dag_find(name): puntero al nodo con ese nombre o nullptr si no existe. | consumido por cpp/apps/shaders_lab/main.cpp |
Nodos incluidos
Generadores (4)
- solid: color constante RGB
- gradient: gradiente direccional con tono
- plasma: onda trigonometrica animada
- circle: SDF de circulo con suavizado
Operadores (3)
- invert: 1 - rgb
- gamma: correccion gamma pow(rgb, 1/g)
- hueShift: rotacion de matiz via matriz YIQ
Blends (3)
- blend_mix: interpolacion mix(a, b, t)
- blend_multiply: a.rgb * b.rgb
- blend_screen: 1 - (1-a)(1-b)
Notas
Los cuerpos GLSL omiten las declaraciones de u_time, u_resolution, u_params — las proporciona el preamble de gl_shader::compile_fragment o compile_dag_to_glsl. El indice idx que recibe body_glsl es la posicion en el pipeline (para indexar u_params[idx]).
Cambios 2026-04-25 (Fase 5 + Fase 7 shaders_lab)
Catálogo creció de 11 a 19 nodos. Nuevos Gen (8): checker, stripes, dots, rings, polar_rays, noise_value, voronoi, truchet. Bug fix: solid ahora muestra label en su control Color (era invisible por ImGuiColorEditFlags_NoLabel).
API mutable y lifecycle (declarados en dag_catalog.h):
dag_register_node(DagNodeDef def) -> bool: añade o reemplaza un nodo user. Refuse si el nombre colisiona con un built-in. Seteais_builtin = falseen el stored.dag_unregister_node(name) -> bool: borra un user node. Built-ins están protegidos.- Flag
is_builtinenDagNodeDef(verdag_types.h). Built-ins se cargan en el constructor estático y nunca se tocan tras eso.
Layout de params:
param_names/param_defaultspasan dearray<*,4>avector<*>. Cada nodo declara la cantidad real de floats que necesita (sin padding cosmético).body_glslrecibeint base_vec4(índice base en el array global), no el index del nodo. El compilador lo calcula víadag_param_layout.body_glsl(idx)semantically: whereidxwas the node index, now it is the vec4 base. Bodies que originalmente hacíanvec4 p = u_params[i]; ...; p.x ... p.wsiguen funcionando porque cada nodo built-in cabe en 1 vec4. Generators custom de Code → DAG (code_to_generator) reciben__BASE__como placeholder y la lambda lo sustituye en runtime con el valor real.
body_glsl(int base_vec4) retorna string con cuerpo de la función vec4 node_<i>(vec4 a?, vec4 b?, ..., vec2 uv). Los inputs llegan como params a,b,c,d según num_inputs; uv siempre presente.
Tests: 8/8 (19 nodos, invariantes por kind + 1 control_idx in-bounds + name uniqueness).