--- name: shader_canvas kind: component lang: cpp domain: gfx version: "1.1.0" purity: impure signature: "void canvas_render(ShaderCanvas& c, float time_seconds, const std::function& uniforms_fn = {})" description: "Componente ImGui que renderiza un fragment shader GLSL a un FBO y lo muestra en el panel actual. Compone gl_framebuffer, fullscreen_quad y gl_shader. Gestiona resize automático y coordenadas de mouse. Acepta callback opcional uniforms_fn invocado tras glUseProgram para uniforms custom." tags: [opengl, shader, canvas, imgui, fbo, gfx, component] uses_functions: - gl_shader_cpp_gfx - gl_framebuffer_cpp_gfx - fullscreen_quad_cpp_gfx - uniform_panel_cpp_gfx uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [imgui, GL/gl.h, GL/glext.h] tested: false tests: [] test_file_path: "" file_path: "cpp/functions/gfx/shader_canvas.cpp" framework: imgui params: - name: c desc: "ShaderCanvas con estado GL interno (fb, quad, program). Inicializar con canvas_init() antes del primer frame." - name: time_seconds desc: "Tiempo en segundos para el uniform u_time. Usar ImGui::GetTime() o clock propio." - name: uniforms_fn desc: "Callback opcional invocado tras glUseProgram y antes de quad_draw. Recibe el program ID. Usar para aplicar uniforms custom (ej: uniforms_apply de uniform_panel)." output: "Dibuja ImGui::Image con la textura del FBO renderizado. El panel ImGui debe estar abierto (entre Begin/End). Ocupa GetContentRegionAvail()." --- # shader_canvas Componente que encapsula el ciclo render-to-FBO + ImGui::Image. Llama a `canvas_render()` dentro de un `ImGui::Begin/End` activo. ## Ciclo de vida ```cpp fn::gfx::ShaderCanvas canvas{}; // En el render loop: if (!canvas.initialized) fn::gfx::canvas_init(canvas); // Cargar un shader compilado: auto r = fn::gfx::compile_fragment(src); if (r.ok) fn::gfx::canvas_set_program(canvas, r.program); // Dentro de ImGui::Begin/End: fn::gfx::canvas_render(canvas, (float)ImGui::GetTime()); // Al destruir: fn::gfx::canvas_destroy(canvas); ``` ## Notas - `canvas_set_program` borra el programa anterior automáticamente. - `canvas_set_program(c, 0)` deja la pantalla en negro (glClear sin draw call). - El flip de coordenadas UV (`ImVec2(0,1)` / `ImVec2(1,0)`) corrige el origen OpenGL bottom-left vs ImGui top-left. - Guarda y restaura `GL_FRAMEBUFFER_BINDING` y `GL_VIEWPORT` para compatibilidad con el render loop de ImGui.