Render unused metatile layer as it appears in-game

This commit is contained in:
GriffinR 2022-07-01 18:24:05 -04:00 committed by Marcus Huderle
parent d14bcdbdc1
commit 44bbef6105

View file

@ -51,13 +51,46 @@ QImage getMetatileImage(
QPainter metatile_painter(&metatile_image); QPainter metatile_painter(&metatile_image);
bool isTripleLayerMetatile = projectConfig.getTripleLayerMetatilesEnabled(); bool isTripleLayerMetatile = projectConfig.getTripleLayerMetatilesEnabled();
int numLayers = isTripleLayerMetatile ? 3: 2; const int numLayers = 3; // When rendering, metatiles always have 3 layers
int layerType = metatile->layerType;
for (int layer = 0; layer < numLayers; layer++) for (int layer = 0; layer < numLayers; layer++)
for (int y = 0; y < 2; y++) for (int y = 0; y < 2; y++)
for (int x = 0; x < 2; x++) { for (int x = 0; x < 2; x++) {
int l = layerOrder.size() >= numLayers ? layerOrder[layer] : layer; int l = layerOrder.size() >= numLayers ? (layerOrder[layer] % numLayers) : layer;
int bottomLayer = layerOrder.size() >= numLayers ? layerOrder[0] : 0; int bottomLayer = layerOrder.size() >= numLayers ? layerOrder[0] : 0;
Tile tile = metatile->tiles.value((y * 2) + x + (l * 4));
// Get the tile to render next
Tile tile;
int tileOffset = (y * 2) + x;
if (isTripleLayerMetatile) {
tile = metatile->tiles.value(tileOffset + (l * 4));
} else {
// "Vanilla" metatiles only have 8 tiles, but render 12.
// The remaining 4 tiles are rendered either as tile 0 or 0x3014 (invalid) depending on layer type.
switch (layerType)
{
default:
case METATILE_LAYER_MIDDLE_TOP:
if (l == 0)
tile = Tile(0x3014, false, false, 0);
else // Tiles are on layers 1 and 2
tile = metatile->tiles.value(tileOffset + ((l - 1) * 4));
break;
case METATILE_LAYER_BOTTOM_MIDDLE:
if (l == 2)
tile = Tile();
else // Tiles are on layers 0 and 1
tile = metatile->tiles.value(tileOffset + (l * 4));
break;
case METATILE_LAYER_BOTTOM_TOP:
if (l == 1)
tile = Tile();
else // Tiles are on layers 0 and 2
tile = metatile->tiles.value(tileOffset + ((l == 0 ? 0 : 1) * 4));
break;
}
}
QImage tile_image = getTileImage(tile.tileId, primaryTileset, secondaryTileset); QImage tile_image = getTileImage(tile.tileId, primaryTileset, secondaryTileset);
if (tile_image.isNull()) { if (tile_image.isNull()) {
// Some metatiles specify tiles that are outside the valid range. // Some metatiles specify tiles that are outside the valid range.