mirror of
https://github.com/holub/mame
synced 2025-06-03 19:36:26 +03:00
model2.cpp: cleanup culling (nw)
This commit is contained in:
parent
a06b6616d6
commit
2731786d61
@ -319,7 +319,7 @@ private:
|
|||||||
// inliners
|
// inliners
|
||||||
inline void model2_3d_project( triangle *tri );
|
inline void model2_3d_project( triangle *tri );
|
||||||
inline uint16_t float_to_zval( float floatval );
|
inline uint16_t float_to_zval( float floatval );
|
||||||
|
inline bool check_culling( raster_state *raster, uint32_t attr, float min_z, float max_z );
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************************
|
/*****************************
|
||||||
|
@ -98,6 +98,41 @@
|
|||||||
#define pv p[2]
|
#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
|
* Generic 3D Math Functions
|
||||||
@ -178,11 +213,11 @@ inline uint16_t model2_state::float_to_zval( float floatval )
|
|||||||
return 0x0000;
|
return 0x0000;
|
||||||
|
|
||||||
/* between -12 and 0 create a denormal with exponent of 0 */
|
/* between -12 and 0 create a denormal with exponent of 0 */
|
||||||
else if ( exponent < 0 )
|
if ( exponent < 0 )
|
||||||
return (mantissa | 0x1000) >> -exponent;
|
return (mantissa | 0x1000) >> -exponent;
|
||||||
|
|
||||||
/* between 0 and 14 create a FP value with exponent + 1 */
|
/* between 0 and 14 create a FP value with exponent + 1 */
|
||||||
else if ( exponent < 15 )
|
if ( exponent < 15 )
|
||||||
return (( exponent + 1 ) << 12) | mantissa;
|
return (( exponent + 1 ) << 12) | mantissa;
|
||||||
|
|
||||||
/* above 14 is too large */
|
/* 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;
|
return outcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************************************/
|
inline bool model2_state::check_culling( raster_state *raster, uint32_t attr, float min_z, float max_z )
|
||||||
|
|
||||||
/*******************************************
|
|
||||||
*
|
|
||||||
* 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 */
|
/* if doubleside is disabled */
|
||||||
uint16_t * texture_rom; /* Texture ROM pointer */
|
if ( ((attr >> 17) & 1) == 0 )
|
||||||
uint32_t texture_rom_mask; /* Texture ROM mask */
|
{
|
||||||
int16_t viewport[4]; /* View port (startx,starty,endx,endy) */
|
/* if it's the backface, cull it */
|
||||||
int16_t center[4][2]; /* Centers (eye 0[x,y],1[x,y],2[x,y],3[x,y]) */
|
if ( raster->command_buffer[9] & 0x00800000 )
|
||||||
uint16_t center_sel; /* Selected center */
|
return true;
|
||||||
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 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 )
|
void model2_state::model2_3d_process_quad( raster_state *raster, uint32_t attr )
|
||||||
{
|
{
|
||||||
quad_m2 object;
|
quad_m2 object;
|
||||||
uint16_t *th, *tp;
|
uint16_t *th, *tp;
|
||||||
int32_t tho;
|
int32_t tho;
|
||||||
uint32_t cull, i;
|
uint32_t i;
|
||||||
float zvalue;
|
bool cull;
|
||||||
float min_z, max_z;
|
float zvalue;
|
||||||
|
float min_z, max_z;
|
||||||
|
|
||||||
/* extract P0(n-1) */
|
/* extract P0(n-1) */
|
||||||
object.v[1].x = u2f( raster->command_buffer[2] << 8 );
|
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;
|
object.luma = (raster->command_buffer[9] >> 15) & 0xFF;
|
||||||
|
|
||||||
/* determine whether we can cull this quad */
|
/* determine whether we can cull this quad */
|
||||||
cull = 0;
|
cull = check_culling(raster,attr,min_z,max_z);
|
||||||
|
|
||||||
/* 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;
|
|
||||||
|
|
||||||
/* set the object's z value */
|
/* set the object's z value */
|
||||||
switch((attr >> 10) & 3)
|
switch((attr >> 10) & 3)
|
||||||
@ -451,17 +456,18 @@ void model2_state::model2_3d_process_quad( raster_state *raster, uint32_t attr )
|
|||||||
zvalue = max_z;
|
zvalue = max_z;
|
||||||
break;
|
break;
|
||||||
case 3: // error
|
case 3: // error
|
||||||
|
default:
|
||||||
zvalue = 0.0f;
|
zvalue = 0.0f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
raster->triangle_z = zvalue;
|
raster->triangle_z = zvalue;
|
||||||
|
|
||||||
if ( cull == 0 )
|
if ( cull == false )
|
||||||
{
|
{
|
||||||
int32_t clipped_verts;
|
int32_t clipped_verts;
|
||||||
poly_vertex verts[10];
|
poly_vertex verts[10];
|
||||||
plane clip_plane;
|
plane clip_plane;
|
||||||
|
|
||||||
clip_plane.normal.x = 0;
|
clip_plane.normal.x = 0;
|
||||||
clip_plane.normal.y = 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 )
|
void model2_state::model2_3d_process_triangle( raster_state *raster, uint32_t attr )
|
||||||
{
|
{
|
||||||
triangle object;
|
triangle object;
|
||||||
uint16_t *th, *tp;
|
uint16_t *th, *tp;
|
||||||
int32_t tho;
|
int32_t tho;
|
||||||
uint32_t cull, i;
|
uint32_t i;
|
||||||
float zvalue;
|
bool cull;
|
||||||
float min_z, max_z;
|
float zvalue;
|
||||||
|
float min_z, max_z;
|
||||||
|
|
||||||
/* extract P0(n-1) */
|
/* extract P0(n-1) */
|
||||||
object.v[1].x = u2f( raster->command_buffer[2] << 8 );
|
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;
|
object.luma = (raster->command_buffer[9] >> 15) & 0xFF;
|
||||||
|
|
||||||
/* determine whether we can cull this quad */
|
/* determine whether we can cull this quad */
|
||||||
cull = 0;
|
cull = check_culling(raster,attr,min_z,max_z);
|
||||||
|
|
||||||
/* 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 */
|
/* set the object's z value */
|
||||||
switch((attr >> 10) & 3)
|
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;
|
raster->triangle_z = zvalue;
|
||||||
|
|
||||||
/* if we're not culling, do z-clip and add to out triangle list */
|
/* if we're not culling, do z-clip and add to out triangle list */
|
||||||
if ( cull == 0 )
|
if ( cull == false )
|
||||||
{
|
{
|
||||||
int32_t clipped_verts;
|
int32_t clipped_verts;
|
||||||
poly_vertex verts[10];
|
poly_vertex verts[10];
|
||||||
|
Loading…
Reference in New Issue
Block a user