Previous 199869 Revisions Next

r40576 Wednesday 2nd September, 2015 at 12:00:41 UTC by Andrew Gardner
Moved midzeus2 over to "polynew". (nw)
[src/mame/video]midzeus2.c

trunk/src/mame/video/midzeus2.c
r249087r249088
99#include "emu.h"
1010#include "cpu/tms32031/tms32031.h"
1111#include "includes/midzeus.h"
12#include "video/polylgcy.h"
12#include "video/poly.h"
1313#include "video/rgbutil.h"
1414
1515
r249087r249088
5050};
5151
5252
53/*************************************
54 *
55 *  Polygon renderer
56 *
57 *************************************/
5358
59class midzeus2_renderer : public poly_manager<float, mz2_poly_extra_data, 4, 10000>
60{
61public:
62   midzeus2_renderer(midzeus2_state &state);
63
64    void render_poly_8bit(INT32 scanline, const extent_t& extent, const mz2_poly_extra_data& object, int threadid);
65   
66    void zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit);
67   
68    bitmap_rgb32 &screenbits() { return m_screenbits; }
69   
70private:
71   midzeus2_state& m_state;
72    bitmap_rgb32 m_screenbits;
73};
74
75typedef midzeus2_renderer::vertex_t poly_vertex;
76typedef midzeus2_renderer::extent_t poly_extent;
77
78midzeus2_renderer::midzeus2_renderer(midzeus2_state &state)
79    : poly_manager<float, mz2_poly_extra_data, 4, 10000>(state.machine())
80    , m_state(state)
81    , m_screenbits(state.m_screen->width(), state.m_screen->height())
82{
83   
84}
85
86
5487/*************************************
5588 *
5689 *  Global variables
5790 *
5891 *************************************/
5992
60static legacy_poly_manager *poly;
93static midzeus2_renderer* polyNew;
6194static UINT8 log_fifo;
6295
6396static UINT32 zeus_fifo[20];
r249087r249088
99132
100133/*************************************
101134 *
102 *  Function prototypes
103 *
104 *************************************/
105
106static void render_poly_8bit(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
107
108/*************************************
109 *
110135 *  Macros
111136 *
112137 *************************************/
r249087r249088
258283   waveram[1] = auto_alloc_array(machine(), UINT32, WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12/4);
259284
260285   /* initialize polygon engine */
261   poly = poly_alloc(machine(), 10000, sizeof(mz2_poly_extra_data), POLYFLAG_ALLOW_QUADS);
262
286    polyNew = auto_alloc(machine(), midzeus2_renderer(*this));
287   
263288   /* we need to cleanup on exit */
264289   machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(midzeus2_state::exit_handler2), this));
265290
r249087r249088
335360}
336361#endif
337362
338   poly_free(poly);
339363}
340364
341365
r249087r249088
350374{
351375   int x, y;
352376
353   poly_wait(poly, "VIDEO_UPDATE");
354
377    polyNew->wait();
378   
355379if (machine().input().code_pressed(KEYCODE_UP)) { zbase += 1.0f; popmessage("Zbase = %f", (double) zbase); }
356380if (machine().input().code_pressed(KEYCODE_DOWN)) { zbase -= 1.0f; popmessage("Zbase = %f", (double) zbase); }
357381
r249087r249088
10071031                  break;
10081032
10091033               case 0x38:  /* crusnexo/thegrid */
1010                  zeus2_draw_quad(databuffer, texoffs, logit);
1034                  polyNew->zeus2_draw_quad(databuffer, texoffs, logit);
10111035                  break;
10121036
10131037               default:
r249087r249088
10361060 *
10371061 *************************************/
10381062
1039void midzeus2_state::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit)
1063void midzeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit)
10401064{
1041   poly_draw_scanline_func callback;
1042   mz2_poly_extra_data *extra;
10431065   poly_vertex clipvert[8];
10441066   poly_vertex vert[4];
10451067//  float uscale, vscale;
r249087r249088
10641086//if (machine().input().code_pressed(KEYCODE_O) && (texoffs & 0xffff) == 0x119) return;
10651087//if (machine().input().code_pressed(KEYCODE_L) && (texoffs & 0x100)) return;
10661088
1067   callback = render_poly_8bit;
1068
10691089/*
107010900   38800000
107110911   x2 | x1
r249087r249088
11791199      }
11801200   }
11811201
1182   numverts = poly_zclip_if_less(4, &vert[0], &clipvert[0], 4, 1.0f / 512.0f / 4.0f);
1202   numverts = polyNew->zclip_if_less(4, &vert[0], &clipvert[0], 4, 1.0f / 512.0f / 4.0f);
11831203   if (numverts < 3)
11841204      return;
11851205
r249087r249088
12101230         clipvert[i].y += 0.0005f;
12111231   }
12121232
1213   extra = (mz2_poly_extra_data *)poly_get_extra_data(poly);
1233    mz2_poly_extra_data& extra = polyNew->object_data_alloc();
12141234   switch (texmode)
12151235   {
12161236      case 0x01d:     /* crusnexo: RHS of score bar */
r249087r249088
12221242      case 0x95d:     /* crusnexo */
12231243      case 0xc1d:     /* crusnexo */
12241244      case 0xc5d:     /* crusnexo */
1225         extra->texwidth = 256;
1245         extra.texwidth = 256;
12261246         break;
12271247
12281248      case 0x059:     /* crusnexo */
12291249      case 0x0d9:     /* crusnexo */
12301250      case 0x119:     /* crusnexo: license plates */
12311251      case 0x159:     /* crusnexo */
1232         extra->texwidth = 128;
1252         extra.texwidth = 128;
12331253         break;
12341254
12351255      case 0x055:     /* crusnexo */
12361256      case 0x155:     /* crusnexo */
1237         extra->texwidth = 64;
1257         extra.texwidth = 64;
12381258         break;
12391259
12401260      default:
r249087r249088
12491269      }
12501270   }
12511271
1252   extra->solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
1253   extra->zoffset = 0;//m_zeusbase[0x7e] >> 16;
1254   extra->alpha = 0;//m_zeusbase[0x4e];
1255   extra->transcolor = 0x100;//((databuffer[1] >> 16) & 1) ? 0 : 0x100;
1256   extra->texbase = WAVERAM_BLOCK0(zeus_texbase);
1257   extra->palbase = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
1272   extra.solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
1273   extra.zoffset = 0;//m_zeusbase[0x7e] >> 16;
1274   extra.alpha = 0;//m_zeusbase[0x4e];
1275   extra.transcolor = 0x100;//((databuffer[1] >> 16) & 1) ? 0 : 0x100;
1276   extra.texbase = WAVERAM_BLOCK0(zeus_texbase);
1277   extra.palbase = waveram0_ptr_from_expanded_addr(m_state.m_zeusbase[0x41]);
12581278
1259   poly_render_quad_fan(poly, NULL, zeus_cliprect, callback, 4, numverts, &clipvert[0]);
1279    // Note: Before being converted to the "poly.h" interface, this used to call the polylgcy function
1280    //       poly_render_quad_fan.  The behavior seems to be the same as it once was after a few short
1281    //       tests, but the (numverts == 5) statement below may actually be a quad fan instead of a 5-sided
1282    //       polygon.
1283    if (numverts == 3)
1284        render_triangle(zeus_cliprect, render_delegate(FUNC(midzeus2_renderer::render_poly_8bit), this), 4, clipvert[0], clipvert[1], clipvert[2]);
1285    else if (numverts == 4)
1286        render_polygon<4>(zeus_cliprect, render_delegate(FUNC(midzeus2_renderer::render_poly_8bit), this), 4, clipvert);
1287    else if (numverts == 5)
1288        render_polygon<5>(zeus_cliprect, render_delegate(FUNC(midzeus2_renderer::render_poly_8bit), this), 4, clipvert);
12601289}
12611290
12621291
r249087r249088
12671296 *
12681297 *************************************/
12691298
1270static void render_poly_8bit(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid)
1299void midzeus2_renderer::render_poly_8bit(INT32 scanline, const extent_t& extent, const mz2_poly_extra_data& object, int threadid)
12711300{
1272   const mz2_poly_extra_data *extra = (const mz2_poly_extra_data *)extradata;
1273   INT32 curz = extent->param[0].start;
1274   INT32 curu = extent->param[1].start;
1275   INT32 curv = extent->param[2].start;
1276//  INT32 curi = extent->param[3].start;
1277   INT32 dzdx = extent->param[0].dpdx;
1278   INT32 dudx = extent->param[1].dpdx;
1279   INT32 dvdx = extent->param[2].dpdx;
1280//  INT32 didx = extent->param[3].dpdx;
1281   const void *texbase = extra->texbase;
1282   const void *palbase = extra->palbase;
1283   UINT16 transcolor = extra->transcolor;
1284   int texwidth = extra->texwidth;
1301   INT32 curz = extent.param[0].start;
1302   INT32 curu = extent.param[1].start;
1303   INT32 curv = extent.param[2].start;
1304//  INT32 curi = extent.param[3].start;
1305   INT32 dzdx = extent.param[0].dpdx;
1306   INT32 dudx = extent.param[1].dpdx;
1307   INT32 dvdx = extent.param[2].dpdx;
1308//  INT32 didx = extent.param[3].dpdx;
1309   const void *texbase = object.texbase;
1310   const void *palbase = object.palbase;
1311   UINT16 transcolor = object.transcolor;
1312   int texwidth = object.texwidth;
12851313   int x;
12861314
1287   for (x = extent->startx; x < extent->stopx; x++)
1315   for (x = extent.startx; x < extent.stopx; x++)
12881316   {
12891317      UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, scanline, x);
1290      INT32 depth = (curz >> 16) + extra->zoffset;
1318      INT32 depth = (curz >> 16) + object.zoffset;
12911319      if (depth > 0x7fff) depth = 0x7fff;
12921320      if (depth >= 0 && depth <= *depthptr)
12931321      {


Previous 199869 Revisions Next


© 1997-2024 The MAME Team