aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig130
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});
- }
-}