DS Video: Fix non-zero sprite extended palettes

This commit is contained in:
Vicki Pfau 2017-03-03 18:49:37 -08:00
parent 9b5bda237a
commit 7b8fc0dbaa
2 changed files with 40 additions and 4 deletions

View File

@ -85,6 +85,7 @@ static bool _regenerateExtPalette(struct DSVideoSoftwareRenderer* renderer, bool
} }
if (obj) { if (obj) {
softwareRenderer->objExtPalette = palette; softwareRenderer->objExtPalette = palette;
softwareRenderer->objExtVariantPalette = variantPalette;
} else { } else {
if (slot >= 2) { if (slot >= 2) {
if (GBARegisterBGCNTIsExtPaletteSlot(softwareRenderer->bg[slot - 2].control)) { if (GBARegisterBGCNTIsExtPaletteSlot(softwareRenderer->bg[slot - 2].control)) {

View File

@ -203,7 +203,15 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
int objwinSlowPath = GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt) && GBAWindowControlGetBlendEnable(renderer->objwin.packed) != GBAWindowControlIsBlendEnable(renderer->currentWindow.packed); int objwinSlowPath = GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt) && GBAWindowControlGetBlendEnable(renderer->objwin.packed) != GBAWindowControlIsBlendEnable(renderer->currentWindow.packed);
if (GBAObjAttributesAIs256Color(sprite->a) && renderer->objExtPalette) { if (GBAObjAttributesAIs256Color(sprite->a) && renderer->objExtPalette) {
if (!variant) {
palette = renderer->objExtPalette; palette = renderer->objExtPalette;
objwinPalette = palette;
} else {
palette = renderer->objExtVariantPalette;
if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) {
objwinPalette = palette;
}
}
} else if (variant) { } else if (variant) {
palette = &renderer->variantPalette[0x100]; palette = &renderer->variantPalette[0x100];
if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) { if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) {
@ -289,7 +297,7 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
} else { } else {
SPRITE_TRANSFORMED_LOOP(16, NORMAL); SPRITE_TRANSFORMED_LOOP(16, NORMAL);
} }
} else { } else if (!renderer->objExtPalette) {
if (flags & FLAG_OBJWIN) { if (flags & FLAG_OBJWIN) {
SPRITE_TRANSFORMED_LOOP(256, OBJWIN); SPRITE_TRANSFORMED_LOOP(256, OBJWIN);
} else if (objwinSlowPath) { } else if (objwinSlowPath) {
@ -297,6 +305,16 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
} else { } else {
SPRITE_TRANSFORMED_LOOP(256, NORMAL); SPRITE_TRANSFORMED_LOOP(256, NORMAL);
} }
} else {
palette = &palette[GBAObjAttributesCGetPalette(sprite->c) << 8];
if (flags & FLAG_OBJWIN) {
SPRITE_TRANSFORMED_LOOP(256, OBJWIN);
} else if (objwinSlowPath) {
objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 8];
SPRITE_TRANSFORMED_LOOP(256, NORMAL_OBJWIN);
} else {
SPRITE_TRANSFORMED_LOOP(256, NORMAL);
}
} }
if (x + totalWidth > renderer->masterEnd) { if (x + totalWidth > renderer->masterEnd) {
renderer->spriteCyclesRemaining -= (x + totalWidth - renderer->masterEnd) * 2; renderer->spriteCyclesRemaining -= (x + totalWidth - renderer->masterEnd) * 2;
@ -343,12 +361,11 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
} else { } else {
SPRITE_NORMAL_LOOP(16, NORMAL); SPRITE_NORMAL_LOOP(16, NORMAL);
} }
} else { } else if (!renderer->objExtPalette) {
if (flags & FLAG_OBJWIN) { if (flags & FLAG_OBJWIN) {
SPRITE_NORMAL_LOOP(256, OBJWIN); SPRITE_NORMAL_LOOP(256, OBJWIN);
} else if (mosaicH > 1) { } else if (mosaicH > 1) {
if (objwinSlowPath) { if (objwinSlowPath) {
objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 4];
SPRITE_MOSAIC_LOOP(256, NORMAL_OBJWIN); SPRITE_MOSAIC_LOOP(256, NORMAL_OBJWIN);
} else { } else {
SPRITE_MOSAIC_LOOP(256, NORMAL); SPRITE_MOSAIC_LOOP(256, NORMAL);
@ -358,6 +375,24 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
} else { } else {
SPRITE_NORMAL_LOOP(256, NORMAL); SPRITE_NORMAL_LOOP(256, NORMAL);
} }
} else {
palette = &palette[GBAObjAttributesCGetPalette(sprite->c) << 8];
if (flags & FLAG_OBJWIN) {
SPRITE_NORMAL_LOOP(256, OBJWIN);
} else if (mosaicH > 1) {
if (objwinSlowPath) {
objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 8];
SPRITE_MOSAIC_LOOP(256, NORMAL_OBJWIN);
} else {
SPRITE_MOSAIC_LOOP(256, NORMAL);
}
} else if (objwinSlowPath) {
objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 8];
SPRITE_NORMAL_LOOP(256, NORMAL_OBJWIN);
} else {
SPRITE_NORMAL_LOOP(256, NORMAL);
}
} }
if (x + width > renderer->masterEnd) { if (x + width > renderer->masterEnd) {
renderer->spriteCyclesRemaining -= x + width - renderer->masterEnd; renderer->spriteCyclesRemaining -= x + width - renderer->masterEnd;