diff --git a/src/Core.zig b/src/Core.zig index e118e6ed..12cd7817 100644 --- a/src/Core.zig +++ b/src/Core.zig @@ -388,6 +388,31 @@ pub fn deinit(entities: *mach.Entities.Mod, core: *Mod) !void { state.instance.release(); } +pub const InputState = struct { + const KeyBitSet = std.StaticBitSet(@intFromEnum(Key.max) + 1); + const MouseButtonSet = std.StaticBitSet(@as(u4, @intFromEnum(MouseButton.max)) + 1); + + keys: KeyBitSet = KeyBitSet.initEmpty(), + mouse_buttons: MouseButtonSet = MouseButtonSet.initEmpty(), + mouse_position: Position = .{ .x = 0, .y = 0 }, + + pub inline fn isKeyPressed(input: InputState, key: Key) bool { + return input.keys.isSet(@intFromEnum(key)); + } + + pub inline fn isKeyReleased(input: InputState, key: Key) bool { + return !input.isKeyPressed(key); + } + + pub inline fn isMouseButtonPressed(input: InputState, button: MouseButton) bool { + return input.mouse_buttons.isSet(@intFromEnum(button)); + } + + pub inline fn isMouseButtonReleased(input: InputState, button: MouseButton) bool { + return !input.isMouseButtonPressed(button); + } +}; + pub const Event = union(enum) { key_press: KeyEvent, key_repeat: KeyEvent, @@ -1050,6 +1075,31 @@ pub fn deinitLinuxGamemode() void { gamemode_log.info("gamemode: deactivated", .{}); } +pub fn detectBackendType(allocator: std.mem.Allocator) !gpu.BackendType { + const backend = std.process.getEnvVarOwned( + allocator, + "MACH_GPU_BACKEND", + ) catch |err| switch (err) { + error.EnvironmentVariableNotFound => { + if (builtin.target.isDarwin()) return .metal; + if (builtin.target.os.tag == .windows) return .d3d12; + return .vulkan; + }, + else => return err, + }; + defer allocator.free(backend); + + if (std.ascii.eqlIgnoreCase(backend, "null")) return .null; + if (std.ascii.eqlIgnoreCase(backend, "d3d11")) return .d3d11; + if (std.ascii.eqlIgnoreCase(backend, "d3d12")) return .d3d12; + if (std.ascii.eqlIgnoreCase(backend, "metal")) return .metal; + if (std.ascii.eqlIgnoreCase(backend, "vulkan")) return .vulkan; + if (std.ascii.eqlIgnoreCase(backend, "opengl")) return .opengl; + if (std.ascii.eqlIgnoreCase(backend, "opengles")) return .opengles; + + @panic("unknown MACH_GPU_BACKEND type"); +} + // Verifies that a platform implementation exposes the expected function declarations. comptime { // Core diff --git a/src/core/Darwin.zig b/src/core/Darwin.zig index d3ff6d10..01d3d89b 100644 --- a/src/core/Darwin.zig +++ b/src/core/Darwin.zig @@ -2,8 +2,6 @@ const std = @import("std"); const mach = @import("../main.zig"); const Core = @import("../Core.zig"); const InputState = @import("InputState.zig"); -const unicode = @import("unicode.zig"); -const detectBackendType = @import("common.zig").detectBackendType; const gpu = mach.gpu; const InitOptions = Core.InitOptions; const Event = Core.Event; diff --git a/src/core/Null.zig b/src/core/Null.zig index 2a6fb34b..796cea8b 100644 --- a/src/core/Null.zig +++ b/src/core/Null.zig @@ -5,8 +5,6 @@ const std = @import("std"); const mach = @import("../main.zig"); const Core = @import("../Core.zig"); const InputState = @import("InputState.zig"); -const unicode = @import("unicode.zig"); -const detectBackendType = @import("common.zig").detectBackendType; const gpu = mach.gpu; const InitOptions = Core.InitOptions; const Event = Core.Event; diff --git a/src/core/common.zig b/src/core/common.zig deleted file mode 100644 index 8118384d..00000000 --- a/src/core/common.zig +++ /dev/null @@ -1,29 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const mach = @import("../main.zig"); -const gpu = mach.gpu; - -pub fn detectBackendType(allocator: std.mem.Allocator) !gpu.BackendType { - const backend = std.process.getEnvVarOwned( - allocator, - "MACH_GPU_BACKEND", - ) catch |err| switch (err) { - error.EnvironmentVariableNotFound => { - if (builtin.target.isDarwin()) return .metal; - if (builtin.target.os.tag == .windows) return .d3d12; - return .vulkan; - }, - else => return err, - }; - defer allocator.free(backend); - - if (std.ascii.eqlIgnoreCase(backend, "null")) return .null; - if (std.ascii.eqlIgnoreCase(backend, "d3d11")) return .d3d11; - if (std.ascii.eqlIgnoreCase(backend, "d3d12")) return .d3d12; - if (std.ascii.eqlIgnoreCase(backend, "metal")) return .metal; - if (std.ascii.eqlIgnoreCase(backend, "vulkan")) return .vulkan; - if (std.ascii.eqlIgnoreCase(backend, "opengl")) return .opengl; - if (std.ascii.eqlIgnoreCase(backend, "opengles")) return .opengles; - - @panic("unknown MACH_GPU_BACKEND type"); -} diff --git a/src/core/unicode.zig b/src/core/linux_util.zig similarity index 100% rename from src/core/unicode.zig rename to src/core/linux_util.zig diff --git a/src/core/win32.zig b/src/core/win32.zig index 7b440846..0c1fe378 100644 --- a/src/core/win32.zig +++ b/src/core/win32.zig @@ -3,7 +3,6 @@ const w = @import("../win32.zig"); const mach = @import("../main.zig"); const Core = @import("../Core.zig"); const InputState = @import("InputState.zig"); -const unicode = @import("unicode.zig"); const gpu = mach.gpu; const InitOptions = Core.InitOptions;