model2.cpp: cleanup culling (nw)

This commit is contained in:
angelosa 2018-03-07 20:26:58 +01:00
parent a06b6616d6
commit 2731786d61
2 changed files with 83 additions and 96 deletions

View File

@ -319,7 +319,7 @@ private:
// inliners
inline void model2_3d_project( triangle *tri );
inline uint16_t float_to_zval( float floatval );
inline bool check_culling( raster_state *raster, uint32_t attr, float min_z, float max_z );
};
/*****************************

View File

@ -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;
}
/***********************************************************************************************/
/*******************************************
*
* Hardware 3D Rasterizer Internal State
*
*******************************************/
#define MAX_TRIANGLES 32768
struct raster_state
inline bool model2_state::check_culling( raster_state *raster, uint32_t attr, float min_z, float max_z )
{
// 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 doubleside is disabled */
if ( ((attr >> 17) & 1) == 0 )
{
/* if it's the backface, cull it */
if ( raster->command_buffer[9] & 0x00800000 )
return true;
}
/* if the linktype is 0, then we can also cull it */
if ( ((attr >> 8) & 3) == 0 )
return true;
/* 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;
/* 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];