diff options
author | alaric <alaric@netmythos.org> | 2024-04-10 04:52:14 -0700 |
---|---|---|
committer | alaric <alaric@netmythos.org> | 2024-04-10 04:52:14 -0700 |
commit | 748efaa6cb6dfd0252354a6c384762e163f4d3b8 (patch) | |
tree | 9b924523f4fedf036d5506f544c4617e6beb43bd | |
parent | dcbee5d6fb42dc12b6cad3b7908a172ebb2804ad (diff) | |
download | tiny-td-748efaa6cb6dfd0252354a6c384762e163f4d3b8.tar.gz tiny-td-748efaa6cb6dfd0252354a6c384762e163f4d3b8.zip |
Click and drag on squares
m--------- | engine | 0 | ||||
-rw-r--r-- | src/main.zig | 97 |
2 files changed, 85 insertions, 12 deletions
diff --git a/engine b/engine -Subproject e1ff0e3d124151c4c965f4d731c795d31732e42 +Subproject 9c224b99cda7331f4297bd58fa70a53b9de95c0 diff --git a/src/main.zig b/src/main.zig index bebb189..cb1395d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -23,13 +23,34 @@ const plane_verts = [_][2]f32{ .{ 1, 1 }, }; -var pos: [2]f32 = .{ 0, 0 }; -var push: bool = false; +const Mouse = struct { + mutex: bool = false, + pos: [2]f32 = .{ 0, 0 }, + down: bool = false, + was_down: bool = false, + + //Note(Alaric): This is the most suspicious mutex of all time. + fn lock(self: *Mouse) void { + var l: ?bool = self.mutex; + while (l != null) { + l = @cmpxchgWeak(bool, &self.mutex, false, true, .seq_cst, .seq_cst); + } + } + + fn unlock(self: *Mouse) void { + engine.assert(self.mutex == true); + self.mutex = false; + } +}; +var mouse: Mouse = .{}; +var input_priority: u8 = 0; const p_count = 8; -var p_idx: usize = 0; var points: [p_count][2]f32 = [1][2]f32{.{ 0, 0 }} ** p_count; +var grab_idx: ?usize = null; +var grab_offset: [2]f32 = undefined; + pub fn init() void { prog = webgl.createGeneral2DSolidProgram() catch return; prog.use(); @@ -40,17 +61,51 @@ pub fn init() void { } pub fn update() void { + const m = blk: { + mouse.lock(); + defer mouse.unlock(); + + const pressed = mouse.down and !mouse.was_down; + const released = !mouse.down and mouse.was_down; + mouse.was_down = mouse.down; + input_priority = 0; + break :blk .{ + .down = mouse.down, + .pressed = pressed, + .released = released, + .pos = mouse.pos, + }; + }; + + const m_vec: @Vector(2, f32) = m.pos; + if (m.pressed) { + for (points, 0..) |p, i| { + const bl: @Vector(2, f32) = p; + const tr = bl + @Vector(2, f32){ 50, 50 }; + if (@reduce(.And, m_vec >= bl) and @reduce(.And, m_vec < tr)) { + grab_offset = m_vec - bl; + grab_idx = i; + } + } + } else if (m.released and grab_idx != null) { + points[grab_idx.?] = m_vec - grab_offset; + grab_idx = null; + } else if (grab_idx != null) { + points[grab_idx.?] = m_vec - grab_offset; + } const dims = webgl.getScreenSize(); webgl.viewportToScreen(); prog.setUniform(.projection, matrix.projectionMatrix2D(dims[0], dims[1])); - prog.setUniform(.color, .{ 1, 0, 0 }); - if (push) { - prog.setUniform(.color, .{ 0, 0, 1 }); - } webgl.clear(bg); buffer.bind(.array_buffer); - for (points) |p| { + for (points, 0..) |p, i| { + const is_grabbed = grab_idx != null and grab_idx.? == i; + if (is_grabbed) { + prog.setUniform(.color, .{ 0, 1, 0 }); + } else { + prog.setUniform(.color, .{ 1, 0, 0 }); + } const model = Mat3.translation(p).scaled(.{ 50, 50 }); prog.setUniform(.model, model); webgl.drawArrays(.triangles, 0, 6); @@ -60,14 +115,32 @@ pub fn update() void { pub fn handleInput(event: input.InputEvent) void { switch (event) { .mouse => |m| { + mouse.lock(); + defer mouse.unlock(); + + // We prioritize positions of click/release over drag events + const down = m.buttons.left and input_priority < 2; + const pressed = down and !mouse.was_down; + const released = !down and mouse.was_down; + const prio: u8 = if (pressed) 2 else if (released) 1 else 0; + if (prio < input_priority) { + return; + } + input_priority = prio; + const dims = webgl.getScreenSize(); const world_pos = .{ m.pos[0], dims[1] - m.pos[1] }; - if (m.buttons.left and !push) { - points[p_idx] = world_pos; - p_idx = (p_idx + 1) % p_count; + mouse.pos = world_pos; + + mouse.down = m.buttons.left; + if (pressed) { + engine.print("Clicked {d:.2}, {d:.2}, delta: {any}", .{ + world_pos[0], + world_pos[1], + m.delta, + }); } - push = m.buttons.left; }, } } |