moving engine setup away from prepare, and everything can be done in start module now
This commit is contained in:
parent
9d3190f78d
commit
0ca5592b40
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ pub const list = [_][]const u8{
|
|||
"physics",
|
||||
|
||||
"rend",
|
||||
"imgui",
|
||||
// "imgui",
|
||||
// to be implemented
|
||||
// "graphics",
|
||||
// "ui",
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue