nesemu/gui/gui.c

127 lines
2.7 KiB
C

//
// Created by william on 16/05/24.
//
#include <SDL_ttf.h>
#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"
#include "dbg_nametable.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();
dbg_nametable_init();
pattern_window_build_table(&gui.pattern_window);
nametable_window_update(&gui.nametable_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) {
nametable_window_update(&gui.nametable_window);
// }
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;
}