--- name: dag_uniforms kind: function lang: cpp domain: gfx version: "1.0.0" purity: impure signature: "void dag_uniforms_apply(const std::vector& pipeline, unsigned int program)" description: "Sube los params del pipeline al shader activo via glUniform4fv. Construye un float[64] con los params de cada DagStep (hasta 16 pasos) y llama glUniform4fv(u_params, 16, data)." tags: [dag, shader, uniforms, opengl, gfx, pipeline] uses_functions: - gl_loader_cpp_gfx uses_types: - dag_types_cpp_gfx returns: [] returns_optional: false error_type: "error_go_core" imports: [dag_uniforms, gl_loader, dag_types, vector, algorithm, cstring] tested: false tests: [] test_file_path: "" file_path: "cpp/functions/gfx/dag_uniforms.cpp" params: - name: pipeline desc: "Vector de DagStep. params[0..3] de cada step se copian en data[i*4..i*4+3]. Steps mas alla de MAX_NODES=16 se ignoran." - name: program desc: "ID del programa GL activo. Debe haber sido activado con glUseProgram antes de llamar." output: "Efecto lateral: actualiza el uniform u_params[16] en el programa GL activo para el frame actual." --- ## Notas El array data[64] se inicializa a 0 antes de copiar, por lo que steps no usados quedan en cero. El caller es responsable de activar el programa antes de llamar. ## Cambios 2026-04-25 (Fase 5 + Fase 7 shaders_lab) - **Layout dinámico**: el array global pasa de `vec4 u_params[16]` (4 floats por nodo, fijo) a `vec4 u_params[64]` (256 floats). Cada nodo ocupa `dag_vec4_count(param_count)` vec4s consecutivos. El packing usa `dag_param_layout(pipeline)` (declarada en `dag_compile.h`) para obtener el índice base por nodo, idéntico al que usa el compilador. - **Reset de `u_preview_target`**: al final del apply, se hace `glUniform1i(u_preview_target, -1)` si el uniform existe en el programa. Esto deja la rama de preview desactivada en el render principal del Canvas DAG; `dag_previews_render` la activa transitoriamente por nodo y la deja restaurada. - Nuevo `dag_compile_cpp_gfx` en `uses_functions` (consume `dag_param_layout`).