diff --git a/src/mame/video/n64.c b/src/mame/video/n64.c index 51c07980672..068004fd9e6 100644 --- a/src/mame/video/n64.c +++ b/src/mame/video/n64.c @@ -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) + int shade_base = m_rdp->GetCurrFIFOIndex() + 8; + int texture_base = m_rdp->GetCurrFIFOIndex() + 8; + int zbuffer_base = m_rdp->GetCurrFIFOIndex() + 8; + if(m_texture) { - shade_base = 8; - if(m_texture) - { - texture_base = 24; - if(m_zbuffer) - { - zbuffer_base = 40; - } - } - else if(m_zbuffer) - { - zbuffer_base = 24; - } + texture_base += 16; + zbuffer_base += 16; } - else if(m_texture) + if(m_zbuffer) { - 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++) diff --git a/src/mame/video/rdpblend.c b/src/mame/video/rdpblend.c index 654f6bc7410..9d607aaa637 100644 --- a/src/mame/video/rdpblend.c +++ b/src/mame/video/rdpblend.c @@ -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; diff --git a/src/mame/video/rdpspn16.c b/src/mame/video/rdpspn16.c index 1b8ba41812f..792f8add267 100644 --- a/src/mame/video/rdpspn16.c +++ b/src/mame/video/rdpspn16.c @@ -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,10 +170,22 @@ void Span::Draw(int index, int tilenum, bool shade, bool texture, bool zbuffer, sa = a.h.h; } - if (m_other_modes->z_source_sel) + if(texture) { - sz = (((UINT32)m_misc_state->m_primitive_z) << 3) & 0x3ffff; - dzpix = m_misc_state->m_primitive_delta_z; + 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,115 +202,128 @@ 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 (m_other_modes->persp_tex_en) - { - m_rdp->TCDiv(ss, st, sw, &sss, &sst); - } - else // Hack for Bust-a-Move 2 - { - sss = ss; - sst = st; - } - - if (m_other_modes->tex_lod_en && !disable_lod) + if(texture) { if (m_other_modes->persp_tex_en) { - nextsw = (w.w + dwinc) >> 16; - nexts = (s.w + dsinc) >> 16; - nextt = (t.w + dtinc) >> 16; - m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); + m_rdp->TCDiv(ss, st, sw, &sss, &sst); } - else + else // Hack for Bust-a-Move 2 { - nexts = (s.w + dsinc)>>16; - nextt = (t.w + dtinc)>>16; + sss = ss; + sst = st; } - INT32 horstep = SIGN17(nexts & 0x1ffff) - SIGN17(sss & 0x1ffff); - INT32 vertstep = SIGN17(nextt & 0x1ffff) - SIGN17(sst & 0x1ffff); - if (horstep & 0x20000) + if (m_other_modes->tex_lod_en && !disable_lod) { - horstep = ~horstep & 0x1ffff; - } - if (vertstep & 0x20000) - { - vertstep = ~vertstep & 0x1ffff; - } - - int LOD = (horstep >= vertstep) ? horstep : vertstep; - LOD = (LOD >= m_dymax) ? LOD : m_dymax; - - if (LOD & 0x1c000) - { - LOD = 0x7fff; - } - if (LOD < m_misc_state->m_min_level) - { - LOD = m_misc_state->m_min_level; - } - - bool magnify = (LOD < 32); - INT32 l_tile = m_rdp->GetLog2((LOD >> 5) & 0xff); - bool distant = ((LOD & 0x6000) || (l_tile >= m_misc_state->m_max_level)); - - m_rdp->SetLODFrac(((LOD << 3) >> l_tile) & 0xff); - - if (distant) - { - l_tile = m_misc_state->m_max_level; - } - if(!m_other_modes->sharpen_tex_en && !m_other_modes->detail_tex_en && magnify) - { - m_rdp->SetLODFrac(0); - } - if(!m_other_modes->sharpen_tex_en && !m_other_modes->detail_tex_en && distant) - { - m_rdp->SetLODFrac(0xff); - } - if(m_other_modes->sharpen_tex_en && magnify) - { - m_rdp->SetLODFrac(*(m_rdp->GetLODFrac()) | 0x100); - } - - if (!m_other_modes->detail_tex_en) - { - tilenum = (prim_tile + l_tile); - tilenum &= 7; - if (m_other_modes->sharpen_tex_en) + if (m_other_modes->persp_tex_en) { - tilenum2 = (tilenum + 1) & 7; - } - else if (!distant) - { - tilenum2 = (tilenum + 1) & 7; + nextsw = (w.w + dwinc) >> 16; + nexts = (s.w + dsinc) >> 16; + nextt = (t.w + dtinc) >> 16; + m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); } else { - tilenum2 = tilenum; + nexts = (s.w + dsinc)>>16; + nextt = (t.w + dtinc)>>16; } - } - else - { - if (!magnify) + + INT32 horstep = SIGN17(nexts & 0x1ffff) - SIGN17(sss & 0x1ffff); + INT32 vertstep = SIGN17(nextt & 0x1ffff) - SIGN17(sst & 0x1ffff); + if (horstep & 0x20000) { - tilenum = (prim_tile + l_tile + 1); + horstep = ~horstep & 0x1ffff; } - else + if (vertstep & 0x20000) + { + vertstep = ~vertstep & 0x1ffff; + } + + int LOD = (horstep >= vertstep) ? horstep : vertstep; + LOD = (LOD >= m_dymax) ? LOD : m_dymax; + + if (LOD & 0x1c000) + { + LOD = 0x7fff; + } + if (LOD < m_misc_state->m_min_level) + { + LOD = m_misc_state->m_min_level; + } + + bool magnify = (LOD < 32); + INT32 l_tile = m_rdp->GetLog2((LOD >> 5) & 0xff); + bool distant = ((LOD & 0x6000) || (l_tile >= m_misc_state->m_max_level)); + + m_rdp->SetLODFrac(((LOD << 3) >> l_tile) & 0xff); + + if (distant) + { + l_tile = m_misc_state->m_max_level; + } + if(!m_other_modes->sharpen_tex_en && !m_other_modes->detail_tex_en && magnify) + { + m_rdp->SetLODFrac(0); + } + if(!m_other_modes->sharpen_tex_en && !m_other_modes->detail_tex_en && distant) + { + m_rdp->SetLODFrac(0xff); + } + if(m_other_modes->sharpen_tex_en && magnify) + { + m_rdp->SetLODFrac(*(m_rdp->GetLODFrac()) | 0x100); + } + + if (!m_other_modes->detail_tex_en) { tilenum = (prim_tile + l_tile); - } - tilenum &= 7; - - if (!distant && !magnify) - { - tilenum2 = (prim_tile + l_tile + 2) & 7; + tilenum &= 7; + if (m_other_modes->sharpen_tex_en) + { + tilenum2 = (tilenum + 1) & 7; + } + else if (!distant) + { + tilenum2 = (tilenum + 1) & 7; + } + else + { + tilenum2 = tilenum; + } } else { - tilenum2 = (prim_tile + l_tile + 1) & 7; + if (!magnify) + { + tilenum = (prim_tile + l_tile + 1); + } + else + { + tilenum = (prim_tile + l_tile); + } + tilenum &= 7; + + if (!distant && !magnify) + { + tilenum2 = (prim_tile + l_tile + 2) & 7; + } + else + { + tilenum2 = (prim_tile + l_tile + 1) & 7; + } } } + + 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) @@ -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; - s.w += dsinc; - t.w += dtinc; - w.w += dwinc; + if (texture) + { + s.w += dsinc; + t.w += dtinc; + w.w += dwinc; + } + if (zbuffer) + { + z.w += dzinc; + } x += xinc; }