From a8071bd783046a0578d14c6386c16a5e887807c6 Mon Sep 17 00:00:00 2001 From: Lorenzo Torres Date: Mon, 4 Aug 2025 13:56:50 +0200 Subject: [PATCH] Made `render` a system again --- src/ecs/entities.zig | 1 - src/main.zig | 36 +++++++++++------------------------- src/renderer/Renderer.zig | 5 ++--- src/wayland.zig | 12 +++++++----- src/xorg.zig | 7 +++++-- 5 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/ecs/entities.zig b/src/ecs/entities.zig index a591bb4..d5ef236 100644 --- a/src/ecs/entities.zig +++ b/src/ecs/entities.zig @@ -11,7 +11,6 @@ pub const SystemGroup = []const System; pub const SyncGroup = []const System; pub const Resources = struct { - window: Renderer.Window, renderer: Renderer, input: Input, delta_time: f64 = 0.0, diff --git a/src/main.zig b/src/main.zig index c582d32..ec4367b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -5,6 +5,7 @@ const Input = @import("sideros").Input; const mods = @import("sideros").mods; const ecs = @import("sideros").ecs; const builtin = @import("builtin"); +const Renderer = @import("sideros").Renderer; const platform = if (builtin.target.os.tag == .linux) (if (config.wayland) @import("wayland.zig") else @import("xorg.zig")) else @import("xorg.zig"); @@ -43,30 +44,15 @@ pub fn main() !void { //var w = try Renderer.Window.create(800, 600, "sideros"); //defer w.destroy(); - //var r = try Renderer.init(allocator, w); - //defer r.deinit(); + const resources = ecs.Resources{ + .renderer = undefined, + .input = .{ .key_pressed = .{false} ** @intFromEnum(Input.KeyCode.menu) }, + }; + var pool = try ecs.Pool.init(allocator, resources); + defer pool.deinit(); + try pool.addSystemGroup(&[_]ecs.System{ + Renderer.render, + }, true); - //const resources = ecs.Resources{ - // .window = w, - // .renderer = r, - // .input = .{ .key_pressed = .{false} ** @intFromEnum(Input.KeyCode.menu) }, - //}; - - //var pool = try ecs.Pool.init(allocator, resources); - //defer pool.deinit(); - //w.setResources(&pool.resources); - //try pool.addSystemGroup(&[_]ecs.System{ - // Renderer.render, - //}, true); - //try pool.addSystemGroup(&[_]ecs.System{ - // testSystem2, - //}); - - // for (0..1000) |_| { - // const entity = try pool.createEntity(); - // try pool.addComponent(entity, ecs.components.Position{ .x = 1.0, .y = 0.5, .z = 3.0 }); - // try pool.addComponent(entity, ecs.components.Speed{ .speed = 5.0 }); - // } - - try platform.init(allocator); + try platform.init(allocator, &pool); } diff --git a/src/renderer/Renderer.zig b/src/renderer/Renderer.zig index 6727e3e..14bfa89 100644 --- a/src/renderer/Renderer.zig +++ b/src/renderer/Renderer.zig @@ -74,9 +74,8 @@ pub fn deinit(self: Renderer) void { } // TODO: render is maybe a bad name? something like present() or submit() is better? -//pub fn render(pool: *ecs.Pool) anyerror!void { -pub fn render(renderer: *Renderer) anyerror!void { - //var renderer = pool.resources.renderer; +pub fn render(pool: *ecs.Pool) anyerror!void { + var renderer = pool.resources.renderer; try renderer.device.waitFence(renderer.current_frame); const image = try renderer.swapchain.nextImage(renderer.device, renderer.current_frame); diff --git a/src/wayland.zig b/src/wayland.zig index efc8e82..08c8e3e 100644 --- a/src/wayland.zig +++ b/src/wayland.zig @@ -1,6 +1,7 @@ const c = @import("sideros").c; const std = @import("std"); const Renderer = @import("sideros").Renderer; +const ecs = @import("sideros").ecs; var resize = false; var quit = false; @@ -11,7 +12,7 @@ const State = struct { compositor: ?*c.wl_compositor = null, shell: ?*c.xdg_wm_base = null, surface: ?*c.wl_surface = null, - renderer: *Renderer = undefined, + pool: *ecs.Pool = undefined, configured: bool = false, }; @@ -77,7 +78,7 @@ fn frameHandleDone(data: ?*anyopaque, callback: ?*c.wl_callback, time: u32) call const cb = c.wl_surface_frame(state.surface); _ = c.wl_callback_add_listener(cb, &frame_listener, state); - state.renderer.render() catch @panic("can't render"); + state.pool.tick(); _ = c.wl_surface_commit(state.surface); } @@ -104,7 +105,7 @@ const registry_listener: c.wl_registry_listener = .{ .global_remove = registryHandleGlobalRemove, }; -pub fn init(allocator: std.mem.Allocator) !void { +pub fn init(allocator: std.mem.Allocator, pool: *ecs.Pool) !void { var state: State = .{}; const display = c.wl_display_connect(null); defer c.wl_display_disconnect(display); @@ -138,9 +139,10 @@ pub fn init(allocator: std.mem.Allocator) !void { var renderer = try Renderer.init(@TypeOf(display), @TypeOf(surface), allocator, display, surface); defer renderer.deinit(); - try renderer.render(); - state.renderer = &renderer; + pool.resources.renderer = renderer; + state.pool = pool; + pool.tick(); const cb = c.wl_surface_frame(surface); _ = c.wl_callback_add_listener(cb, &frame_listener, @ptrCast(&state)); diff --git a/src/xorg.zig b/src/xorg.zig index 5c040b9..bf35547 100644 --- a/src/xorg.zig +++ b/src/xorg.zig @@ -1,8 +1,9 @@ const std = @import("std"); const Renderer = @import("sideros").Renderer; const c = @import("sideros").c; +const ecs = @import("sideros").ecs; -pub fn init(allocator: std.mem.Allocator) !void { +pub fn init(allocator: std.mem.Allocator, pool: *ecs.Pool) !void { const connection = c.xcb_connect(null, null); defer c.xcb_disconnect(connection); @@ -28,6 +29,8 @@ pub fn init(allocator: std.mem.Allocator) !void { var renderer = try Renderer.init(@TypeOf(connection), @TypeOf(window), allocator, connection, window); defer renderer.deinit(); + pool.resources.renderer = renderer; + while (true) { if (c.xcb_poll_for_event(connection)) |e| { switch (e.*.response_type & ~@as(u32, 0x80)) { @@ -36,6 +39,6 @@ pub fn init(allocator: std.mem.Allocator) !void { std.c.free(e); } - try renderer.render(); + pool.tick(); } }