DS Video: Possibly fix 2D/3D blending alpha values, I really need to make tests

This commit is contained in:
Vicki Pfau 2017-07-17 16:56:25 -07:00
parent e472ca5b6c
commit 76b8916dfe
1 changed files with 4 additions and 7 deletions

View File

@ -407,9 +407,7 @@ static void DSVideoSoftwareRendererDrawGBAScanline(struct GBAVideoRenderer* rend
if (DSRegisterDISPCNTIs3D(softwareRenderer->dispcnt) && gx) { if (DSRegisterDISPCNTIs3D(softwareRenderer->dispcnt) && gx) {
const color_t* scanline; const color_t* scanline;
gx->renderer->getScanline(gx->renderer, y, &scanline); gx->renderer->getScanline(gx->renderer, y, &scanline);
uint32_t flags = (softwareRenderer->bg[0].priority << OFFSET_PRIORITY) | FLAG_IS_BACKGROUND; uint32_t flags = (softwareRenderer->bg[0].priority << OFFSET_PRIORITY) | FLAG_IS_BACKGROUND | FLAG_TARGET_1 | FLAG_TARGET_2;
flags |= FLAG_TARGET_2 * softwareRenderer->bg[0].target2;
flags |= FLAG_TARGET_1 * (softwareRenderer->bg[0].target1 && softwareRenderer->blendEffect == BLEND_ALPHA && GBAWindowControlIsBlendEnable(softwareRenderer->currentWindow.packed));
int x; int x;
for (x = softwareRenderer->start; x < softwareRenderer->end; ++x) { for (x = softwareRenderer->start; x < softwareRenderer->end; ++x) {
color_t color = scanline[x]; color_t color = scanline[x];
@ -425,12 +423,11 @@ static void DSVideoSoftwareRendererDrawGBAScanline(struct GBAVideoRenderer* rend
// TODO: More precise values // TODO: More precise values
softwareRenderer->alphaA[x] = (color >> 28) + 1; softwareRenderer->alphaA[x] = (color >> 28) + 1;
softwareRenderer->alphaB[x] = 0xF - (color >> 28); softwareRenderer->alphaB[x] = 0xF - (color >> 28);
_compositeBlendNoObjwin(softwareRenderer, x, (color & 0x00FFFFFF) | flags | FLAG_TARGET_1, softwareRenderer->row[x]); _compositeBlendNoObjwin(softwareRenderer, x, (color & 0x00FFFFFF) | flags, softwareRenderer->row[x]);
} else { } else {
if (!(flags & FLAG_TARGET_2) || !(softwareRenderer->row[x] & FLAG_TARGET_1)) { if (!(softwareRenderer->row[x] & FLAG_TARGET_1)) {
_compositeNoBlendNoObjwin(softwareRenderer, x, (color & 0x00FFFFFF) | flags, softwareRenderer->row[x]); _compositeNoBlendNoObjwin(softwareRenderer, x, (color & 0x00FFFFFF) | flags, softwareRenderer->row[x]);
} else if (softwareRenderer->row[x] & FLAG_TARGET_1) { } else {
softwareRenderer->alphaB[x] = 0x10;
_compositeBlendNoObjwin(softwareRenderer, x, (color & 0x00FFFFFF) | flags, softwareRenderer->row[x]); _compositeBlendNoObjwin(softwareRenderer, x, (color & 0x00FFFFFF) | flags, softwareRenderer->row[x]);
} }
softwareRenderer->alphaA[x] = 0x10; softwareRenderer->alphaA[x] = 0x10;