GPA (General Purpose App)
Find a file
2026-07-13 11:48:40 +01:00
src World: Added get and add components 2026-07-13 11:48:40 +01:00
.gitignore HelloWorld 2026-07-09 22:30:04 +01:00
build.zig HelloWorld 2026-07-09 22:30:04 +01:00
build.zig.zon HelloWorld 2026-07-09 22:30:04 +01:00
README.md Cleanup | Removed template | Use GTL instead 2026-07-12 20:04:35 +01:00

Includes

  • Plugins
  • Scheduler
  • Resources
  • Events
  • ECS (Archetype)

Plugin

pub const plugin: App.plugin.Plugin = .{
    .name = "Renderer",
    .description = "Vulkan Renderer",
    .build = build,
};

System

pub fn render(ctx: App.scheduler.Context) !void {
    // --- GET RESOURCES ---
    const res = try ctx.app.resources.getMany(struct {
        window: *Window,
        device: *Device,
        render_frame: ?*RenderFrame,
    });

    if (res.render_frame) |rf| {
        _ = rf;
    }
}

Simple Events

// --- SEND MANY EVENTS ---
try app.events.sendMany(&.{
    event.AppExit{
        .reason = "Yes",
    },
});

// --- MAIN GAME LOOP ---
while (true) {
    // --- USE AND EAT EVENT ---
    if (app.events.consume(event.AppExit)) |app_exit| {
        std.debug.print("Exit Reason: {s}\n", .{
            app_exit.reason,
        });
        break;
    }
}

Event Queue

const Register = struct {
    username: []const u8,
};

// --- QUEUE ---
if (app.events.get(event.Register)) |queue| {
    // --- GET EVERY EVENT ---
    for (queue.items()) |register| {
        // --- DEBUG ---
        std.debug.print("New Register: Username(s)\n", .{
            register.username
        });
        // ...
    }
    // --- CLEAR EVENT QUEUE ---
    queue.clear();
}

Simple

test "Main" {
    // --- APP ---
    var app: Self = .init(std.testing.allocator);
    defer app.deinit();

    { // PLUGINS
        // --- ADD PLUGINS ---
        try app.plugins.addMany(&.{
            example.simple.plugin,
        });

        // --- BUILD PLUGINS ---
        try app.plugins.build(.{
            .app = &app,
        });
    }

    { // SYSTEMS
        try app.schedules.runMany(&.{
            example.simple.stage.Init,
            example.simple.stage.Inputs,
            example.simple.stage.Update,
            example.simple.stage.Draw,
            example.simple.stage.Deinit,
        }, .{
            .app = &app,
        });
    }
}

Default App Stages

pub const stage = struct {
    // --- INIT ---
    pub const pre_init = struct {};
    pub const init = struct {};
    pub const post_init = struct {};

    // --- DEINIT ---
    pub const pre_deinit = struct {};
    pub const deinit = struct {};
    pub const post_deinit = struct {};

    // --- BEGIN FRAME ---
    pub const pre_begin_frame = struct {};
    pub const begin_frame = struct {};
    pub const post_begin_frame = struct {};

    // --- END FRAME ---
    pub const pre_end_frame = struct {};
    pub const end_frame = struct {};
    pub const post_end_frame = struct {};

    // --- INPUTS ---
    pub const pre_inputs = struct {};
    pub const inputs = struct {};
    pub const post_inputs = struct {};

    // --- FIXED UPDATE ---
    pub const pre_fixed_update = struct {};
    pub const fixed_update = struct {};
    pub const post_fixed_update = struct {};

    // --- UPDATE ---
    pub const pre_update = struct {};
    pub const update = struct {};
    pub const post_update = struct {};

    // --- DRAW ---
    pub const pre_draw = struct {};
    pub const draw = struct {};
    pub const post_draw = struct {};
};