summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralaric <alaric@netmythos.org>2024-04-10 04:52:14 -0700
committeralaric <alaric@netmythos.org>2024-04-10 04:52:14 -0700
commit748efaa6cb6dfd0252354a6c384762e163f4d3b8 (patch)
tree9b924523f4fedf036d5506f544c4617e6beb43bd
parentdcbee5d6fb42dc12b6cad3b7908a172ebb2804ad (diff)
downloadtiny-td-748efaa6cb6dfd0252354a6c384762e163f4d3b8.tar.gz
tiny-td-748efaa6cb6dfd0252354a6c384762e163f4d3b8.zip
Click and drag on squares
m---------engine0
-rw-r--r--src/main.zig97
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;
},
}
}