git.s-ol.nu glsl-view / 23abee5
different OSC set layer s-ol 2 years ago
2 changed file(s) with 69 addition(s) and 29 deletion(s). Raw diff Collapse all Expand all
33 const cfg = @import("config.zig");
44
55 const param_prefix = "/param/";
6
7 fn set_array(comptime T: type, dest: []T, argc: c_int, argv: [*c][*c]c.lo_arg) void {
8 std.debug.assert(argc == dest.len);
9 switch (T) {
10 f32 => {
11 for (dest) |*v, i|
12 v.* = argv[i].*.f;
13 },
14 f64 => {
15 for (dest) |*v, i|
16 v.* = argv[i].*.d;
17 },
18 i32 => {
19 for (dest) |*v, i|
20 v.* = argv[i].*.i;
21 },
22 u32 => {
23 for (dest) |*v, i|
24 v.* = @intCast(u32, argv[i].*.i);
25 },
26 else => {}
27 }
28 }
629
730 pub const ControlServer = struct {
831 server: c.lo_server,
6992 std.mem.copy(u8, buffer[0..], param_name);
7093 buffer[param_name.len] = 0;
7194
72 if (self.cache.get(buffer[0 .. param_name.len + 1]) catch null) |uniform| {
73 if (std.mem.eql(u8, types, "f")) {
74 uniform.value.FLOAT = argv[0].*.f;
75 } else if (std.mem.eql(u8, types, "[ff]") or std.mem.eql(u8, types, "ff")) {
76 for (uniform.value.FLOAT_VEC2) |*dest, i|
77 dest.* = argv[i].*.f;
78 } else if (std.mem.eql(u8, types, "[fff]") or std.mem.eql(u8, types, "fff")) {
79 for (uniform.value.FLOAT_VEC3) |*dest, i|
80 dest.* = argv[i].*.f;
81 } else if (std.mem.eql(u8, types, "[ffff]") or std.mem.eql(u8, types, "ffff")) {
82 for (uniform.value.FLOAT_VEC4) |*dest, i|
83 dest.* = argv[i].*.f;
84 } else if (std.mem.eql(u8, types, "i")) {
85 uniform.value.INT = argv[0].*.i;
86 } else if (std.mem.eql(u8, types, "[ii]") or std.mem.eql(u8, types, "ii")) {
87 for (uniform.value.INT_VEC2) |*dest, i|
88 dest.* = argv[i].*.i;
89 } else if (std.mem.eql(u8, types, "[iii]") or std.mem.eql(u8, types, "iii")) {
90 for (uniform.value.INT_VEC3) |*dest, i|
91 dest.* = argv[i].*.i;
92 } else if (std.mem.eql(u8, types, "[iiii]") or std.mem.eql(u8, types, "iiii")) {
93 for (uniform.value.INT_VEC4) |*dest, i|
94 dest.* = argv[i].*.i;
95 } else {
95 const uniform = self.cache.get(buffer[0 .. param_name.len + 1])
96 catch { return 0; }
97 orelse { return 0; };
98
99 switch (uniform.value) {
100 .FLOAT => |*val| val.* = argv[0].*.f,
101 .FLOAT_VEC2 => |*val| set_array(f32, val[0..], argc, argv),
102 .FLOAT_VEC3 => |*val| set_array(f32, val[0..], argc, argv),
103 .FLOAT_VEC4 => |*val| set_array(f32, val[0..], argc, argv),
104 .DOUBLE => |*val| val.* = argv[0].*.d,
105 .DOUBLE_VEC2 => |*val| set_array(f64, val[0..], argc, argv),
106 .DOUBLE_VEC3 => |*val| set_array(f64, val[0..], argc, argv),
107 .DOUBLE_VEC4 => |*val| set_array(f64, val[0..], argc, argv),
108 .INT => |*val| val.* = argv[0].*.i,
109 .INT_VEC2 => |*val| set_array(i32, val[0..], argc, argv),
110 .INT_VEC3 => |*val| set_array(i32, val[0..], argc, argv),
111 .INT_VEC4 => |*val| set_array(i32, val[0..], argc, argv),
112 .UNSIGNED_INT => |*val| val.* = @intCast(u32, argv[0].*.i),
113 .UNSIGNED_INT_VEC2 => |*val| set_array(u32, val[0..], argc, argv),
114 .UNSIGNED_INT_VEC3 => |*val| set_array(u32, val[0..], argc, argv),
115 .UNSIGNED_INT_VEC4 => |*val| set_array(u32, val[0..], argc, argv),
116 .BOOL => |*val| val.* = @intCast(u32, argv[0].*.i),
117 .BOOL_VEC2 => |*val| set_array(u32, val[0..], argc, argv),
118 .BOOL_VEC3 => |*val| set_array(u32, val[0..], argc, argv),
119 .BOOL_VEC4 => |*val| set_array(u32, val[0..], argc, argv),
120 .FLOAT_MAT2 => |*val| set_array(f32, val[0..], argc, argv),
121 .FLOAT_MAT3 => |*val| set_array(f32, val[0..], argc, argv),
122 .FLOAT_MAT4 => |*val| set_array(f32, val[0..], argc, argv),
123 .FLOAT_MAT2x3 => |*val| set_array(f32, val[0..], argc, argv),
124 .FLOAT_MAT2x4 => |*val| set_array(f32, val[0..], argc, argv),
125 .FLOAT_MAT3x2 => |*val| set_array(f32, val[0..], argc, argv),
126 .FLOAT_MAT3x4 => |*val| set_array(f32, val[0..], argc, argv),
127 .FLOAT_MAT4x2 => |*val| set_array(f32, val[0..], argc, argv),
128 .FLOAT_MAT4x3 => |*val| set_array(f32, val[0..], argc, argv),
129 .DOUBLE_MAT2 => |*val| set_array(f64, val[0..], argc, argv),
130 .DOUBLE_MAT3 => |*val| set_array(f64, val[0..], argc, argv),
131 .DOUBLE_MAT4 => |*val| set_array(f64, val[0..], argc, argv),
132 .DOUBLE_MAT2x3 => |*val| set_array(f64, val[0..], argc, argv),
133 .DOUBLE_MAT2x4 => |*val| set_array(f64, val[0..], argc, argv),
134 .DOUBLE_MAT3x2 => |*val| set_array(f64, val[0..], argc, argv),
135 .DOUBLE_MAT3x4 => |*val| set_array(f64, val[0..], argc, argv),
136 .DOUBLE_MAT4x2 => |*val| set_array(f64, val[0..], argc, argv),
137 .DOUBLE_MAT4x3 => |*val| set_array(f64, val[0..], argc, argv),
138 else => {
96139 std.debug.warn("unsupported types: {s}\n", .{types});
97140 return 0;
98141 }
99 uniform.setShaderValue(self.cache.shader.*);
100 } else {
101 std.debug.warn("param {s} doesn't exist\n", .{param_name});
102142 }
143
144 uniform.setShaderValue(self.cache.shader.*);
103145 return 0;
104146 }
105147
404404 const name = existing_names[i];
405405 if (index == c.GL_INVALID_INDEX) {
406406 if (self.uniforms.remove(name)) |removed| {
407 // @TODO: remove OSC link
408407 self.allocator.free(removed.key);
409408 }
410409 } else {
427426 self.allocator.free(cloned_name);
428427 return null;
429428 };
430 // @TODO: add OSC link
431429 }
432430
433431 return &result.kv.value;