mirror of
https://github.com/holub/mame
synced 2025-07-01 00:09:18 +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 "emu.h"
|
||||||
#include "cpu/tms32031/tms32031.h"
|
#include "cpu/tms32031/tms32031.h"
|
||||||
#include "includes/midzeus.h"
|
#include "includes/midzeus.h"
|
||||||
#include "video/polylgcy.h"
|
#include "video/poly.h"
|
||||||
#include "video/rgbutil.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 UINT8 log_fifo;
|
||||||
|
|
||||||
static UINT32 zeus_fifo[20];
|
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
|
* Macros
|
||||||
@ -258,7 +283,7 @@ VIDEO_START_MEMBER(midzeus2_state,midzeus2)
|
|||||||
waveram[1] = auto_alloc_array(machine(), UINT32, WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12/4);
|
waveram[1] = auto_alloc_array(machine(), UINT32, WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12/4);
|
||||||
|
|
||||||
/* initialize polygon engine */
|
/* 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 */
|
/* we need to cleanup on exit */
|
||||||
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(midzeus2_state::exit_handler2), this));
|
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
|
#endif
|
||||||
|
|
||||||
poly_free(poly);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -350,7 +374,7 @@ UINT32 midzeus2_state::screen_update_midzeus2(screen_device &screen, bitmap_rgb3
|
|||||||
{
|
{
|
||||||
int x, y;
|
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_UP)) { zbase += 1.0f; popmessage("Zbase = %f", (double) zbase); }
|
||||||
if (machine().input().code_pressed(KEYCODE_DOWN)) { 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;
|
break;
|
||||||
|
|
||||||
case 0x38: /* crusnexo/thegrid */
|
case 0x38: /* crusnexo/thegrid */
|
||||||
zeus2_draw_quad(databuffer, texoffs, logit);
|
polyNew->zeus2_draw_quad(databuffer, texoffs, logit);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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 clipvert[8];
|
||||||
poly_vertex vert[4];
|
poly_vertex vert[4];
|
||||||
// float uscale, vscale;
|
// 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_O) && (texoffs & 0xffff) == 0x119) return;
|
||||||
//if (machine().input().code_pressed(KEYCODE_L) && (texoffs & 0x100)) return;
|
//if (machine().input().code_pressed(KEYCODE_L) && (texoffs & 0x100)) return;
|
||||||
|
|
||||||
callback = render_poly_8bit;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
0 38800000
|
0 38800000
|
||||||
1 x2 | x1
|
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)
|
if (numverts < 3)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1210,7 +1230,7 @@ In memory:
|
|||||||
clipvert[i].y += 0.0005f;
|
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)
|
switch (texmode)
|
||||||
{
|
{
|
||||||
case 0x01d: /* crusnexo: RHS of score bar */
|
case 0x01d: /* crusnexo: RHS of score bar */
|
||||||
@ -1222,19 +1242,19 @@ In memory:
|
|||||||
case 0x95d: /* crusnexo */
|
case 0x95d: /* crusnexo */
|
||||||
case 0xc1d: /* crusnexo */
|
case 0xc1d: /* crusnexo */
|
||||||
case 0xc5d: /* crusnexo */
|
case 0xc5d: /* crusnexo */
|
||||||
extra->texwidth = 256;
|
extra.texwidth = 256;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x059: /* crusnexo */
|
case 0x059: /* crusnexo */
|
||||||
case 0x0d9: /* crusnexo */
|
case 0x0d9: /* crusnexo */
|
||||||
case 0x119: /* crusnexo: license plates */
|
case 0x119: /* crusnexo: license plates */
|
||||||
case 0x159: /* crusnexo */
|
case 0x159: /* crusnexo */
|
||||||
extra->texwidth = 128;
|
extra.texwidth = 128;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x055: /* crusnexo */
|
case 0x055: /* crusnexo */
|
||||||
case 0x155: /* crusnexo */
|
case 0x155: /* crusnexo */
|
||||||
extra->texwidth = 64;
|
extra.texwidth = 64;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1249,14 +1269,23 @@ In memory:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extra->solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
|
extra.solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
|
||||||
extra->zoffset = 0;//m_zeusbase[0x7e] >> 16;
|
extra.zoffset = 0;//m_zeusbase[0x7e] >> 16;
|
||||||
extra->alpha = 0;//m_zeusbase[0x4e];
|
extra.alpha = 0;//m_zeusbase[0x4e];
|
||||||
extra->transcolor = 0x100;//((databuffer[1] >> 16) & 1) ? 0 : 0x100;
|
extra.transcolor = 0x100;//((databuffer[1] >> 16) & 1) ? 0 : 0x100;
|
||||||
extra->texbase = WAVERAM_BLOCK0(zeus_texbase);
|
extra.texbase = WAVERAM_BLOCK0(zeus_texbase);
|
||||||
extra->palbase = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
|
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 curz = extent->param[0].start;
|
INT32 curu = extent.param[1].start;
|
||||||
INT32 curu = extent->param[1].start;
|
INT32 curv = extent.param[2].start;
|
||||||
INT32 curv = extent->param[2].start;
|
// INT32 curi = extent.param[3].start;
|
||||||
// INT32 curi = extent->param[3].start;
|
INT32 dzdx = extent.param[0].dpdx;
|
||||||
INT32 dzdx = extent->param[0].dpdx;
|
INT32 dudx = extent.param[1].dpdx;
|
||||||
INT32 dudx = extent->param[1].dpdx;
|
INT32 dvdx = extent.param[2].dpdx;
|
||||||
INT32 dvdx = extent->param[2].dpdx;
|
// INT32 didx = extent.param[3].dpdx;
|
||||||
// INT32 didx = extent->param[3].dpdx;
|
const void *texbase = object.texbase;
|
||||||
const void *texbase = extra->texbase;
|
const void *palbase = object.palbase;
|
||||||
const void *palbase = extra->palbase;
|
UINT16 transcolor = object.transcolor;
|
||||||
UINT16 transcolor = extra->transcolor;
|
int texwidth = object.texwidth;
|
||||||
int texwidth = extra->texwidth;
|
|
||||||
int x;
|
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);
|
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 > 0x7fff) depth = 0x7fff;
|
||||||
if (depth >= 0 && depth <= *depthptr)
|
if (depth >= 0 && depth <= *depthptr)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user