refactor(shaders_lab): extraer compile_* a compiler.{h,cpp}
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
add_imgui_app(shaders_lab
|
add_imgui_app(shaders_lab
|
||||||
main.cpp
|
main.cpp
|
||||||
|
compiler.cpp
|
||||||
${CMAKE_SOURCE_DIR}/functions/gfx/gl_loader.cpp
|
${CMAKE_SOURCE_DIR}/functions/gfx/gl_loader.cpp
|
||||||
${CMAKE_SOURCE_DIR}/functions/gfx/gl_shader.cpp
|
${CMAKE_SOURCE_DIR}/functions/gfx/gl_shader.cpp
|
||||||
${CMAKE_SOURCE_DIR}/functions/gfx/gl_framebuffer.cpp
|
${CMAKE_SOURCE_DIR}/functions/gfx/gl_framebuffer.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 <chrono>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// ── 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<fn::gfx::UniformDescriptor> g_descs;
|
||||||
|
extern fn::gfx::UniformStore g_store;
|
||||||
|
extern std::vector<fn::gfx::DagStep> 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
|
||||||
@@ -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
|
||||||
@@ -19,6 +19,8 @@
|
|||||||
#include "core/app_menubar.h"
|
#include "core/app_menubar.h"
|
||||||
#include "core/layout_storage.h"
|
#include "core/layout_storage.h"
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@@ -27,8 +29,9 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
static fn::gfx::ShaderCanvas g_canvas_code;
|
// Globals: linked extern desde compiler.cpp. NO `static` aqui.
|
||||||
static fn::gfx::ShaderCanvas g_canvas_dag;
|
fn::gfx::ShaderCanvas g_canvas_code;
|
||||||
|
fn::gfx::ShaderCanvas g_canvas_dag;
|
||||||
|
|
||||||
// Default placeholder so the Code panel does something useful on first launch
|
// Default placeholder so the Code panel does something useful on first launch
|
||||||
// without committing to one specific look.
|
// without committing to one specific look.
|
||||||
@@ -47,19 +50,19 @@ void main() {
|
|||||||
}
|
}
|
||||||
)glsl";
|
)glsl";
|
||||||
|
|
||||||
static std::string g_source = CODE_PLACEHOLDER;
|
std::string g_source = CODE_PLACEHOLDER;
|
||||||
static std::string g_code_err;
|
std::string g_code_err;
|
||||||
static int g_code_err_line = -1;
|
int g_code_err_line = -1;
|
||||||
static std::chrono::steady_clock::time_point g_code_last_edit;
|
std::chrono::steady_clock::time_point g_code_last_edit;
|
||||||
static bool g_code_dirty = true;
|
bool g_code_dirty = true;
|
||||||
static std::vector<fn::gfx::UniformDescriptor> g_descs;
|
std::vector<fn::gfx::UniformDescriptor> g_descs;
|
||||||
static fn::gfx::UniformStore g_store;
|
fn::gfx::UniformStore g_store;
|
||||||
|
|
||||||
static std::vector<fn::gfx::DagStep> g_pipeline;
|
std::vector<fn::gfx::DagStep> g_pipeline;
|
||||||
static std::string g_dag_glsl;
|
std::string g_dag_glsl;
|
||||||
static std::string g_dag_err;
|
std::string g_dag_err;
|
||||||
static int g_dag_err_line = -1;
|
int g_dag_err_line = -1;
|
||||||
static bool g_dag_dirty = true;
|
static bool g_dag_dirty = true; // solo lo usa main.cpp
|
||||||
|
|
||||||
// ── Panel visibility (toggled from View menu and panel close button) ──────
|
// ── Panel visibility (toggled from View menu and panel close button) ──────
|
||||||
static bool g_show_code = true;
|
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 char g_save_tags[128] = "shaders_lab,user";
|
||||||
static std::string g_save_err;
|
static std::string g_save_err;
|
||||||
|
|
||||||
static void compile_code() {
|
// compile_code, compile_dag, mark_code_dirty viven en compiler.cpp
|
||||||
auto r = fn::gfx::compile_fragment(g_source);
|
using shaders_lab::compile_code;
|
||||||
if (r.ok) {
|
using shaders_lab::compile_dag;
|
||||||
g_descs = fn::gfx::parse_uniforms(g_source);
|
using shaders_lab::mark_code_dirty;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ensure_dag_default() {
|
static void ensure_dag_default() {
|
||||||
if (g_pipeline.empty()) {
|
if (g_pipeline.empty()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user