// // Created by william on 16/05/24. // #include #include "log.h" #include "gui.h" #include "main_window.h" #include "pattern_window.h" #include "../include/system.h" #include "nametable_window.h" #include "dbg_pattern_table.h" typedef struct nes_gui { NesMainWindow main_window; NesPatternWindow pattern_window; NesNametableWindow nametable_window; TTF_Font *font; // Debug info bool debug_enabled; Uint32 last_frame_tick; Uint32 frame_delay; unsigned long tick; } NesGui; NesGui gui; bool gui_init() { TTF_Init(); gui.font = TTF_OpenFont("./nintendo-nes-font.ttf", 16); if (gui.font == NULL) { log_error("Failed to open TTF font"); return false; } gui.debug_enabled = true; gui.tick = 0; main_window_init(&gui.main_window, gui.font); if (gui.debug_enabled) { pattern_window_init(&gui.pattern_window); // nametable_window_init(&gui.nametable_window); } return true; } void gui_uninit() { main_window_uninit(&gui.main_window); if (gui.debug_enabled) { pattern_window_uninit(&gui.pattern_window); // nametable_window_uninit(&gui.nametable_window); } TTF_CloseFont(gui.font); } void gui_post_sysinit() { if (gui.debug_enabled) { dbg_pattern_table_init(); pattern_window_build_table(&gui.pattern_window); } } int gui_input() { SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE) { return -1; } } return 1; } void gui_render() { main_window_render(&gui.main_window, ppu_get_state()->pixels); if (gui.debug_enabled) { pattern_window_render(&gui.pattern_window); // if (gui.tick % 60 == 0) { // PPUMemory *ppu_memory = &ppu_get_state()->memory; // nametable_window_update(&gui.nametable_window, ppu_memory->nametable_0, ppu_memory->nametable_1); // } // nametable_window_render(&gui.nametable_window); } gui.tick++; } void gui_present() { main_window_present(&gui.main_window); if (gui.debug_enabled) { pattern_window_present(&gui.pattern_window); // nametable_window_present(&gui.nametable_window); } } void gui_delay() { Uint32 tick_now = SDL_GetTicks(); gui.frame_delay = tick_now - gui.last_frame_tick; if (gui.frame_delay < 16) { Uint32 additional_delay = 16 - gui.frame_delay; SDL_Delay(additional_delay); gui.frame_delay += additional_delay; } gui.last_frame_tick = SDL_GetTicks(); } bool gui_debug_enabled() { return gui.debug_enabled; } unsigned int gui_get_frame_delay() { return gui.frame_delay; }