diff options
| author | s-ol <s+removethis@s-ol.nu> | 2023-10-29 22:47:27 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2023-10-29 22:47:27 +0000 |
| commit | 536c820d9ccdda07d02934b82d26e21adbd39d9d (patch) | |
| tree | ffc00b4de676184dcfe3cc377c0ee26d80e5efb0 /src/control.zig | |
| parent | specifying config.yaml path as CLI arg (diff) | |
| download | glsl-view-536c820d9ccdda07d02934b82d26e21adbd39d9d.tar.gz glsl-view-536c820d9ccdda07d02934b82d26e21adbd39d9d.zip | |
allow indexing uniforms, fix bug
Diffstat (limited to 'src/control.zig')
| -rw-r--r-- | src/control.zig | 158 |
1 files changed, 106 insertions, 52 deletions
diff --git a/src/control.zig b/src/control.zig index d7ce531..344badc 100644 --- a/src/control.zig +++ b/src/control.zig @@ -12,6 +12,40 @@ fn verify_args(expected: u8, got: []const u8) !void { } } +fn set_one( + comptime T: type, + dest: *T, + argc: c_int, + argv: [*c][*c]c.lo_arg, + types: []const u8, +) !void { + if (argc != 1) + return error.sizeMismatch; + + switch (T) { + f32 => { + try verify_args('f', types); + dest.* = argv[0].*.f; + }, + f64 => { + try verify_args('d', types); + dest.* = argv[0].*.d; + }, + i32 => { + try verify_args('d', types); + dest.* = argv[0].*.i; + }, + u32 => { + try verify_args('d', types); + const val = argv[0].*.i; + if (val < 0) + return error.signDisallowed; + dest.* = @as(u32, @intCast(val)); + }, + else => return error.invalidType, + } +} + fn set_array( comptime T: type, dest: []T, @@ -111,56 +145,80 @@ pub const ControlServer = struct { fn set_uniform( self: *ControlServer, - uniform_name: []const u8, + path: []const u8, argv: [*c][*c]c.lo_arg, argc: c_int, types: []const u8, ) !void { - var buffer: [256]u8 = undefined; - std.mem.copy(u8, buffer[0..], uniform_name); - buffer[uniform_name.len] = 0; - const name = buffer[0 .. uniform_name.len + 1]; - const uniform = (try self.cache.get(name)) orelse return error.notFound; - - try switch (uniform.value) { - .FLOAT => |*val| set_array(f32, @as([*]f32, @ptrCast(val))[0..1], argc, argv, types), - .DOUBLE => |*val| set_array(f64, @as([*]f64, @ptrCast(val))[0..1], argc, argv, types), - .INT => |*val| set_array(i32, @as([*]i32, @ptrCast(val))[0..1], argc, argv, types), - .UNSIGNED_INT => |*val| set_array(u32, @as([*]u32, @ptrCast(val))[0..1], argc, argv, types), - .BOOL => |*val| set_array(u32, @as([*]u32, @ptrCast(val))[0..1], argc, argv, types), - .FLOAT_VEC2 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_VEC3 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_VEC4 => |*val| set_array(f32, val[0..], argc, argv, types), - .DOUBLE_VEC2 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_VEC3 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_VEC4 => |*val| set_array(f64, val[0..], argc, argv, types), - .INT_VEC2 => |*val| set_array(i32, val[0..], argc, argv, types), - .INT_VEC3 => |*val| set_array(i32, val[0..], argc, argv, types), - .INT_VEC4 => |*val| set_array(i32, val[0..], argc, argv, types), - .UNSIGNED_INT_VEC2 => |*val| set_array(u32, val[0..], argc, argv, types), - .UNSIGNED_INT_VEC3 => |*val| set_array(u32, val[0..], argc, argv, types), - .UNSIGNED_INT_VEC4 => |*val| set_array(u32, val[0..], argc, argv, types), - .BOOL_VEC2 => |*val| set_array(u32, val[0..], argc, argv, types), - .BOOL_VEC3 => |*val| set_array(u32, val[0..], argc, argv, types), - .BOOL_VEC4 => |*val| set_array(u32, val[0..], argc, argv, types), - .FLOAT_MAT2 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT3 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT4 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT2x3 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT2x4 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT3x2 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT3x4 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT4x2 => |*val| set_array(f32, val[0..], argc, argv, types), - .FLOAT_MAT4x3 => |*val| set_array(f32, val[0..], argc, argv, types), - .DOUBLE_MAT2 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT3 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT4 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT2x3 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT2x4 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT3x2 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT3x4 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT4x2 => |*val| set_array(f64, val[0..], argc, argv, types), - .DOUBLE_MAT4x3 => |*val| set_array(f64, val[0..], argc, argv, types), + var parts = std.mem.tokenizeScalar(u8, path, '/'); + var uniform: *gl.CachedUniform = undefined; + + if (parts.next()) |uniform_name| { + var nameZ = try self.allocator.dupeZ(u8, uniform_name); + defer self.allocator.free(nameZ); + + const res = try self.cache.get(nameZ); + uniform = res orelse return error.notFound; + } else { + return error.invalidMessage; + } + + var value = uniform.value; + while (parts.next()) |component| { + const i = switch (component[0]) { + 'x', 'r', 's' => 0, + 'y', 'g', 't' => 1, + 'z', 'b', 'p' => 2, + 'w', 'a', 'q' => 3, + else => std.fmt.parseUnsigned(u8, component, 10) catch null, + }; + + if (i) |ii| { + value = try value.index(ii); + } else { + return error.invalidIndex; + } + } + + try switch (value) { + .FLOAT => |val| set_one(f32, val, argc, argv, types), + .DOUBLE => |val| set_one(f64, val, argc, argv, types), + .INT => |val| set_one(i32, val, argc, argv, types), + .UNSIGNED_INT => |val| set_one(u32, val, argc, argv, types), + .BOOL => |val| set_one(u32, val, argc, argv, types), + .FLOAT_VEC2 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_VEC3 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_VEC4 => |val| set_array(f32, val.*[0..], argc, argv, types), + .DOUBLE_VEC2 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_VEC3 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_VEC4 => |val| set_array(f64, val.*[0..], argc, argv, types), + .INT_VEC2 => |val| set_array(i32, val.*[0..], argc, argv, types), + .INT_VEC3 => |val| set_array(i32, val.*[0..], argc, argv, types), + .INT_VEC4 => |val| set_array(i32, val.*[0..], argc, argv, types), + .UNSIGNED_INT_VEC2 => |val| set_array(u32, val.*[0..], argc, argv, types), + .UNSIGNED_INT_VEC3 => |val| set_array(u32, val.*[0..], argc, argv, types), + .UNSIGNED_INT_VEC4 => |val| set_array(u32, val.*[0..], argc, argv, types), + .BOOL_VEC2 => |val| set_array(u32, val.*[0..], argc, argv, types), + .BOOL_VEC3 => |val| set_array(u32, val.*[0..], argc, argv, types), + .BOOL_VEC4 => |val| set_array(u32, val.*[0..], argc, argv, types), + .FLOAT_MAT2 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT3 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT4 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT2x3 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT2x4 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT3x2 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT3x4 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT4x2 => |val| set_array(f32, val.*[0..], argc, argv, types), + .FLOAT_MAT4x3 => |val| set_array(f32, val.*[0..], argc, argv, types), + .DOUBLE_MAT2 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT3 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT4 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT2x3 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT2x4 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT3x2 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT3x4 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT4x2 => |val| set_array(f64, val.*[0..], argc, argv, types), + .DOUBLE_MAT4x3 => |val| set_array(f64, val.*[0..], argc, argv, types), else => error.uniformNotSupported, }; @@ -181,13 +239,9 @@ pub const ControlServer = struct { const path = _path[0..c.strlen(_path)]; const types = _types[0..@as(u32, @intCast(argc))]; - if (!std.mem.startsWith(u8, path, "/")) { - std.debug.print("invalid OSC message {s} ({s})\n", .{ path, types }); - return 1; - } - - self.set_uniform(path[1..], argv, argc, types) catch |err| { + self.set_uniform(path, argv, argc, types) catch |err| { std.debug.print("{} while processing {s}\n", .{ err, path }); + return 1; }; return 0; } |
