aboutsummaryrefslogtreecommitdiffstats
path: root/src/control.zig
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2023-10-29 22:47:27 +0000
committers-ol <s+removethis@s-ol.nu>2023-10-29 22:47:27 +0000
commit536c820d9ccdda07d02934b82d26e21adbd39d9d (patch)
treeffc00b4de676184dcfe3cc377c0ee26d80e5efb0 /src/control.zig
parentspecifying config.yaml path as CLI arg (diff)
downloadglsl-view-536c820d9ccdda07d02934b82d26e21adbd39d9d.tar.gz
glsl-view-536c820d9ccdda07d02934b82d26e21adbd39d9d.zip
allow indexing uniforms, fix bug
Diffstat (limited to 'src/control.zig')
-rw-r--r--src/control.zig158
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;
}