diff options
author | Lorenzo Torres <torres@sideros.org> | 2025-03-29 14:51:31 +0100 |
---|---|---|
committer | Lorenzo Torres <torres@sideros.org> | 2025-03-29 14:51:31 +0100 |
commit | fd7973173f163e068deb0ae8f9d6ff0fc31fc71b (patch) | |
tree | 3d4af1de3a1d1eab487da6368b32fb3dca9e5f69 /src | |
parent | 4a43e564d7a137097a8403f807b63a2998e0c090 (diff) |
Added cursor input management
Diffstat (limited to 'src')
-rw-r--r-- | src/Input.zig | 16 | ||||
-rw-r--r-- | src/renderer/Camera.zig | 26 | ||||
-rw-r--r-- | src/renderer/Window.zig | 23 |
3 files changed, 63 insertions, 2 deletions
diff --git a/src/Input.zig b/src/Input.zig index 854d54a..820c0ab 100644 --- a/src/Input.zig +++ b/src/Input.zig @@ -126,7 +126,21 @@ pub const KeyCode = enum(u32) { menu = 348, }; -key_pressed: [@intFromEnum(KeyCode.menu)]bool, +key_pressed: [@intFromEnum(KeyCode.menu)]bool = .{false} ** @intFromEnum(Input.KeyCode.menu), +mouse_delta_x: f64 = 0.0, +mouse_delta_y: f64 = 0.0, +mouse_x: f64 = 0.0, +mouse_y: f64 = 0.0, +mouse_first: bool = true, +sensitivity: f64 = 0.1, + +pub fn getCursorDelta(self: Input) @Vector(2, f64) { + return @Vector(2, f64){ self.mouse_delta_x, self.mouse_delta_y }; +} + +pub fn getCursorPosition(self: Input) @Vector(2, f64) { + return @Vector(2, f64){ self.mouse_x, self.mouse_y }; +} pub fn isKeyDown(self: Input, key: KeyCode) bool { return self.key_pressed[@intFromEnum(key)]; diff --git a/src/renderer/Camera.zig b/src/renderer/Camera.zig index 9794da3..9ab305c 100644 --- a/src/renderer/Camera.zig +++ b/src/renderer/Camera.zig @@ -15,7 +15,31 @@ position: @Vector(3, f32), target: @Vector(3, f32), direction: @Vector(3, f32), right: @Vector(3, f32), +front: @Vector(3, f32), up: @Vector(3, f32), +speed: f32 = 2.5, -fn input(pool: *ecs.Pool) void { +fn getProjection(width: usize, height: usize) math.Matrix { + return math.Matrix.perspective(math.rad(45.0), (@as(f32, @floatFromInt(width)) / @as(f32, @floatFromInt(height))), 0.1, 10.0); +} + +fn getView(self: Camera) math.Matrix { + math.lookAt(self.position, self.position + self.front, self.up); +} + +fn moveCamera(pool: *ecs.Pool) void { + const input = pool.resources.input; + const camera = pool.resources.camera; + if (input.isKeyDown(.w)) { + camera.position += (camera.front * (camera.speed * pool.resources.delta_time)); + } + if (input.isKeyDown(.s)) { + camera.position -= (camera.front * (camera.speed * pool.resources.delta_time)); + } + if (input.isKeyDown(.a)) { + camera.position -= math.normalize(math.cross(camera.front, camera.up)) * (camera.speed * pool.resources.delta_time); + } + if (input.isKeyDown(.d)) { + camera.position += math.normalize(math.cross(camera.front, camera.up)) * (camera.speed * pool.resources.delta_time); + } } diff --git a/src/renderer/Window.zig b/src/renderer/Window.zig index c05391b..bc8f83b 100644 --- a/src/renderer/Window.zig +++ b/src/renderer/Window.zig @@ -38,6 +38,7 @@ pub fn create(width: usize, height: usize, title: []const u8) !Window { const raw = c.glfwCreateWindow(@intCast(width), @intCast(height), title.ptr, null, null); c.glfwShowWindow(raw); _ = c.glfwSetKeyCallback(raw, keyCallback); + _ = c.glfwSetCursorPosCallback(raw, cursorCallback); return Window{ .title = title, @@ -73,6 +74,10 @@ pub fn destroy(self: Window) void { c.glfwTerminate(); } +pub fn getTime() f32 { + return c.glfwGetTime(); +} + pub fn keyCallback(window: ?*c.GLFWwindow, key: c_int, scancode: c_int, action: c_int, mods: c_int) callconv(.c) void { _ = scancode; _ = mods; @@ -85,3 +90,21 @@ pub fn keyCallback(window: ?*c.GLFWwindow, key: c_int, scancode: c_int, action: } } } + +pub fn cursorCallback(window: ?*c.GLFWwindow, x: f64, y: f64) callconv(.c) void { + if (c.glfwGetWindowUserPointer(window)) |r| { + const resources: *ecs.Resources = @alignCast(@ptrCast(r)); + var input = resources.input; + + if (input.mouse_first) { + input.mouse_x = x; + input.mouse_y = y; + input.mouse_first = false; + } + + input.mouse_delta_x = (x - input.mouse_x); + input.mouse_delta_y = (y - input.mouse_y); + input.mouse_x = x; + input.mouse_y = y; + } +} |