- app.md - appicon.ico Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.4 KiB
name, lang, domain, version, description, tags, uses_functions, uses_types, framework, entry_point, dir_path, repo_url, icon
| name | lang | domain | version | description | tags | uses_functions | uses_types | framework | entry_point | dir_path | repo_url | icon | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| shaders_lab | cpp | gfx | 0.1.0 | Live GLSL shader playground con DAG pipeline. Editor de codigo con compilacion en caliente, panel DAG con paleta de generadores/filtros/output, dos canvas (Code y DAG), parseo de uniforms anotados (// @slider, @color, @xy) que se convierten en controles, persistencia de generators en shaders_lab.db, y guardado/carga de layouts ImGui. |
|
|
|
imgui | main.cpp | apps/shaders_lab |
|
Arquitectura
App ImGui de live-coding GLSL con dos modos en paralelo:
- Code panel — editor de fragment shader libre. Las anotaciones en
uniforms (
// @slider,// @color,// @xy,// @toggle) se parsean y convierten en controles del panel Controls que escriben en unUniformStoreaplicado al programa cada frame. - DAG panel — pipeline node-based con catalogo de generadores (plasma, voronoi, etc.) y filtros (blur, threshold, etc.) que se compilan a un fragment shader unificado y se renderizan en Canvas DAG.
Al guardar un Code shader como "generator" se traduce a un DagNodeDef y se
persiste en shaders_lab.db (tabla via shaderlab_db), apareciendo en la
paleta del DAG junto a los builtins.
Capas
| Archivo | Responsabilidad |
|---|---|
main.cpp |
UI shell, paneles, modal save-as, layouts, AppConfig |
compiler.cpp |
compile_code(), compile_dag(), mark_code_dirty() con debounce 250ms |
main.cpp mantiene estado global de sesion (g_source, g_pipeline, g_descs,
g_store, g_layouts...) — ImGui retained-mode obliga a que persista entre
frames. Toda la logica pura de compilacion vive en compiler.cpp y en las
funciones dag_compile, code_to_generator, uniform_parser del registry.
Persistencia
shaders_lab.db(junto al .exe) — tabla de generators de usuario viashaderlab_db_*, ademas deimgui_layouts(creada porlayout_storage).imgui.iniyapp_settings.ini— gestionados porfn::run_appen<exe_dir>/local_files/.
Paneles
| Panel | Atajo | Que muestra |
|---|---|---|
| Code | Ctrl+1 | Editor del fragment shader + boton "Save as generator" |
| DAG Pipeline | Ctrl+2 | Node editor con la pipeline |
| Canvas Code | Ctrl+3 | Render del Code shader |
| Canvas DAG | Ctrl+4 | Render del shader compilado del DAG |
| Controls | Ctrl+5 | Sliders/color pickers de uniforms anotados |
| Functions | Ctrl+6 | Paleta del DAG (generators + filters + output) |
| Generated GLSL | Ctrl+7 | GLSL final del DAG con uniforms baked como const array |
Build
# Linux
cd cpp && cmake -B build/linux -S . && cmake --build build/linux --target shaders_lab
# Windows (cross-compile)
cd cpp && cmake -B build/windows -S . -DCMAKE_TOOLCHAIN_FILE=toolchains/mingw-w64.cmake \
&& cmake --build build/windows --target shaders_lab
Decisiones
init_gl_loader = true(viafn::run_apppor default cuando se enlaza con OpenGL) —shader_canvas,gl_shader,gl_framebufferllaman gl*.viewports = true— los Canvas se pueden arrastrar fuera del main.- DAG default: arranca con un nodo "plasma" + "output" si la paleta los
encuentra; persiste el INI con
layout_storage. - El boton "Save as generator" valida snake_case, evita colisionar con
builtins, traduce con
code_to_generator, persiste conshaderlab_db_save_generator, y registra el nodo nuevo en el catalogo en vivo (dag_register_node).
Capability growth log
Una linea por bump SemVer. Bump-type segun .claude/commands/version.md:
-
major: breaking observable (CLI args, schema BBDD propia, formato wire). -
minor: feature aditiva (nuevo panel, endpoint, opcion). -
patch: bugfix sin cambio observable. -
v0.1.0 (2026-05-18) — baseline.