diff --git a/src/ds/renderers/software.c b/src/ds/renderers/software.c index 8c2d30494..17ea5a082 100644 --- a/src/ds/renderers/software.c +++ b/src/ds/renderers/software.c @@ -85,6 +85,7 @@ static bool _regenerateExtPalette(struct DSVideoSoftwareRenderer* renderer, bool } if (obj) { softwareRenderer->objExtPalette = palette; + softwareRenderer->objExtVariantPalette = variantPalette; } else { if (slot >= 2) { if (GBARegisterBGCNTIsExtPaletteSlot(softwareRenderer->bg[slot - 2].control)) { diff --git a/src/gba/renderers/software-obj.c b/src/gba/renderers/software-obj.c index be79c6dfb..0c60fee39 100644 --- a/src/gba/renderers/software-obj.c +++ b/src/gba/renderers/software-obj.c @@ -203,7 +203,15 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re int objwinSlowPath = GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt) && GBAWindowControlGetBlendEnable(renderer->objwin.packed) != GBAWindowControlIsBlendEnable(renderer->currentWindow.packed); if (GBAObjAttributesAIs256Color(sprite->a) && renderer->objExtPalette) { - palette = renderer->objExtPalette; + if (!variant) { + palette = renderer->objExtPalette; + objwinPalette = palette; + } else { + palette = renderer->objExtVariantPalette; + if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) { + objwinPalette = palette; + } + } } else if (variant) { palette = &renderer->variantPalette[0x100]; if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) { @@ -289,7 +297,7 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re } else { SPRITE_TRANSFORMED_LOOP(16, NORMAL); } - } else { + } else if (!renderer->objExtPalette) { if (flags & FLAG_OBJWIN) { SPRITE_TRANSFORMED_LOOP(256, OBJWIN); } else if (objwinSlowPath) { @@ -297,6 +305,16 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re } else { 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) { renderer->spriteCyclesRemaining -= (x + totalWidth - renderer->masterEnd) * 2; @@ -343,12 +361,11 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re } else { SPRITE_NORMAL_LOOP(16, NORMAL); } - } else { + } else if (!renderer->objExtPalette) { if (flags & FLAG_OBJWIN) { SPRITE_NORMAL_LOOP(256, OBJWIN); } else if (mosaicH > 1) { if (objwinSlowPath) { - objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 4]; SPRITE_MOSAIC_LOOP(256, NORMAL_OBJWIN); } else { SPRITE_MOSAIC_LOOP(256, NORMAL); @@ -358,6 +375,24 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re } else { 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) { renderer->spriteCyclesRemaining -= x + width - renderer->masterEnd;