From ede7eb5486068504dbe4dfe009d1e9d0ab8984f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Banaan=20Ananas?= Date: Thu, 6 Oct 2011 23:27:11 +0000 Subject: [PATCH] sprite y-clipping (preliminary, disabled by default for now) --- src/mame/video/namcos22.c | 84 +++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/src/mame/video/namcos22.c b/src/mame/video/namcos22.c index 13e8e402f6d..25c2fa026f0 100644 --- a/src/mame/video/namcos22.c +++ b/src/mame/video/namcos22.c @@ -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; } +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 poly3d_NoClip( void ) { @@ -256,7 +268,7 @@ poly3d_NoClip( void ) mClip.scissor.min_x = 0; mClip.scissor.max_x = 639; mClip.scissor.min_y = 0; - mClip.scissor.max_x = 479; + mClip.scissor.max_y = 479; } typedef struct @@ -556,8 +568,8 @@ static void renderscanline_sprite(void *destbase, INT32 scanline, const poly_ext static void mydrawgfxzoom( - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, - UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, + bitmap_t *dest_bmp, const gfx_element *gfx, UINT32 code, + UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int z, int prioverchar, int alpha ) { namcos22_state *state = gfx->machine().driver_data(); @@ -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 */ @@ -673,33 +685,12 @@ ApplyGamma( running_machine &machine, bitmap_t *bitmap ) } } /* 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 SPRITERAM_SIZE (0x9b0000-0x980000) #define CGRAM_SIZE 0x1e000 #define NUM_CG_CHARS ((CGRAM_SIZE*8)/(64*16)) /* 0x3c0 */ - /* modal rendering properties */ static void matrix3d_Multiply( float A[4][4], float B[4][4] ) @@ -809,6 +800,7 @@ struct SceneNode int linkType; int numcols, numrows; int xpos, ypos; + int cy_min, cy_max; int sizex, sizey; int translucency; 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 ); } - poly3d_Draw3dSprite( + mydrawgfxzoom( bitmap, machine.gfx[GFX_SPRITE], code, @@ -906,11 +898,11 @@ static void RenderSprite(running_machine &machine, bitmap_t *bitmap, struct Scen node->data.sprite.flipy, node->data.sprite.xpos+col*node->data.sprite.sizex, node->data.sprite.ypos+row*node->data.sprite.sizey, - node->data.sprite.sizex, - node->data.sprite.sizey, - node->data.sprite.translucency, + (node->data.sprite.sizex<<16)/32, + (node->data.sprite.sizey<<16)/32, node->data.sprite.cz, - node->data.sprite.pri ); + node->data.sprite.pri, + 0xff - node->data.sprite.translucency ); i++; } /* next col */ } /* next row */ @@ -954,8 +946,10 @@ static void RenderSceneHelper(running_machine &machine, bitmap_t *bitmap, struct break; case eSCENENODE_SPRITE: - poly3d_NoClip(); - RenderSprite(machine, bitmap,node ); + sprite_Clip( + node->data.sprite.cy_min, + node->data.sprite.cy_max ); + RenderSprite(machine, bitmap, node ); break; default: @@ -1251,9 +1245,15 @@ DrawSpritesHelper( int enable, int deltax, int deltay, + UINT32 clip, int y_lowres ) { + // set y-clipping + INT16 cy_min = -deltay + (INT16)(clip>>16); + INT16 cy_max = -deltay + (INT16)(clip&0xffff); + int i; + for( i=0; idata.sprite.linkType = linkType; node->data.sprite.xpos = xpos; 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.sizey = sizey; node->data.sprite.translucency = translucency; @@ -1383,12 +1385,12 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre ^^^^ ^^^^ deltax ^^^^ deltay - 0x980010: 00200020 000002ff 000007ff 00000000 + 0x980010: 00200020 028004ff 032a0509 00000000 ^^^^^^^^ character size? + ^^^^^^^^ window-x related? + ^^^^^^^^ window-y related? - 0x980200: 000007ff 000007ff 000007ff 032a0509 - ^^^^^^^^ y-clipping (see timecris, not implemented yet) - + 0x980200: 000007ff 000007ff 000007ff 032a0509 y-clipping related 0x980210: 000007ff 000007ff 000007ff 000007ff 0x980220: 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? // the only game that uses y_lowres is cybrcycc, and unfortunately doesn't have a video test in service mode int y_lowres = 0; @@ -1438,7 +1444,7 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre { pSource = &spriteram32[0x04000/4 + base*4]; 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) */ @@ -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]; 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 @@ -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]; 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 */