#include "gfx/dag_compile.h" #include "gfx/dag_catalog.h" #include #include namespace fn::gfx { static constexpr int MAX_NODES = 16; std::string compile_dag_to_glsl(const std::vector& pipeline) { const int n = static_cast(std::min(pipeline.size(), static_cast(MAX_NODES))); std::ostringstream out; out << "uniform vec4 u_params[16];\n\n"; if (n == 0) { out << "void main() {\n"; out << " vec2 uv = gl_FragCoord.xy / u_resolution;\n"; out << " (void)uv;\n"; out << " fragColor = vec4(0.04, 0.04, 0.06, 1.0);\n"; out << "}\n"; return out.str(); } // Emit per-node functions with signatures based on num_inputs for (int i = 0; i < n; ++i) { const DagStep& step = pipeline[static_cast(i)]; const DagNodeDef* def = dag_find(step.name); if (!def) continue; int ni = def->num_inputs; out << "vec4 node_" << i << "("; if (ni >= 1) out << "vec4 a"; if (ni >= 2) out << ", vec4 b"; if (ni >= 3) out << ", vec4 c"; if (ni >= 4) out << ", vec4 d"; if (ni > 0) out << ", "; out << "vec2 uv) {\n"; out << def->body_glsl(i) << "\n"; out << "}\n\n"; } out << "void main() {\n"; out << " vec2 uv = gl_FragCoord.xy / u_resolution;\n"; for (int i = 0; i < n; ++i) { const DagStep& step = pipeline[static_cast(i)]; const DagNodeDef* def = dag_find(step.name); if (!def) { if (i == 0) { out << " vec4 out_" << i << " = vec4(0.0, 0.0, 0.0, 1.0);\n"; } else { out << " vec4 out_" << i << " = out_" << (i - 1) << ";\n"; } continue; } int ni = def->num_inputs; // Resolve each input slot // For slot k: look for source_ids[k] in pipeline[0..i-1]; fallback = prev output auto resolve = [&](int k) -> std::string { const std::string& sid = step.source_ids[static_cast(k)]; if (!sid.empty()) { for (int j = 0; j < i; ++j) { if (pipeline[static_cast(j)].id == sid) { return "out_" + std::to_string(j); } } } // fallback if (i == 0) return "vec4(0.0, 0.0, 0.0, 1.0)"; return "out_" + std::to_string(i - 1); }; out << " vec4 out_" << i << " = node_" << i << "("; for (int k = 0; k < ni; ++k) { if (k > 0) out << ", "; out << resolve(k); } if (ni > 0) out << ", "; out << "uv);\n"; } out << " fragColor = out_" << (n - 1) << ";\n"; out << "}\n"; return out.str(); } } // namespace fn::gfx