From d5cd21eb0cf45c2906a5e4f6f13720340975e792 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Mon, 14 Mar 2011 22:04:21 +1100 Subject: [PATCH] Update to v076r05 release. byuu says: Changelog: - QMenu::setVisible() does nothing, have to use QMenu::menuAction::setVisible() - improved path system, especially for ST games (states will be /path/to/slotA+notdir(slotB).ext, saves are per-game and per-path) - paths are now valid when you load just the BS-X/ST/SGB BIOSes with no carts inserted; maybe useful for BS-X I guess - removed video filter and pixel shader code from video settings dialog - added Settings->Video Filter and Settings->Video Shader menu lists - fixed the SaI family of filters in lores-mode only; although I don't really know how or why the change fixed them, the code is too vague The menu list for the video filters and shaders are populated from either base/filters and base/shaders, or user/.config/bsnes/filters and user/.config/bsnes/shaders. It tries the first, and if it does not find anything it tries the second, just like the configuration files. That meant doing away with multiple folders for the shaders, so now the shaders have a suffix to indicate what driver uses them, eg "Curvature.OpenGL.shader" and "Sepia.Direct3D.shader" -- probably nicer to use GLSL/HLSL, but using the driver name lets me sub in the currently loaded video driver with no special casing. So the filter if you have eg OpenGL loaded is "*.OpenGL.shader"; and for SDL you get "*.SDL.shader", which will obviously not be there as the non-GL-based SDL driver doesn't support shaders. If there are no filters or no shaders available, the menu options do not show up. The lists are not radio items with active item ticked states just yet, but they will be. --- bsnes/phoenix/qt/action/action.cpp | 2 +- bsnes/phoenix/qt/qt.moc | 34 ++++---- bsnes/snes/cartridge/cartridge.cpp | 2 +- bsnes/snes/cartridge/cartridge.hpp | 11 +-- bsnes/snes/cartridge/xml.cpp | 2 +- bsnes/snes/chip/bsx/cartridge/cartridge.cpp | 4 +- bsnes/snes/chip/msu1/msu1.cpp | 4 +- bsnes/snes/chip/msu1/serialization.cpp | 4 +- bsnes/snes/chip/serial/serial.cpp | 2 +- bsnes/snes/chip/sufamiturbo/sufamiturbo.cpp | 4 +- bsnes/snes/interface/interface.hpp | 2 +- bsnes/snes/snes.hpp | 2 +- bsnes/ui/cartridge/cartridge.cpp | 8 +- bsnes/ui/debugger/console.cpp | 2 +- bsnes/ui/general/main-window.cpp | 85 +++++++++++++++++++ bsnes/ui/general/main-window.hpp | 14 ++++ bsnes/ui/interface.cpp | 4 +- bsnes/ui/interface.hpp | 2 +- bsnes/ui/path/path.cpp | 90 ++++++++++++--------- bsnes/ui/path/path.hpp | 5 +- bsnes/ui/settings/video.cpp | 50 +----------- bsnes/ui/settings/video.hpp | 12 --- bsnes/ui/tools/cheat-editor.cpp | 6 +- bsnes/ui/tools/state-manager.cpp | 6 +- bsnes/ui/utility/utility.cpp | 16 ++-- bsnes/ui/utility/utility.hpp | 2 +- 26 files changed, 215 insertions(+), 160 deletions(-) diff --git a/bsnes/phoenix/qt/action/action.cpp b/bsnes/phoenix/qt/action/action.cpp index c2cbe42b..57036439 100755 --- a/bsnes/phoenix/qt/action/action.cpp +++ b/bsnes/phoenix/qt/action/action.cpp @@ -28,7 +28,7 @@ void pAction::setFont(Font &font) { void pAction::setVisible(bool visible) { if(dynamic_cast(&action)) { - ((Menu&)action).p.qtMenu->setVisible(visible); + ((Menu&)action).p.qtMenu->menuAction()->setVisible(visible); } else if(dynamic_cast(&action)) { ((Separator&)action).p.qtAction->setVisible(visible); } else if(dynamic_cast(&action)) { diff --git a/bsnes/phoenix/qt/qt.moc b/bsnes/phoenix/qt/qt.moc index 8e1a40fe..748714e1 100755 --- a/bsnes/phoenix/qt/qt.moc +++ b/bsnes/phoenix/qt/qt.moc @@ -1,8 +1,8 @@ /**************************************************************************** ** Meta object code from reading C++ file 'qt.moc.hpp' ** -** Created: Thu Feb 24 07:36:07 2011 -** by: The Qt Meta Object Compiler version 62 (Qt 4.6.2) +** Created: Sun Mar 13 14:53:22 2011 +** by: The Qt Meta Object Compiler version 62 (Qt 4.7.0) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ @@ -10,7 +10,7 @@ #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'qt.moc.hpp' doesn't include ." #elif Q_MOC_OUTPUT_REVISION != 62 -#error "This file was generated using the moc from 4.6.2. It" +#error "This file was generated using the moc from 4.7.0. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif @@ -19,7 +19,7 @@ QT_BEGIN_MOC_NAMESPACE static const uint qt_meta_data_pWindow[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 0, 0, // methods @@ -70,7 +70,7 @@ int pWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pItem[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -131,7 +131,7 @@ int pItem::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pCheckItem[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -192,7 +192,7 @@ int pCheckItem::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pRadioItem[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -253,7 +253,7 @@ int pRadioItem::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pButton[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -314,7 +314,7 @@ int pButton::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pCheckBox[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -375,7 +375,7 @@ int pCheckBox::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pComboBox[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -436,7 +436,7 @@ int pComboBox::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pHexEdit[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -497,7 +497,7 @@ int pHexEdit::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pHorizontalSlider[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -558,7 +558,7 @@ int pHorizontalSlider::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pLineEdit[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 2, 14, // methods @@ -621,7 +621,7 @@ int pLineEdit::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pListView[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 3, 14, // methods @@ -687,7 +687,7 @@ int pListView::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pRadioBox[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -748,7 +748,7 @@ int pRadioBox::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pTextEdit[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods @@ -809,7 +809,7 @@ int pTextEdit::qt_metacall(QMetaObject::Call _c, int _id, void **_a) static const uint qt_meta_data_pVerticalSlider[] = { // content: - 4, // revision + 5, // revision 0, // classname 0, 0, // classinfo 1, 14, // methods diff --git a/bsnes/snes/cartridge/cartridge.cpp b/bsnes/snes/cartridge/cartridge.cpp index 9ff241c5..db47d958 100755 --- a/bsnes/snes/cartridge/cartridge.cpp +++ b/bsnes/snes/cartridge/cartridge.cpp @@ -37,7 +37,7 @@ void Cartridge::load(Mode cartridge_mode, const lstring &xml_list) { if(ram_size > 0) { ram.map(allocate(ram_size, 0xff), ram_size); - nvram.append({ "srm", ram.data(), ram.size() }); + nvram.append({ ".srm", ram.data(), ram.size() }); } rom.write_protect(true); diff --git a/bsnes/snes/cartridge/cartridge.hpp b/bsnes/snes/cartridge/cartridge.hpp index 3e0d682e..ac70b909 100755 --- a/bsnes/snes/cartridge/cartridge.hpp +++ b/bsnes/snes/cartridge/cartridge.hpp @@ -13,9 +13,10 @@ public: PAL, }; - enum class Slot : unsigned { + enum class Path : unsigned { Base, Bsx, + SufamiTurbo, SufamiTurboA, SufamiTurboB, GameBoy, @@ -54,10 +55,10 @@ public: const string id; uint8_t *data; unsigned size; - Slot slot; - NonVolatileRAM() : id(""), data(0), size(0), slot(Slot::Base) {} - NonVolatileRAM(const string id, uint8_t *data, unsigned size, Slot slot = Slot::Base) - : id(id), data(data), size(size), slot(slot) {} + Path path; + NonVolatileRAM() : id(""), data(0), size(0), path(Path::Base) {} + NonVolatileRAM(const string id, uint8_t *data, unsigned size, Path path = Path::Base) + : id(id), data(data), size(size), path(path) {} }; linear_vector nvram; diff --git a/bsnes/snes/cartridge/xml.cpp b/bsnes/snes/cartridge/xml.cpp index 488bdc33..5af51493 100755 --- a/bsnes/snes/cartridge/xml.cpp +++ b/bsnes/snes/cartridge/xml.cpp @@ -274,7 +274,7 @@ void Cartridge::xml_parse_necdsp(xml_element &root) { unsigned filesize = promsize * 3 + dromsize * 2; file fp; - if(fp.open(system.interface->path(Slot::NECDSP, program), file::mode::read)) { + if(fp.open(system.interface->path(Path::NECDSP, program), file::mode::read)) { if(fp.size() == filesize) { for(unsigned n = 0; n < promsize; n++) necdsp.programROM[n] = fp.readm(3); for(unsigned n = 0; n < dromsize; n++) necdsp.dataROM[n] = fp.readm(2); diff --git a/bsnes/snes/chip/bsx/cartridge/cartridge.cpp b/bsnes/snes/chip/bsx/cartridge/cartridge.cpp index 3de27508..ade0f11d 100755 --- a/bsnes/snes/chip/bsx/cartridge/cartridge.cpp +++ b/bsnes/snes/chip/bsx/cartridge/cartridge.cpp @@ -8,11 +8,11 @@ void BSXCartridge::init() { void BSXCartridge::load() { sram.map(allocate(32 * 1024, 0xff), 32 * 1024); sram.write_protect(false); - cartridge.nvram.append({ "bss", sram.data(), sram.size() }); + cartridge.nvram.append({ ".bss", sram.data(), sram.size() }); psram.map(allocate(512 * 1024, 0xff), 512 * 1024); psram.write_protect(false); - cartridge.nvram.append({ "bsp", psram.data(), psram.size() }); + cartridge.nvram.append({ ".bsp", psram.data(), psram.size() }); } void BSXCartridge::unload() { diff --git a/bsnes/snes/chip/msu1/msu1.cpp b/bsnes/snes/chip/msu1/msu1.cpp index cc27244f..ad9e3fe5 100755 --- a/bsnes/snes/chip/msu1/msu1.cpp +++ b/bsnes/snes/chip/msu1/msu1.cpp @@ -50,7 +50,7 @@ void MSU1::init() { void MSU1::load() { if(datafile.open()) datafile.close(); - datafile.open(system.interface->path(Cartridge::Slot::MSU1, ".msu"), file::mode::read); + datafile.open(system.interface->path(Cartridge::Path::MSU1, ".msu"), file::mode::read); } void MSU1::unload() { @@ -133,7 +133,7 @@ void MSU1::mmio_write(unsigned addr, uint8 data) { if(addr == 0x2005) { mmio.audio_track = (mmio.audio_track & 0x00ff) | (data << 8); if(audiofile.open()) audiofile.close(); - if(audiofile.open(system.interface->path(Cartridge::Slot::MSU1, { "-", (unsigned)mmio.audio_track, ".pcm" }), file::mode::read)) { + if(audiofile.open(system.interface->path(Cartridge::Path::MSU1, { "-", (unsigned)mmio.audio_track, ".pcm" }), file::mode::read)) { uint32 header = audiofile.readm(4); if(header != 0x4d535531) { //verify 'MSU1' header audiofile.close(); diff --git a/bsnes/snes/chip/msu1/serialization.cpp b/bsnes/snes/chip/msu1/serialization.cpp index e01f3a39..24b85a91 100755 --- a/bsnes/snes/chip/msu1/serialization.cpp +++ b/bsnes/snes/chip/msu1/serialization.cpp @@ -16,12 +16,12 @@ void MSU1::serialize(serializer &s) { s.integer(mmio.audio_play); if(datafile.open()) datafile.close(); - if(datafile.open(system.interface->path(Cartridge::Slot::MSU1, ".msu"), file::mode::read)) { + if(datafile.open(system.interface->path(Cartridge::Path::MSU1, ".msu"), file::mode::read)) { datafile.seek(mmio.data_offset); } if(audiofile.open()) audiofile.close(); - if(audiofile.open(system.interface->path(Cartridge::Slot::MSU1, { "-", (unsigned)mmio.audio_track, ".pcm" }), file::mode::read)) { + if(audiofile.open(system.interface->path(Cartridge::Path::MSU1, { "-", (unsigned)mmio.audio_track, ".pcm" }), file::mode::read)) { audiofile.seek(mmio.audio_offset); } } diff --git a/bsnes/snes/chip/serial/serial.cpp b/bsnes/snes/chip/serial/serial.cpp index 1fee5b2e..96ed1700 100755 --- a/bsnes/snes/chip/serial/serial.cpp +++ b/bsnes/snes/chip/serial/serial.cpp @@ -79,7 +79,7 @@ void Serial::init() { void Serial::load() { if(opened()) close(); - string basename = system.interface->path(Cartridge::Slot::Serial, ""); + string basename = system.interface->path(Cartridge::Path::Serial, ""); string name = notdir(basename); string path = dir(basename); if(open(name, path)) { diff --git a/bsnes/snes/chip/sufamiturbo/sufamiturbo.cpp b/bsnes/snes/chip/sufamiturbo/sufamiturbo.cpp index 33ebb8ef..1ee8779a 100755 --- a/bsnes/snes/chip/sufamiturbo/sufamiturbo.cpp +++ b/bsnes/snes/chip/sufamiturbo/sufamiturbo.cpp @@ -11,13 +11,13 @@ void SufamiTurbo::load() { slotB.ram.map(allocate(128 * 1024, 0xff), 128 * 1024); if(slotA.rom.data()) { - cartridge.nvram.append({ "sts", slotA.ram.data(), slotA.ram.size(), Cartridge::Slot::SufamiTurboA }); + cartridge.nvram.append({ ".sts", slotA.ram.data(), slotA.ram.size(), Cartridge::Path::SufamiTurboA }); } else { slotA.rom.map(allocate(128 * 1024, 0xff), 128 * 1024); } if(slotB.rom.data()) { - cartridge.nvram.append({ "sts", slotB.ram.data(), slotB.ram.size(), Cartridge::Slot::SufamiTurboB }); + cartridge.nvram.append({ ".sts", slotB.ram.data(), slotB.ram.size(), Cartridge::Path::SufamiTurboB }); } else { slotB.rom.map(allocate(128 * 1024, 0xff), 128 * 1024); } diff --git a/bsnes/snes/interface/interface.hpp b/bsnes/snes/interface/interface.hpp index 71aabe7c..3a413152 100755 --- a/bsnes/snes/interface/interface.hpp +++ b/bsnes/snes/interface/interface.hpp @@ -6,5 +6,5 @@ public: virtual int16_t input_poll(bool port, Input::Device device, unsigned index, unsigned id) { return 0; } virtual void message(const string &text) { print(text, "\n"); } - virtual string path(Cartridge::Slot slot, const string &path) { return path; }; + virtual string path(Cartridge::Path path, const string &hint) { return hint; }; }; diff --git a/bsnes/snes/snes.hpp b/bsnes/snes/snes.hpp index a69d84ca..fc5c5c16 100755 --- a/bsnes/snes/snes.hpp +++ b/bsnes/snes/snes.hpp @@ -1,7 +1,7 @@ namespace SNES { namespace Info { static const char Name[] = "bsnes"; - static const char Version[] = "076.04"; + static const char Version[] = "076.05"; static const unsigned SerializerVersion = 18; } } diff --git a/bsnes/ui/cartridge/cartridge.cpp b/bsnes/ui/cartridge/cartridge.cpp index 81852e8b..2eca6bda 100755 --- a/bsnes/ui/cartridge/cartridge.cpp +++ b/bsnes/ui/cartridge/cartridge.cpp @@ -73,7 +73,7 @@ bool Cartridge::loadSuperGameBoy(const char *basename, const char *slotname) { SNES::cartridge.load(SNES::Cartridge::Mode::SuperGameBoy, { baseXML, "" }); foreach(memory, SNES::cartridge.nvram) loadMemory(memory); - if(GameBoy::cartridge.info.battery && fp.open(path.load(SNES::Cartridge::Slot::GameBoy, "sav"), file::mode::read)) { + if(GameBoy::cartridge.info.battery && fp.open(path.load(SNES::Cartridge::Path::GameBoy, ".sav"), file::mode::read)) { fp.read(GameBoy::cartridge.ramdata, min(GameBoy::cartridge.ramsize, fp.size())); fp.close(); } @@ -89,7 +89,7 @@ void Cartridge::unload() { foreach(memory, SNES::cartridge.nvram) saveMemory(memory); if(SNES::cartridge.mode() == SNES::Cartridge::Mode::SuperGameBoy) { file fp; - if(GameBoy::cartridge.info.battery && fp.open(path.load(SNES::Cartridge::Slot::GameBoy, "sav"), file::mode::write)) { + if(GameBoy::cartridge.info.battery && fp.open(path.load(SNES::Cartridge::Path::GameBoy, ".sav"), file::mode::write)) { fp.write(GameBoy::cartridge.ramdata, GameBoy::cartridge.ramsize); fp.close(); } @@ -133,7 +133,7 @@ bool Cartridge::loadCartridge(SNES::MappedRAM &memory, string &XML, const char * bool Cartridge::loadMemory(SNES::Cartridge::NonVolatileRAM &memory) { if(memory.size == 0) return true; - string filename = path.load(memory.slot, memory.id); + string filename = path.load(memory.path, memory.id); file fp; if(fp.open(filename, file::mode::read) == false) return false; fp.read(memory.data, min(memory.size, fp.size())); @@ -143,7 +143,7 @@ bool Cartridge::loadMemory(SNES::Cartridge::NonVolatileRAM &memory) { bool Cartridge::saveMemory(SNES::Cartridge::NonVolatileRAM &memory) { if(memory.size == 0) return true; - string filename = path.load(memory.slot, memory.id); + string filename = path.load(memory.path, memory.id); file fp; if(fp.open(filename, file::mode::write) == false) return false; fp.write(memory.data, memory.size); diff --git a/bsnes/ui/debugger/console.cpp b/bsnes/ui/debugger/console.cpp index 996eab75..fcbe6518 100755 --- a/bsnes/ui/debugger/console.cpp +++ b/bsnes/ui/debugger/console.cpp @@ -54,7 +54,7 @@ void Console::write(const string &text, bool echo) { void Console::tracerEnable(bool state) { if(state == true) { - logfile.open(path.load(SNES::Cartridge::Slot::Base, "log"), file::mode::write); + logfile.open(path.load(SNES::Cartridge::Slot::Base, ".log"), file::mode::write); } else { logfile.close(); } diff --git a/bsnes/ui/general/main-window.cpp b/bsnes/ui/general/main-window.cpp index b64bf681..785e084f 100755 --- a/bsnes/ui/general/main-window.cpp +++ b/bsnes/ui/general/main-window.cpp @@ -126,6 +126,24 @@ void MainWindow::create() { settingsVideoModePAL.setText("PAL"); settingsVideoMode.append(settingsVideoModePAL); + settingsVideoFilter.setText("Video Filter"); + settings.append(settingsVideoFilter); + + settingsVideoFilterNone.setText("None"); + settingsVideoFilter.append(settingsVideoFilterNone); + + settingsVideoFilter.append(settingsVideoFilterSeparator); + + settingsVideoShader.setText("Video Shader"); + settings.append(settingsVideoShader); + + settingsVideoShaderNone.setText("None"); + settingsVideoShader.append(settingsVideoShaderNone); + + settingsVideoShader.append(settingsVideoShaderSeparator); + + setupFiltersAndShaders(); + RadioItem::group( settingsVideoModeNTSC, settingsVideoModePAL ); @@ -302,6 +320,16 @@ void MainWindow::create() { settingsVideoModeNTSC.onTick = []() { config.video.region = 0; utility.setScale(); }; settingsVideoModePAL.onTick = []() { config.video.region = 1; utility.setScale(); }; + settingsVideoFilterNone.onTick = []() { + config.video.filter = ""; + utility.setFilter(); + }; + + settingsVideoShaderNone.onTick = []() { + config.video.shader = ""; + utility.setShader(); + }; + settingsSmoothVideo.onTick = []() { config.video.smooth = mainWindow.settingsSmoothVideo.checked(); video.set(Video::Filter, (unsigned)config.video.smooth); @@ -373,3 +401,60 @@ void MainWindow::synchronize() { toolsStateLoad.setEnabled(true); } } + +void MainWindow::setupFiltersAndShaders() { + string folderPath; + lstring files; + + folderPath = { path.base, "filters/" }; + files = directory::files(folderPath, "*.filter"); + if(files.size() == 0) { + folderPath = { path.user, ".config/bsnes/filters/" }; + files = directory::files(folderPath, "*.filter"); + } + foreach(filename, files) { + settingsVideoFilterName.append({ folderPath, filename }); + } + + if(settingsVideoFilterName.size() == 0) { + settingsVideoFilter.setVisible(false); + config.video.filter = ""; //as the list (and thus the 'None' option) is invisible, + utility.setFilter(); //erase any previously saved filter name + } else { + settingsVideoFilterItem = new Item[settingsVideoFilterName.size()]; + foreach(filename, settingsVideoFilterName, n) { + settingsVideoFilterItem[n].onTick = [n]() { + config.video.filter = mainWindow.settingsVideoFilterName[n]; + utility.setFilter(); + }; + settingsVideoFilterItem[n].setText(nall::basename(notdir(filename))); + settingsVideoFilter.append(settingsVideoFilterItem[n]); + } + } + + folderPath = { path.base, "shaders/" }; + files = directory::files(folderPath, { "*.", config.video.driver, ".shader" }); + if(files.size() == 0) { + folderPath = { path.user, ".config/bsnes/shaders/" }; + files = directory::files(folderPath, { "*.", config.video.driver, ".shader" }); + } + foreach(filename, files) { + settingsVideoShaderName.append({ folderPath, filename }); + } + + if(settingsVideoShaderName.size() == 0) { + settingsVideoShader.setVisible(false); + config.video.shader = ""; + utility.setShader(); + } else { + settingsVideoShaderItem = new Item[settingsVideoShaderName.size()]; + foreach(filename, settingsVideoShaderName, n) { + settingsVideoShaderItem[n].onTick = [n]() { + config.video.shader = mainWindow.settingsVideoShaderName[n]; + utility.setShader(); + }; + settingsVideoShaderItem[n].setText(nall::basename(nall::basename(notdir(filename)))); + settingsVideoShader.append(settingsVideoShaderItem[n]); + } + } +} diff --git a/bsnes/ui/general/main-window.hpp b/bsnes/ui/general/main-window.hpp index c6a5b1d6..26faf689 100755 --- a/bsnes/ui/general/main-window.hpp +++ b/bsnes/ui/general/main-window.hpp @@ -36,6 +36,19 @@ struct MainWindow : TopLevelWindow { Separator settingsVideoModeSeparator2; RadioItem settingsVideoModeNTSC; RadioItem settingsVideoModePAL; + + Menu settingsVideoFilter; + Item settingsVideoFilterNone; + Separator settingsVideoFilterSeparator; + Item *settingsVideoFilterItem; + lstring settingsVideoFilterName; + + Menu settingsVideoShader; + Item settingsVideoShaderNone; + Separator settingsVideoShaderSeparator; + Item *settingsVideoShaderItem; + lstring settingsVideoShaderName; + CheckItem settingsSmoothVideo; Separator settingsSeparator1; CheckItem settingsSynchronizeVideo; @@ -76,6 +89,7 @@ struct MainWindow : TopLevelWindow { void create(); void synchronize(); + void setupFiltersAndShaders(); }; extern MainWindow mainWindow; diff --git a/bsnes/ui/interface.cpp b/bsnes/ui/interface.cpp index fabeb003..8611b1ed 100755 --- a/bsnes/ui/interface.cpp +++ b/bsnes/ui/interface.cpp @@ -138,6 +138,6 @@ void Interface::message(const string &text) { MessageWindow::information(mainWindow, text); } -string Interface::path(SNES::Cartridge::Slot slot, const string &pathname) { - return ::path.load(slot, pathname); +string Interface::path(SNES::Cartridge::Path path, const string &hint) { + return ::path.load(path, hint); } diff --git a/bsnes/ui/interface.hpp b/bsnes/ui/interface.hpp index 321a87f9..94430970 100755 --- a/bsnes/ui/interface.hpp +++ b/bsnes/ui/interface.hpp @@ -21,7 +21,7 @@ struct Interface : public SNES::Interface { int16_t input_poll(bool port, SNES::Input::Device device, unsigned index, unsigned id); void message(const string &text); - string path(SNES::Cartridge::Slot slot, const string &path); + string path(SNES::Cartridge::Path path, const string &hint); }; extern Palette palette; diff --git a/bsnes/ui/path/path.cpp b/bsnes/ui/path/path.cpp index 0b8e0cf2..583a1bfa 100755 --- a/bsnes/ui/path/path.cpp +++ b/bsnes/ui/path/path.cpp @@ -27,9 +27,6 @@ string Path::load(const string &path) { if(path == "st") value = st; if(path == "gb") value = gb; - if(path == "filter") value = filter; - if(path == "shader") value = shader; - if(value.beginswith("recent/")) value.ltrim<1>("recent/"); if(value == "") value = base; return value; @@ -43,9 +40,6 @@ void Path::save(const string &path, const string &value) { if(path == "st") output = &st; if(path == "gb") output = &gb; - if(path == "filter") output = &filter; - if(path == "shader") output = &shader; - if(output) { string &s = *output; if(s.beginswith("recent/") == false && s != "") return; @@ -54,36 +48,63 @@ void Path::save(const string &path, const string &value) { } } -string Path::load(SNES::Cartridge::Slot slot, const string &type, const string &suffix) { +string Path::load(SNES::Cartridge::Path pathHint, const string &hint) { string romPath; - switch(slot) { - case SNES::Cartridge::Slot::Base: romPath = cartridge.baseName; break; - case SNES::Cartridge::Slot::Bsx: romPath = cartridge.bsxName; break; - case SNES::Cartridge::Slot::SufamiTurboA: romPath = cartridge.sufamiTurboAName; break; - case SNES::Cartridge::Slot::SufamiTurboB: romPath = cartridge.sufamiTurboBName; break; - case SNES::Cartridge::Slot::GameBoy: romPath = cartridge.gameBoyName; break; + switch(pathHint) { + case SNES::Cartridge::Path::Base: { + romPath = cartridge.baseName; + break; + } + case SNES::Cartridge::Path::Bsx: { + romPath = cartridge.bsxName != "" ? cartridge.bsxName : cartridge.baseName; + break; + } + case SNES::Cartridge::Path::SufamiTurbo: { + if(cartridge.sufamiTurboAName == "" && cartridge.sufamiTurboBName == "") { + romPath = cartridge.baseName; + } else if(cartridge.sufamiTurboAName != "" && cartridge.sufamiTurboBName == "") { + romPath = cartridge.sufamiTurboAName; + } else if(cartridge.sufamiTurboAName == "" && cartridge.sufamiTurboBName != "") { + romPath = cartridge.sufamiTurboBName; + } else { + romPath = { cartridge.sufamiTurboAName, "+", notdir(cartridge.sufamiTurboBName) }; + } + break; + } + case SNES::Cartridge::Path::SufamiTurboA: { + romPath = cartridge.sufamiTurboAName != "" ? cartridge.sufamiTurboAName : cartridge.baseName; + break; + } + case SNES::Cartridge::Path::SufamiTurboB: { + romPath = cartridge.sufamiTurboBName != "" ? cartridge.sufamiTurboBName : cartridge.baseName; + break; + } + case SNES::Cartridge::Path::GameBoy: { + romPath = cartridge.gameBoyName != "" ? cartridge.gameBoyName : cartridge.baseName; + break; + } - case SNES::Cartridge::Slot::NECDSP: romPath = cartridge.baseName; break; - case SNES::Cartridge::Slot::MSU1: romPath = cartridge.baseName; break; - case SNES::Cartridge::Slot::Serial: romPath = cartridge.baseName; break; + case SNES::Cartridge::Path::NECDSP: romPath = cartridge.baseName; break; + case SNES::Cartridge::Path::MSU1: romPath = cartridge.baseName; break; + case SNES::Cartridge::Path::Serial: romPath = cartridge.baseName; break; } string path = romPath; - if(slot == SNES::Cartridge::Slot::NECDSP && necdsp != "") path = necdsp; - if(slot == SNES::Cartridge::Slot::MSU1 && msu1 != "") path = string(msu1, notdir(path)); - if(slot == SNES::Cartridge::Slot::Serial && serial != "") path = string(serial, notdir(path)); + if(pathHint == SNES::Cartridge::Path::NECDSP && necdsp != "") path = necdsp; + if(pathHint == SNES::Cartridge::Path::MSU1 && msu1 != "") path = string(msu1, notdir(path)); + if(pathHint == SNES::Cartridge::Path::Serial && serial != "") path = string(serial, notdir(path)); - if(type == "srm" && srm != "") path = string(srm, notdir(path)); - if(type == "bsp" && bsp != "") path = string(bsp, notdir(path)); - if(type == "bss" && bss != "") path = string(bss, notdir(path)); - if(type == "sts" && sts != "") path = string(sts, notdir(path)); - if(type == "sav" && sav != "") path = string(sav, notdir(path)); - if(type == "rtc" && rtc != "") path = string(rtc, notdir(path)); + if(hint == ".srm" && srm != "") path = string(srm, notdir(path)); + if(hint == ".bsp" && bsp != "") path = string(bsp, notdir(path)); + if(hint == ".bss" && bss != "") path = string(bss, notdir(path)); + if(hint == ".sts" && sts != "") path = string(sts, notdir(path)); + if(hint == ".sav" && sav != "") path = string(sav, notdir(path)); + if(hint == ".rtc" && rtc != "") path = string(rtc, notdir(path)); - if(type == "bsa" && bsa != "") path = string(bsa, notdir(path)); - if(type == "bst" && bst != "") path = string(bst, notdir(path)); - if(type == "cht" && cht != "") path = string(cht, notdir(path)); - if(type == "log" && log != "") path = string(log, notdir(path)); + if(hint == ".bsa" && bsa != "") path = string(bsa, notdir(path)); + if(hint.endswith(".bst") && bst != "") path = string(bst, notdir(path)); + if(hint == ".cht" && cht != "") path = string(cht, notdir(path)); + if(hint == ".log" && log != "") path = string(log, notdir(path)); if(path.beginswith("user/")) { path.ltrim<1>("user/"); @@ -105,11 +126,11 @@ string Path::load(SNES::Cartridge::Slot slot, const string &type, const string & path = string(dir(base), path); } - if(slot == SNES::Cartridge::Slot::NECDSP) return { dir(path), type }; - if(slot == SNES::Cartridge::Slot::MSU1) return { path, type }; - if(slot == SNES::Cartridge::Slot::Serial) return { path, type }; + if(pathHint == SNES::Cartridge::Path::NECDSP) return { dir(path), hint }; + if(pathHint == SNES::Cartridge::Path::MSU1) return { path, hint }; + if(pathHint == SNES::Cartridge::Path::Serial) return { path, hint }; - return { path, suffix, ".", type }; + return { path, hint }; } void Path::load() { @@ -126,9 +147,6 @@ Path::Path() { attach(st = "", "st"); attach(gb = "", "gb"); - attach(filter = "", "filter"); - attach(shader = "", "shader"); - attach(satellaviewBios = "", "satellaviewBios"); attach(sufamiTurboBios = "", "sufamiTurboBios"); attach(superGameBoyBios = "", "superGameBoyBios"); diff --git a/bsnes/ui/path/path.hpp b/bsnes/ui/path/path.hpp index 54a54d1a..b61698c0 100755 --- a/bsnes/ui/path/path.hpp +++ b/bsnes/ui/path/path.hpp @@ -7,9 +7,6 @@ struct Path : public configuration { string st; string gb; - string filter; - string shader; - string satellaviewBios; string sufamiTurboBios; string superGameBoyBios; @@ -33,7 +30,7 @@ struct Path : public configuration { string home(const string &filename); string load(const string &path); void save(const string &path, const string &value); - string load(SNES::Cartridge::Slot slot, const string &type, const string &suffix = ""); + string load(SNES::Cartridge::Path path, const string &hint); void load(); void save(); diff --git a/bsnes/ui/settings/video.cpp b/bsnes/ui/settings/video.cpp index cd175f5c..f7de6f2a 100755 --- a/bsnes/ui/settings/video.cpp +++ b/bsnes/ui/settings/video.cpp @@ -19,16 +19,6 @@ void VideoSettings::create() { fullscreenScale.setText("Scale"); fullscreenStretch.setText("Stretch"); RadioBox::group(fullscreenCenter, fullscreenScale, fullscreenStretch); - filterLabel.setText("Video Filter :."); - filterLabel.setFont(application.proportionalFontBold); - filterPath.setEditable(false); - filterPath.setText(config.video.filter); - filterSelect.setText("..."); - shaderLabel.setText("Pixel Shader :."); - shaderLabel.setFont(application.proportionalFontBold); - shaderPath.setEditable(false); - shaderPath.setText(config.video.shader); - shaderSelect.setText("..."); layout.setMargin(5); layout.append(colorAdjustmentLabel, 0, Style::LabelHeight); @@ -49,17 +39,7 @@ void VideoSettings::create() { fullscreenLayout.append(fullscreenCenter, 0, 0); fullscreenLayout.append(fullscreenScale, 0, 0); fullscreenLayout.append(fullscreenStretch, 0, 0); - layout.append(fullscreenLayout, 0, Style::CheckBoxHeight, 5); - layout.append(filterLabel, 0, Style::LabelHeight); - filterLayout.append(filterPath, 0, 0, 5); - filterLayout.append(filterClear, Style::LineEditHeight, 0, 5); - filterLayout.append(filterSelect, Style::LineEditHeight, 0); - layout.append(filterLayout, 0, Style::LineEditHeight, 5); - layout.append(shaderLabel, 0, Style::LabelHeight); - shaderLayout.append(shaderPath, 0, 0, 5); - shaderLayout.append(shaderClear, Style::LineEditHeight, 0, 5); - shaderLayout.append(shaderSelect, Style::LineEditHeight, 0); - layout.append(shaderLayout, 0, Style::LineEditHeight); + layout.append(fullscreenLayout, 0, Style::CheckBoxHeight); setGeometry({ 0, 0, 480, layout.minimumHeight() }); append(layout); @@ -87,34 +67,6 @@ void VideoSettings::create() { fullscreenCenter.onTick = []() { config.video.fullscreenScale = 0; }; fullscreenScale.onTick = []() { config.video.fullscreenScale = 1; }; fullscreenStretch.onTick = []() { config.video.fullscreenScale = 2; }; - - filterClear.onTick = []() { - config.video.filter = ""; - videoSettings.filterPath.setText(config.video.filter); - utility.setFilter(); - }; - - filterSelect.onTick = []() { - fileBrowser.fileOpen(FileBrowser::Mode::Filter, [](string filename) { - config.video.filter = filename; - videoSettings.filterPath.setText(config.video.filter); - utility.setFilter(); - }); - }; - - shaderClear.onTick = []() { - config.video.shader = ""; - videoSettings.shaderPath.setText(config.video.shader); - utility.setShader(); - }; - - shaderSelect.onTick = []() { - fileBrowser.fileOpen(FileBrowser::Mode::Shader, [](string filename) { - config.video.shader = filename; - videoSettings.shaderPath.setText(config.video.shader); - utility.setShader(); - }); - }; } void VideoSettings::adjust() { diff --git a/bsnes/ui/settings/video.hpp b/bsnes/ui/settings/video.hpp index 821c861b..15c6eabb 100755 --- a/bsnes/ui/settings/video.hpp +++ b/bsnes/ui/settings/video.hpp @@ -25,18 +25,6 @@ struct VideoSettings : TopLevelWindow { RadioBox fullscreenScale; RadioBox fullscreenStretch; - Label filterLabel; - HorizontalLayout filterLayout; - LineEdit filterPath; - Button filterClear; - Button filterSelect; - - Label shaderLabel; - HorizontalLayout shaderLayout; - LineEdit shaderPath; - Button shaderClear; - Button shaderSelect; - void create(); void adjust(); }; diff --git a/bsnes/ui/tools/cheat-editor.cpp b/bsnes/ui/tools/cheat-editor.cpp index 61f51896..7cb5798b 100755 --- a/bsnes/ui/tools/cheat-editor.cpp +++ b/bsnes/ui/tools/cheat-editor.cpp @@ -12,7 +12,7 @@ void CheatEditor::load() { unsigned n = 0; string data; - data.readfile(path.load(utility.stateSlot(), "cht")); + data.readfile(path.load(utility.slotPath(), ".cht")); xml_element document = xml_parse(data); foreach(head, document.element) { if(head.name == "cartridge") { @@ -52,12 +52,12 @@ void CheatEditor::save() { } } if(lastSave == -1) { - unlink(path.load(utility.stateSlot(), "cht")); + unlink(path.load(utility.slotPath(), ".cht")); return; } file fp; - if(fp.open(path.load(utility.stateSlot(), "cht"), file::mode::write)) { + if(fp.open(path.load(utility.slotPath(), ".cht"), file::mode::write)) { fp.print("\n"); fp.print(string("\n")); for(unsigned i = 0; i <= lastSave; i++) { diff --git a/bsnes/ui/tools/state-manager.cpp b/bsnes/ui/tools/state-manager.cpp index af4c37a3..3ebbf2cb 100755 --- a/bsnes/ui/tools/state-manager.cpp +++ b/bsnes/ui/tools/state-manager.cpp @@ -60,7 +60,7 @@ void StateManager::load() { } file fp; - if(fp.open(path.load(utility.stateSlot(), "bsa"), file::mode::read)) { + if(fp.open(path.load(utility.slotPath(), ".bsa"), file::mode::read)) { if(fp.readl(4) == 0x31415342) { if(fp.readl(4) == SNES::Info::SerializerVersion) { for(unsigned i = 0; i < 32; i++) { @@ -84,10 +84,10 @@ void StateManager::save() { } if(hasSave == false) { - unlink(path.load(utility.stateSlot(), "bsa")); + unlink(path.load(utility.slotPath(), ".bsa")); } else { file fp; - if(fp.open(path.load(utility.stateSlot(), "bsa"), file::mode::write)) { + if(fp.open(path.load(utility.slotPath(), ".bsa"), file::mode::write)) { fp.writel(0x31415342, 4); //'BSA1' fp.writel(SNES::Info::SerializerVersion, 4); diff --git a/bsnes/ui/utility/utility.cpp b/bsnes/ui/utility/utility.cpp index 28e6802f..911866c6 100755 --- a/bsnes/ui/utility/utility.cpp +++ b/bsnes/ui/utility/utility.cpp @@ -167,16 +167,16 @@ void Utility::cartridgeUnloaded() { mainWindow.synchronize(); } -SNES::Cartridge::Slot Utility::stateSlot() { - SNES::Cartridge::Slot slot = SNES::Cartridge::Slot::Base; - if(SNES::cartridge.mode() == SNES::Cartridge::Mode::Bsx) slot = SNES::Cartridge::Slot::Bsx; - if(SNES::cartridge.mode() == SNES::Cartridge::Mode::SufamiTurbo) slot = SNES::Cartridge::Slot::SufamiTurboA; - if(SNES::cartridge.mode() == SNES::Cartridge::Mode::SuperGameBoy) slot = SNES::Cartridge::Slot::GameBoy; - return slot; +SNES::Cartridge::Path Utility::slotPath() { + SNES::Cartridge::Path path = SNES::Cartridge::Path::Base; + if(SNES::cartridge.mode() == SNES::Cartridge::Mode::Bsx) path = SNES::Cartridge::Path::Bsx; + if(SNES::cartridge.mode() == SNES::Cartridge::Mode::SufamiTurbo) path = SNES::Cartridge::Path::SufamiTurbo; + if(SNES::cartridge.mode() == SNES::Cartridge::Mode::SuperGameBoy) path = SNES::Cartridge::Path::GameBoy; + return path; } void Utility::saveState(unsigned slot) { - string filename = path.load(stateSlot(), "bst", { "-", slot }); + string filename = path.load(slotPath(), { "-", slot, ".bst" }); SNES::system.runtosave(); serializer s = SNES::system.serialize(); file fp; @@ -190,7 +190,7 @@ void Utility::saveState(unsigned slot) { } void Utility::loadState(unsigned slot) { - string filename = path.load(stateSlot(), "bst", { "-", slot }); + string filename = path.load(slotPath(), { "-", slot, ".bst" }); file fp; if(fp.open(filename, file::mode::read)) { unsigned size = fp.size(); diff --git a/bsnes/ui/utility/utility.hpp b/bsnes/ui/utility/utility.hpp index 4fd75551..35dcf402 100755 --- a/bsnes/ui/utility/utility.hpp +++ b/bsnes/ui/utility/utility.hpp @@ -15,7 +15,7 @@ struct Utility : property { void cartridgeLoaded(); void cartridgeUnloaded(); - SNES::Cartridge::Slot stateSlot(); + SNES::Cartridge::Path slotPath(); void saveState(unsigned slot); void loadState(unsigned slot);