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; } } std::vector graphicsArgs(args.begin(), args.end()); Configuration* graphics = LocalProject({ .projectFile = "../../project.cpp", .args = graphicsArgs, }); Configuration cfg; cfg.path = "./"; cfg.name = "VulkanTriangle"; cfg.outputName = "VulkanTriangle"; cfg.type = ConfigurationType::Executable; if (isWasm) { cfg.target = "wasm32-wasip1"; cfg.defines.push_back({"CRAFTER_GRAPHICS_WINDOW_DOM", ""}); cfg.compileFlags.push_back("-msimd128"); } ApplyStandardArgs(cfg, args); cfg.dependencies = { graphics }; std::array ifaces = {}; std::array impls = { "main" }; cfg.GetInterfacesAndImplementations(ifaces, impls); if (isWasm) { cfg.files.emplace_back(fs::path("raygen.wgsl")); cfg.files.emplace_back(fs::path("closesthit.wgsl")); cfg.files.emplace_back(fs::path("miss.wgsl")); EnableWasiBrowserRuntime(cfg); } else { cfg.shaders.emplace_back(fs::path("raygen.glsl"), std::string("main"), ShaderType::RayGen); cfg.shaders.emplace_back(fs::path("closesthit.glsl"), std::string("main"), ShaderType::ClosestHit); cfg.shaders.emplace_back(fs::path("miss.glsl"), std::string("main"), ShaderType::Miss); } return cfg; }