Files
ComSquare/sources/Debugger/TileViewer/RAMTileRenderer.cpp
2021-07-26 17:24:54 +02:00

108 lines
2.4 KiB
C++

//
// Created by cbihan on 24/05/2021.
//
#include <cmath>
#include "RAMTileRenderer.hpp"
#include "PPU/Tile.hpp"
namespace ComSquare::Debugger
{
RAMTileRenderer::RAMTileRenderer(Ram::Ram &ram, Ram::Ram &cgram)
: _ram(ram),
_renderSize(0x5000),
_nbColumns(16),
_ramOffset(0),
_bpp(2),
_tileRenderer(ram, cgram),
buffer({{0}})
{}
void prepVector(std::vector<std::vector<uint32_t>> &vector, int nbColumns)
{
std::vector<std::vector<uint32_t>> vec(1 * PPU::Tile::NbPixelsHeight,
std::vector<uint32_t>(nbColumns * PPU::Tile::NbPixelsWidth, 0));
vector = vec;
}
void RAMTileRenderer::render()
{
this->buffer.clear();
int bufX = 0;
int bufY = 0;
int nbTilesDrawn = 0;
int resetX = bufX;
uint24_t limit = std::fmin(this->_ram.getSize(), this->_renderSize) + this->_ramOffset;
std::vector<std::vector<uint32_t>> row;
prepVector(row, this->_nbColumns);
for (uint24_t i = this->_ramOffset; i < limit; i += PPU::Tile::BaseByteSize * this->_bpp, nbTilesDrawn++) {
this->_tileRenderer.render(i);
if (nbTilesDrawn) {
resetX += PPU::Tile::NbPixelsWidth;
bufX = resetX;
bufY -= PPU::Tile::NbPixelsHeight;
}
if (nbTilesDrawn && nbTilesDrawn % this->_nbColumns == 0) {
nbTilesDrawn = 0;
resetX = 0;
bufX = 0;
bufY = 0;
this->buffer.insert(this->buffer.end(), row.begin(), row.end());
prepVector(row, this->_nbColumns);
}
for (const auto &raw : this->_tileRenderer.buffer) {
for (const auto &pixel : raw) {
row[bufY][bufX++] = pixel;
}
bufY++;
bufX = resetX;
}
}
this->buffer.insert(this->buffer.end(), row.begin(), row.end());
}
void RAMTileRenderer::setPaletteIndex(int paletteIndex)
{
this->_tileRenderer.setPaletteIndex(paletteIndex);
}
void RAMTileRenderer::setBpp(int bpp)
{
this->_bpp = bpp;
this->_tileRenderer.setBpp(bpp);
}
void RAMTileRenderer::setRenderSize(int size)
{
this->_renderSize = size;
}
void RAMTileRenderer::setNbColumns(int nbColumns)
{
this->_nbColumns = nbColumns;
}
int RAMTileRenderer::getBpp() const
{
return this->_tileRenderer.getBpp();
}
int RAMTileRenderer::getPaletteIndex() const
{
return this->_tileRenderer.getPaletteIndex();
}
int RAMTileRenderer::getNbColumns() const
{
return this->_nbColumns;
}
void RAMTileRenderer::setRamOffset(int offset)
{
this->_ramOffset = offset;
}
}