mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
Moved midzeus2 over to "polynew". (nw)
This commit is contained in:
parent
70bddf12f5
commit
52c2ab0239
@ -9,7 +9,7 @@
|
||||
#include "emu.h"
|
||||
#include "cpu/tms32031/tms32031.h"
|
||||
#include "includes/midzeus.h"
|
||||
#include "video/polylgcy.h"
|
||||
#include "video/poly.h"
|
||||
#include "video/rgbutil.h"
|
||||
|
||||
|
||||
@ -50,6 +50,39 @@ struct mz2_poly_extra_data
|
||||
};
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Polygon renderer
|
||||
*
|
||||
*************************************/
|
||||
|
||||
class midzeus2_renderer : public poly_manager<float, mz2_poly_extra_data, 4, 10000>
|
||||
{
|
||||
public:
|
||||
midzeus2_renderer(midzeus2_state &state);
|
||||
|
||||
void render_poly_8bit(INT32 scanline, const extent_t& extent, const mz2_poly_extra_data& object, int threadid);
|
||||
|
||||
void zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit);
|
||||
|
||||
bitmap_rgb32 &screenbits() { return m_screenbits; }
|
||||
|
||||
private:
|
||||
midzeus2_state& m_state;
|
||||
bitmap_rgb32 m_screenbits;
|
||||
};
|
||||
|
||||
typedef midzeus2_renderer::vertex_t poly_vertex;
|
||||
typedef midzeus2_renderer::extent_t poly_extent;
|
||||
|
||||
midzeus2_renderer::midzeus2_renderer(midzeus2_state &state)
|
||||
: poly_manager<float, mz2_poly_extra_data, 4, 10000>(state.machine())
|
||||
, m_state(state)
|
||||
, m_screenbits(state.m_screen->width(), state.m_screen->height())
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
@ -57,7 +90,7 @@ struct mz2_poly_extra_data
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static legacy_poly_manager *poly;
|
||||
static midzeus2_renderer* polyNew;
|
||||
static UINT8 log_fifo;
|
||||
|
||||
static UINT32 zeus_fifo[20];
|
||||
@ -97,14 +130,6 @@ static int subregwrite_count[0x100];
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Function prototypes
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static void render_poly_8bit(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Macros
|
||||
@ -258,8 +283,8 @@ VIDEO_START_MEMBER(midzeus2_state,midzeus2)
|
||||
waveram[1] = auto_alloc_array(machine(), UINT32, WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12/4);
|
||||
|
||||
/* initialize polygon engine */
|
||||
poly = poly_alloc(machine(), 10000, sizeof(mz2_poly_extra_data), POLYFLAG_ALLOW_QUADS);
|
||||
|
||||
polyNew = auto_alloc(machine(), midzeus2_renderer(*this));
|
||||
|
||||
/* we need to cleanup on exit */
|
||||
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(midzeus2_state::exit_handler2), this));
|
||||
|
||||
@ -335,7 +360,6 @@ void midzeus2_state::exit_handler2()
|
||||
}
|
||||
#endif
|
||||
|
||||
poly_free(poly);
|
||||
}
|
||||
|
||||
|
||||
@ -350,8 +374,8 @@ UINT32 midzeus2_state::screen_update_midzeus2(screen_device &screen, bitmap_rgb3
|
||||
{
|
||||
int x, y;
|
||||
|
||||
poly_wait(poly, "VIDEO_UPDATE");
|
||||
|
||||
polyNew->wait();
|
||||
|
||||
if (machine().input().code_pressed(KEYCODE_UP)) { zbase += 1.0f; popmessage("Zbase = %f", (double) zbase); }
|
||||
if (machine().input().code_pressed(KEYCODE_DOWN)) { zbase -= 1.0f; popmessage("Zbase = %f", (double) zbase); }
|
||||
|
||||
@ -1007,7 +1031,7 @@ void midzeus2_state::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
|
||||
break;
|
||||
|
||||
case 0x38: /* crusnexo/thegrid */
|
||||
zeus2_draw_quad(databuffer, texoffs, logit);
|
||||
polyNew->zeus2_draw_quad(databuffer, texoffs, logit);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1036,10 +1060,8 @@ void midzeus2_state::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void midzeus2_state::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit)
|
||||
void midzeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit)
|
||||
{
|
||||
poly_draw_scanline_func callback;
|
||||
mz2_poly_extra_data *extra;
|
||||
poly_vertex clipvert[8];
|
||||
poly_vertex vert[4];
|
||||
// float uscale, vscale;
|
||||
@ -1064,8 +1086,6 @@ if (machine().input().code_pressed(KEYCODE_Y) && (texoffs & 0xffff) == 0x0dd) re
|
||||
//if (machine().input().code_pressed(KEYCODE_O) && (texoffs & 0xffff) == 0x119) return;
|
||||
//if (machine().input().code_pressed(KEYCODE_L) && (texoffs & 0x100)) return;
|
||||
|
||||
callback = render_poly_8bit;
|
||||
|
||||
/*
|
||||
0 38800000
|
||||
1 x2 | x1
|
||||
@ -1179,7 +1199,7 @@ In memory:
|
||||
}
|
||||
}
|
||||
|
||||
numverts = poly_zclip_if_less(4, &vert[0], &clipvert[0], 4, 1.0f / 512.0f / 4.0f);
|
||||
numverts = polyNew->zclip_if_less(4, &vert[0], &clipvert[0], 4, 1.0f / 512.0f / 4.0f);
|
||||
if (numverts < 3)
|
||||
return;
|
||||
|
||||
@ -1210,7 +1230,7 @@ In memory:
|
||||
clipvert[i].y += 0.0005f;
|
||||
}
|
||||
|
||||
extra = (mz2_poly_extra_data *)poly_get_extra_data(poly);
|
||||
mz2_poly_extra_data& extra = polyNew->object_data_alloc();
|
||||
switch (texmode)
|
||||
{
|
||||
case 0x01d: /* crusnexo: RHS of score bar */
|
||||
@ -1222,19 +1242,19 @@ In memory:
|
||||
case 0x95d: /* crusnexo */
|
||||
case 0xc1d: /* crusnexo */
|
||||
case 0xc5d: /* crusnexo */
|
||||
extra->texwidth = 256;
|
||||
extra.texwidth = 256;
|
||||
break;
|
||||
|
||||
case 0x059: /* crusnexo */
|
||||
case 0x0d9: /* crusnexo */
|
||||
case 0x119: /* crusnexo: license plates */
|
||||
case 0x159: /* crusnexo */
|
||||
extra->texwidth = 128;
|
||||
extra.texwidth = 128;
|
||||
break;
|
||||
|
||||
case 0x055: /* crusnexo */
|
||||
case 0x155: /* crusnexo */
|
||||
extra->texwidth = 64;
|
||||
extra.texwidth = 64;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1249,14 +1269,23 @@ In memory:
|
||||
}
|
||||
}
|
||||
|
||||
extra->solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
|
||||
extra->zoffset = 0;//m_zeusbase[0x7e] >> 16;
|
||||
extra->alpha = 0;//m_zeusbase[0x4e];
|
||||
extra->transcolor = 0x100;//((databuffer[1] >> 16) & 1) ? 0 : 0x100;
|
||||
extra->texbase = WAVERAM_BLOCK0(zeus_texbase);
|
||||
extra->palbase = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
|
||||
extra.solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
|
||||
extra.zoffset = 0;//m_zeusbase[0x7e] >> 16;
|
||||
extra.alpha = 0;//m_zeusbase[0x4e];
|
||||
extra.transcolor = 0x100;//((databuffer[1] >> 16) & 1) ? 0 : 0x100;
|
||||
extra.texbase = WAVERAM_BLOCK0(zeus_texbase);
|
||||
extra.palbase = waveram0_ptr_from_expanded_addr(m_state.m_zeusbase[0x41]);
|
||||
|
||||
poly_render_quad_fan(poly, NULL, zeus_cliprect, callback, 4, numverts, &clipvert[0]);
|
||||
// Note: Before being converted to the "poly.h" interface, this used to call the polylgcy function
|
||||
// poly_render_quad_fan. The behavior seems to be the same as it once was after a few short
|
||||
// tests, but the (numverts == 5) statement below may actually be a quad fan instead of a 5-sided
|
||||
// polygon.
|
||||
if (numverts == 3)
|
||||
render_triangle(zeus_cliprect, render_delegate(FUNC(midzeus2_renderer::render_poly_8bit), this), 4, clipvert[0], clipvert[1], clipvert[2]);
|
||||
else if (numverts == 4)
|
||||
render_polygon<4>(zeus_cliprect, render_delegate(FUNC(midzeus2_renderer::render_poly_8bit), this), 4, clipvert);
|
||||
else if (numverts == 5)
|
||||
render_polygon<5>(zeus_cliprect, render_delegate(FUNC(midzeus2_renderer::render_poly_8bit), this), 4, clipvert);
|
||||
}
|
||||
|
||||
|
||||
@ -1267,27 +1296,26 @@ In memory:
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static void render_poly_8bit(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid)
|
||||
void midzeus2_renderer::render_poly_8bit(INT32 scanline, const extent_t& extent, const mz2_poly_extra_data& object, int threadid)
|
||||
{
|
||||
const mz2_poly_extra_data *extra = (const mz2_poly_extra_data *)extradata;
|
||||
INT32 curz = extent->param[0].start;
|
||||
INT32 curu = extent->param[1].start;
|
||||
INT32 curv = extent->param[2].start;
|
||||
// INT32 curi = extent->param[3].start;
|
||||
INT32 dzdx = extent->param[0].dpdx;
|
||||
INT32 dudx = extent->param[1].dpdx;
|
||||
INT32 dvdx = extent->param[2].dpdx;
|
||||
// INT32 didx = extent->param[3].dpdx;
|
||||
const void *texbase = extra->texbase;
|
||||
const void *palbase = extra->palbase;
|
||||
UINT16 transcolor = extra->transcolor;
|
||||
int texwidth = extra->texwidth;
|
||||
INT32 curz = extent.param[0].start;
|
||||
INT32 curu = extent.param[1].start;
|
||||
INT32 curv = extent.param[2].start;
|
||||
// INT32 curi = extent.param[3].start;
|
||||
INT32 dzdx = extent.param[0].dpdx;
|
||||
INT32 dudx = extent.param[1].dpdx;
|
||||
INT32 dvdx = extent.param[2].dpdx;
|
||||
// INT32 didx = extent.param[3].dpdx;
|
||||
const void *texbase = object.texbase;
|
||||
const void *palbase = object.palbase;
|
||||
UINT16 transcolor = object.transcolor;
|
||||
int texwidth = object.texwidth;
|
||||
int x;
|
||||
|
||||
for (x = extent->startx; x < extent->stopx; x++)
|
||||
for (x = extent.startx; x < extent.stopx; x++)
|
||||
{
|
||||
UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, scanline, x);
|
||||
INT32 depth = (curz >> 16) + extra->zoffset;
|
||||
INT32 depth = (curz >> 16) + object.zoffset;
|
||||
if (depth > 0x7fff) depth = 0x7fff;
|
||||
if (depth >= 0 && depth <= *depthptr)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user