/* Crafter®.Graphics Copyright (C) 2026 Catcrafts® catcrafts.net */ // DOM-mode RT pipeline. Mirrors PipelineRTVulkan's surface — Init takes // the same kind of (raygen, miss, hit) shader-group spans plus an SBT. // The big difference is implementation: there's no native RT pipeline on // WebGPU, so Init assembles a single megakernel WGSL by concatenating // 1. library prelude (types, bindings, ray-flag constants) // 2. user closesthit / anyhit / miss source files // 3. library mega-switches dispatched on per-hit hit-group index // 4. library helpers (rayAabb / rayTriangle / traverseBlas / traverseTlas) // 5. library traceRay function // 6. user raygen source files // 7. @compute entry calling the registered raygen // and hands the result to wgpuLoadRTPipeline. // // The library WGSL itself lives in additional/dom-webgpu.js (rtWgslPrelude // + rtWgslDispatchTemplate). C++ side only knows the substitution markers. export module Crafter.Graphics:PipelineRTWebGPU; #ifdef CRAFTER_GRAPHICS_WINDOW_DOM import std; import :RT; import :WebGPU; import :ShaderBindingTableWebGPU; export namespace Crafter { class PipelineRTWebGPU { public: std::uint32_t pipelineHandle = 0; // Build the megakernel pipeline. Groups carry indices into // `sbt.shaders`. The library generates one `case` per registered // group: closest-hit groups dispatch to their closestHitShader's // entryFn, miss groups to their generalShader's entryFn, etc. // The `cmd` parameter is unused on WebGPU; kept for API symmetry. void Init(WebGPUCommandEncoderRef cmd, std::span raygenGroups, std::span missGroups, std::span hitGroups, const ShaderBindingTableWebGPU& sbt); PipelineRTWebGPU() = default; PipelineRTWebGPU(const PipelineRTWebGPU&) = delete; PipelineRTWebGPU& operator=(const PipelineRTWebGPU&) = delete; }; } #endif // CRAFTER_GRAPHICS_WINDOW_DOM