// // Created by cbihan on 5/7/21. // #include "Renderer/QtRenderer/QtSFML.hpp" #include "TileViewer.hpp" #include "SNES.hpp" #include #include #include #include "RAMTileRenderer.hpp" #include "PPU/PPU.hpp" namespace ComSquare::Debugger { TileViewer::TileViewer(SNES &snes, ComSquare::PPU::PPU &ppu) : _window(new ClosableWindow([&snes] { snes.disableTileViewer(); })), _snes(snes), _ui(), _ppu(ppu), _ramTileRenderer(ppu.vram, ppu.cgram) { this->_ui.setupUi(this->_window); this->_sfWidget = std::make_unique(this->_ui.widget_sfml); QMainWindow::connect(this->_ui.NbColumns, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setNbColumns(nb); }); QMainWindow::connect(this->_ui.ByteSize, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRenderSize(nb); }); QMainWindow::connect(this->_ui.Address, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRamOffset(nb); }); QMainWindow::connect(this->_ui.PaletteIndex, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setPaletteIndex(nb); }); QMainWindow::connect(this->_ui.BppFormat, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) -> void { this->_bppChangeUIHandler(index); }); // used to setup ui restrictions this->setBpp(this->getBpp()); this->_window->show(); this->internalUpdate(); } void TileViewer::focus() { this->_window->activateWindow(); } uint16_t TileViewer::read(uint8_t addr) { return this->_ppu.cgramRead(addr); } void TileViewer::setPaletteIndex(int paletteIndex) { this->_ramTileRenderer.setPaletteIndex(paletteIndex); this->internalUpdate(); } void TileViewer::setBpp(int bpp) { this->_ui.PaletteIndex->setDisabled(bpp > 4); switch (bpp) { case 8: this->_ui.PaletteIndex->setValue(0); break; case 4: this->_ui.PaletteIndex->setMaximum(15); if (this->_ui.PaletteIndex->value() > 15) { this->_ui.PaletteIndex->setValue(15); } break; case 2: default: bpp = 2; this->_ui.PaletteIndex->setMaximum(63); break; } this->_ramTileRenderer.setBpp(bpp); this->internalUpdate(); } void TileViewer::setNbColumns(int nbColumns) { this->_ramTileRenderer.setNbColumns(nbColumns); this->internalUpdate(); } void TileViewer::setRenderSize(int size) { this->_ramTileRenderer.setRenderSize(size); this->internalUpdate(); } int TileViewer::getBpp() const { return this->_ramTileRenderer.getBpp(); } int TileViewer::getPaletteIndex() const { return this->_ramTileRenderer.getPaletteIndex(); } int TileViewer::getNbColumns() const { return this->_ramTileRenderer.getNbColumns(); } void TileViewer::internalUpdate() { this->_ramTileRenderer.render(); this->_sfWidget->buffer = this->_ramTileRenderer.buffer; } void TileViewer::setRamOffset(int offset) { this->_ramTileRenderer.setRamOffset(offset); this->internalUpdate(); } void TileViewer::_bppChangeUIHandler(int index) { switch (index) { case 0: return this->setBpp(2); case 1: return this->setBpp(4); case 2: return this->setBpp(8); default: throw std::runtime_error("Invalid Index"); } } }