Skip to content

Commit cd0a41e

Browse files
authored
namcos22_v.cpp: replace render_triangle_fan usages with render_polygon & render_triangle (#15844)
* namcos22_v.cpp: Use render_polygon rather than render_triangle_fan for rendering clipped quads * poly.h: Clip extents before calculating its parameters
1 parent fd6e7a5 commit cd0a41e

3 files changed

Lines changed: 35 additions & 16 deletions

File tree

src/devices/video/poly.h

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,8 +1243,16 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(re
12431243
if (istartx > istopx)
12441244
std::swap(istartx, istopx);
12451245

1246-
// compute parameter starting points and deltas
1246+
// apply left/right clipping BEFORE calculating parameter start
1247+
if (!(Flags & POLY_FLAG_NO_CLIPPING))
1248+
{
1249+
istartx = std::max(istartx, cliprect.left());
1250+
istopx = std::min(istopx, cliprect.right() + 1);
1251+
}
1252+
1253+
// set the extent
12471254
extent_t &extent = unit.extent[extnum];
1255+
12481256
if (ParamCount > 0)
12491257
{
12501258
BaseType ldy = fully - ledge->v1->y;
@@ -1256,26 +1264,14 @@ uint32_t poly_manager<BaseType, ObjectType, MaxParams, Flags>::render_polygon(re
12561264
{
12571265
BaseType lparam = ledge->v1->p[paramnum] + ldy * ledge->dpdy[paramnum];
12581266
BaseType rparam = redge->v1->p[paramnum] + rdy * redge->dpdy[paramnum];
1267+
12591268
BaseType dpdx = (rparam - lparam) * oox;
12601269

12611270
extent.param[paramnum].start = lparam + (BaseType(istartx) + BaseType(0.5) - startx) * dpdx;
12621271
extent.param[paramnum].dpdx = dpdx;
12631272
}
12641273
}
12651274

1266-
// apply left/right clipping
1267-
if (!(Flags & POLY_FLAG_NO_CLIPPING))
1268-
{
1269-
if (istartx < cliprect.left())
1270-
{
1271-
for (int paramnum = 0; paramnum < ParamCount; paramnum++)
1272-
extent.param[paramnum].start += (cliprect.left() - istartx) * extent.param[paramnum].dpdx;
1273-
istartx = cliprect.left();
1274-
}
1275-
if (istopx > cliprect.right())
1276-
istopx = cliprect.right() + 1;
1277-
}
1278-
12791275
// set the extent and update the total pixel count
12801276
if (istartx >= istopx)
12811277
istartx = istopx = 0;

src/mame/namco/namcos22.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ class namcos22_renderer : public poly_manager<poly3d_t, namcos22_object_data, 4>
178178
void free_scenenode(struct namcos22_scenenode *node);
179179
struct namcos22_scenenode *alloc_scenenode(running_machine &machine, struct namcos22_scenenode *node);
180180

181+
using scanline_func = void (namcos22_renderer::*)(int32_t scanline, const extent_t &extent, const namcos22_object_data &extra, int threadid);
182+
183+
void dispatch_scanline_poly(scanline_func callback, int clipverts, vertex_t const *clipv);
181184
void renderscanline_poly(int32_t scanline, const extent_t &extent, const namcos22_object_data &extra, int threadid);
182185
void renderscanline_poly_ss22(int32_t scanline, const extent_t &extent, const namcos22_object_data &extra, int threadid);
183186
void renderscanline_sprite(int32_t scanline, const extent_t &extent, const namcos22_object_data &extra, int threadid);

src/mame/namco/namcos22_v.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,27 @@ void namcos22_renderer::renderscanline_sprite(int32_t scanline, const extent_t &
280280
}
281281
}
282282

283+
inline void namcos22_renderer::dispatch_scanline_poly(scanline_func callback, int clipverts, vertex_t const *clipv)
284+
{
285+
switch (clipverts)
286+
{
287+
case 3:
288+
render_triangle<4>(m_cliprect, render_delegate(callback, this), clipv[0], clipv[1], clipv[2]);
289+
break;
290+
291+
case 4:
292+
render_polygon<4,4>(m_cliprect, render_delegate(callback, this), clipv);
293+
break;
283294

295+
case 5:
296+
render_polygon<5,4>(m_cliprect, render_delegate(callback, this), clipv);
297+
break;
298+
299+
case 6:
300+
render_polygon<6,4>(m_cliprect, render_delegate(callback, this), clipv);
301+
break;
302+
}
303+
}
284304

285305
/*********************************************************************************************/
286306

@@ -453,9 +473,9 @@ void namcos22_renderer::poly3d_drawquad(screen_device &screen, bitmap_rgb32 &bit
453473
}
454474

455475
if (m_state.m_is_ss22)
456-
render_triangle_fan<4>(m_cliprect, render_delegate(&namcos22_renderer::renderscanline_poly_ss22, this), clipverts, clipv);
476+
dispatch_scanline_poly(&namcos22_renderer::renderscanline_poly_ss22, clipverts, clipv);
457477
else
458-
render_triangle_fan<4>(m_cliprect, render_delegate(&namcos22_renderer::renderscanline_poly, this), clipverts, clipv);
478+
dispatch_scanline_poly(&namcos22_renderer::renderscanline_poly, clipverts, clipv);
459479
}
460480

461481

0 commit comments

Comments
 (0)