Add a GUI to ZBA #7
@@ -26,25 +26,25 @@ const histogram_len = 0x400;
 | 
			
		||||
 | 
			
		||||
/// Immediate-Mode GUI State
 | 
			
		||||
pub const State = struct {
 | 
			
		||||
    title: [:0]const u8,
 | 
			
		||||
    title: [12:0]u8,
 | 
			
		||||
 | 
			
		||||
    fps_hist: RingBuffer(u32),
 | 
			
		||||
    should_quit: bool = false,
 | 
			
		||||
 | 
			
		||||
    pub fn init(allocator: Allocator, title: [12]u8) !@This() {
 | 
			
		||||
    pub fn init(allocator: Allocator) !@This() {
 | 
			
		||||
        const history = try allocator.alloc(u32, histogram_len);
 | 
			
		||||
        const without_null = std.mem.sliceTo(&title, 0);
 | 
			
		||||
 | 
			
		||||
        var title: [12:0]u8 = [_:0]u8{0} ** 12;
 | 
			
		||||
        std.mem.copy(u8, &title, "[No Title]");
 | 
			
		||||
 | 
			
		||||
        return .{
 | 
			
		||||
            .title = try allocator.dupeZ(u8, without_null),
 | 
			
		||||
            .title = title,
 | 
			
		||||
            .fps_hist = RingBuffer(u32).init(history),
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn deinit(self: *@This(), allocator: Allocator) void {
 | 
			
		||||
        allocator.free(self.title);
 | 
			
		||||
        allocator.free(self.fps_hist.buf);
 | 
			
		||||
 | 
			
		||||
        self.* = undefined;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
@@ -60,9 +60,10 @@ pub fn draw(state: *State, tex_id: GLuint, cpu: *Arm7tdmi) void {
 | 
			
		||||
            defer zgui.endMenu();
 | 
			
		||||
 | 
			
		||||
            if (zgui.menuItem("Quit", .{})) state.should_quit = true;
 | 
			
		||||
 | 
			
		||||
            if (zgui.menuItem("Insert ROM", .{})) blk: {
 | 
			
		||||
                const maybe_path = nfd.openFileDialog("gba", null) catch |e| {
 | 
			
		||||
                    log.err("failed to open file dialog: {?}", .{e});
 | 
			
		||||
                    log.err("failed to open file dialog: {}", .{e});
 | 
			
		||||
                    break :blk;
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
@@ -74,6 +75,10 @@ pub fn draw(state: *State, tex_id: GLuint, cpu: *Arm7tdmi) void {
 | 
			
		||||
                        log.err("failed to replace GamePak: {}", .{e});
 | 
			
		||||
                        break :blk;
 | 
			
		||||
                    };
 | 
			
		||||
 | 
			
		||||
                    // Ideally, state.title = cpu.bus.pak.title
 | 
			
		||||
                    // since state.title is a [12:0]u8 and cpu.bus.pak.title is a [12]u8
 | 
			
		||||
                    std.mem.copy(u8, &state.title, &cpu.bus.pak.title);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -91,7 +96,7 @@ pub fn draw(state: *State, tex_id: GLuint, cpu: *Arm7tdmi) void {
 | 
			
		||||
        const w = @intToFloat(f32, gba_width * win_scale);
 | 
			
		||||
        const h = @intToFloat(f32, gba_height * win_scale);
 | 
			
		||||
 | 
			
		||||
        const window_title = if (state.title.len != 0) state.title else "[No Title]";
 | 
			
		||||
        const window_title = std.mem.sliceTo(&state.title, 0);
 | 
			
		||||
        _ = zgui.begin(window_title, .{ .flags = .{ .no_resize = true, .always_auto_resize = true } });
 | 
			
		||||
        defer zgui.end();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -91,7 +91,7 @@ pub fn main() void {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: Just copy the title instead of grabbing a pointer to it
 | 
			
		||||
    var gui = Gui.init(allocator, bus.pak.title, &bus.apu) catch |e| exitln("failed to init gui: {}", .{e});
 | 
			
		||||
    var gui = Gui.init(allocator, &bus.apu) catch |e| exitln("failed to init gui: {}", .{e});
 | 
			
		||||
    defer gui.deinit();
 | 
			
		||||
 | 
			
		||||
    var quit = std.atomic.Atomic(bool).init(false);
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ pub const Gui = struct {
 | 
			
		||||
    allocator: Allocator,
 | 
			
		||||
    program_id: gl.GLuint,
 | 
			
		||||
 | 
			
		||||
    pub fn init(allocator: Allocator, title: [12]u8, apu: *Apu) !Self {
 | 
			
		||||
    pub fn init(allocator: Allocator, apu: *Apu) !Self {
 | 
			
		||||
        if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO | SDL.SDL_INIT_EVENTS | SDL.SDL_INIT_AUDIO) < 0) panic();
 | 
			
		||||
        if (SDL.SDL_GL_SetAttribute(SDL.SDL_GL_CONTEXT_PROFILE_MASK, SDL.SDL_GL_CONTEXT_PROFILE_CORE) < 0) panic();
 | 
			
		||||
        if (SDL.SDL_GL_SetAttribute(SDL.SDL_GL_CONTEXT_MAJOR_VERSION, 3) < 0) panic();
 | 
			
		||||
@@ -91,7 +91,7 @@ pub const Gui = struct {
 | 
			
		||||
            .audio = Audio.init(apu),
 | 
			
		||||
 | 
			
		||||
            .allocator = allocator,
 | 
			
		||||
            .state = try imgui.State.init(allocator, title),
 | 
			
		||||
            .state = try imgui.State.init(allocator),
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user