Fixed some massive texturing issues in the new Nintendo 64 / RDP renderer. [Harmony]

This commit is contained in:
Ryan Holtz 2010-04-03 21:00:47 +00:00
parent 3b0cb91d98
commit f397bcd6d2
3 changed files with 178 additions and 153 deletions

View File

@ -745,12 +745,16 @@ bool Processor::ZCompare(void* fb, UINT8* hb, UINT16* zb, UINT8* zhb, UINT32 sz,
{ {
case 0: // Opaque case 0: // Opaque
return (max || (overflow ? infront : nearer)); return (max || (overflow ? infront : nearer));
break;
case 1: // Interpenetrating case 1: // Interpenetrating
return (max || (overflow ? infront : nearer)); return (max || (overflow ? infront : nearer));
break;
case 2: // Transparent case 2: // Transparent
return (infront || max); return (infront || max);
break;
case 3: // Decal case 3: // Decal
return (farther && nearer && !max); return (farther && nearer && !max);
break;
default: default:
fatalerror( "z_mode = %d", m_other_modes.z_mode); fatalerror( "z_mode = %d", m_other_modes.z_mode);
break; break;
@ -1206,36 +1210,17 @@ void N64::RDP::Triangle::Draw()
INT32 maxxhx = 0; INT32 maxxhx = 0;
INT32 minxhx = 0; INT32 minxhx = 0;
int shade_base = 0; int shade_base = m_rdp->GetCurrFIFOIndex() + 8;
int texture_base = 0; int texture_base = m_rdp->GetCurrFIFOIndex() + 8;
int zbuffer_base = 0; int zbuffer_base = m_rdp->GetCurrFIFOIndex() + 8;
if(m_shade)
{
shade_base = 8;
if(m_texture) if(m_texture)
{ {
texture_base = 24; texture_base += 16;
zbuffer_base += 16;
}
if(m_zbuffer) if(m_zbuffer)
{ {
zbuffer_base = 40; zbuffer_base += 16;
}
}
else if(m_zbuffer)
{
zbuffer_base = 24;
}
}
else if(m_texture)
{
texture_base = 8;
if(m_zbuffer)
{
zbuffer_base = 24;
}
}
else if(m_zbuffer)
{
zbuffer_base = 8;
} }
UINT32 w3 = m_cmd_data[m_rdp->GetCurrFIFOIndex()+2]; UINT32 w3 = m_cmd_data[m_rdp->GetCurrFIFOIndex()+2];
@ -1353,14 +1338,7 @@ void N64::RDP::Triangle::Draw()
dbdiff = (dbdeh*3 - dbdyh*3) << 7; dbdiff = (dbdeh*3 - dbdyh*3) << 7;
dadiff = (dadeh*3 - dadyh*3) << 7; dadiff = (dadeh*3 - dadyh*3) << 7;
dzdiff = (dzdeh*3 - dzdyh*3) << 7; dzdiff = (dzdeh*3 - dzdyh*3) << 7;
}
else
{
dsdiff = dtdiff = dwdiff = drdiff = dgdiff = dbdiff = dadiff = dzdiff = 0;
}
if (do_offset)
{
dseoff = (dsdeh*3) << 7; dseoff = (dsdeh*3) << 7;
dteoff = (dtdeh*3) << 7; dteoff = (dtdeh*3) << 7;
dweoff = (dwdeh*3) << 7; dweoff = (dwdeh*3) << 7;
@ -1372,6 +1350,7 @@ void N64::RDP::Triangle::Draw()
} }
else else
{ {
dsdiff = dtdiff = dwdiff = drdiff = dgdiff = dbdiff = dadiff = dzdiff = 0;
dseoff = dteoff = dweoff = dreoff = dgeoff = dbeoff = daeoff = dzeoff = 0; dseoff = dteoff = dweoff = dreoff = dgeoff = dbeoff = daeoff = dzeoff = 0;
} }
@ -1442,7 +1421,6 @@ void N64::RDP::Triangle::Draw()
{ {
m_rdp->GetSpans()[j].m_lx = maxxmx; m_rdp->GetSpans()[j].m_lx = maxxmx;
m_rdp->GetSpans()[j].m_rx = minxhx; m_rdp->GetSpans()[j].m_rx = minxhx;
m_rdp->GetSpans()[j].m_dymax = (dsdylod > dtdylod)? dsdylod : dtdylod;
if(m_shade) if(m_shade)
{ {
m_rdp->GetSpans()[j].m_dr.w = drdx & ~0x1f; m_rdp->GetSpans()[j].m_dr.w = drdx & ~0x1f;
@ -1450,18 +1428,39 @@ void N64::RDP::Triangle::Draw()
m_rdp->GetSpans()[j].m_db.w = dbdx & ~0x1f; m_rdp->GetSpans()[j].m_db.w = dbdx & ~0x1f;
m_rdp->GetSpans()[j].m_da.w = dadx & ~0x1f; m_rdp->GetSpans()[j].m_da.w = dadx & ~0x1f;
} }
else
{
m_rdp->GetSpans()[j].m_dr.w = 0;
m_rdp->GetSpans()[j].m_dg.w = 0;
m_rdp->GetSpans()[j].m_db.w = 0;
m_rdp->GetSpans()[j].m_da.w = 0;
}
if(m_texture) if(m_texture)
{ {
m_rdp->GetSpans()[j].m_ds.w = dsdx; m_rdp->GetSpans()[j].m_ds.w = dsdx;
m_rdp->GetSpans()[j].m_dt.w = dtdx; m_rdp->GetSpans()[j].m_dt.w = dtdx;
m_rdp->GetSpans()[j].m_dw.w = dwdx; m_rdp->GetSpans()[j].m_dw.w = dwdx;
} }
else
{
m_rdp->GetSpans()[j].m_ds.w = 0;
m_rdp->GetSpans()[j].m_dt.w = 0;
m_rdp->GetSpans()[j].m_dw.w = 0;
}
if(m_zbuffer) if(m_zbuffer)
{ {
m_rdp->GetSpans()[j].m_dymax = (dsdylod > dtdylod)? dsdylod : dtdylod;
m_rdp->GetSpans()[j].m_dz.w = dzdx; m_rdp->GetSpans()[j].m_dz.w = dzdx;
m_rdp->GetSpans()[j].m_dzpix = ((dzdy_dz & 0x8000) ? ((~dzdy_dz) & 0x7fff) : dzdy_dz) + ((dzdx_dz & 0x8000) ? ((~dzdx_dz) & 0x7fff) : dzdx_dz); m_rdp->GetSpans()[j].m_dzpix = ((dzdy_dz & 0x8000) ? ((~dzdy_dz) & 0x7fff) : dzdy_dz) + ((dzdx_dz & 0x8000) ? ((~dzdx_dz) & 0x7fff) : dzdx_dz);
m_rdp->GetSpans()[j].m_dzpix = m_rdp->NormalizeDZPix(m_rdp->GetSpans()[j].m_dzpix); m_rdp->GetSpans()[j].m_dzpix = m_rdp->NormalizeDZPix(m_rdp->GetSpans()[j].m_dzpix);
} }
else
{
m_rdp->GetSpans()[j].m_dymax = 0;
m_rdp->GetSpans()[j].m_dz.w = 0;
m_rdp->GetSpans()[j].m_dzpix = 0;
m_rdp->GetSpans()[j].m_dzpix = 0;
}
} }
int length = (xend - xstart) * sign; int length = (xend - xstart) * sign;
@ -1476,16 +1475,28 @@ void N64::RDP::Triangle::Draw()
m_rdp->GetSpans()[j].m_b.w = b + dbdiff - (xfrac * dbdxh); m_rdp->GetSpans()[j].m_b.w = b + dbdiff - (xfrac * dbdxh);
m_rdp->GetSpans()[j].m_a.w = a + dadiff - (xfrac * dadxh); m_rdp->GetSpans()[j].m_a.w = a + dadiff - (xfrac * dadxh);
} }
else
{
m_rdp->GetSpans()[j].m_r.w = m_rdp->GetSpans()[j].m_g.w = m_rdp->GetSpans()[j].m_b.w = m_rdp->GetSpans()[j].m_a.w = 0;
}
if(m_texture) if(m_texture)
{ {
m_rdp->GetSpans()[j].m_s.w = (s + dsdiff - (xfrac * dsdxh)) & ~0x1f; m_rdp->GetSpans()[j].m_s.w = (s + dsdiff - (xfrac * dsdxh)) & ~0x1f;
m_rdp->GetSpans()[j].m_t.w = (t + dtdiff - (xfrac * dtdxh)) & ~0x1f; m_rdp->GetSpans()[j].m_t.w = (t + dtdiff - (xfrac * dtdxh)) & ~0x1f;
m_rdp->GetSpans()[j].m_w.w = (w + dwdiff - (xfrac * dwdxh)) & ~0x1f; m_rdp->GetSpans()[j].m_w.w = (w + dwdiff - (xfrac * dwdxh)) & ~0x1f;
} }
else
{
m_rdp->GetSpans()[j].m_s.w = m_rdp->GetSpans()[j].m_t.w = m_rdp->GetSpans()[j].m_w.w = 0;
}
if(m_zbuffer) if(m_zbuffer)
{ {
m_rdp->GetSpans()[j].m_z.w = z + dzdiff - (xfrac * dzdxh); m_rdp->GetSpans()[j].m_z.w = z + dzdiff - (xfrac * dzdxh);
} }
else
{
m_rdp->GetSpans()[j].m_z.w = 0;
}
} }
m = xend + 1; m = xend + 1;
@ -1505,10 +1516,6 @@ void N64::RDP::Triangle::Draw()
else else
{ {
m_rdp->GetSpans()[j].m_cvg[xend] -= (2 - m_rdp->AddLeftCvg(xright, k)); m_rdp->GetSpans()[j].m_cvg[xend] -= (2 - m_rdp->AddLeftCvg(xright, k));
if (m_rdp->GetSpans()[j].m_cvg[xend] > 200)
{
m_rdp->GetSpans()[j].m_cvg[xend] = 0;
}
} }
} }
for (n = 0; n < (length - 1); n++) for (n = 0; n < (length - 1); n++)

View File

@ -177,7 +177,7 @@ bool RDP::Blender::Blend16Bit2Cycle(UINT16* fb, UINT8* hb, RDP::Color c1, RDP::C
} }
else else
{ {
BlendEquation1Force(&r, &g, &b, special_bsel); BlendEquation0NoForce(&r, &g, &b, special_bsel);
} }
m_rdp->GetBlendedColor()->i.r = r; m_rdp->GetBlendedColor()->i.r = r;

View File

@ -127,7 +127,7 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
int length = flip ? (m_lx - m_rx) : (m_rx - m_lx); int length = flip ? (m_lx - m_rx) : (m_rx - m_lx);
bool disable_lod = false; bool disable_lod = false;
if (m_other_modes->tex_lod_en && m_other_modes->cycle_type != CYCLE_TYPE_2) // Used by World Driver Championship if (m_other_modes->cycle_type != CYCLE_TYPE_2) // Used by World Driver Championship
{ {
disable_lod = true; disable_lod = true;
} }
@ -153,10 +153,10 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
int sg = 0; int sg = 0;
int sb = 0; int sb = 0;
int sa = 0; int sa = 0;
int ss = s.h.h; int ss = 0;
int st = t.h.h; int st = 0;
int sw = w.h.h; int sw = 0;
int sz = z.w >> 13; int sz = 0;
int sss = 0; int sss = 0;
int sst = 0; int sst = 0;
Color c1; Color c1;
@ -170,11 +170,23 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
sa = a.h.h; sa = a.h.h;
} }
if(texture)
{
ss = s.h.h;
st = t.h.h;
sw = w.h.h;
}
if(zbuffer)
{
sz = z.w >> 13;
if (m_other_modes->z_source_sel) if (m_other_modes->z_source_sel)
{ {
sz = (((UINT32)m_misc_state->m_primitive_z) << 3) & 0x3ffff; sz = (((UINT32)m_misc_state->m_primitive_z) << 3) & 0x3ffff;
dzpix = m_misc_state->m_primitive_delta_z; dzpix = m_misc_state->m_primitive_delta_z;
} }
}
if (x >= clipx1 && x < clipx2) if (x >= clipx1 && x < clipx2)
{ {
@ -190,6 +202,8 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
UINT8* hbcur = &hb[curpixel ^ BYTE_ADDR_XOR]; UINT8* hbcur = &hb[curpixel ^ BYTE_ADDR_XOR];
UINT8* zhbcur = &zhb[curpixel ^ BYTE_ADDR_XOR]; UINT8* zhbcur = &zhb[curpixel ^ BYTE_ADDR_XOR];
if(texture)
{
if (m_other_modes->persp_tex_en) if (m_other_modes->persp_tex_en)
{ {
m_rdp->TCDiv(ss, st, sw, &sss, &sst); m_rdp->TCDiv(ss, st, sw, &sss, &sst);
@ -301,6 +315,17 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
} }
} }
if (m_other_modes->cycle_type == CYCLE_TYPE_1)
{
m_rdp->GetTexel0Color()->c = m_rdp->GetTexPipe()->Fetch(sss, sst, &m_rdp->GetTiles()[tilenum]);
}
else
{
m_rdp->GetTexel0Color()->c = m_rdp->GetTexPipe()->Fetch(sss, sst, &m_rdp->GetTiles()[tilenum]);
m_rdp->GetTexel1Color()->c = m_rdp->GetTexPipe()->Fetch(sss, sst, &m_rdp->GetTiles()[tilenum2]);
}
}
if (shade) if (shade)
{ {
if (sr > 0xff) sr = 0xff; if (sr > 0xff) sr = 0xff;
@ -317,19 +342,6 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
m_rdp->GetShadeColor()->i.a = sa; m_rdp->GetShadeColor()->i.a = sa;
} }
if (texture)
{
if (m_other_modes->cycle_type == CYCLE_TYPE_1)
{
m_rdp->GetTexel0Color()->c = m_rdp->GetTexPipe()->Fetch(sss, sst, &m_rdp->GetTiles()[tilenum]);
}
else
{
m_rdp->GetTexel0Color()->c = m_rdp->GetTexPipe()->Fetch(sss, sst, &m_rdp->GetTiles()[tilenum]);
m_rdp->GetTexel1Color()->c = m_rdp->GetTexPipe()->Fetch(sss, sst, &m_rdp->GetTiles()[tilenum2]);
}
}
if (m_other_modes->cycle_type == CYCLE_TYPE_1) if (m_other_modes->cycle_type == CYCLE_TYPE_1)
{ {
c1.i.r = LookUpCC(*m_rdp->GetColorInputs()->combiner_rgbsub_a_r[1], c1.i.r = LookUpCC(*m_rdp->GetColorInputs()->combiner_rgbsub_a_r[1],
@ -398,7 +410,7 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
if(z_compare_result) if(z_compare_result)
{ {
bool rendered = true; bool rendered = false;
int dith = 0; int dith = 0;
if (!m_other_modes->rgb_dither_sel) if (!m_other_modes->rgb_dither_sel)
{ {
@ -426,10 +438,16 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
b.w += dbinc; b.w += dbinc;
a.w += dainc; a.w += dainc;
} }
z.w += dzinc; if (texture)
{
s.w += dsinc; s.w += dsinc;
t.w += dtinc; t.w += dtinc;
w.w += dwinc; w.w += dwinc;
}
if (zbuffer)
{
z.w += dzinc;
}
x += xinc; x += xinc;
} }