diff --git a/engine/backlog.zig b/engine/backlog.zig index 246acb6..77282c6 100644 --- a/engine/backlog.zig +++ b/engine/backlog.zig @@ -90,9 +90,12 @@ pub fn run_everything(comptime GameContext: type) !void { if (@hasDecl(GameContext, "tick")) { canTick = true; } + core.engine_logs("creating Game context"); _ = try core.createObject(GameContext, .{ .can_tick = canTick }); + core.engine_logs("calling gEngine.run"); + try core.gEngine.run(); while (!core.gEngine.exitFinished()) { diff --git a/engine/core/src/core.zig b/engine/core/src/core.zig index 2c20e32..aa9da01 100644 --- a/engine/core/src/core.zig +++ b/engine/core/src/core.zig @@ -174,10 +174,9 @@ pub fn registerRendererSetup(ctx: *anyopaque, setup: engine.SetupFuncFn) void { gEngine.rendererSetupFunc = setup; } -pub fn setupEnginePlatform(ctx: *anyopaque, setup: engine.SetupFuncFn, poll: engine.PollFuncFn, proc: engine.ProcEventsFn) void { +pub fn setupEnginePlatform(ctx: *anyopaque, poll: engine.PollFuncFn, proc: engine.ProcEventsFn) void { gEngine.platformCtx = ctx; - gEngine.platformSetupFunc = setup; gEngine.platformPollFunc = poll; gEngine.platformProcEventsFunc = proc; } diff --git a/engine/core/src/engine.zig b/engine/core/src/engine.zig index 91a67a6..ac0e15f 100644 --- a/engine/core/src/engine.zig +++ b/engine/core/src/engine.zig @@ -40,6 +40,8 @@ pub const Engine = struct { allocator: std.mem.Allocator, + createObjectLock: bool = false, + // better name for these engineObject objects is actually 'engine object' engineObjects: ArrayListUnmanaged(EngineObjectRef), eventors: ArrayListUnmanaged(EngineObjectRef), @@ -69,7 +71,6 @@ pub const Engine = struct { platformCtx: *anyopaque = undefined, platformPollFunc: ?PollFuncFn = null, - platformSetupFunc: ?PollFuncFn = null, platformProcEventsFunc: ?ProcEventsFn = null, rendererCtx: *anyopaque = undefined, @@ -142,6 +143,12 @@ pub const Engine = struct { // creates an engine object using the engine's allocator. pub fn createObject(self: *@This(), comptime T: type, params: NeonObjectParams) !*T { + if (self.createObjectLock) { + core.engine_err("RECURSIVE OBJECT CREATION NOT ALLOWED", .{}); + return error.BadInit; + } + self.createObjectLock = true; + defer self.createObjectLock = false; const newIndex = self.engineObjects.items.len; const vtable = &@field(T, "NeonObjectTable"); const newObjectPtr = try vtable.init_func(self.allocator); @@ -276,6 +283,7 @@ pub const Engine = struct { pub fn run(self: *@This()) !void { core.engine_logs("engine loop started"); + const SystemsThread = struct { engine: *Engine, @@ -308,23 +316,21 @@ pub const Engine = struct { self.dependentsDestroyed.store(true, .seq_cst); } + pub fn runPrepares(self: *@This()) !void { + var z = core.tracy.Zone(@src()); + for (self.prepares.items) |prep| { + var z1 = core.tracy.ZoneN(@src(), "Preparing game"); + core.tracy.Message(prep.vtable.typeName); + prep.vtable.prepare_func.?(prep.ptr) catch unreachable; + z1.End(); + } + z.End(); + } + fn mainLoop(self: *@This()) !void { var exitSignaled: bool = false; - if (self.platformSetupFunc) |setupFunc| { - setupFunc(self.platformCtx) catch unreachable; - } - - { - var z = core.tracy.Zone(@src()); - for (self.prepares.items) |prep| { - var z1 = core.tracy.ZoneN(@src(), "Preparing game"); - core.tracy.Message(prep.vtable.typeName); - prep.vtable.prepare_func.?(prep.ptr) catch unreachable; - z1.End(); - } - z.End(); - } + try self.runPrepares(); while (true) { self.tick() catch unreachable; diff --git a/engine/modulelist.zig b/engine/modulelist.zig index 4bda2af..c09b12d 100644 --- a/engine/modulelist.zig +++ b/engine/modulelist.zig @@ -6,7 +6,7 @@ pub const list = [_][]const u8{ "physics", "rend", - "imgui", + // "imgui", // to be implemented // "graphics", // "ui", diff --git a/engine/platform/src/platform.zig b/engine/platform/src/platform.zig index ad16929..a6c182c 100644 --- a/engine/platform/src/platform.zig +++ b/engine/platform/src/platform.zig @@ -29,7 +29,9 @@ pub fn start_module(comptime programSpec: anytype, args: anytype, allocator: std gPlatformInstance = try allocator.create(windowing.PlatformInstance); gPlatformInstance.* = try windowing.PlatformInstance.init(allocator, gStartupParams); - try gPlatformInstance.registerSetupFuncs(); + try gPlatformInstance.setupWindow(); + + try gPlatformInstance.registerFuncs(); } pub fn getInstance() *windowing.PlatformInstance { diff --git a/engine/platform/src/windowing.zig b/engine/platform/src/windowing.zig index 89b5d5a..b56419c 100644 --- a/engine/platform/src/windowing.zig +++ b/engine/platform/src/windowing.zig @@ -105,15 +105,13 @@ pub const PlatformInstance = struct { return self; } - pub fn setupWindow(opaqueSelf: *anyopaque) core.EngineDataEventError!void { - const self: *@This() = @alignCast(@ptrCast(opaqueSelf)); - + pub fn setupWindow(self: *@This()) core.EngineDataEventError!void { sdl3.init(.{ .video = true, .gamepad = true }) catch return error.BadInit; self.window = sdl3.c.SDL_CreateWindow(self.windowName, self.windowExtent.x, self.windowExtent.y, 0).?; // resizeable } - pub fn registerSetupFuncs(self: *@This()) !void { - core.setupEnginePlatform(self, setupWindow, enginePoll, processEvents); + pub fn registerFuncs(self: *@This()) !void { + core.setupEnginePlatform(self, enginePoll, processEvents); } // runs pinned on io thread. diff --git a/engine/rend/src/rend.zig b/engine/rend/src/rend.zig index 7082be8..c063806 100644 --- a/engine/rend/src/rend.zig +++ b/engine/rend/src/rend.zig @@ -42,12 +42,9 @@ pub const Module: core.ModuleDescription = .{ pub fn start_module(comptime programSpec: anytype, args: anytype, allocator: std.mem.Allocator) !void { _ = args; _ = programSpec; - core.engine_log("starting up renderer interface", .{}); rendAllocator = allocator; + try renderer.createInstance(); try renderer.start(); - - try core.defineComponent(MeshComponent, allocator); - try core.defineComponent(CameraComponent, allocator); } pub fn shutdown_module(allocator: std.mem.Allocator) void { diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index e4b34f7..c26cac4 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -45,12 +45,10 @@ pub const Renderer = struct { .allocator = allocator, }; - return self; - } + try core.defineComponent(rend.MeshComponent, allocator); + try core.defineComponent(rend.CameraComponent, allocator); - pub fn prepare(self: *@This()) core.EngineDataEventError!void { - core.engine_log("starting up renderer interface", .{}); - self.startRenderer() catch return error.BadInit; + return self; } pub fn registerRendererObject(self: *@This(), T: type) !*T { @@ -448,11 +446,15 @@ pub fn reloadShaders() !void { } // ====== renderer API ======= -pub fn start() !void { +pub fn createInstance() !void { gRenderer = try core.createObject(Renderer, .{ .can_tick = true, .isCore = true }); gAllocator = gRenderer.allocator; } +pub fn start() !void { + try gRenderer.startRenderer(); +} + pub fn shutdown() void {} pub fn context() *Renderer {