diff options
Diffstat (limited to 'src/mame/video/model2.cpp')
-rw-r--r-- | src/mame/video/model2.cpp | 173 |
1 files changed, 80 insertions, 93 deletions
diff --git a/src/mame/video/model2.cpp b/src/mame/video/model2.cpp index 18027ff7ed7..56dfb301a6e 100644 --- a/src/mame/video/model2.cpp +++ b/src/mame/video/model2.cpp @@ -98,6 +98,41 @@ #define pv p[2] + +/******************************************* + * + * Hardware 3D Rasterizer Internal State + * + *******************************************/ + +#define MAX_TRIANGLES 32768 + +struct raster_state +{ +// uint32_t mode; /* bit 0 = Test Mode, bit 2 = Switch 60Hz(1)/30Hz(0) operation */ + uint16_t *texture_rom; /* Texture ROM pointer */ + uint32_t texture_rom_mask; /* Texture ROM mask */ + int16_t viewport[4]; /* View port (startx,starty,endx,endy) */ + int16_t center[4][2]; /* Centers (eye 0[x,y],1[x,y],2[x,y],3[x,y]) */ + uint16_t center_sel; /* Selected center */ + uint32_t reverse; /* Left/Right Reverse */ + float z_adjust; /* ZSort Mode */ + float triangle_z; /* Current Triangle z value */ + uint8_t master_z_clip; /* Master Z-Clip value */ + uint32_t cur_command; /* Current command */ + uint32_t command_buffer[32]; /* Command buffer */ + uint32_t command_index; /* Command buffer index */ + triangle tri_list[MAX_TRIANGLES]; /* Triangle list */ + uint32_t tri_list_index; /* Triangle list index */ + triangle *tri_sorted_list[0x10000]; /* Sorted Triangle list */ + uint16_t min_z; /* Minimum sortable Z value */ + uint16_t max_z; /* Maximum sortable Z value */ + uint16_t texture_ram[0x10000]; /* Texture RAM pointer */ + uint8_t log_ram[0x40000]; /* Log RAM pointer */ +}; + + + /******************************************* * * Generic 3D Math Functions @@ -178,11 +213,11 @@ inline uint16_t model2_state::float_to_zval( float floatval ) return 0x0000; /* between -12 and 0 create a denormal with exponent of 0 */ - else if ( exponent < 0 ) + if ( exponent < 0 ) return (mantissa | 0x1000) >> -exponent; /* between 0 and 14 create a FP value with exponent + 1 */ - else if ( exponent < 15 ) + if ( exponent < 15 ) return (( exponent + 1 ) << 12) | mantissa; /* above 14 is too large */ @@ -237,40 +272,32 @@ static int32_t clip_polygon(poly_vertex *v, int32_t num_vertices, plane *cp, pol return outcount; } -/***********************************************************************************************/ +inline bool model2_state::check_culling( raster_state *raster, uint32_t attr, float min_z, float max_z ) +{ + /* if doubleside is disabled */ + if ( ((attr >> 17) & 1) == 0 ) + { + /* if it's the backface, cull it */ + if ( raster->command_buffer[9] & 0x00800000 ) + return true; + } -/******************************************* - * - * Hardware 3D Rasterizer Internal State - * - *******************************************/ + /* if the linktype is 0, then we can also cull it */ + if ( ((attr >> 8) & 3) == 0 ) + return true; -#define MAX_TRIANGLES 32768 + /* if the minimum z value is bigger than the master z clip value, don't render */ + if ( (int32_t)(1.0/min_z) > raster->master_z_clip ) + return true; -struct raster_state -{ -// uint32_t mode; /* bit 0 = Test Mode, bit 2 = Switch 60Hz(1)/30Hz(0) operation */ - uint16_t * texture_rom; /* Texture ROM pointer */ - uint32_t texture_rom_mask; /* Texture ROM mask */ - int16_t viewport[4]; /* View port (startx,starty,endx,endy) */ - int16_t center[4][2]; /* Centers (eye 0[x,y],1[x,y],2[x,y],3[x,y]) */ - uint16_t center_sel; /* Selected center */ - uint32_t reverse; /* Left/Right Reverse */ - float z_adjust; /* ZSort Mode */ - float triangle_z; /* Current Triangle z value */ - uint8_t master_z_clip; /* Master Z-Clip value */ - uint32_t cur_command; /* Current command */ - uint32_t command_buffer[32]; /* Command buffer */ - uint32_t command_index; /* Command buffer index */ - triangle tri_list[MAX_TRIANGLES]; /* Triangle list */ - uint32_t tri_list_index; /* Triangle list index */ - triangle * tri_sorted_list[0x10000]; /* Sorted Triangle list */ - uint16_t min_z; /* Minimum sortable Z value */ - uint16_t max_z; /* Maximum sortable Z value */ - uint16_t texture_ram[0x10000]; /* Texture RAM pointer */ - uint8_t log_ram[0x40000]; /* Log RAM pointer */ -}; + /* if the maximum z value is < 0 then we can safely clip the entire polygon */ + if ( max_z < 0 ) + return true; + + return false; +} +/***********************************************************************************************/ /******************************************* * @@ -330,12 +357,13 @@ READ32_MEMBER(model2_state::polygon_count_r) void model2_state::model2_3d_process_quad( raster_state *raster, uint32_t attr ) { - quad_m2 object; - uint16_t *th, *tp; - int32_t tho; - uint32_t cull, i; - float zvalue; - float min_z, max_z; + quad_m2 object; + uint16_t *th, *tp; + int32_t tho; + uint32_t i; + bool cull; + float zvalue; + float min_z, max_z; /* extract P0(n-1) */ object.v[1].x = u2f( raster->command_buffer[2] << 8 ); @@ -413,30 +441,7 @@ void model2_state::model2_3d_process_quad( raster_state *raster, uint32_t attr ) object.luma = (raster->command_buffer[9] >> 15) & 0xFF; /* determine whether we can cull this quad */ - cull = 0; - - /* if doubleside is disabled */ - if ( ((attr >> 17) & 1) == 0 ) - { - /* if it's the backface, cull it */ - if ( raster->command_buffer[9] & 0x00800000 ) - cull = 1; - } - - /* if the linktype is 0, then we can also cull it */ - if ( ((attr >> 8) & 3) == 0 ) - cull = 1; - - /* if the minimum z value is bigger than the master z clip value, don't render */ - if ( (int32_t)(1.0/min_z) > raster->master_z_clip ) - cull = 1; - - /* if the maximum z value is < 0 then we can safely clip the entire polygon */ - if ( max_z < 0 ) - cull = 1; - - /* set the object's z value */ - zvalue = raster->triangle_z; + cull = check_culling(raster,attr,min_z,max_z); /* set the object's z value */ switch((attr >> 10) & 3) @@ -451,17 +456,18 @@ void model2_state::model2_3d_process_quad( raster_state *raster, uint32_t attr ) zvalue = max_z; break; case 3: // error + default: zvalue = 0.0f; break; } raster->triangle_z = zvalue; - if ( cull == 0 ) + if ( cull == false ) { - int32_t clipped_verts; + int32_t clipped_verts; poly_vertex verts[10]; - plane clip_plane; + plane clip_plane; clip_plane.normal.x = 0; clip_plane.normal.y = 0; @@ -574,12 +580,13 @@ void model2_state::model2_3d_process_quad( raster_state *raster, uint32_t attr ) void model2_state::model2_3d_process_triangle( raster_state *raster, uint32_t attr ) { - triangle object; - uint16_t *th, *tp; - int32_t tho; - uint32_t cull, i; - float zvalue; - float min_z, max_z; + triangle object; + uint16_t *th, *tp; + int32_t tho; + uint32_t i; + bool cull; + float zvalue; + float min_z, max_z; /* extract P0(n-1) */ object.v[1].x = u2f( raster->command_buffer[2] << 8 ); @@ -653,27 +660,7 @@ void model2_state::model2_3d_process_triangle( raster_state *raster, uint32_t at object.luma = (raster->command_buffer[9] >> 15) & 0xFF; /* determine whether we can cull this quad */ - cull = 0; - - /* if doubleside is disabled */ - if ( ((attr >> 17) & 1) == 0 ) - { - /* if it's the backface, cull it */ - if ( raster->command_buffer[9] & 0x00800000 ) - cull = 1; - } - - /* if the linktype is 0, then we can also cull it */ - if ( ((attr >> 8) & 3) == 0 ) - cull = 1; - - /* if the minimum z value is bigger than the master z clip value, don't render */ - if ( (int32_t)(1.0/min_z) > raster->master_z_clip ) - cull = 1; - - /* if the maximum z value is < 0 then we can safely clip the entire polygon */ - if ( max_z < 0 ) - cull = 1; + cull = check_culling(raster,attr,min_z,max_z); /* set the object's z value */ switch((attr >> 10) & 3) @@ -696,7 +683,7 @@ void model2_state::model2_3d_process_triangle( raster_state *raster, uint32_t at raster->triangle_z = zvalue; /* if we're not culling, do z-clip and add to out triangle list */ - if ( cull == 0 ) + if ( cull == false ) { int32_t clipped_verts; poly_vertex verts[10]; |