mirror of
https://github.com/holub/mame
synced 2025-05-20 12:48:53 +03:00
Fixed some massive texturing issues in the new Nintendo 64 / RDP renderer. [Harmony]
This commit is contained in:
parent
3b0cb91d98
commit
f397bcd6d2
@ -745,12 +745,16 @@ bool Processor::ZCompare(void* fb, UINT8* hb, UINT16* zb, UINT8* zhb, UINT32 sz,
|
||||
{
|
||||
case 0: // Opaque
|
||||
return (max || (overflow ? infront : nearer));
|
||||
break;
|
||||
case 1: // Interpenetrating
|
||||
return (max || (overflow ? infront : nearer));
|
||||
break;
|
||||
case 2: // Transparent
|
||||
return (infront || max);
|
||||
break;
|
||||
case 3: // Decal
|
||||
return (farther && nearer && !max);
|
||||
break;
|
||||
default:
|
||||
fatalerror( "z_mode = %d", m_other_modes.z_mode);
|
||||
break;
|
||||
@ -1206,36 +1210,17 @@ void N64::RDP::Triangle::Draw()
|
||||
INT32 maxxhx = 0;
|
||||
INT32 minxhx = 0;
|
||||
|
||||
int shade_base = 0;
|
||||
int texture_base = 0;
|
||||
int zbuffer_base = 0;
|
||||
if(m_shade)
|
||||
{
|
||||
shade_base = 8;
|
||||
int shade_base = m_rdp->GetCurrFIFOIndex() + 8;
|
||||
int texture_base = m_rdp->GetCurrFIFOIndex() + 8;
|
||||
int zbuffer_base = m_rdp->GetCurrFIFOIndex() + 8;
|
||||
if(m_texture)
|
||||
{
|
||||
texture_base = 24;
|
||||
texture_base += 16;
|
||||
zbuffer_base += 16;
|
||||
}
|
||||
if(m_zbuffer)
|
||||
{
|
||||
zbuffer_base = 40;
|
||||
}
|
||||
}
|
||||
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;
|
||||
zbuffer_base += 16;
|
||||
}
|
||||
|
||||
UINT32 w3 = m_cmd_data[m_rdp->GetCurrFIFOIndex()+2];
|
||||
@ -1353,14 +1338,7 @@ void N64::RDP::Triangle::Draw()
|
||||
dbdiff = (dbdeh*3 - dbdyh*3) << 7;
|
||||
dadiff = (dadeh*3 - dadyh*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;
|
||||
dteoff = (dtdeh*3) << 7;
|
||||
dweoff = (dwdeh*3) << 7;
|
||||
@ -1372,6 +1350,7 @@ void N64::RDP::Triangle::Draw()
|
||||
}
|
||||
else
|
||||
{
|
||||
dsdiff = dtdiff = dwdiff = drdiff = dgdiff = dbdiff = dadiff = dzdiff = 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_rx = minxhx;
|
||||
m_rdp->GetSpans()[j].m_dymax = (dsdylod > dtdylod)? dsdylod : dtdylod;
|
||||
if(m_shade)
|
||||
{
|
||||
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_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)
|
||||
{
|
||||
m_rdp->GetSpans()[j].m_ds.w = dsdx;
|
||||
m_rdp->GetSpans()[j].m_dt.w = dtdx;
|
||||
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)
|
||||
{
|
||||
m_rdp->GetSpans()[j].m_dymax = (dsdylod > dtdylod)? dsdylod : dtdylod;
|
||||
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 = 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;
|
||||
@ -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_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)
|
||||
{
|
||||
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_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)
|
||||
{
|
||||
m_rdp->GetSpans()[j].m_z.w = z + dzdiff - (xfrac * dzdxh);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_rdp->GetSpans()[j].m_z.w = 0;
|
||||
}
|
||||
}
|
||||
|
||||
m = xend + 1;
|
||||
@ -1505,10 +1516,6 @@ void N64::RDP::Triangle::Draw()
|
||||
else
|
||||
{
|
||||
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++)
|
||||
|
@ -177,7 +177,7 @@ bool RDP::Blender::Blend16Bit2Cycle(UINT16* fb, UINT8* hb, RDP::Color c1, RDP::C
|
||||
}
|
||||
else
|
||||
{
|
||||
BlendEquation1Force(&r, &g, &b, special_bsel);
|
||||
BlendEquation0NoForce(&r, &g, &b, special_bsel);
|
||||
}
|
||||
|
||||
m_rdp->GetBlendedColor()->i.r = r;
|
||||
|
@ -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);
|
||||
|
||||
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;
|
||||
}
|
||||
@ -153,10 +153,10 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
|
||||
int sg = 0;
|
||||
int sb = 0;
|
||||
int sa = 0;
|
||||
int ss = s.h.h;
|
||||
int st = t.h.h;
|
||||
int sw = w.h.h;
|
||||
int sz = z.w >> 13;
|
||||
int ss = 0;
|
||||
int st = 0;
|
||||
int sw = 0;
|
||||
int sz = 0;
|
||||
int sss = 0;
|
||||
int sst = 0;
|
||||
Color c1;
|
||||
@ -170,11 +170,23 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer,
|
||||
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)
|
||||
{
|
||||
sz = (((UINT32)m_misc_state->m_primitive_z) << 3) & 0x3ffff;
|
||||
dzpix = m_misc_state->m_primitive_delta_z;
|
||||
}
|
||||
}
|
||||
|
||||
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* zhbcur = &zhb[curpixel ^ BYTE_ADDR_XOR];
|
||||
|
||||
if(texture)
|
||||
{
|
||||
if (m_other_modes->persp_tex_en)
|
||||
{
|
||||
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 (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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
bool rendered = true;
|
||||
bool rendered = false;
|
||||
int dith = 0;
|
||||
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;
|
||||
a.w += dainc;
|
||||
}
|
||||
z.w += dzinc;
|
||||
if (texture)
|
||||
{
|
||||
s.w += dsinc;
|
||||
t.w += dtinc;
|
||||
w.w += dwinc;
|
||||
}
|
||||
if (zbuffer)
|
||||
{
|
||||
z.w += dzinc;
|
||||
}
|
||||
|
||||
x += xinc;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user