Support 256-color sprites

This commit is contained in:
Jeffrey Pfau 2013-05-01 23:27:49 -07:00
parent 61c6b7186e
commit e3fddc5739
1 changed files with 43 additions and 18 deletions

View File

@ -631,26 +631,51 @@ static void _drawSprite(struct GBAVideoSoftwareRenderer* renderer, struct GBAObj
inY = height - inY - 1; inY = height - inY - 1;
} }
unsigned charBase = BASE_TILE + sprite->tile * 0x20; unsigned charBase = BASE_TILE + sprite->tile * 0x20;
unsigned yBase = (inY & ~0x7) * (renderer->dispcnt.objCharacterMapping ? width >> 1 : 0x80) + (inY & 0x7) * 4; if (!sprite->multipalette) {
for (int outX = x >= start ? x : start; outX < x + width && outX < end; ++outX) { unsigned yBase = (inY & ~0x7) * (renderer->dispcnt.objCharacterMapping ? width >> 1 : 0x80) + (inY & 0x7) * 4;
int inX = outX - x; for (int outX = x >= start ? x : start; outX < x + width && outX < end; ++outX) {
if (sprite->hflip) { int inX = outX - x;
inX = width - inX - 1; if (sprite->hflip) {
} inX = width - inX - 1;
if (renderer->flags[outX].isSprite) { }
continue; if (renderer->flags[outX].isSprite) {
} continue;
unsigned xBase = (inX & ~0x7) * 4 + ((inX >> 1) & 2); }
uint16_t tileData = renderer->d.vram[(yBase + charBase + xBase) >> 1]; unsigned xBase = (inX & ~0x7) * 4 + ((inX >> 1) & 2);
tileData = (tileData >> ((inX & 3) << 2)) & 0xF; uint16_t tileData = renderer->d.vram[(yBase + charBase + xBase) >> 1];
if (tileData) { tileData = (tileData >> ((inX & 3) << 2)) & 0xF;
if (renderer->blendEffect == BLEND_NONE || renderer->blendEffect == BLEND_ALPHA || !renderer->target1Obj) { if (tileData) {
renderer->spriteLayer[outX] = renderer->normalPalette[0x100 | tileData | (sprite->palette << 4)]; if (renderer->blendEffect == BLEND_NONE || renderer->blendEffect == BLEND_ALPHA || !renderer->target1Obj) {
} else { renderer->spriteLayer[outX] = renderer->normalPalette[0x100 | tileData | (sprite->palette << 4)];
renderer->spriteLayer[outX] = renderer->variantPalette[0x100 | tileData | (sprite->palette << 4)]; } else {
renderer->spriteLayer[outX] = renderer->variantPalette[0x100 | tileData | (sprite->palette << 4)];
}
renderer->flags[outX] = flags;
} }
renderer->flags[outX] = flags;
} }
} else {
unsigned yBase = (inY & ~0x7) * (renderer->dispcnt.objCharacterMapping ? width : 0x100) + (inY & 0x7) * 8;
for (int outX = x >= start ? x : start; outX < x + width && outX < end; ++outX) {
int inX = outX - x;
if (sprite->hflip) {
inX = width - inX - 1;
}
if (renderer->flags[outX].isSprite) {
continue;
}
unsigned xBase = (inX & ~0x7) * 8 + (inX & 6);
uint16_t tileData = renderer->d.vram[(yBase + charBase + xBase) >> 1];
tileData = (tileData >> ((inX & 1) << 3)) & 0xFF;
if (tileData) {
if (renderer->blendEffect == BLEND_NONE || renderer->blendEffect == BLEND_ALPHA || !renderer->target1Obj) {
renderer->spriteLayer[outX] = renderer->normalPalette[0x100 | tileData];
} else {
renderer->spriteLayer[outX] = renderer->variantPalette[0x100 | tileData];
}
renderer->flags[outX] = flags;
}
}
} }
} }