examples: boids: make boids calculation framerate independent

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2022-04-17 10:07:27 -07:00
parent 305c446aa2
commit 6f3864c1f9

View file

@ -11,12 +11,23 @@ const FrameParams = struct {
sprite_vertex_buffer: gpu.Buffer, sprite_vertex_buffer: gpu.Buffer,
particle_buffers: [2]gpu.Buffer, particle_buffers: [2]gpu.Buffer,
particle_bind_groups: [2]gpu.BindGroup, particle_bind_groups: [2]gpu.BindGroup,
sim_param_buffer: gpu.Buffer,
frame_counter: usize, frame_counter: usize,
}; };
const App = mach.App(*FrameParams, .{}); const App = mach.App(*FrameParams, .{});
const num_particle = 1500; const num_particle = 1500;
var sim_params = [_]f32 {
0.04, // .delta_T
0.1, // .rule_1_distance
0.025, // .rule_2_distance
0.025, // .rule_3_distance
0.02, // .rule_1_scale
0.05, // .rule_2_scale
0.005, // .rule_3_scale
};
pub fn main() !void { pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){}; var gpa = std.heap.GeneralPurposeAllocator(.{}){};
var allocator = gpa.allocator(); var allocator = gpa.allocator();
@ -108,16 +119,6 @@ pub fn main() !void {
}); });
app.device.getQueue().writeBuffer(sprite_vertex_buffer, 0, f32, &vert_buffer_data); app.device.getQueue().writeBuffer(sprite_vertex_buffer, 0, f32, &vert_buffer_data);
const sim_params = [_]f32 {
0.04, // .delta_T
0.1, // .rule_1_distance
0.025, // .rule_2_distance
0.025, // .rule_3_distance
0.02, // .rule_1_scale
0.05, // .rule_2_scale
0.005, // .rule_3_scale
};
const sim_param_buffer = app.device.createBuffer(&gpu.Buffer.Descriptor{ const sim_param_buffer = app.device.createBuffer(&gpu.Buffer.Descriptor{
.usage = .{.uniform = true, .copy_dst = true}, .usage = .{.uniform = true, .copy_dst = true},
.size = sim_params.len * @sizeOf(f32), .size = sim_params.len * @sizeOf(f32),
@ -164,6 +165,7 @@ pub fn main() !void {
.sprite_vertex_buffer = sprite_vertex_buffer, .sprite_vertex_buffer = sprite_vertex_buffer,
.particle_buffers = particle_buffers, .particle_buffers = particle_buffers,
.particle_bind_groups = particle_bind_groups, .particle_bind_groups = particle_bind_groups,
.sim_param_buffer = sim_param_buffer,
.frame_counter = 0, .frame_counter = 0,
}; };
@ -186,6 +188,9 @@ fn frame(app: *App, params: *FrameParams) !void {
} }
}; };
sim_params[0] = @floatCast(f32, app.delta_time);
app.device.getQueue().writeBuffer(params.sim_param_buffer, 0, f32, &sim_params);
const command_encoder = app.device.createCommandEncoder(null); const command_encoder = app.device.createCommandEncoder(null);
{ {
const pass_encoder = command_encoder.beginComputePass(null); const pass_encoder = command_encoder.beginComputePass(null);