diff options
| author | s-ol <s+removethis@s-ol.nu> | 2021-11-10 15:19:21 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2021-11-10 15:19:21 +0000 |
| commit | e56efe809ba0f3c47feaecedd992e10f4209a451 (patch) | |
| tree | 8b61dd8c42921344aa7ca8daea5a3631aaea1247 /src | |
| parent | update for zig 0.7.1 (diff) | |
| download | glsl-view-e56efe809ba0f3c47feaecedd992e10f4209a451.tar.gz glsl-view-e56efe809ba0f3c47feaecedd992e10f4209a451.zip | |
resolve '#pragma include "...path..."' directives
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.zig | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/src/main.zig b/src/main.zig index b580dd9..47e72f8 100644 --- a/src/main.zig +++ b/src/main.zig @@ -104,7 +104,7 @@ pub fn main() !void { const shader_file = try fs.cwd().openFile(config.fragment, .{}); var last_stat = try shader_file.stat(); - try reloadShader(&main_program, shader_file, last_stat.size); + try reloadShader(&main_program, shader_file, config.fragment, last_stat.size); var cache = gl.UniformCache.init(std.heap.c_allocator, &main_program); defer cache.deinit(); @@ -112,8 +112,6 @@ pub fn main() !void { const control = try ctrl.ControlServer.init(&arena.allocator, config.osc, &cache); defer control.destroy(); - _ = try cache.get("radius\x00"); - while (c.glfwWindowShouldClose(window) == c.GL_FALSE) { c.glfwMakeContextCurrent(window); c.glClear(c.GL_COLOR_BUFFER_BIT); @@ -124,7 +122,7 @@ pub fn main() !void { const stat = try shader_file.stat(); if (stat.mtime > last_stat.mtime) { - try reloadShader(&main_program, shader_file, stat.size); + try reloadShader(&main_program, shader_file, config.fragment, stat.size); try cache.refresh(); last_stat = stat; } @@ -154,11 +152,58 @@ pub fn main() !void { } } -fn reloadShader(current: *gl.ShaderProgram, frag_file: fs.File, size: u64) !void { - var frag_source = try c_allocator.alloc(u8, @intCast(usize, size)); +// given a file and the directory it is in, resolve references +fn loadFile(writer: anytype, dir: []const u8, filename: []const u8) !void { + const file_dir = try std.fs.path.resolve(c_allocator, &[_][]const u8{ + dir, + std.fs.path.dirname(filename) orelse "", + }); + defer c_allocator.free(file_dir); + + const file_path = try std.fs.path.resolve(c_allocator, &[_][]const u8{ dir, filename }); + defer c_allocator.free(file_path); + + var file = try fs.openFileAbsolute(file_path, .{}); + defer file.close(); + var reader = file.reader(); + + var buf: [1024]u8 = undefined; + while (try reader.readUntilDelimiterOrEof(&buf, '\n')) |line| { + if (std.mem.startsWith(u8, line, "#pragma ")) { + var parts = std.mem.split(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] != '"') { + std.debug.warn("Invalid #pragma directive '{}'\n", .{line}); + continue; + } + include_path = include_path[1 .. include_path.len - 1]; + + loadFile(writer, file_dir, include_path) catch unreachable; + + continue; + } else { + std.debug.warn("Unknown #pragma directive '{}'\n", .{pragma}); + } + } + + _ = try writer.write(line); + _ = try writer.write("\n"); + } +} + +fn reloadShader(current: *gl.ShaderProgram, frag_file: fs.File, frag_filename: []const u8, size: u64) !void { + var buffer = try std.ArrayList(u8).initCapacity(c_allocator, @intCast(usize, size)); + var writer = buffer.writer(); + errdefer buffer.deinit(); + + try loadFile(buffer.writer(), "", frag_filename); + + const frag_source = buffer.toOwnedSlice(); defer c_allocator.free(frag_source); - try frag_file.seekTo(0); - const length = try frag_file.read(frag_source); const vert_source = \\#version 330 core |
