aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-06-07 18:56:59 +0000
committers-ol <s-ol@users.noreply.github.com>2020-06-07 18:56:59 +0000
commit23abee58d2c4451ef41d34b13ae9926c4651d1e9 (patch)
tree4c8b2b3d91bc6764d48f377a003f69ceca6fa04f
parentupdate for zig 0.6.0 (diff)
downloadglsl-view-23abee58d2c4451ef41d34b13ae9926c4651d1e9.tar.gz
glsl-view-23abee58d2c4451ef41d34b13ae9926c4651d1e9.zip
different OSC set layer
-rw-r--r--src/control.zig96
-rw-r--r--src/gl.zig2
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;
}
diff --git a/src/gl.zig b/src/gl.zig
index 0c3f924..8d67bdf 100644
--- a/src/gl.zig
+++ b/src/gl.zig
@@ -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;