feat(cpp/gfx): code_to_generator + shaderlab_db
Dos primitivas del pipeline de shaders_lab que ya estaban en uso pero sin indexar al registry: - code_to_generator_cpp_gfx (function, pure) Traduce un fragment shader GLSL escrito a mano (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 y reemplaza fragColor= por return. Empaqueta uniforms en vec4 (4 x n_uniforms). - shaderlab_db_cpp_gfx (function, impure) CRUD persistente para generators custom de shaders_lab via sqlite3. Guarda el GLSL original, el body traducido para el DAG, los DagControl y los param_defaults en una BD local (shaders_lab.db). Soporta open(:memory:) para tests. Ambas se indexan ahora en registry.db y son reusables fuera de shaders_lab si en el futuro hay otra app que componga DAGs de shaders.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
---
|
||||
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.
|
||||
Reference in New Issue
Block a user