mirror of https://github.com/mgba-emu/mgba.git
Qt: Fix sprite viewer tile info
This commit is contained in:
parent
d77793231d
commit
4c4fbcc2a8
|
@ -25,6 +25,7 @@ ObjView::ObjView(GameController* controller, QWidget* parent)
|
||||||
, m_controller(controller)
|
, m_controller(controller)
|
||||||
, m_tileStatus{}
|
, m_tileStatus{}
|
||||||
, m_objId(0)
|
, m_objId(0)
|
||||||
|
, m_objInfo{}
|
||||||
{
|
{
|
||||||
m_ui.setupUi(this);
|
m_ui.setupUi(this);
|
||||||
m_ui.tile->setController(controller);
|
m_ui.tile->setController(controller);
|
||||||
|
@ -54,7 +55,9 @@ void ObjView::selectObj(int obj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjView::translateIndex(int index) {
|
void ObjView::translateIndex(int index) {
|
||||||
m_ui.tile->selectIndex(index + m_tileOffset);
|
unsigned x = index % m_objInfo.width;
|
||||||
|
unsigned y = index / m_objInfo.width;
|
||||||
|
m_ui.tile->selectIndex(x + y * m_objInfo.stride + m_tileOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef M_CORE_GBA
|
#ifdef M_CORE_GBA
|
||||||
|
@ -66,23 +69,34 @@ void ObjView::updateTilesGBA(bool force) {
|
||||||
unsigned size = GBAObjAttributesBGetSize(obj->b);
|
unsigned size = GBAObjAttributesBGetSize(obj->b);
|
||||||
unsigned width = GBAVideoObjSizes[shape * 4 + size][0];
|
unsigned width = GBAVideoObjSizes[shape * 4 + size][0];
|
||||||
unsigned height = GBAVideoObjSizes[shape * 4 + size][1];
|
unsigned height = GBAVideoObjSizes[shape * 4 + size][1];
|
||||||
|
unsigned tile = GBAObjAttributesCGetTile(obj->c);
|
||||||
|
ObjInfo newInfo{
|
||||||
|
tile,
|
||||||
|
width / 8,
|
||||||
|
height / 8,
|
||||||
|
width / 8
|
||||||
|
};
|
||||||
m_ui.tiles->setTileCount(width * height / 64);
|
m_ui.tiles->setTileCount(width * height / 64);
|
||||||
m_ui.tiles->setMinimumSize(QSize(width, height) * m_ui.magnification->value());
|
m_ui.tiles->setMinimumSize(QSize(width, height) * m_ui.magnification->value());
|
||||||
unsigned palette = GBAObjAttributesCGetPalette(obj->c);
|
unsigned palette = GBAObjAttributesCGetPalette(obj->c);
|
||||||
unsigned tile = GBAObjAttributesCGetTile(obj->c);
|
|
||||||
GBARegisterDISPCNT dispcnt = gba->memory.io[0]; // FIXME: Register name can't be imported due to namespacing issues
|
GBARegisterDISPCNT dispcnt = gba->memory.io[0]; // FIXME: Register name can't be imported due to namespacing issues
|
||||||
|
if (!GBARegisterDISPCNTIsObjCharacterMapping(dispcnt)) {
|
||||||
|
newInfo.stride = 0x20 >> (GBAObjAttributesAGet256Color(obj->a));
|
||||||
|
};
|
||||||
|
if (newInfo != m_objInfo) {
|
||||||
|
force = true;
|
||||||
|
}
|
||||||
|
m_objInfo = newInfo;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
// TODO: Tile stride
|
|
||||||
// TODO: Check to see if parameters are changed (so as to enable force if needed)
|
|
||||||
if (GBAObjAttributesAIs256Color(obj->a)) {
|
if (GBAObjAttributesAIs256Color(obj->a)) {
|
||||||
m_ui.palette->setText("256-color");
|
m_ui.palette->setText("256-color");
|
||||||
mTileCacheSetPalette(m_tileCache.get(), 1);
|
mTileCacheSetPalette(m_tileCache.get(), 1);
|
||||||
m_ui.tile->setPalette(0);
|
m_ui.tile->setPalette(0);
|
||||||
m_ui.tile->setPaletteSet(1, 1024, 1536);
|
m_ui.tile->setPaletteSet(1, 1024, 1536);
|
||||||
tile /= 2;
|
tile /= 2;
|
||||||
for (int y = 0; y < height / 8; ++y) {
|
|
||||||
for (int x = 0; x < width / 8; ++x, ++i) {
|
|
||||||
unsigned t = tile + i;
|
unsigned t = tile + i;
|
||||||
|
for (int y = 0; y < height / 8; ++y) {
|
||||||
|
for (int x = 0; x < width / 8; ++x, ++i, ++t) {
|
||||||
const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache.get(), &m_tileStatus[32 * t], t + 1024, 1);
|
const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache.get(), &m_tileStatus[32 * t], t + 1024, 1);
|
||||||
if (data) {
|
if (data) {
|
||||||
m_ui.tiles->setTile(i, data);
|
m_ui.tiles->setTile(i, data);
|
||||||
|
@ -90,6 +104,7 @@ void ObjView::updateTilesGBA(bool force) {
|
||||||
m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t + 1024, 1));
|
m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t + 1024, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
t += newInfo.stride - width / 8;
|
||||||
}
|
}
|
||||||
tile += 1024;
|
tile += 1024;
|
||||||
} else {
|
} else {
|
||||||
|
@ -107,9 +122,7 @@ void ObjView::updateTilesGBA(bool force) {
|
||||||
m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t + 2048, palette + 16));
|
m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t + 2048, palette + 16));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!GBARegisterDISPCNTIsObjCharacterMapping(dispcnt)) {
|
t += newInfo.stride - width / 8;
|
||||||
t += 0x20 - width / 8;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
tile += 2048;
|
tile += 2048;
|
||||||
}
|
}
|
||||||
|
@ -157,15 +170,25 @@ void ObjView::updateTilesGB(bool force) {
|
||||||
const GBObj* obj = &gb->video.oam.obj[m_objId];
|
const GBObj* obj = &gb->video.oam.obj[m_objId];
|
||||||
|
|
||||||
unsigned width = 8;
|
unsigned width = 8;
|
||||||
unsigned height = 8; // TODO
|
unsigned height = 8;
|
||||||
GBRegisterLCDC lcdc = gb->memory.io[REG_LCDC];
|
GBRegisterLCDC lcdc = gb->memory.io[REG_LCDC];
|
||||||
if (GBRegisterLCDCIsObjSize(lcdc)) {
|
if (GBRegisterLCDCIsObjSize(lcdc)) {
|
||||||
height = 16;
|
height = 16;
|
||||||
}
|
}
|
||||||
|
unsigned tile = obj->tile;
|
||||||
|
ObjInfo newInfo{
|
||||||
|
tile,
|
||||||
|
1,
|
||||||
|
height / 8,
|
||||||
|
1
|
||||||
|
};
|
||||||
|
if (newInfo != m_objInfo) {
|
||||||
|
force = true;
|
||||||
|
}
|
||||||
|
m_objInfo = newInfo;
|
||||||
m_ui.tiles->setTileCount(width * height / 64);
|
m_ui.tiles->setTileCount(width * height / 64);
|
||||||
m_ui.tiles->setMinimumSize(QSize(width, height) * m_ui.magnification->value());
|
m_ui.tiles->setMinimumSize(QSize(width, height) * m_ui.magnification->value());
|
||||||
int palette = 0;
|
int palette = 0;
|
||||||
unsigned tile = obj->tile;
|
|
||||||
if (gb->model >= GB_MODEL_CGB) {
|
if (gb->model >= GB_MODEL_CGB) {
|
||||||
if (GBObjAttributesIsBank(obj->attr)) {
|
if (GBObjAttributesIsBank(obj->attr)) {
|
||||||
tile += 512;
|
tile += 512;
|
||||||
|
@ -175,7 +198,6 @@ void ObjView::updateTilesGB(bool force) {
|
||||||
palette = GBObjAttributesGetPalette(obj->attr);
|
palette = GBObjAttributesGetPalette(obj->attr);
|
||||||
}
|
}
|
||||||
int i = 0;
|
int i = 0;
|
||||||
// TODO: Check to see if parameters are changed (so as to enable force if needed)
|
|
||||||
m_ui.palette->setText(QString::number(palette));
|
m_ui.palette->setText(QString::number(palette));
|
||||||
mTileCacheSetPalette(m_tileCache.get(), 0);
|
mTileCacheSetPalette(m_tileCache.get(), 0);
|
||||||
m_ui.tile->setPalette(palette + 8);
|
m_ui.tile->setPalette(palette + 8);
|
||||||
|
@ -207,3 +229,11 @@ void ObjView::updateTilesGB(bool force) {
|
||||||
m_ui.mode->setText(tr("N/A"));
|
m_ui.mode->setText(tr("N/A"));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
bool ObjView::ObjInfo::operator!=(const ObjInfo& other) {
|
||||||
|
return other.tile != tile ||
|
||||||
|
other.width != width ||
|
||||||
|
other.height != height ||
|
||||||
|
other.stride != stride;
|
||||||
|
}
|
||||||
|
|
|
@ -40,6 +40,14 @@ private:
|
||||||
GameController* m_controller;
|
GameController* m_controller;
|
||||||
mTileCacheEntry m_tileStatus[1024 * 32]; // TODO: Correct size
|
mTileCacheEntry m_tileStatus[1024 * 32]; // TODO: Correct size
|
||||||
int m_objId;
|
int m_objId;
|
||||||
|
struct ObjInfo {
|
||||||
|
unsigned tile;
|
||||||
|
unsigned width;
|
||||||
|
unsigned height;
|
||||||
|
unsigned stride;
|
||||||
|
|
||||||
|
bool operator!=(const ObjInfo&);
|
||||||
|
} m_objInfo;
|
||||||
|
|
||||||
int m_tileOffset;
|
int m_tileOffset;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue