moving engine setup away from prepare, and everything can be done in start module now

This commit is contained in:
Peter Li 2025-04-19 18:47:52 -07:00
parent 9d3190f78d
commit 0ca5592b40
8 changed files with 41 additions and 34 deletions

View File

@ -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()) {

View File

@ -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;
}

View File

@ -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;

View File

@ -6,7 +6,7 @@ pub const list = [_][]const u8{
"physics",
"rend",
"imgui",
// "imgui",
// to be implemented
// "graphics",
// "ui",

View File

@ -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 {

View File

@ -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.

View File

@ -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 {

View File

@ -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 {