3 | 3 |
const cfg = @import("config.zig");
|
4 | 4 |
|
5 | 5 |
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 |
}
|
6 | 29 |
|
7 | 30 |
pub const ControlServer = struct {
|
8 | 31 |
server: c.lo_server,
|
|
69 | 92 |
std.mem.copy(u8, buffer[0..], param_name);
|
70 | 93 |
buffer[param_name.len] = 0;
|
71 | 94 |
|
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 => {
|
96 | 139 |
std.debug.warn("unsupported types: {s}\n", .{types});
|
97 | 140 |
return 0;
|
98 | 141 |
}
|
99 | |
uniform.setShaderValue(self.cache.shader.*);
|
100 | |
} else {
|
101 | |
std.debug.warn("param {s} doesn't exist\n", .{param_name});
|
102 | 142 |
}
|
|
143 |
|
|
144 |
uniform.setShaderValue(self.cache.shader.*);
|
103 | 145 |
return 0;
|
104 | 146 |
}
|
105 | 147 |
|