const std = @import("std"); // this file creates auto generated static resource installers for // embedded shaders. // // when building with -Dstatic_build shaders are instead not loaded from the file system // but instead embedded into the binary pub fn main() !void { var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); defer arena.deinit(); const allocator = arena.allocator(); // Get output filename from build system const args = try std.process.argsAlloc(allocator); if (args.len < 3) @panic("Missing output filename"); const out_path = args[1]; // Generate a startup module function that invokes // startup module for each zig function // and generates an api var writer = std.ArrayList(u8){}; // const content_path = args[2]; // std.debug.print("content path: {s}\n", .{content_path}); // check the content directory and search for all _spv files var dir = try std.fs.cwd().openDir("content/_shaders", .{ .iterate = true }); defer dir.close(); _ = try writer.appendSlice(allocator, \\ pub const core = @import("core").module; \\ \\ pub fn installStaticResources() !void { \\ ); var shaderFileEmbeds = std.ArrayList([]const u8){}; var walker = dir.iterate(); while (try walker.next()) |shaderType| { // std.debug.print("Walk: {s}\n", .{shaderType.name}); if (shaderType.kind == .directory) { var d2 = try dir.openDir(shaderType.name, .{ .iterate = true }); defer d2.close(); var w2 = d2.iterate(); while (try w2.next()) |shaderName| { const shaderPath = try std.fmt.allocPrint(allocator, "_shaders/{s}/{s}", .{ shaderType.name, shaderName.name }); // std.debug.print("mounted path: {s} => {s}\n", .{ shaderPath, shaderName.name }); try writer.print( allocator, "{{ const embedded align(8) = @embedFile(\"{s}\").*;\n_ = try core.fs().installFileBytesMount(\"{s}\", @constCast(&embedded), true);}}\n", .{ shaderName.name, shaderPath }, ); try shaderFileEmbeds.append(allocator, shaderName.name); } } } _ = try writer.appendSlice(allocator, \\ } ); try writer.print(allocator, "const std = @import(\"std\");", .{}); // Write to specified output file // Open or create the file for writing (overwrites if it exists) const file = try std.fs.cwd().createFile(out_path, .{}); defer file.close(); try writer.append(allocator, 0); var ast = try std.zig.Ast.parse(allocator, @as([:0]const u8, @ptrCast(writer.items[0 .. writer.items.len - 1])), .zig); // std.debug.print("output=\n{s}", .{content.items[0 .. content.items.len - 1]}); defer ast.deinit(allocator); const out = try ast.renderAlloc(allocator); // Write the content to the file try file.writeAll(out); }