aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2021-11-10 15:19:21 +0000
committers-ol <s+removethis@s-ol.nu>2021-11-10 15:19:21 +0000
commite56efe809ba0f3c47feaecedd992e10f4209a451 (patch)
tree8b61dd8c42921344aa7ca8daea5a3631aaea1247 /src
parentupdate for zig 0.7.1 (diff)
downloadglsl-view-e56efe809ba0f3c47feaecedd992e10f4209a451.tar.gz
glsl-view-e56efe809ba0f3c47feaecedd992e10f4209a451.zip
resolve '#pragma include "...path..."' directives
Diffstat (limited to 'src')
-rw-r--r--src/main.zig61
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