SdfSceneGraphBuilder

Build an eval::Graph from an SDFNode tree.

In the namespace construct::eval. Declared in src/libs/libconstruct/construct/eval/SdfSceneGraphBuilder.hpp.

Detailed description

Phase 6-B of libeval-gpu-and-compute-migration (§EX2-MI-2). Walks the SDFNode tree starting at `rootNodeIndex` and emits a flat eval expression that inlines each primitive call + CSG operator + position transform encountered along the way. The result is an `eval::Graph` configured with: - one `Type::Vec3` input named `"p"` (the sample point in world space) - one `Type::Float` output named `"d"` (the SDF distance) - one user function per unique primitive / operator / transform / etc. definition referenced by any node in the tree (sourced from the Registry's `Definition::shaderCode`)

**Interim approach** — the scene tree is inlined at build time (one flat expression). Each scene change → fresh `Graph::compile`; the cache layer amortises this across many sample evaluations. Scales adequately to scenes up to ~tens of nodes; bigger scenes need the spec-target struct-array-iteration shape which requires vec/struct element types in `Type::RuntimeArray` (today only scalar Float elements work).

**Out-of-scope (this iteration)**: - `DistanceModifier`, `PositionAwareModifier`, `ScalarField` node types — none of testBoundsDetector's existing 5 cases exercise these. - Non-uniform / projective transform compensation. The walker uses the precomputed `invTransform` matrix directly, which is correct for pure rigid + uniform-scale transforms (covers translate / rotate / uniform-scale). Anisotropic scale matches the GPU's behavior (small distance bias near the surface).

In this section