feat: add support for RG35XX Plus/H

- Use linux EGL backend for rendering
- Use linux evdev backend for input
- Use seizer's new ButtonInput abstraction
ci-dev
LeRoyce Pearson 2024-04-20 23:51:56 -06:00
parent b199c7d52e
commit 4a6e419213
2 changed files with 48 additions and 83 deletions

View File

@ -16,8 +16,8 @@
// internet connectivity. // internet connectivity.
.dependencies = .{ .dependencies = .{
.seizer = .{ .seizer = .{
.url = "https://github.com/leroycep/seizer/archive/ec651ce18e423a8fdda3b1a3369d9121c45d96f0.tar.gz", .url = "https://github.com/leroycep/seizer/archive/d425db26fbbf5a99faa70ea07fb7d2b028f690d1.tar.gz",
.hash = "122028487862f2462ba02191adbc6676b621b37fa05e0962f0a5990d4079ed34140e", .hash = "1220250791e125cf4d342020eb3af65c36a8b971559ae9ffafc187c0cb116ee3d6e2",
}, },
}, },
.paths = .{ .paths = .{

View File

@ -23,7 +23,7 @@ pub fn init(context: *seizer.Context) !void {
gpa = context.gpa; gpa = context.gpa;
prng = std.rand.DefaultPrng.init(@bitCast(std.time.timestamp())); prng = std.rand.DefaultPrng.init(@bitCast(std.time.timestamp()));
const window = try context.createWindow(.{ _ = try context.createWindow(.{
.title = "Seizer Solitaire", .title = "Seizer Solitaire",
.on_render = render, .on_render = render,
.on_destroy = destroy, .on_destroy = destroy,
@ -44,41 +44,36 @@ pub fn init(context: *seizer.Context) !void {
} }
} }
// update joystick to gamepad mappings try context.addButtonInput(.{
update_gamepad_mappings_file: { .title = "move_up",
const sdl_controller_config_filepath = std.process.getEnvVarOwned(gpa, "SDL_GAMECONTROLLERCONFIG_FILE") catch break :update_gamepad_mappings_file; .on_event = moveUp,
defer gpa.free(sdl_controller_config_filepath); .default_bindings = &.{.dpad_up},
});
std.log.debug("Loading gamepad mappings from file: \"{}\"", .{std.zig.fmtEscapes(sdl_controller_config_filepath)}); try context.addButtonInput(.{
.title = "move_down",
const controller_config_data = std.fs.cwd().readFileAllocOptions( .on_event = moveDown,
gpa, .default_bindings = &.{.dpad_down},
sdl_controller_config_filepath, });
512 * 1024 * 1024, try context.addButtonInput(.{
null, .title = "move_left",
@alignOf(u8), .on_event = moveLeft,
0, .default_bindings = &.{.dpad_left},
) catch break :update_gamepad_mappings_file; });
defer gpa.free(controller_config_data); try context.addButtonInput(.{
.title = "move_right",
if (!seizer.backend.glfw.Joystick.updateGamepadMappings(controller_config_data)) { .on_event = moveRight,
std.log.warn("Failed to update gamepad mappings from file", .{}); .default_bindings = &.{.dpad_right},
} });
} try context.addButtonInput(.{
update_gamepad_mappings: { .title = "select_or_place",
const sdl_controller_config = std.process.getEnvVarOwned(gpa, "SDL_GAMECONTROLLERCONFIG") catch break :update_gamepad_mappings; .on_event = doSelectOrPlace,
defer gpa.free(sdl_controller_config); .default_bindings = &.{.a},
});
std.log.debug("Loading gamepad mappings from environment variable", .{}); try context.addButtonInput(.{
.title = "deselect",
const sdl_controller_configz = gpa.dupeZ(u8, sdl_controller_config) catch break :update_gamepad_mappings; .on_event = deselect,
.default_bindings = &.{.b},
if (!seizer.backend.glfw.Joystick.updateGamepadMappings(sdl_controller_configz)) { });
std.log.warn("Failed to update gamepad mappings from environment variable", .{});
}
}
window.glfw_window.setKeyCallback(key_input_callback);
} }
fn destroy(window: *seizer.Window) void { fn destroy(window: *seizer.Window) void {
@ -100,17 +95,6 @@ fn destroy(window: *seizer.Window) void {
} }
fn render(window: *seizer.Window) !void { fn render(window: *seizer.Window) !void {
for (1..@intFromEnum(seizer.backend.glfw.Joystick.Id.last)) |i| {
const joystick = seizer.backend.glfw.Joystick{ .jid = @enumFromInt(i) };
if (joystick.getGamepadState()) |gamepad| {
if (gamepad.getButton(.a) == .press) doSelectOrPlace();
if (gamepad.getButton(.dpad_left) == .press) moveLeft();
if (gamepad.getButton(.dpad_right) == .press) moveRight();
if (gamepad.getButton(.dpad_up) == .press) moveUp();
if (gamepad.getButton(.dpad_down) == .press) moveDown();
}
}
gl.clearColor(0.2, 0.4, 0.2, 1.0); gl.clearColor(0.2, 0.4, 0.2, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT); gl.clear(gl.COLOR_BUFFER_BIT);
@ -228,14 +212,6 @@ fn render(window: *seizer.Window) !void {
} }
} }
var text_writer = canvas.textWriter(.{});
for (1..@intFromEnum(seizer.backend.glfw.Joystick.Id.last)) |i| {
const joystick = seizer.backend.glfw.Joystick{ .jid = @enumFromInt(i) };
if (joystick.getName()) |name| {
text_writer.writer().print("connected_controller[{}] = {s}\n", .{ i, name }) catch {};
}
}
canvas.end(); canvas.end();
} }
@ -257,30 +233,14 @@ pub fn makeStandardDeck(allocator: std.mem.Allocator) ![]Card {
return deck; return deck;
} }
pub fn key_input_callback( pub fn deselect(pressed: bool) !void {
window: seizer.backend.glfw.Window, if (!pressed) return;
key: seizer.backend.glfw.Key, selected_deck = null;
scancode: i32, selected_card = 0;
action: seizer.backend.glfw.Action,
mods: seizer.backend.glfw.Mods,
) void {
_ = window;
_ = scancode;
_ = mods;
switch (action) {
.press => switch (key) {
.z => doSelectOrPlace(),
.left => moveLeft(),
.right => moveRight(),
.down => moveDown(),
.up => moveUp(),
else => {},
},
else => {},
}
} }
pub fn doSelectOrPlace() void { pub fn doSelectOrPlace(pressed: bool) !void {
if (!pressed) return;
if (selected_deck == null) { if (selected_deck == null) {
if (hovered_deck == &draw_pile and !draw_pile_exhausted) { if (hovered_deck == &draw_pile and !draw_pile_exhausted) {
drawn_cards.ensureUnusedCapacity(gpa, 3) catch return; drawn_cards.ensureUnusedCapacity(gpa, 3) catch return;
@ -384,7 +344,8 @@ pub fn doSelectOrPlace() void {
} }
} }
pub fn moveLeft() void { pub fn moveLeft(pressed: bool) !void {
if (!pressed) return;
if (hovered_deck == null) { if (hovered_deck == null) {
hovered_deck = &draw_pile; hovered_deck = &draw_pile;
hovered_card = 0; hovered_card = 0;
@ -415,7 +376,8 @@ pub fn moveLeft() void {
} }
} }
pub fn moveRight() void { pub fn moveRight(pressed: bool) !void {
if (!pressed) return;
if (hovered_deck == null) { if (hovered_deck == null) {
hovered_deck = &draw_pile; hovered_deck = &draw_pile;
hovered_card = 0; hovered_card = 0;
@ -446,7 +408,9 @@ pub fn moveRight() void {
} }
} }
pub fn moveUp() void { pub fn moveUp(pressed: bool) !void {
if (!pressed) return;
if (hovered_deck == null) { if (hovered_deck == null) {
hovered_deck = &draw_pile; hovered_deck = &draw_pile;
hovered_card = 0; hovered_card = 0;
@ -486,7 +450,8 @@ pub fn moveUp() void {
} }
} }
pub fn moveDown() void { pub fn moveDown(pressed: bool) !void {
if (!pressed) return;
if (hovered_deck == null) { if (hovered_deck == null) {
hovered_deck = &draw_pile; hovered_deck = &draw_pile;
hovered_card = 0; hovered_card = 0;