import std; import Crafter.Build; namespace fs = std::filesystem; using namespace Crafter; extern "C" Configuration CrafterBuildProject(std::span args) { bool isWasm = false; for (std::string_view a : args) { if (a.starts_with("--target=") && a.find("wasm") != std::string_view::npos) { isWasm = true; break; } } Configuration* graphics = LocalProject({ .projectFile = "../../project.cpp", .args = std::vector(args.begin(), args.end()), }); Configuration cfg; cfg.path = "./"; cfg.name = "CustomShader"; cfg.outputName = "CustomShader"; cfg.type = ConfigurationType::Executable; if (isWasm) { cfg.target = "wasm32-wasip1"; cfg.defines.push_back({"CRAFTER_GRAPHICS_WINDOW_DOM", ""}); // Match the -msimd128 that Crafter.Math/Crafter.Graphics's wasm // PCMs were compiled with. cfg.compileFlags.push_back("-msimd128"); } ApplyStandardArgs(cfg, args); cfg.dependencies = { graphics }; std::array ifaces = {}; std::array impls = { "main" }; cfg.GetInterfacesAndImplementations(ifaces, impls); if (isWasm) { // WGSL source is shipped as a static file and loaded via the // WASI VFS at runtime through WebGPUComputeShader::Load(path). cfg.files.emplace_back(fs::path("inverse-circle.comp.wgsl")); EnableWasiBrowserRuntime(cfg); } else { cfg.shaders.emplace_back(fs::path("inverse-circle.comp.glsl"), std::string("main"), ShaderType::Compute); } return cfg; }