Compare commits

...

2 commits

Author SHA1 Message Date
rdanbrook 88d33a150a FLTK: Update modern GL uniforms when resizing 2024-06-02 11:46:40 -06:00
rdanbrook 188c8346f9 FLTK: Clean up main window and menu 2024-06-02 10:24:35 -06:00
3 changed files with 95 additions and 72 deletions

View file

@ -79,9 +79,49 @@ CheatManager *chtmgr{nullptr};
std::vector<uint8_t> game;
}
Fl_Menu_Item menutable[] = {
{"&File", FL_ALT + 'f', 0, 0, FL_SUBMENU},
{"Open", 0, FltkUi::rom_open, 0, FL_MENU_DIVIDER},
{"Load State...", 0, FltkUi::state_load, 0, FL_MENU_INACTIVE},
{"Save State...", 0, FltkUi::state_save, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Quick Load", 0, 0, 0, FL_SUBMENU|FL_MENU_INACTIVE},
{"Slot 0", 0, FltkUi::state_qload, (void*)"0", FL_MENU_INACTIVE},
{"Slot 1", 0, FltkUi::state_qload, (void*)"1", FL_MENU_INACTIVE},
{"Slot 2", 0, FltkUi::state_qload, (void*)"2", FL_MENU_INACTIVE},
{"Slot 3", 0, FltkUi::state_qload, (void*)"3", FL_MENU_INACTIVE},
{"Slot 4", 0, FltkUi::state_qload, (void*)"4", FL_MENU_INACTIVE},
{0},
{"Quick Save", 0, 0, 0, FL_SUBMENU|FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Slot 0", 0, FltkUi::state_qsave, (void*)"0", FL_MENU_INACTIVE},
{"Slot 1", 0, FltkUi::state_qsave, (void*)"1", FL_MENU_INACTIVE},
{"Slot 2", 0, FltkUi::state_qsave, (void*)"2", FL_MENU_INACTIVE},
{"Slot 3", 0, FltkUi::state_qsave, (void*)"3", FL_MENU_INACTIVE},
{"Slot 4", 0, FltkUi::state_qsave, (void*)"4", FL_MENU_INACTIVE},
{0},
{"Open Palette...", 0, FltkUi::palette_open, 0, FL_MENU_DIVIDER},
//{"Screenshot...", 0, fltkui_screenshot, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
/*{"Load Movie...", 0, fltkui_movie_load, 0, FL_MENU_INACTIVE},
{"Record Movie...", 0, fltkui_movie_save, 0, FL_MENU_INACTIVE},
{"Stop Movie", 0, fltkui_movie_stop, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},*/
{"&Quit", FL_ALT + 'q', FltkUi::quit, 0, 0},
{0}, // End File
{"&Emulator", FL_ALT + 'e', 0, 0, FL_SUBMENU},
{"Pause", 0, FltkUi::pause, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Reset (Soft)", 0, FltkUi::reset, (void*)"0", FL_MENU_INACTIVE},
{"Reset (Hard)", 0, FltkUi::reset, (void*)"1", FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Fullscreen", 0, FltkUi::fullscreen, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Switch Disk Side", 0, FltkUi::fds_next, 0, FL_MENU_INACTIVE},
{"Insert/Eject Disk", 0, FltkUi::fds_insert, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Cheats...", 0, FltkUi::chtwin_open, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Settings...", 0, FltkUi::setwin_open, 0, 0},
{0}, // End Emulator
{"&Help", FL_ALT + 'h', 0, 0, FL_SUBMENU},
{"About", 0, FltkUi::about, 0, 0},
{0}, // End Help
{0} // End Menu
};
static int fltkui_refreshrate(void) {
int get_refreshrate(void) {
// Get the screen refresh rate using an SDL window
int refresh = 60;
SDL_Window *sdlwin;
@ -97,7 +137,9 @@ static int fltkui_refreshrate(void) {
return refresh;
}
static void fltkui_cheats(Fl_Widget* w, void* userdata) {
}
void FltkUi::chtwin_open(Fl_Widget *w, void *data) {
if (!jgm->is_loaded()) {
return;
}
@ -106,11 +148,11 @@ static void fltkui_cheats(Fl_Widget* w, void* userdata) {
chtwin->show();
}
static void fltkui_settings(Fl_Widget* w, void* userdata) {
void FltkUi::setwin_open(Fl_Widget *w, void *data) {
setwin->show();
}
static void fltkui_load_file(const char *filename) {
void FltkUi::load_file(const char *filename) {
// First, check if it's an archive
std::set<std::string> archive_exts = { ".zip", ".7z", ".gz", ".bz2", ".xz", ".zst" };
std::string fileext = std::filesystem::path(filename).extension().string();
@ -148,7 +190,7 @@ static void fltkui_load_file(const char *filename) {
}
}
static void fltkui_rom_open(Fl_Widget* w, void* userdata) {
void FltkUi::rom_open(Fl_Widget *w, void *data) {
// Create native chooser
Fl_Native_File_Chooser fc;
fc.title("Select a ROM");
@ -163,7 +205,7 @@ static void fltkui_rom_open(Fl_Widget* w, void* userdata) {
case 1: break; // Cancel
default:
if (fc.filename()) {
fltkui_load_file(fc.filename());
load_file(fc.filename());
if (jgm->is_loaded()) {
chtmgr->clear();
@ -179,7 +221,7 @@ static void fltkui_rom_open(Fl_Widget* w, void* userdata) {
}
}
static void fltkui_movie_load(Fl_Widget* w, void* userdata) {
/*static void fltkui_movie_load(Fl_Widget* w, void* userdata) {
// Create native chooser
if (!jgm->is_loaded()) {
return;
@ -226,9 +268,9 @@ static void fltkui_movie_save(Fl_Widget* w, void* userdata) {
static void fltkui_movie_stop(Fl_Widget* w, void* userdata) {
//nst_movie_stop();
}
}*/
static void fltkui_state_load(Fl_Widget* w, void* userdata) {
void FltkUi::state_load(Fl_Widget *w, void *userdata) {
// Create native chooser
if (!jgm->is_loaded()) {
return;
@ -255,7 +297,7 @@ static void fltkui_state_load(Fl_Widget* w, void* userdata) {
}
}
static void fltkui_state_save(Fl_Widget* w, void* userdata) {
void FltkUi::state_save(Fl_Widget *w, void *data) {
// Create native chooser
if (!jgm->is_loaded()) {
return;
@ -276,7 +318,7 @@ static void fltkui_state_save(Fl_Widget* w, void* userdata) {
jgm->state_save(statefile);
}
static void fltkui_screenshot(Fl_Widget* w, void* userdata) {
/*static void fltkui_screenshot(Fl_Widget* w, void* userdata) {
// Create native chooser
if (!jgm->is_loaded()) {
return;
@ -294,9 +336,9 @@ static void fltkui_screenshot(Fl_Widget* w, void* userdata) {
}
//video_screenshot(fc.filename());
}
}*/
static void fltkui_palette_open(Fl_Widget* w, void* userdata) {
void FltkUi::palette_open(Fl_Widget *w, void *data) {
// Create native chooser
Fl_Native_File_Chooser fc;
fc.title("Select a Palette");
@ -325,17 +367,17 @@ static void fltkui_palette_open(Fl_Widget* w, void* userdata) {
}
}
static void fltkui_state_qload(Fl_Widget* w, void* userdata) {
int slot = atoi((const char*)userdata);
void FltkUi::state_qload(Fl_Widget *w, void *data) {
int slot = atoi((const char*)data);
jgm->state_qload(slot);
}
static void fltkui_state_qsave(Fl_Widget* w, void* userdata) {
int slot = atoi((const char*)userdata);
void FltkUi::state_qsave(Fl_Widget *w, void *data) {
int slot = atoi((const char*)data);
jgm->state_qsave(slot);
}
static void fltkui_pause(Fl_Widget* w, void* userdata) {
void FltkUi::pause(Fl_Widget *w, void *data) {
paused ^= 1;
if (paused) {
audiomgr->pause();
@ -349,8 +391,8 @@ static void fltkui_pause(Fl_Widget* w, void* userdata) {
}
}
static void fltkui_reset(Fl_Widget* w, void* userdata) {
jgm->reset(atoi((const char*)userdata));
void FltkUi::reset(Fl_Widget *w, void *data) {
jgm->reset(atoi((const char*)data));
}
void NstWindow::resize(int x, int y, int w, int h) {
@ -392,11 +434,11 @@ void FltkUi::fullscreen(Fl_Widget *w, void *data) {
}
}
static void fltkui_fds_next(Fl_Widget* w, void* userdata) {
void FltkUi::fds_next(Fl_Widget *w, void *data) {
jg_media_select();
}
static void fltkui_fds_insert(Fl_Widget* w, void* userdata) {
void FltkUi::fds_insert(Fl_Widget *w, void *data) {
jg_media_insert();
}
@ -455,8 +497,8 @@ void FltkUi::quit(Fl_Widget *w, void *data) {
nstwin->hide();
}
// this is used to stop Esc from exiting the program:
int handle(int e) {
int FltkUi::handle(int e) {
// This is used to stop Esc from exiting the program
return (e == FL_SHORTCUT); // eat all keystrokes
}
@ -515,48 +557,6 @@ int NstGlArea::handle(int e) {
return Fl_Gl_Window::handle(e);
}
static Fl_Menu_Item menutable[] = {
{"&File", FL_ALT + 'f', 0, 0, FL_SUBMENU},
{"Open", 0, fltkui_rom_open, 0, FL_MENU_DIVIDER},
{"Load State...", 0, fltkui_state_load, 0, FL_MENU_INACTIVE},
{"Save State...", 0, fltkui_state_save, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Quick Load", 0, 0, 0, FL_SUBMENU|FL_MENU_INACTIVE},
{"Slot 0", 0, fltkui_state_qload, (void*)"0", FL_MENU_INACTIVE},
{"Slot 1", 0, fltkui_state_qload, (void*)"1", FL_MENU_INACTIVE},
{"Slot 2", 0, fltkui_state_qload, (void*)"2", FL_MENU_INACTIVE},
{"Slot 3", 0, fltkui_state_qload, (void*)"3", FL_MENU_INACTIVE},
{"Slot 4", 0, fltkui_state_qload, (void*)"4", FL_MENU_INACTIVE},
{0},
{"Quick Save", 0, 0, 0, FL_SUBMENU|FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Slot 0", 0, fltkui_state_qsave, (void*)"0", FL_MENU_INACTIVE},
{"Slot 1", 0, fltkui_state_qsave, (void*)"1", FL_MENU_INACTIVE},
{"Slot 2", 0, fltkui_state_qsave, (void*)"2", FL_MENU_INACTIVE},
{"Slot 3", 0, fltkui_state_qsave, (void*)"3", FL_MENU_INACTIVE},
{"Slot 4", 0, fltkui_state_qsave, (void*)"4", FL_MENU_INACTIVE},
{0},
{"Open Palette...", 0, fltkui_palette_open, 0, FL_MENU_DIVIDER},
{"Screenshot...", 0, fltkui_screenshot, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Load Movie...", 0, fltkui_movie_load, 0, FL_MENU_INACTIVE},
{"Record Movie...", 0, fltkui_movie_save, 0, FL_MENU_INACTIVE},
{"Stop Movie", 0, fltkui_movie_stop, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"&Quit", FL_ALT + 'q', FltkUi::quit, 0, 0},
{0}, // End File
{"&Emulator", FL_ALT + 'e', 0, 0, FL_SUBMENU},
{"Pause", 0, fltkui_pause, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Reset (Soft)", 0, fltkui_reset, (void*)"0", FL_MENU_INACTIVE},
{"Reset (Hard)", 0, fltkui_reset, (void*)"1", FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Fullscreen", 0, FltkUi::fullscreen, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Switch Disk Side", 0, fltkui_fds_next, 0, FL_MENU_INACTIVE},
{"Insert/Eject Disk", 0, fltkui_fds_insert, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Cheats...", 0, fltkui_cheats, 0, FL_MENU_DIVIDER|FL_MENU_INACTIVE},
{"Settings...", 0, fltkui_settings, 0, 0},
{0}, // End Emulator
{"&Help", FL_ALT + 'h', 0, 0, FL_SUBMENU},
{"About", 0, FltkUi::about, 0, 0},
{0}, // End Help
{0} // End Menu
};
void FltkUi::enable_menu() {
for (int i = 0; i < menutable[0].size(); ++i) {
menutable[i].activate();
@ -567,12 +567,12 @@ void FltkUi::show_msgbox(bool show) {
setwin->show_msgbox(show);
}
void makenstwin(const char *name) {
void FltkUi::nstwin_open(const char *name) {
int rw, rh;
videomgr->set_dimensions();
videomgr->get_dimensions(&rw, &rh);
Fl::add_handler(handle);
Fl::add_handler(FltkUi::handle);
// Cheats Window
chtwin = new NstChtWindow(720, 500, "Cheat Manager", *chtmgr);
@ -622,7 +622,7 @@ int main(int argc, char *argv[]) {
return 1;
}
int refreshrate = fltkui_refreshrate();
int refreshrate = get_refreshrate();
jgm = new JGManager();
@ -638,7 +638,7 @@ int main(int argc, char *argv[]) {
// Load a rom from the command line
if (argc > 1 && argv[argc - 1][0] != '-') {
fltkui_load_file(argv[argc - 1]);
FltkUi::load_file(argv[argc - 1]);
if (jgm->is_loaded()) {
jg_setup_audio();
jg_setup_video();
@ -649,7 +649,7 @@ int main(int argc, char *argv[]) {
video_fullscreen = 0;
}
makenstwin(argv[0]);
FltkUi::nstwin_open(argv[0]);
if (jgm->is_loaded()) {
nstwin->label(jgm->get_gamename().c_str());

View file

@ -46,4 +46,19 @@ public:
static void quit(Fl_Widget *w = nullptr, void *data = nullptr);
static void about(Fl_Widget *w = nullptr, void *data = nullptr);
static void about_close(Fl_Widget *w = nullptr, void *data = nullptr);
static void rom_open(Fl_Widget *w = nullptr, void *data = nullptr);
static void load_file(const char *filename);
static void fds_next(Fl_Widget *w = nullptr, void *data = nullptr);
static void fds_insert(Fl_Widget *w = nullptr, void *data = nullptr);
static void state_load(Fl_Widget *w = nullptr, void *data = nullptr);
static void state_save(Fl_Widget *w = nullptr, void *data = nullptr);
static void state_qload(Fl_Widget *w = nullptr, void *data = nullptr);
static void state_qsave(Fl_Widget *w = nullptr, void *data = nullptr);
static void pause(Fl_Widget *w = nullptr, void *data = nullptr);
static void reset(Fl_Widget *w = nullptr, void *data = nullptr);
static void palette_open(Fl_Widget *w = nullptr, void *data = nullptr);
static void setwin_open(Fl_Widget *w = nullptr, void *data = nullptr);
static void chtwin_open(Fl_Widget *w = nullptr, void *data = nullptr);
static void nstwin_open(const char *name);
static int handle(int e);
};

View file

@ -250,6 +250,14 @@ void VideoRendererModern::rehash(bool reset_shaders) {
if (reset_shaders) {
shader_setup();
}
// Update uniforms for post-processing
glUniform4f(glGetUniformLocation(shaderprog[1], "sourceSize"),
(float)vidinfo->w, (float)vidinfo->h,
1.0/(float)vidinfo->w, 1.0/(float)vidinfo->h);
glUniform4f(glGetUniformLocation(shaderprog[1], "targetSize"),
dimensions.rw, dimensions.rh,
1.0/dimensions.rw, 1.0/dimensions.rh);
}
// Load a shader source file into memory