sprite y-clipping (preliminary, disabled by default for now)

This commit is contained in:
Michaël Banaan Ananas 2011-10-06 23:27:11 +00:00
parent e02e881376
commit ede7eb5486

View File

@ -248,6 +248,18 @@ poly3d_Clip( float vx, float vy, float vw, float vh )
if( mClip.scissor.max_y>479 ) mClip.scissor.max_y = 479; if( mClip.scissor.max_y>479 ) mClip.scissor.max_y = 479;
} }
static void
sprite_Clip( int miny, int maxy )
{
// cx/cy not used, and only set y-clipping
mClip.scissor.min_y = miny;
mClip.scissor.max_y = maxy;
if( mClip.scissor.min_y<0 ) mClip.scissor.min_y = 0;
if( mClip.scissor.max_y>479 ) mClip.scissor.max_y = 479;
mClip.scissor.min_x = 0;
mClip.scissor.max_x = 639;
}
static void static void
poly3d_NoClip( void ) poly3d_NoClip( void )
{ {
@ -256,7 +268,7 @@ poly3d_NoClip( void )
mClip.scissor.min_x = 0; mClip.scissor.min_x = 0;
mClip.scissor.max_x = 639; mClip.scissor.max_x = 639;
mClip.scissor.min_y = 0; mClip.scissor.min_y = 0;
mClip.scissor.max_x = 479; mClip.scissor.max_y = 479;
} }
typedef struct typedef struct
@ -556,8 +568,8 @@ static void renderscanline_sprite(void *destbase, INT32 scanline, const poly_ext
static void static void
mydrawgfxzoom( mydrawgfxzoom(
bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, bitmap_t *dest_bmp, const gfx_element *gfx, UINT32 code,
UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, UINT32 color, int flipx, int flipy, int sx, int sy,
int scalex, int scaley, int z, int prioverchar, int alpha ) int scalex, int scaley, int z, int prioverchar, int alpha )
{ {
namcos22_state *state = gfx->machine().driver_data<namcos22_state>(); namcos22_state *state = gfx->machine().driver_data<namcos22_state>();
@ -625,7 +637,7 @@ mydrawgfxzoom(
} }
} }
poly_render_triangle_fan(state->m_poly, dest_bmp, clip, renderscanline_sprite, 2, 4, vert); poly_render_triangle_fan(state->m_poly, dest_bmp, &mClip.scissor, renderscanline_sprite, 2, 4, vert);
} }
} /* mydrawgfxzoom */ } /* mydrawgfxzoom */
@ -673,33 +685,12 @@ ApplyGamma( running_machine &machine, bitmap_t *bitmap )
} }
} /* ApplyGamma */ } /* ApplyGamma */
static void
poly3d_Draw3dSprite( bitmap_t *bitmap, const gfx_element *gfx, int tileNumber, int color, int flipx, int flipy, int sx, int sy, int width, int height, int translucency, int zc, UINT32 pri )
{
rectangle clip;
clip.min_x = 0;
clip.min_y = 0;
clip.max_x = 640-1;
clip.max_y = 480-1;
mydrawgfxzoom(
bitmap,
&clip,
gfx,
tileNumber,
color,
flipx, flipy,
sx, sy,
(width<<16)/32,
(height<<16)/32,
zc, pri, 0xff - translucency );
}
#define DSP_FIXED_TO_FLOAT( X ) (((INT16)(X))/(float)0x7fff) #define DSP_FIXED_TO_FLOAT( X ) (((INT16)(X))/(float)0x7fff)
#define SPRITERAM_SIZE (0x9b0000-0x980000) #define SPRITERAM_SIZE (0x9b0000-0x980000)
#define CGRAM_SIZE 0x1e000 #define CGRAM_SIZE 0x1e000
#define NUM_CG_CHARS ((CGRAM_SIZE*8)/(64*16)) /* 0x3c0 */ #define NUM_CG_CHARS ((CGRAM_SIZE*8)/(64*16)) /* 0x3c0 */
/* modal rendering properties */ /* modal rendering properties */
static void static void
matrix3d_Multiply( float A[4][4], float B[4][4] ) matrix3d_Multiply( float A[4][4], float B[4][4] )
@ -809,6 +800,7 @@ struct SceneNode
int linkType; int linkType;
int numcols, numrows; int numcols, numrows;
int xpos, ypos; int xpos, ypos;
int cy_min, cy_max;
int sizex, sizey; int sizex, sizey;
int translucency; int translucency;
int cz; int cz;
@ -897,7 +889,7 @@ static void RenderSprite(running_machine &machine, bitmap_t *bitmap, struct Scen
{ {
code += nthword( &state->m_spriteram[0x800/4], i+node->data.sprite.linkType*4 ); code += nthword( &state->m_spriteram[0x800/4], i+node->data.sprite.linkType*4 );
} }
poly3d_Draw3dSprite( mydrawgfxzoom(
bitmap, bitmap,
machine.gfx[GFX_SPRITE], machine.gfx[GFX_SPRITE],
code, code,
@ -906,11 +898,11 @@ static void RenderSprite(running_machine &machine, bitmap_t *bitmap, struct Scen
node->data.sprite.flipy, node->data.sprite.flipy,
node->data.sprite.xpos+col*node->data.sprite.sizex, node->data.sprite.xpos+col*node->data.sprite.sizex,
node->data.sprite.ypos+row*node->data.sprite.sizey, node->data.sprite.ypos+row*node->data.sprite.sizey,
node->data.sprite.sizex, (node->data.sprite.sizex<<16)/32,
node->data.sprite.sizey, (node->data.sprite.sizey<<16)/32,
node->data.sprite.translucency,
node->data.sprite.cz, node->data.sprite.cz,
node->data.sprite.pri ); node->data.sprite.pri,
0xff - node->data.sprite.translucency );
i++; i++;
} /* next col */ } /* next col */
} /* next row */ } /* next row */
@ -954,8 +946,10 @@ static void RenderSceneHelper(running_machine &machine, bitmap_t *bitmap, struct
break; break;
case eSCENENODE_SPRITE: case eSCENENODE_SPRITE:
poly3d_NoClip(); sprite_Clip(
RenderSprite(machine, bitmap,node ); node->data.sprite.cy_min,
node->data.sprite.cy_max );
RenderSprite(machine, bitmap, node );
break; break;
default: default:
@ -1251,9 +1245,15 @@ DrawSpritesHelper(
int enable, int enable,
int deltax, int deltax,
int deltay, int deltay,
UINT32 clip,
int y_lowres ) int y_lowres )
{ {
// set y-clipping
INT16 cy_min = -deltay + (INT16)(clip>>16);
INT16 cy_max = -deltay + (INT16)(clip&0xffff);
int i; int i;
for( i=0; i<num_sprites; i++ ) for( i=0; i<num_sprites; i++ )
{ {
/* attrs: /* attrs:
@ -1332,6 +1332,8 @@ DrawSpritesHelper(
node->data.sprite.linkType = linkType; node->data.sprite.linkType = linkType;
node->data.sprite.xpos = xpos; node->data.sprite.xpos = xpos;
node->data.sprite.ypos = ypos; node->data.sprite.ypos = ypos;
node->data.sprite.cy_min = cy_min;
node->data.sprite.cy_max = cy_max;
node->data.sprite.sizex = sizex; node->data.sprite.sizex = sizex;
node->data.sprite.sizey = sizey; node->data.sprite.sizey = sizey;
node->data.sprite.translucency = translucency; node->data.sprite.translucency = translucency;
@ -1383,12 +1385,12 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre
^^^^ ^^^^ deltax ^^^^ ^^^^ deltax
^^^^ deltay ^^^^ deltay
0x980010: 00200020 000002ff 000007ff 00000000 0x980010: 00200020 028004ff 032a0509 00000000
^^^^^^^^ character size? ^^^^^^^^ character size?
^^^^^^^^ window-x related?
^^^^^^^^ window-y related?
0x980200: 000007ff 000007ff 000007ff 032a0509 0x980200: 000007ff 000007ff 000007ff 032a0509 y-clipping related
^^^^^^^^ y-clipping (see timecris, not implemented yet)
0x980210: 000007ff 000007ff 000007ff 000007ff 0x980210: 000007ff 000007ff 000007ff 000007ff
0x980220: 000007ff 000007ff 000007ff 000007ff 0x980220: 000007ff 000007ff 000007ff 000007ff
0x980230: 000007ff 000007ff 000007ff 000007ff 0x980230: 000007ff 000007ff 000007ff 000007ff
@ -1412,6 +1414,10 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre
... ...
*/ */
// y-clipping, disabled for now
UINT32 clipy_minmax = spriteram32[0x20c/4]; // works in timecris, but problems in aquajet and tokyowar
clipy_minmax = 0x000007ff;
// y-resolution, where is this bit? // y-resolution, where is this bit?
// the only game that uses y_lowres is cybrcycc, and unfortunately doesn't have a video test in service mode // the only game that uses y_lowres is cybrcycc, and unfortunately doesn't have a video test in service mode
int y_lowres = 0; int y_lowres = 0;
@ -1438,7 +1444,7 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre
{ {
pSource = &spriteram32[0x04000/4 + base*4]; pSource = &spriteram32[0x04000/4 + base*4];
pPal = &spriteram32[0x20000/4 + base*2]; pPal = &spriteram32[0x20000/4 + base*2];
DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, (enable&4)<<24, deltax, deltay, y_lowres ); DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, (enable&4)<<24, deltax, deltay, clipy_minmax, y_lowres );
} }
/* VICS RAM provides two additional banks (also many unknown regs here) */ /* VICS RAM provides two additional banks (also many unknown regs here) */
@ -1463,7 +1469,7 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre
{ {
pSource = &state->m_vics_data[(state->m_vics_control[0x48/4]&0xffff)/4]; pSource = &state->m_vics_data[(state->m_vics_control[0x48/4]&0xffff)/4];
pPal = &state->m_vics_data[(state->m_vics_control[0x58/4]&0xffff)/4]; pPal = &state->m_vics_data[(state->m_vics_control[0x58/4]&0xffff)/4];
DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, (enable&4)<<24, deltax, deltay, y_lowres ); DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, (enable&4)<<24, deltax, deltay, clipy_minmax, y_lowres );
} }
num_sprites = state->m_vics_control[0x60/4] >> 4 & 0x1ff; // no +1 num_sprites = state->m_vics_control[0x60/4] >> 4 & 0x1ff; // no +1
@ -1471,7 +1477,7 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre
{ {
pSource = &state->m_vics_data[(state->m_vics_control[0x68/4]&0xffff)/4]; pSource = &state->m_vics_data[(state->m_vics_control[0x68/4]&0xffff)/4];
pPal = &state->m_vics_data[(state->m_vics_control[0x78/4]&0xffff)/4]; pPal = &state->m_vics_data[(state->m_vics_control[0x78/4]&0xffff)/4];
DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, (enable&4)<<24, deltax, deltay, y_lowres ); DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, (enable&4)<<24, deltax, deltay, clipy_minmax, y_lowres );
} }
} /* DrawSprites */ } /* DrawSprites */