diff options
author | Andrew Gardner <andrew.gardner@liu.se> | 2015-09-02 17:56:14 +0200 |
---|---|---|
committer | Andrew Gardner <andrew.gardner@liu.se> | 2015-09-02 17:59:16 +0200 |
commit | 78f95dc1d0048be5ad7b7996c09eb8cf1d595413 (patch) | |
tree | ce666c7b65712e604f5deb1676b8e6a02b07fff7 | |
parent | 6e072a10925026e8519da6a6589c8935a1de522c (diff) |
Updated model2 to new polygon rasterizer interface. (nw)
I *almost* was able to do this as cleanly as I would have liked. There remains
a switch statement on line 824 in video/model2.c that I would have liked to get
rid of, but I have yet to figure out a way to pass model2_renderer's member
variable m_renderfuncs[renderer] to the FUNC macro (living inside a
render_delegate constructor) successfully.
Of course, it could be done in an entirely different manner, but that can wait
for the great Model2 rewrite of 20XX :-).
-rw-r--r-- | src/mame/includes/model2.h | 182 | ||||
-rw-r--r-- | src/mame/video/model2.c | 218 | ||||
-rw-r--r-- | src/mame/video/model2rd.inc | 52 |
3 files changed, 253 insertions, 199 deletions
diff --git a/src/mame/includes/model2.h b/src/mame/includes/model2.h index 034c6c05e98..5cbac76e7ca 100644 --- a/src/mame/includes/model2.h +++ b/src/mame/includes/model2.h @@ -1,6 +1,6 @@ // license:BSD-3-Clause // copyright-holders:R. Belmont, Olivier Galibert, ElSemi, Angelo Salese -#include "video/polylgcy.h" +#include "video/poly.h" #include "audio/dsbz80.h" #include "audio/segam1audio.h" #include "machine/eepromser.h" @@ -9,10 +9,10 @@ #include "machine/315-5881_crypt.h" #include "machine/315-5838_317-0229_comp.h" +class model2_renderer; struct raster_state; struct geo_state; - class model2_state : public driver_device { public: @@ -107,7 +107,7 @@ public: int m_jnet_time_out; UINT32 m_geo_read_start_address; UINT32 m_geo_write_start_address; - legacy_poly_manager *m_poly; + model2_renderer *m_poly; raster_state *m_raster; geo_state *m_geo; bitmap_rgb32 m_sys24_bitmap; @@ -219,7 +219,6 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(model2_timer_cb); TIMER_DEVICE_CALLBACK_MEMBER(model2_interrupt); TIMER_DEVICE_CALLBACK_MEMBER(model2c_interrupt); - void model2_exit(); DECLARE_WRITE8_MEMBER(scsp_irq); DECLARE_READ_LINE_MEMBER(copro_tgp_fifoin_pop_ok); DECLARE_READ32_MEMBER(copro_tgp_fifoin_pop); @@ -237,5 +236,180 @@ public: void model2_3d_frame_end( bitmap_rgb32 &bitmap, const rectangle &cliprect ); }; + +/***************************** + * + * Modern polygon renderer + * + *****************************/ + +struct m2_poly_extra_data +{ + model2_state * state; + UINT32 lumabase; + UINT32 colorbase; + UINT32 * texsheet; + UINT32 texwidth; + UINT32 texheight; + UINT32 texx, texy; + UINT8 texmirrorx; + UINT8 texmirrory; +}; + + +INLINE UINT16 get_texel( UINT32 base_x, UINT32 base_y, int x, int y, UINT32 *sheet ) +{ + UINT32 baseoffs = ((base_y/2)*512)+(base_x/2); + UINT32 texeloffs = ((y/2)*512)+(x/2); + UINT32 offset = baseoffs + texeloffs; + UINT32 texel = sheet[offset>>1]; + + if ( offset & 1 ) + texel >>= 16; + + if ( (y & 1) == 0 ) + texel >>= 8; + + if ( (x & 1) == 0 ) + texel >>= 4; + + return (texel & 0x0f); +} + +struct triangle; + +class model2_renderer : public poly_manager<float, m2_poly_extra_data, 4, 4000> +{ + +public: + typedef void (model2_renderer::*scanline_render_func)(INT32 scanline, const extent_t& extent, const m2_poly_extra_data& object, int threadid); + +public: + model2_renderer(model2_state& state) + : poly_manager<float, m2_poly_extra_data, 4, 4000>(state.machine()) + , m_state(state) + , m_destmap(state.m_screen->width(), state.m_screen->height()) + { + m_renderfuncs[0] = &model2_renderer::model2_3d_render_0; + m_renderfuncs[1] = &model2_renderer::model2_3d_render_1; + m_renderfuncs[2] = &model2_renderer::model2_3d_render_2; + m_renderfuncs[3] = &model2_renderer::model2_3d_render_3; + m_renderfuncs[4] = &model2_renderer::model2_3d_render_4; + m_renderfuncs[5] = &model2_renderer::model2_3d_render_5; + m_renderfuncs[6] = &model2_renderer::model2_3d_render_6; + m_renderfuncs[7] = &model2_renderer::model2_3d_render_7; + } + + bitmap_rgb32& destmap() { return m_destmap; } + + void model2_3d_render(triangle *tri, const rectangle &cliprect); + + /* checker = 0, textured = 0, transparent = 0 */ + #define MODEL2_FUNC 0 + #define MODEL2_FUNC_NAME model2_3d_render_0 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + /* checker = 0, textured = 0, translucent = 1 */ + #define MODEL2_FUNC 1 + #define MODEL2_FUNC_NAME model2_3d_render_1 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + /* checker = 0, textured = 1, translucent = 0 */ + #define MODEL2_FUNC 2 + #define MODEL2_FUNC_NAME model2_3d_render_2 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + /* checker = 0, textured = 1, translucent = 1 */ + #define MODEL2_FUNC 3 + #define MODEL2_FUNC_NAME model2_3d_render_3 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + /* checker = 1, textured = 0, translucent = 0 */ + #define MODEL2_FUNC 4 + #define MODEL2_FUNC_NAME model2_3d_render_4 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + /* checker = 1, textured = 0, translucent = 1 */ + #define MODEL2_FUNC 5 + #define MODEL2_FUNC_NAME model2_3d_render_5 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + /* checker = 1, textured = 1, translucent = 0 */ + #define MODEL2_FUNC 6 + #define MODEL2_FUNC_NAME model2_3d_render_6 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + /* checker = 1, textured = 1, translucent = 1 */ + #define MODEL2_FUNC 7 + #define MODEL2_FUNC_NAME model2_3d_render_7 + #include "video/model2rd.inc" + #undef MODEL2_FUNC + #undef MODEL2_FUNC_NAME + + scanline_render_func m_renderfuncs[8]; + +private: + model2_state& m_state; + bitmap_rgb32 m_destmap; +}; + +typedef model2_renderer::vertex_t poly_vertex; + + +/******************************************* + * + * Basic Data Types + * + *******************************************/ + +struct plane +{ + poly_vertex normal; + float distance; +}; + +struct texture_parameter +{ + float diffuse; + float ambient; + UINT32 specular_control; + float specular_scale; +}; + +struct triangle +{ + void * next; + poly_vertex v[3]; + UINT16 z; + UINT16 texheader[4]; + UINT8 luma; + INT16 viewport[4]; + INT16 center[2]; +}; + +struct quad_m2 +{ + poly_vertex v[4]; + UINT16 z; + UINT16 texheader[4]; + UINT8 luma; +}; + + + /*----------- defined in video/model2.c -----------*/ void model2_3d_set_zclip( running_machine &machine, UINT8 clip ); diff --git a/src/mame/video/model2.c b/src/mame/video/model2.c index 56ba04cd024..0478d6c6689 100644 --- a/src/mame/video/model2.c +++ b/src/mame/video/model2.c @@ -89,7 +89,6 @@ *********************************************************************************************************************************/ #include "emu.h" #include "video/segaic24.h" -#include "video/polylgcy.h" #include "includes/model2.h" #define MODEL2_VIDEO_DEBUG 0 @@ -102,59 +101,6 @@ /******************************************* * - * Basic Data Types - * - *******************************************/ - -struct plane -{ - poly_vertex normal; - float distance; -}; - -struct texture_parameter -{ - float diffuse; - float ambient; - UINT32 specular_control; - float specular_scale; -}; - -struct triangle -{ - void * next; - poly_vertex v[3]; - UINT16 z; - UINT16 texheader[4]; - UINT8 luma; - INT16 viewport[4]; - INT16 center[2]; -}; - -struct quad_m2 -{ - poly_vertex v[4]; - UINT16 z; - UINT16 texheader[4]; - UINT8 luma; -}; - -struct m2_poly_extra_data -{ - model2_state * state; - UINT32 lumabase; - UINT32 colorbase; - UINT32 * texsheet; - UINT32 texwidth; - UINT32 texheight; - UINT32 texx, texy; - UINT8 texmirrorx; - UINT8 texmirrory; -}; - - -/******************************************* - * * Generic 3D Math Functions * *******************************************/ @@ -834,101 +780,14 @@ static void model2_3d_process_triangle( raster_state *raster, UINT32 attr ) } /***********************************************************************************************/ - -INLINE UINT16 get_texel( UINT32 base_x, UINT32 base_y, int x, int y, UINT32 *sheet ) -{ - UINT32 baseoffs = ((base_y/2)*512)+(base_x/2); - UINT32 texeloffs = ((y/2)*512)+(x/2); - UINT32 offset = baseoffs + texeloffs; - UINT32 texel = sheet[offset>>1]; - - if ( offset & 1 ) - texel >>= 16; - - if ( (y & 1) == 0 ) - texel >>= 8; - - if ( (x & 1) == 0 ) - texel >>= 4; - - return (texel & 0x0f); -} - -/* checker = 0, textured = 0, transparent = 0 */ -#define MODEL2_FUNC 0 -#define MODEL2_FUNC_NAME model2_3d_render_0 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - -/* checker = 0, textured = 0, translucent = 1 */ -#define MODEL2_FUNC 1 -#define MODEL2_FUNC_NAME model2_3d_render_1 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - -/* checker = 0, textured = 1, translucent = 0 */ -#define MODEL2_FUNC 2 -#define MODEL2_FUNC_NAME model2_3d_render_2 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - -/* checker = 0, textured = 1, translucent = 1 */ -#define MODEL2_FUNC 3 -#define MODEL2_FUNC_NAME model2_3d_render_3 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - -/* checker = 1, textured = 0, translucent = 0 */ -#define MODEL2_FUNC 4 -#define MODEL2_FUNC_NAME model2_3d_render_4 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - -/* checker = 1, textured = 0, translucent = 1 */ -#define MODEL2_FUNC 5 -#define MODEL2_FUNC_NAME model2_3d_render_5 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - -/* checker = 1, textured = 1, translucent = 0 */ -#define MODEL2_FUNC 6 -#define MODEL2_FUNC_NAME model2_3d_render_6 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - -/* checker = 1, textured = 1, translucent = 1 */ -#define MODEL2_FUNC 7 -#define MODEL2_FUNC_NAME model2_3d_render_7 -#include "model2rd.inc" -#undef MODEL2_FUNC -#undef MODEL2_FUNC_NAME - + /***********************************************************************************************/ -static const poly_draw_scanline_func render_funcs[8] = +void model2_renderer::model2_3d_render(triangle *tri, const rectangle &cliprect) { - model2_3d_render_0, /* checker = 0, textured = 0, translucent = 0 */ - model2_3d_render_1, /* checker = 0, textured = 0, translucent = 1 */ - model2_3d_render_2, /* checker = 0, textured = 1, translucent = 0 */ - model2_3d_render_3, /* checker = 0, textured = 1, translucent = 1 */ - model2_3d_render_4, /* checker = 1, textured = 0, translucent = 0 */ - model2_3d_render_5, /* checker = 1, textured = 0, translucent = 1 */ - model2_3d_render_6, /* checker = 1, textured = 1, translucent = 0 */ - model2_3d_render_7 /* checker = 1, textured = 1, translucent = 1 */ -}; - -static void model2_3d_render( model2_state *state, bitmap_rgb32 &bitmap, triangle *tri, const rectangle &cliprect ) -{ - legacy_poly_manager *poly = state->m_poly; - m2_poly_extra_data *extra = (m2_poly_extra_data *)poly_get_extra_data(poly); - UINT8 renderer; + model2_renderer *poly = m_state.m_poly; + m2_poly_extra_data& extra = poly->object_data_alloc(); + UINT8 renderer; /* select renderer based on attributes (bit15 = checker, bit14 = textured, bit13 = transparent */ renderer = (tri->texheader[0] >> 13) & 7; @@ -937,20 +796,20 @@ static void model2_3d_render( model2_state *state, bitmap_rgb32 &bitmap, triangl rectangle vp(tri->viewport[0] - 8, tri->viewport[2] - 8, (384-tri->viewport[3])+90, (384-tri->viewport[1])+90); vp &= cliprect; - extra->state = state; - extra->lumabase = ((tri->texheader[1] & 0xFF) << 7) + ((tri->luma >> 5) ^ 0x7); - extra->colorbase = (tri->texheader[3] >> 6) & 0x3FF; + extra.state = &m_state; + extra.lumabase = ((tri->texheader[1] & 0xFF) << 7) + ((tri->luma >> 5) ^ 0x7); + extra.colorbase = (tri->texheader[3] >> 6) & 0x3FF; if (renderer & 2) { - extra->texwidth = 32 << ((tri->texheader[0] >> 0) & 0x7); - extra->texheight = 32 << ((tri->texheader[0] >> 3) & 0x7); - extra->texx = 32 * ((tri->texheader[2] >> 0) & 0x1f); - extra->texy = 32 * (((tri->texheader[2] >> 6) & 0x1f) + ( tri->texheader[2] & 0x20 )); + extra.texwidth = 32 << ((tri->texheader[0] >> 0) & 0x7); + extra.texheight = 32 << ((tri->texheader[0] >> 3) & 0x7); + extra.texx = 32 * ((tri->texheader[2] >> 0) & 0x1f); + extra.texy = 32 * (((tri->texheader[2] >> 6) & 0x1f) + ( tri->texheader[2] & 0x20 )); /* TODO: Virtua Striker contradicts with this. */ - extra->texmirrorx = 0;//(tri->texheader[0] >> 9) & 1; - extra->texmirrory = 0;//(tri->texheader[0] >> 8) & 1; - extra->texsheet = (tri->texheader[2] & 0x1000) ? state->m_textureram1 : state->m_textureram0; + extra.texmirrorx = 0;//(tri->texheader[0] >> 9) & 1; + extra.texmirrory = 0;//(tri->texheader[0] >> 8) & 1; + extra.texsheet = (tri->texheader[2] & 0x1000) ? m_state.m_textureram1 : m_state.m_textureram0; tri->v[0].pz = 1.0f / (1.0f + tri->v[0].pz); tri->v[0].pu = tri->v[0].pu * tri->v[0].pz * (1.0f / 8.0f); @@ -962,10 +821,35 @@ static void model2_3d_render( model2_state *state, bitmap_rgb32 &bitmap, triangl tri->v[2].pu = tri->v[2].pu * tri->v[2].pz * (1.0f / 8.0f); tri->v[2].pv = tri->v[2].pv * tri->v[2].pz * (1.0f / 8.0f); - poly_render_triangle(poly, &bitmap, vp, render_funcs[renderer], 3, &tri->v[0], &tri->v[1], &tri->v[2]); + // Note : The class model2_renderer has an array of function pointers in it named m_renderfuncs, in theory this simply + // needs to be passed into the render_triangle function as such model2_renderer::m_renderfuncs[renderer], but + // I was unable to make it work when converting to the new polygon rasterizer interface. + switch (renderer) + { + case 0: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_0), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + case 1: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_1), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + case 2: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_2), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + case 3: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_3), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + case 4: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_4), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + case 5: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_5), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + case 6: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_6), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + case 7: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_7), this), 3, tri->v[0], tri->v[1], tri->v[2]); break; + } } else - poly_render_triangle(poly, &bitmap, vp, render_funcs[renderer], 0, &tri->v[0], &tri->v[1], &tri->v[2]); + { + switch (renderer) + { + case 0: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_0), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + case 1: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_1), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + case 2: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_2), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + case 3: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_3), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + case 4: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_4), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + case 5: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_5), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + case 6: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_6), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + case 7: render_triangle(vp, render_delegate(FUNC(model2_renderer::model2_3d_render_7), this), 0, tri->v[0], tri->v[1], tri->v[2]); break; + } + } } /* @@ -1019,7 +903,7 @@ static void model2_3d_frame_start( model2_state *state ) void model2_state::model2_3d_frame_end( bitmap_rgb32 &bitmap, const rectangle &cliprect ) { raster_state *raster = m_raster; - INT32 z; + INT32 z; /* if we have nothing to render, bail */ if ( raster->tri_list_index == 0 ) @@ -1063,6 +947,8 @@ void model2_state::model2_3d_frame_end( bitmap_rgb32 &bitmap, const rectangle &c } #endif + m_poly->destmap().fill(0x00000000, cliprect); + /* go through the Z levels, and render each bucket */ for( z = raster->max_z; z >= raster->min_z; z-- ) { @@ -1077,13 +963,15 @@ void model2_state::model2_3d_frame_end( bitmap_rgb32 &bitmap, const rectangle &c { /* project and render */ model2_3d_project( tri ); - model2_3d_render( this, bitmap, tri, cliprect ); + m_poly->model2_3d_render(tri, cliprect); tri = (triangle *)tri->next; } } } - poly_wait(m_poly, "End of frame"); + m_poly->wait("End of frame"); + + copybitmap_trans(bitmap, m_poly->destmap(), 0, 0, 0, 0, cliprect, 0x00000000); } /* 3D Rasterizer main data input port */ @@ -2694,11 +2582,6 @@ static void geo_parse( model2_state *state ) /***********************************************************************************************/ -void model2_state::model2_exit() -{ - poly_free(m_poly); -} - VIDEO_START_MEMBER(model2_state,model2) { const rectangle &visarea = m_screen->visible_area(); @@ -2707,8 +2590,7 @@ VIDEO_START_MEMBER(model2_state,model2) m_sys24_bitmap.allocate(width, height+4); - m_poly = poly_alloc(machine(), 4000, sizeof(m2_poly_extra_data), 0); - machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model2_state::model2_exit), this)); + m_poly = auto_alloc(machine(), model2_renderer(*this)); /* initialize the hardware rasterizer */ model2_3d_init( machine(), (UINT16*)memregion("user3")->base() ); diff --git a/src/mame/video/model2rd.inc b/src/mame/video/model2rd.inc index 07c744e08cc..0fd6e8f1705 100644 --- a/src/mame/video/model2rd.inc +++ b/src/mame/video/model2rd.inc @@ -56,12 +56,11 @@ #ifndef MODEL2_TEXTURED /* non-textured render path */ -static void MODEL2_FUNC_NAME(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void MODEL2_FUNC_NAME(INT32 scanline, const extent_t& extent, const m2_poly_extra_data& object, int threadid) { #if !defined( MODEL2_TRANSLUCENT) - const m2_poly_extra_data *extra = (const m2_poly_extra_data *)extradata; - model2_state *state = extra->state; - bitmap_rgb32 *destmap = (bitmap_rgb32 *)dest; + model2_state *state = object.state; + bitmap_rgb32 *destmap = (bitmap_rgb32 *)&m_destmap; UINT32 *p = &destmap->pix32(scanline); /* extract color information */ @@ -69,8 +68,8 @@ static void MODEL2_FUNC_NAME(void *dest, INT32 scanline, const poly_extent *exte const UINT16 *colortable_g = (const UINT16 *)&state->m_colorxlat[0x4000/4]; const UINT16 *colortable_b = (const UINT16 *)&state->m_colorxlat[0x8000/4]; const UINT16 *lumaram = (const UINT16 *)state->m_lumaram.target(); - UINT32 lumabase = extra->lumabase; - UINT32 color = extra->colorbase; + UINT32 lumabase = object.lumabase; + UINT32 color = object.colorbase; UINT8 luma; UINT32 tr, tg, tb; int x; @@ -98,7 +97,7 @@ static void MODEL2_FUNC_NAME(void *dest, INT32 scanline, const poly_extent *exte /* build the final color */ color = rgb_t(tr, tg, tb); - for(x = extent->startx; x < extent->stopx; x++) + for(x = extent.startx; x < extent.stopx; x++) #if defined(MODEL2_CHECKER) if ((x^scanline) & 1) p[x] = color; #else @@ -109,35 +108,34 @@ static void MODEL2_FUNC_NAME(void *dest, INT32 scanline, const poly_extent *exte #else /* textured render path */ -static void MODEL2_FUNC_NAME(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void MODEL2_FUNC_NAME(INT32 scanline, const extent_t& extent, const m2_poly_extra_data& object, int threadid) { - const m2_poly_extra_data *extra = (const m2_poly_extra_data *)extradata; - model2_state *state = extra->state; - bitmap_rgb32 *destmap = (bitmap_rgb32 *)dest; + model2_state *state = object.state; + bitmap_rgb32 *destmap = (bitmap_rgb32 *)&m_destmap; UINT32 *p = &destmap->pix32(scanline); - UINT32 tex_width = extra->texwidth; - UINT32 tex_height = extra->texheight; + UINT32 tex_width = object.texwidth; + UINT32 tex_height = object.texheight; /* extract color information */ const UINT16 *colortable_r = (const UINT16 *)&state->m_colorxlat[0x0000/4]; const UINT16 *colortable_g = (const UINT16 *)&state->m_colorxlat[0x4000/4]; const UINT16 *colortable_b = (const UINT16 *)&state->m_colorxlat[0x8000/4]; const UINT16 *lumaram = (const UINT16 *)state->m_lumaram.target(); - UINT32 colorbase = extra->colorbase; - UINT32 lumabase = extra->lumabase; - UINT32 tex_x = extra->texx; - UINT32 tex_y = extra->texy; + UINT32 colorbase = object.colorbase; + UINT32 lumabase = object.lumabase; + UINT32 tex_x = object.texx; + UINT32 tex_y = object.texy; UINT32 tex_x_mask, tex_y_mask; - UINT32 tex_mirr_x = extra->texmirrorx; - UINT32 tex_mirr_y = extra->texmirrory; - UINT32 *sheet = extra->texsheet; - float ooz = extent->param[0].start; - float uoz = extent->param[1].start; - float voz = extent->param[2].start; - float dooz = extent->param[0].dpdx; - float duoz = extent->param[1].dpdx; - float dvoz = extent->param[2].dpdx; + UINT32 tex_mirr_x = object.texmirrorx; + UINT32 tex_mirr_y = object.texmirrory; + UINT32 *sheet = object.texsheet; + float ooz = extent.param[0].start; + float uoz = extent.param[1].start; + float voz = extent.param[2].start; + float dooz = extent.param[0].dpdx; + float duoz = extent.param[1].dpdx; + float dvoz = extent.param[2].dpdx; int x; tex_x_mask = tex_width - 1; @@ -149,7 +147,7 @@ static void MODEL2_FUNC_NAME(void *dest, INT32 scanline, const poly_extent *exte colortable_g += ((colorbase >> 5) & 0x1f) << 8; colortable_b += ((colorbase >> 10) & 0x1f) << 8; - for(x = extent->startx; x < extent->stopx; x++, uoz += duoz, voz += dvoz, ooz += dooz) + for(x = extent.startx; x < extent.stopx; x++, uoz += duoz, voz += dvoz, ooz += dooz) { float z = recip_approx(ooz) * 256.0f; INT32 u = uoz * z; |