diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-06-07 18:56:59 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2020-06-07 18:56:59 +0000 |
| commit | 23abee58d2c4451ef41d34b13ae9926c4651d1e9 (patch) | |
| tree | 4c8b2b3d91bc6764d48f377a003f69ceca6fa04f | |
| parent | update for zig 0.6.0 (diff) | |
| download | glsl-view-23abee58d2c4451ef41d34b13ae9926c4651d1e9.tar.gz glsl-view-23abee58d2c4451ef41d34b13ae9926c4651d1e9.zip | |
different OSC set layer
| -rw-r--r-- | src/control.zig | 96 | ||||
| -rw-r--r-- | src/gl.zig | 2 |
2 files changed, 69 insertions, 29 deletions
diff --git a/src/control.zig b/src/control.zig index b6744b3..2dd182e 100644 --- a/src/control.zig +++ b/src/control.zig @@ -5,6 +5,29 @@ const cfg = @import("config.zig"); const param_prefix = "/param/"; +fn set_array(comptime T: type, dest: []T, argc: c_int, argv: [*c][*c]c.lo_arg) void { + std.debug.assert(argc == dest.len); + switch (T) { + f32 => { + for (dest) |*v, i| + v.* = argv[i].*.f; + }, + f64 => { + for (dest) |*v, i| + v.* = argv[i].*.d; + }, + i32 => { + for (dest) |*v, i| + v.* = argv[i].*.i; + }, + u32 => { + for (dest) |*v, i| + v.* = @intCast(u32, argv[i].*.i); + }, + else => {} + } +} + pub const ControlServer = struct { server: c.lo_server, cache: *gl.UniformCache, @@ -70,37 +93,56 @@ pub const ControlServer = struct { std.mem.copy(u8, buffer[0..], param_name); buffer[param_name.len] = 0; - if (self.cache.get(buffer[0 .. param_name.len + 1]) catch null) |uniform| { - if (std.mem.eql(u8, types, "f")) { - uniform.value.FLOAT = argv[0].*.f; - } else if (std.mem.eql(u8, types, "[ff]") or std.mem.eql(u8, types, "ff")) { - for (uniform.value.FLOAT_VEC2) |*dest, i| - dest.* = argv[i].*.f; - } else if (std.mem.eql(u8, types, "[fff]") or std.mem.eql(u8, types, "fff")) { - for (uniform.value.FLOAT_VEC3) |*dest, i| - dest.* = argv[i].*.f; - } else if (std.mem.eql(u8, types, "[ffff]") or std.mem.eql(u8, types, "ffff")) { - for (uniform.value.FLOAT_VEC4) |*dest, i| - dest.* = argv[i].*.f; - } else if (std.mem.eql(u8, types, "i")) { - uniform.value.INT = argv[0].*.i; - } else if (std.mem.eql(u8, types, "[ii]") or std.mem.eql(u8, types, "ii")) { - for (uniform.value.INT_VEC2) |*dest, i| - dest.* = argv[i].*.i; - } else if (std.mem.eql(u8, types, "[iii]") or std.mem.eql(u8, types, "iii")) { - for (uniform.value.INT_VEC3) |*dest, i| - dest.* = argv[i].*.i; - } else if (std.mem.eql(u8, types, "[iiii]") or std.mem.eql(u8, types, "iiii")) { - for (uniform.value.INT_VEC4) |*dest, i| - dest.* = argv[i].*.i; - } else { + const uniform = self.cache.get(buffer[0 .. param_name.len + 1]) + catch { return 0; } + orelse { return 0; }; + + switch (uniform.value) { + .FLOAT => |*val| val.* = argv[0].*.f, + .FLOAT_VEC2 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_VEC3 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_VEC4 => |*val| set_array(f32, val[0..], argc, argv), + .DOUBLE => |*val| val.* = argv[0].*.d, + .DOUBLE_VEC2 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_VEC3 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_VEC4 => |*val| set_array(f64, val[0..], argc, argv), + .INT => |*val| val.* = argv[0].*.i, + .INT_VEC2 => |*val| set_array(i32, val[0..], argc, argv), + .INT_VEC3 => |*val| set_array(i32, val[0..], argc, argv), + .INT_VEC4 => |*val| set_array(i32, val[0..], argc, argv), + .UNSIGNED_INT => |*val| val.* = @intCast(u32, argv[0].*.i), + .UNSIGNED_INT_VEC2 => |*val| set_array(u32, val[0..], argc, argv), + .UNSIGNED_INT_VEC3 => |*val| set_array(u32, val[0..], argc, argv), + .UNSIGNED_INT_VEC4 => |*val| set_array(u32, val[0..], argc, argv), + .BOOL => |*val| val.* = @intCast(u32, argv[0].*.i), + .BOOL_VEC2 => |*val| set_array(u32, val[0..], argc, argv), + .BOOL_VEC3 => |*val| set_array(u32, val[0..], argc, argv), + .BOOL_VEC4 => |*val| set_array(u32, val[0..], argc, argv), + .FLOAT_MAT2 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT3 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT4 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT2x3 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT2x4 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT3x2 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT3x4 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT4x2 => |*val| set_array(f32, val[0..], argc, argv), + .FLOAT_MAT4x3 => |*val| set_array(f32, val[0..], argc, argv), + .DOUBLE_MAT2 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT3 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT4 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT2x3 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT2x4 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT3x2 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT3x4 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT4x2 => |*val| set_array(f64, val[0..], argc, argv), + .DOUBLE_MAT4x3 => |*val| set_array(f64, val[0..], argc, argv), + else => { std.debug.warn("unsupported types: {s}\n", .{types}); return 0; } - uniform.setShaderValue(self.cache.shader.*); - } else { - std.debug.warn("param {s} doesn't exist\n", .{param_name}); } + + uniform.setShaderValue(self.cache.shader.*); return 0; } @@ -405,7 +405,6 @@ pub const UniformCache = struct { const name = existing_names[i]; if (index == c.GL_INVALID_INDEX) { if (self.uniforms.remove(name)) |removed| { - // @TODO: remove OSC link self.allocator.free(removed.key); } } else { @@ -428,7 +427,6 @@ pub const UniformCache = struct { self.allocator.free(cloned_name); return null; }; - // @TODO: add OSC link } return &result.kv.value; |
