From 0cfaa27ee13e6806a50f374cc68b88448059acd4 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Tue, 28 Apr 2026 23:56:33 +0200 Subject: [PATCH] refactor(shaders_lab): extraer compile_* a compiler.{h,cpp} --- cpp/apps/shaders_lab/CMakeLists.txt | 1 + cpp/apps/shaders_lab/compiler.cpp | 63 +++++++++++++++++++++++++++ cpp/apps/shaders_lab/compiler.h | 24 +++++++++++ cpp/apps/shaders_lab/main.cpp | 66 +++++++++-------------------- 4 files changed, 109 insertions(+), 45 deletions(-) create mode 100644 cpp/apps/shaders_lab/compiler.cpp create mode 100644 cpp/apps/shaders_lab/compiler.h diff --git a/cpp/apps/shaders_lab/CMakeLists.txt b/cpp/apps/shaders_lab/CMakeLists.txt index b5da11af..5e8a9d43 100644 --- a/cpp/apps/shaders_lab/CMakeLists.txt +++ b/cpp/apps/shaders_lab/CMakeLists.txt @@ -1,5 +1,6 @@ add_imgui_app(shaders_lab main.cpp + compiler.cpp ${CMAKE_SOURCE_DIR}/functions/gfx/gl_loader.cpp ${CMAKE_SOURCE_DIR}/functions/gfx/gl_shader.cpp ${CMAKE_SOURCE_DIR}/functions/gfx/gl_framebuffer.cpp diff --git a/cpp/apps/shaders_lab/compiler.cpp b/cpp/apps/shaders_lab/compiler.cpp new file mode 100644 index 00000000..1f2f5d57 --- /dev/null +++ b/cpp/apps/shaders_lab/compiler.cpp @@ -0,0 +1,63 @@ +#include "compiler.h" + +#include "gfx/shader_canvas.h" +#include "gfx/gl_shader.h" +#include "gfx/uniform_parser.h" +#include "gfx/uniform_panel.h" +#include "gfx/dag_compile.h" +#include "gfx/dag_uniforms.h" + +#include +#include +#include + +// ── Globals declarados en main.cpp (single source of truth) ───────────────── +extern fn::gfx::ShaderCanvas g_canvas_code; +extern fn::gfx::ShaderCanvas g_canvas_dag; +extern std::string g_source; +extern std::string g_code_err; +extern int g_code_err_line; +extern std::chrono::steady_clock::time_point g_code_last_edit; +extern bool g_code_dirty; +extern std::vector g_descs; +extern fn::gfx::UniformStore g_store; +extern std::vector g_pipeline; +extern std::string g_dag_glsl; +extern std::string g_dag_err; +extern int g_dag_err_line; + +namespace shaders_lab { + +void compile_code() { + auto r = fn::gfx::compile_fragment(g_source); + if (r.ok) { + g_descs = fn::gfx::parse_uniforms(g_source); + fn::gfx::uniforms_sync(g_store, g_descs); + fn::gfx::canvas_set_program(g_canvas_code, r.program); + g_code_err.clear(); + g_code_err_line = -1; + } else { + g_code_err = r.err_msg; + g_code_err_line = r.err_line; + } +} + +void compile_dag() { + g_dag_glsl = fn::gfx::compile_dag_to_glsl(g_pipeline); + auto r = fn::gfx::compile_fragment(g_dag_glsl); + if (r.ok) { + fn::gfx::canvas_set_program(g_canvas_dag, r.program); + g_dag_err.clear(); + g_dag_err_line = -1; + } else { + g_dag_err = r.err_msg; + g_dag_err_line = r.err_line; + } +} + +void mark_code_dirty() { + g_code_last_edit = std::chrono::steady_clock::now(); + g_code_dirty = true; +} + +} // namespace shaders_lab diff --git a/cpp/apps/shaders_lab/compiler.h b/cpp/apps/shaders_lab/compiler.h new file mode 100644 index 00000000..44d4f3fd --- /dev/null +++ b/cpp/apps/shaders_lab/compiler.h @@ -0,0 +1,24 @@ +#pragma once + +// shaders_lab/compiler — extrae las rutinas impuras de compilacion del shader +// (compile_code, compile_dag, mark_code_dirty) desde main.cpp para que el +// archivo principal quede acotado a la composicion de paneles ImGui. +// +// Las globals (g_source, g_descs, g_store, g_pipeline, etc.) se declaran +// extern y viven en main.cpp; aqui solo orquestamos compilacion. + +namespace shaders_lab { + +// Compila g_source -> programa OpenGL para g_canvas_code, refresca g_descs +// y sincroniza g_store. Actualiza g_code_err / g_code_err_line. +void compile_code(); + +// Compila g_pipeline -> g_dag_glsl -> programa OpenGL para g_canvas_dag. +// Actualiza g_dag_err / g_dag_err_line. +void compile_dag(); + +// Marca el shader Code como dirty y registra el timestamp del ultimo edit +// (para debounce de 250ms en el render loop). +void mark_code_dirty(); + +} // namespace shaders_lab diff --git a/cpp/apps/shaders_lab/main.cpp b/cpp/apps/shaders_lab/main.cpp index 833eca56..6c3d4067 100644 --- a/cpp/apps/shaders_lab/main.cpp +++ b/cpp/apps/shaders_lab/main.cpp @@ -19,6 +19,8 @@ #include "core/app_menubar.h" #include "core/layout_storage.h" +#include "compiler.h" + #include #include #include @@ -27,8 +29,9 @@ #include #include -static fn::gfx::ShaderCanvas g_canvas_code; -static fn::gfx::ShaderCanvas g_canvas_dag; +// Globals: linked extern desde compiler.cpp. NO `static` aqui. +fn::gfx::ShaderCanvas g_canvas_code; +fn::gfx::ShaderCanvas g_canvas_dag; // Default placeholder so the Code panel does something useful on first launch // without committing to one specific look. @@ -47,19 +50,19 @@ void main() { } )glsl"; -static std::string g_source = CODE_PLACEHOLDER; -static std::string g_code_err; -static int g_code_err_line = -1; -static std::chrono::steady_clock::time_point g_code_last_edit; -static bool g_code_dirty = true; -static std::vector g_descs; -static fn::gfx::UniformStore g_store; +std::string g_source = CODE_PLACEHOLDER; +std::string g_code_err; +int g_code_err_line = -1; +std::chrono::steady_clock::time_point g_code_last_edit; +bool g_code_dirty = true; +std::vector g_descs; +fn::gfx::UniformStore g_store; -static std::vector g_pipeline; -static std::string g_dag_glsl; -static std::string g_dag_err; -static int g_dag_err_line = -1; -static bool g_dag_dirty = true; +std::vector g_pipeline; +std::string g_dag_glsl; +std::string g_dag_err; +int g_dag_err_line = -1; +static bool g_dag_dirty = true; // solo lo usa main.cpp // ── Panel visibility (toggled from View menu and panel close button) ────── static bool g_show_code = true; @@ -84,37 +87,10 @@ static char g_save_desc[256] = ""; static char g_save_tags[128] = "shaders_lab,user"; static std::string g_save_err; -static void compile_code() { - auto r = fn::gfx::compile_fragment(g_source); - if (r.ok) { - g_descs = fn::gfx::parse_uniforms(g_source); - fn::gfx::uniforms_sync(g_store, g_descs); - fn::gfx::canvas_set_program(g_canvas_code, r.program); - g_code_err.clear(); - g_code_err_line = -1; - } else { - g_code_err = r.err_msg; - g_code_err_line = r.err_line; - } -} - -static void compile_dag() { - g_dag_glsl = fn::gfx::compile_dag_to_glsl(g_pipeline); - auto r = fn::gfx::compile_fragment(g_dag_glsl); - if (r.ok) { - fn::gfx::canvas_set_program(g_canvas_dag, r.program); - g_dag_err.clear(); - g_dag_err_line = -1; - } else { - g_dag_err = r.err_msg; - g_dag_err_line = r.err_line; - } -} - -static void mark_code_dirty() { - g_code_last_edit = std::chrono::steady_clock::now(); - g_code_dirty = true; -} +// compile_code, compile_dag, mark_code_dirty viven en compiler.cpp +using shaders_lab::compile_code; +using shaders_lab::compile_dag; +using shaders_lab::mark_code_dirty; static void ensure_dag_default() { if (g_pipeline.empty()) {