* perspective-correct Z interpolation

* fix depth buffering. support W-buffer mode.
* 3D/2D blending. doesn't do much yet, but the code is here.
This commit is contained in:
StapleButter
2017-03-06 23:57:04 +01:00
parent ed385ce0f5
commit 72209c51f9
4 changed files with 67 additions and 64 deletions

View File

@ -55,7 +55,6 @@
// 3D/2D blending rules
// * if destination selected as 2nd target:
// blending is applied instead of the selected color effect, using full 5bit alpha from 3D layer
// (or 6bit alpha? TODO: check it)
// this even if the selected color effect is 'none'.
// apparently this works even if BG0 isn't selected as 1st target
// * if BG0 is selected as 1st target, destination not selected as 2nd target:
@ -766,6 +765,32 @@ void GPU2D::DrawScanline_Mode1(u32 line, u32* dst)
evb = EVB;
}
}
else if ((flag1 & 0x40) && (BlendCnt & ((val2 >> 16) & 0xFF00)))
{
// 3D layer blending
eva = (flag1 & 0x1F) + 1;
evb = 32 - eva;
u32 r = (((val1 & 0x00003F) * eva) + ((val2 & 0x00003F) * evb)) >> 5;
u32 g = ((((val1 & 0x003F00) * eva) + ((val2 & 0x003F00) * evb)) >> 5) & 0x007F00;
u32 b = ((((val1 & 0x3F0000) * eva) + ((val2 & 0x3F0000) * evb)) >> 5) & 0x7F0000;
if (eva <= 16)
{
r += 0x000001;
g += 0x000100;
b += 0x010000;
}
if (r > 0x00003F) r = 0x00003F;
if (g > 0x003F00) g = 0x003F00;
if (b > 0x3F0000) b = 0x3F0000;
dst[i] = r | g | b | 0xFF000000;
continue;
}
else if (BlendCnt & flag1)
{
if ((bldcnteffect == 1) && (BlendCnt & ((val2 >> 16) & 0xFF00)))
@ -848,20 +873,14 @@ void GPU2D::DrawBG_3D(u32 line, u32* dst)
{
// TODO: scroll, etc
u8* src = GPU3D::GetLine(line);
u32* src = GPU3D::GetLine(line);
for (int i = 0; i < 256; i++)
{
u8 r = *src++;
u8 g = *src++;
u8 b = *src++;
u8 a = *src++;
if (a == 0) continue;
// TODO: blending
// alpha is 6bit too....?
u32 c = src[i];
if ((c >> 24) == 0) continue;
dst[i+256] = dst[i];
dst[i] = r | (g << 8) | (b << 16) | 0x01000000;
dst[i] = c | 0x40000000;
}
}