--- name: code_to_generator kind: function lang: cpp domain: gfx version: "1.0.0" purity: pure signature: "CodeToGeneratorResult code_to_generator(const std::string& source); DagNodeDef make_generator_def(const std::string& name, const std::string& label, const std::string& desc, const CodeToGeneratorResult& tr)" description: "Traduce un fragment shader GLSL del modo Code (con `void main()` + `fragColor = ...`) en un body de DAG Gen + DagControl[]. Cada uniform anotado se convierte en un control; el body usa el parametro `uv` de la funcion (lineas `vec2 uv = ...;` se eliminan) y reemplaza `fragColor =` por `return`. Empaqueta cada uniform en su propio vec4 (parametros = 4 × n_uniforms)." tags: [glsl, codegen, dag, generators, shaders_lab, parser, gfx] uses_functions: - uniform_parser_cpp_gfx uses_types: - dag_types_cpp_gfx returns: [] returns_optional: false error_type: "" imports: [code_to_generator, uniform_parser, dag_types, regex, sstream, string] tested: true tests: - "plasma-like (float + vec3) → Slider + Color, defaults preservados, base placeholder" - "make_generator_def substituye __BASE__ con el indice runtime" - "missing void main → error" - "missing fragColor → error" - "sampler2D → error" - "vec2 con @xy → XY control" - "shader sin uniforms → controls vacios, body ok" test_file_path: "cpp/functions/gfx/code_to_generator.cpp" file_path: "cpp/functions/gfx/code_to_generator.cpp" params: - name: source desc: "Fuente GLSL del modo Code: uniforms anotados (// @slider, @color, @xy, @toggle), `void main()` con `vec2 uv = gl_FragCoord.xy / u_resolution;` opcional y `fragColor = ...;`." - name: name desc: "Identificador snake_case del generator, unico en el catalogo (no debe colisionar con built-ins)." - name: label desc: "Etiqueta visible en la paleta. Si vacio, se usa name." - name: desc desc: "Descripcion libre del generator." - name: tr desc: "Resultado de `code_to_generator`. Solo se usa si `tr.ok == true`." output: "CodeToGeneratorResult con body_template (con tokens __BASE__), param_count, param_defaults, param_names y DagControl[]. make_generator_def envuelve esto en un DagNodeDef listo para `dag_register_node()`." --- ## Layout de parametros Cada uniform reclama 1 vec4 entero, sin importar su tipo. Esto desperdicia hasta 3 floats por uniform pero hace trivial el mapeo: | GLSL type | Slot | Alias | Control | |-----------|------|------------------------------------|---------| | `float` | 1 | `float n = u_params[B+i].x;` | Slider | | `int` | 1 | `int n = int(u_params[B+i].x);` | Slider | | `bool` | 1 | `bool n = bool(u_params[B+i].x>0.5)` | Slider 0/1 | | `vec2` | 1 | `vec2 n = u_params[B+i].xy;` | XY (con @xy) | | `vec3` | 1 | `vec3 n = u_params[B+i].xyz;` | Color (con @color) | | `vec4` | 1 | `vec4 n = u_params[B+i];` | Color (alpha en .w, sin control) — solo soportado con @color | | `sampler2D` | - | - | error | `__BASE__` es el placeholder que `make_generator_def` sustituye por el `base_vec4` del nodo en runtime.