repo: hackvr-turbo
action: commit
revision: 
path_from: 
revision_from: 2a776c305d6b10be86712df5a3ab661defe73533:
path_to: 
revision_to: 
git.thebackupbox.net
hackvr-turbo
git clone git://git.thebackupbox.net/hackvr-turbo
commit 2a776c305d6b10be86712df5a3ab661defe73533
Author: Felix (xq) Queißner 
Date:   Sun Jul 5 16:55:42 2020 +0200

    Removes OpenGL error handling, adds CLI parsing.

diff --git a/.gitmodules b/.gitmodules
index fc16d9a53eb35aae662c86a97ac7363a022a3d06..
index ..4fac2b530891b46db16e367812e7cee84b559318 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,3 +4,6 @@
 [submodule "lib/zgl"]
 	path = lib/zgl
 	url = https://github.com/ziglibs/zgl
+[submodule "lib/zig-args"]
+	path = lib/zig-args
+	url = https://github.com/MasterQ32/zig-args
diff --git a/build.zig b/build.zig
index 9d3841d4ad3455ad75634126cfb5fc0b09d0cc29..
index ..ff5dd9d0fe2a1a12b75e096f7feb937ab5dfd39e 100644
--- a/build.zig
+++ b/build.zig
@@ -24,6 +24,11 @@ const zgl = std.build.Pkg{
     .path = "lib/zgl/zgl.zig",
 };

+const args = std.build.Pkg{
+    .name = "zig-args",
+    .path = "lib/zig-args/args.zig",
+};
+
 pub fn build(b: *std.build.Builder) void {
     // Standard target options allows the person running `zig build` to choose
     // what target to build for. Here we do not override the defaults, which
@@ -46,6 +51,7 @@ pub fn build(b: *std.build.Builder) void {
     exe.addPackage(hackvr);
     exe.addPackage(zlm);
     exe.addPackage(zgl);
+    exe.addPackage(args);

     exe.install();

diff --git a/lib/zgl b/lib/zgl
index 0e8a4f10a18469e1aee150376bfda3df53e17fa4..
index ..08ddbf7b594de2ffe7a0ada2b83bb03df5f286b0 160000
--- a/lib/zgl
+++ b/lib/zgl
@@ -1 +1 @@
-Subproject commit 0e8a4f10a18469e1aee150376bfda3df53e17fa4
+Subproject commit 08ddbf7b594de2ffe7a0ada2b83bb03df5f286b0
diff --git a/lib/zig-args b/lib/zig-args
new file mode 160000
index 0000000000000000000000000000000000000000..afa26646f78096ca1c0c43c4c4fd3a46a1747df2
--- /dev/null
+++ b/lib/zig-args
@@ -0,0 +1 @@
+Subproject commit afa26646f78096ca1c0c43c4c4fd3a46a1747df2
diff --git a/src/main.zig b/src/main.zig
index 65af3bec3772da8478272be37c5da4072ed8ce8e..
index ..2fdf3ecabff3b8c14b1def565f087d9555444946 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -3,6 +3,7 @@ const std = @import("std");
 const zlm = @import("zlm");
 const hackvr = @import("hackvr");
 const gl = @import("zgl");
+const zig_args = @import("zig-args");

 const c = @cImport({
     @cInclude("SDL.h");
@@ -11,7 +12,7 @@ const c = @cImport({
 const SdlError = error{SdlFailure};

 fn makeSdlError() SdlError {
-    std.log.err(.SDL, "{c}\n", .{c.SDL_GetError()});
+    std.log.err(.SDL, "{}\n", .{std.mem.span(c.SDL_GetError() orelse unreachable)});
     return error.SdlFailure;
 }

@@ -20,12 +21,37 @@ fn sdlCheck(result: c_int) !void {
         return makeSdlError();
 }

+const Resolution = struct {
+    const Self = @This();
+
+    width: u16,
+    height: u16,
+
+    pub fn parse(str: []const u8) !Self {
+        if (std.mem.indexOf(u8, str, "x")) |index| {
+            return Self{
+                .width = try std.fmt.parseInt(u16, str[0..index], 10),
+                .height = try std.fmt.parseInt(u16, str[index + 1 ..], 10),
+            };
+        } else {
+            return error.InvalidFormat;
+        }
+    }
+};
+
 const CliOptions = struct {
+    resolution: Resolution = Resolution{
+        .width = 1280,
+        .height = 720,
+    },
+    fullscreen: bool = false,
     multisampling: ?u7 = null,
-};

-const cli_options = CliOptions{
-    .multisampling = 8,
+    pub const shorthands = .{
+        .f = "fullscreen",
+        .r = "resolution",
+        .m = "multisampling",
+    };
 };

 fn parseColor(comptime col: []const u8) zlm.Vec3 {
@@ -79,6 +105,9 @@ pub fn main() !void {
     }
     const gpa = &gpa_backing.allocator;

+    var cli = try zig_args.parseForCurrentProcess(CliOptions, gpa);
+    defer cli.deinit();
+
     if (c.SDL_Init(c.SDL_INIT_EVERYTHING) < 0) {
         return makeSdlError();
     }
@@ -88,7 +117,7 @@ pub fn main() !void {
     try sdlCheck(c.SDL_GL_SetAttribute(.SDL_GL_CONTEXT_MINOR_VERSION, 5));
     try sdlCheck(c.SDL_GL_SetAttribute(.SDL_GL_CONTEXT_FLAGS, c.SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG | c.SDL_GL_CONTEXT_DEBUG_FLAG));

-    if (cli_options.multisampling) |samples| {
+    if (cli.options.multisampling) |samples| {
         try sdlCheck(c.SDL_GL_SetAttribute(.SDL_GL_MULTISAMPLEBUFFERS, 1));
         try sdlCheck(c.SDL_GL_SetAttribute(.SDL_GL_MULTISAMPLESAMPLES, samples));
     }
@@ -97,9 +126,9 @@ pub fn main() !void {
         "HackVR Turbo",
         c.SDL_WINDOWPOS_CENTERED,
         c.SDL_WINDOWPOS_CENTERED,
-        1280,
-        720,
-        c.SDL_WINDOW_OPENGL,
+        @intCast(c_int, cli.options.resolution.width),
+        @intCast(c_int, cli.options.resolution.height),
+        @intCast(u32, c.SDL_WINDOW_OPENGL | (if (cli.options.fullscreen) c.SDL_WINDOW_FULLSCREEN_DESKTOP else 0)),
     ) orelse return makeSdlError();
     defer c.SDL_DestroyWindow(window);

@@ -108,25 +137,25 @@ pub fn main() !void {

     try sdlCheck(c.SDL_GL_MakeCurrent(window, context));

-    try gl.debugMessageCallback({}, openGlDebugCallback);
+    gl.debugMessageCallback({}, openGlDebugCallback);

     var state = hackvr.State.init(std.testing.allocator);
     defer state.deinit();

-    var vao = try gl.createVertexArray();
+    var vao = gl.createVertexArray();
     defer vao.delete();

-    try vao.enableVertexAttribute(0);
-    try vao.enableVertexAttribute(1);
+    vao.enableVertexAttribute(0);
+    vao.enableVertexAttribute(1);

-    try vao.attribFormat(
+    vao.attribFormat(
         0,
         3,
         .float,
         false,
         @byteOffsetOf(Vertex, "position"),
     );
-    try vao.attribFormat(
+    vao.attribFormat(
         1,
         3,
         .float,
@@ -134,16 +163,16 @@ pub fn main() !void {
         @byteOffsetOf(Vertex, "color"),
     );

-    try vao.attribBinding(0, 0);
-    try vao.attribBinding(1, 0);
+    vao.attribBinding(0, 0);
+    vao.attribBinding(1, 0);

-    var tris_vertex_buffer = try gl.createBuffer();
+    var tris_vertex_buffer = gl.createBuffer();
     defer tris_vertex_buffer.delete();

-    var lines_vertex_buffer = try gl.createBuffer();
+    var lines_vertex_buffer = gl.createBuffer();
     defer lines_vertex_buffer.delete();

-    var point_vertex_buffer = try gl.createBuffer();
+    var point_vertex_buffer = gl.createBuffer();
     defer point_vertex_buffer.delete();

     const PolygonGroup = struct {
@@ -167,26 +196,26 @@ pub fn main() !void {
     var outline_list = std.ArrayList(Vertex).init(gpa);
     defer outline_list.deinit();

-    var shader_program = try gl.createProgram();
+    var shader_program = gl.createProgram();
     defer shader_program.delete();

     {
-        var vertex_shader = try gl.createShader(.vertex);
+        var vertex_shader = gl.createShader(.vertex);
         defer vertex_shader.delete();

-        var fragment_shader = try gl.createShader(.fragment);
+        var fragment_shader = gl.createShader(.fragment);
         defer fragment_shader.delete();

-        try vertex_shader.source(1, &[_][]const u8{
+        vertex_shader.source(1, &[_][]const u8{
             @embedFile("./shader/flat.vert"),
         });

-        try fragment_shader.source(1, &[_][]const u8{
+        fragment_shader.source(1, &[_][]const u8{
             @embedFile("./shader/flat.frag"),
         });

-        try vertex_shader.compile();
-        if ((try vertex_shader.get(.compile_status)) == 0) {
+        vertex_shader.compile();
+        if (vertex_shader.get(.compile_status) == 0) {
             const compile_log = try vertex_shader.getCompileLog(gpa);
             defer gpa.free(compile_log);

@@ -194,8 +223,8 @@ pub fn main() !void {
             return;
         }

-        try fragment_shader.compile();
-        if ((try fragment_shader.get(.compile_status)) == 0) {
+        fragment_shader.compile();
+        if (fragment_shader.get(.compile_status) == 0) {
             const compile_log = try fragment_shader.getCompileLog(gpa);
             defer gpa.free(compile_log);

@@ -203,14 +232,14 @@ pub fn main() !void {
             return;
         }

-        try shader_program.attach(vertex_shader);
+        shader_program.attach(vertex_shader);
         defer shader_program.detach(vertex_shader);

-        try shader_program.attach(fragment_shader);
+        shader_program.attach(fragment_shader);
         defer shader_program.detach(fragment_shader);

-        try shader_program.link();
-        if ((try shader_program.get(.link_status)) == 0) {
+        shader_program.link();
+        if (shader_program.get(.link_status) == 0) {
             const link_log = try shader_program.getCompileLog(gpa);
             defer gpa.free(link_log);

@@ -219,19 +248,19 @@ pub fn main() !void {
         }
     }

-    const transform_loc = (try shader_program.uniformLocation("uTransform")) orelse {
+    const transform_loc = shader_program.uniformLocation("uTransform") orelse {
         std.log.crit(.Exe, "Failed to query uniform uTransform!\n", .{});
         return;
     };

-    const highlighted_loc = (try shader_program.uniformLocation("uHighlighting")) orelse {
+    const highlighted_loc = shader_program.uniformLocation("uHighlighting") orelse {
         std.log.crit(.Exe, "Failed to query uniform uHighlighting!\n", .{});
         return;
     };

-    try gl.enable(.depth_test);
-    try gl.depthFunc(.less_or_equal);
-    try gl.pointSize(5.0);
+    gl.enable(.depth_test);
+    gl.depthFunc(.less_or_equal);
+    gl.pointSize(5.0);

     var time: f32 = 0.0;

@@ -442,8 +471,22 @@ pub fn main() !void {
                 };

                 for (group.shapes.items) |*shape| {
-                    if (shape.points.len < 3) {
-                        std.debug.print("count: {}\n", .{shape.points.len});
+                    if (shape.points.len == 0) {
+                        // wat?
+                    } else if (shape.points.len == 1) {
+                        try point_list.append(Vertex{
+                            .position = shape.points[0],
+                            .color = palette[shape.attributes.color % 16],
+                        });
+                    } else if (shape.points.len == 2) {
+                        try outline_list.append(Vertex{
+                            .position = shape.points[0],
+                            .color = palette[shape.attributes.color % 16],
+                        });
+                        try outline_list.append(Vertex{
+                            .position = shape.points[1],
+                            .color = palette[shape.attributes.color % 16],
+                        });
                     } else {
                         // Simple fan-out triangulation.
                         // Not beautiful, but very simple
@@ -599,7 +642,7 @@ pub fn main() !void {

                 for (group.shapes.items) |*shape, shape_index| {
                     if (shape.points.len < 3) {
-                        std.debug.print("count: {}\n", .{shape.points.len});
+                        // we can't pick lines or points
                     } else {
                         // Simple fan-out triangulation.
                         // Not beautiful, but very simple
@@ -716,46 +759,46 @@ pub fn main() !void {
             }
         }

-        try gl.namedBufferData(tris_vertex_buffer, Vertex, vertex_list.items, .dynamic_draw);
-        try gl.namedBufferData(lines_vertex_buffer, Vertex, outline_list.items, .dynamic_draw);
-        try gl.namedBufferData(point_vertex_buffer, Vertex, point_list.items, .dynamic_draw);
+        gl.namedBufferData(tris_vertex_buffer, Vertex, vertex_list.items, .dynamic_draw);
+        gl.namedBufferData(lines_vertex_buffer, Vertex, outline_list.items, .dynamic_draw);
+        gl.namedBufferData(point_vertex_buffer, Vertex, point_list.items, .dynamic_draw);

         // render graphics
         {
-            try gl.clearColor(0.0, 0.0, 0.3, 1.0);
-            try gl.clearDepth(1.0);
-            try gl.clear(.{
+            gl.clearColor(0.0, 0.0, 0.3, 1.0);
+            gl.clearDepth(1.0);
+            gl.clear(.{
                 .color = true,
                 .depth = true,
             });

-            try vao.bind();
-            try shader_program.use();
+            vao.bind();
+            shader_program.use();

-            try gl.programUniform1f(
+            gl.programUniform1f(
                 shader_program,
                 highlighted_loc,
                 0.0,
             );

-            try vao.vertexBuffer(0, tris_vertex_buffer, 0, @sizeOf(Vertex));
+            vao.vertexBuffer(0, tris_vertex_buffer, 0, @sizeOf(Vertex));
             for (poly_groups.items) |poly_grp| {
                 const transform = zlm.Mat4.mul(poly_grp.transform, mat_view_proj);

-                try gl.programUniformMatrix4(
+                gl.programUniformMatrix4(
                     shader_program,
                     transform_loc,
                     false,
                     @ptrCast([*]const [4][4]f32, &transform.fields)[0..1],
                 );

-                try gl.drawArrays(.triangles, poly_grp.begin_tris, poly_grp.count_tris);
+                gl.drawArrays(.triangles, poly_grp.begin_tris, poly_grp.count_tris);
             }

-            try gl.enable(.polygon_offset_line);
-            try gl.polygonOffset(0.0, -16.0);
+            gl.enable(.polygon_offset_line);
+            gl.polygonOffset(0.0, -16.0);

-            try vao.vertexBuffer(0, lines_vertex_buffer, 0, @sizeOf(Vertex));
+            vao.vertexBuffer(0, lines_vertex_buffer, 0, @sizeOf(Vertex));
             for (poly_groups.items) |poly_grp| {
                 const transform = zlm.Mat4.mul(poly_grp.transform, mat_view_proj);

@@ -764,31 +807,31 @@ pub fn main() !void {
                 else
                     false;

-                try gl.programUniform1f(
+                gl.programUniform1f(
                     shader_program,
                     highlighted_loc,
                     if (picked) @as(f32, 1.0) else @as(f32, 0.0),
                 );

-                try gl.programUniformMatrix4(
+                gl.programUniformMatrix4(
                     shader_program,
                     transform_loc,
                     false,
                     @ptrCast([*]const [4][4]f32, &transform.fields)[0..1],
                 );
-                try gl.drawArrays(.lines, poly_grp.begin_lines, poly_grp.count_lines);
+                gl.drawArrays(.lines, poly_grp.begin_lines, poly_grp.count_lines);
             }

-            try vao.vertexBuffer(0, point_vertex_buffer, 0, @sizeOf(Vertex));
+            vao.vertexBuffer(0, point_vertex_buffer, 0, @sizeOf(Vertex));
             {
                 var transform = mat_view_proj;
-                try gl.programUniformMatrix4(
+                gl.programUniformMatrix4(
                     shader_program,
                     transform_loc,
                     false,
                     @ptrCast([*]const [4][4]f32, &transform.fields)[0..1],
                 );
-                try gl.drawArrays(.points, 0, point_list.items.len);
+                gl.drawArrays(.points, 0, point_list.items.len);
             }

             c.SDL_GL_SwapWindow(window);

-----END OF PAGE-----