diff options
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 130 |
1 files changed, 12 insertions, 118 deletions
diff --git a/src/main.zig b/src/main.zig index 932fdca..11052e5 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,8 +1,6 @@ const std = @import("std"); -const fs = std.fs; const debug = std.debug; const panic = debug.panic; -const process = std.process; const c = @import("c.zig"); const debug_gl = @import("debug_gl.zig"); const cfg = @import("config.zig"); @@ -24,11 +22,7 @@ pub fn main() !void { var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); defer arena.deinit(); - var args = process.args(); - _ = args.next(); - - const filename = args.next() orelse "config.yaml"; - var config = try cfg.Config.parse(arena.allocator(), filename); + var config = try cfg.Config.init(arena.allocator()); _ = c.glfwSetErrorCallback(errorCallback); @@ -111,9 +105,9 @@ pub fn main() !void { var fbo = try gl.FramebufferObject.create(config.width, config.height); defer fbo.destroy(); - const shader_file = try config.project_root.openFile(config.fragment, .{}); - var last_stat = try shader_file.stat(); - try reloadShader(&config, &main_program, config.fragment, last_stat.size); + // const shader_file = try std.fs.cwd().openFile(config.fragment, .{}); + // var last_stat = try shader_file.stat(); + // try main_program.loadFile(config.fragment, last_stat.size); var cache = gl.UniformCache.init(std.heap.c_allocator, &main_program); defer cache.deinit(); @@ -130,14 +124,14 @@ pub fn main() !void { control.update(); - const stat = try shader_file.stat(); - if (stat.mtime > last_stat.mtime or control.reload_requested) { - try reloadShader(&config, &main_program, config.fragment, stat.size); - try cache.refresh(); - last_stat = stat; - - control.reload_requested = false; - } + // const stat = try shader_file.stat(); + // if (stat.mtime > last_stat.mtime or control.reload_requested) { + // try main_program.loadFile(config.fragment, stat.size); + // try cache.refresh(); + // last_stat = stat; + // + // control.reload_requested = false; + // } fbo.bind(); c.glClear(c.GL_COLOR_BUFFER_BIT); @@ -161,103 +155,3 @@ pub fn main() !void { c.glfwPollEvents(); } } - -fn escape_dquote(str: []const u8) []const u8 { - const state = struct { - var buf: [1024]u8 = undefined; - }; - - const len = std.mem.replacementSize(u8, str, "\"", "\\\""); - _ = std.mem.replace(u8, str, "\"", "\\\"", state.buf[0..len]); - return state.buf[0..len]; -} - -// given a file and the directory it is in, resolve references -fn loadFile(config: *const cfg.Config, writer: anytype, dir: []const u8, filename: []const u8) !void { - const file_dir = try fs.path.resolve(c_allocator, &[_][]const u8{ - dir, - fs.path.dirname(filename) orelse "", - }); - defer c_allocator.free(file_dir); - - const file_path = try fs.path.resolve(c_allocator, &[_][]const u8{ dir, filename }); - defer c_allocator.free(file_path); - - var file = try config.project_root.openFile(file_path, .{}); - defer file.close(); - var reader = file.reader(); - - var line_number: u32 = 1; - var buf: [1024]u8 = undefined; - var wrote_line = false; - while (try reader.readUntilDelimiterOrEof(&buf, '\n')) |line| { - if (std.mem.startsWith(u8, line, "#pragma ")) { - var parts = std.mem.splitScalar(u8, line, ' '); - _ = parts.next(); - const pragma = parts.next().?; - - if (std.mem.eql(u8, pragma, "include")) { - var include_path = parts.next().?; - if (include_path[0] != '"' or include_path[include_path.len - 1] != '"') { - debug.print("{s}:{}: Invalid #pragma include\n", .{ file_path, line_number }); - debug.print("{s}:{}: {s}\n", .{ file_path, line_number, line }); - continue; - } - include_path = include_path[1 .. include_path.len - 1]; - - loadFile(config, writer, file_dir, include_path) catch unreachable; - _ = try writer.print("#line {d} \"{s}\"\n", .{ line_number, escape_dquote(filename) }); - - continue; - } else { - debug.print("{s}:{}: Unknown #pragma directive '{s}'\n", .{ file_path, line_number, pragma }); - debug.print("{s}:{}: {s}\n", .{ file_path, line_number, line }); - } - } - - if (!std.mem.startsWith(u8, line, "#version") and !wrote_line) { - _ = try writer.print("#line {d} \"{s}\"\n", .{ line_number - 1, escape_dquote(filename) }); - wrote_line = true; - } - - _ = try writer.write(line); - _ = try writer.write("\n"); - - line_number += 1; - } -} - -fn reloadShader(config: *const cfg.Config, current: *gl.ShaderProgram, frag_filename: []const u8, size: u64) !void { - var buffer = try std.ArrayList(u8).initCapacity(c_allocator, @as(usize, @intCast(size))); - errdefer buffer.deinit(); - - const writer = buffer.writer(); - _ = try writer.write( - \\#version 330 core - \\#extension GL_ARB_shading_language_include : require - \\ - ); - try loadFile(config, writer, "", frag_filename); - - const frag_source = try buffer.toOwnedSlice(); - defer c_allocator.free(frag_source); - - const vert_source = - \\#version 330 core - \\ - \\layout(location = 0) in vec2 position; - \\out vec2 uv; - \\ - \\void main() { - \\ uv = position / 2.0 + 0.5; - \\ gl_Position = vec4(position, 0, 1); - \\} - ; - - if (gl.ShaderProgram.create(vert_source, frag_source)) |new_program| { - current.destroy(); - current.* = new_program; - } else |err| { - debug.print("Error while reloading shader: {}\n", .{err}); - } -} |
