mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
namcos2_sprite.cpp : Updates
Simplfiy / Correct sprite gfx select behavior, Reduce unnecessary lines, Fix spacings, Use shorter / correct type values namcos2.cpp : Simplify gfxdecodes
This commit is contained in:
parent
42221910aa
commit
b1b2b37296
File diff suppressed because it is too large
Load Diff
@ -41,35 +41,35 @@ void namcos2_sprite_device::device_start()
|
||||
void namcos2_sprite_device::zdrawgfxzoom(
|
||||
screen_device &screen,
|
||||
bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx,
|
||||
uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy,
|
||||
int scalex, int scaley, int zpos )
|
||||
u32 code,u32 color,bool flipx,bool flipy,int sx,int sy,
|
||||
int scalex, int scaley, int zpos)
|
||||
{
|
||||
if (!scalex || !scaley) return;
|
||||
if (dest_bmp.bpp() == 16)
|
||||
{
|
||||
if( gfx )
|
||||
if (gfx)
|
||||
{
|
||||
device_palette_interface &palette = m_gfxdecode->palette();
|
||||
int shadow_offset = (palette.shadows_enabled())?palette.entries():0;
|
||||
device_palette_interface &palette = gfx->palette();
|
||||
const int shadow_offset = (palette.shadows_enabled()) ? palette.entries() : 0;
|
||||
const pen_t *pal = &palette.pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors()));
|
||||
const uint8_t *source_base = gfx->get_data(code % gfx->elements());
|
||||
int sprite_screen_height = (scaley*gfx->height()+0x8000)>>16;
|
||||
int sprite_screen_width = (scalex*gfx->width()+0x8000)>>16;
|
||||
const u8 *source_base = gfx->get_data(code % gfx->elements());
|
||||
const int sprite_screen_height = (scaley * gfx->height() + 0x8000) >> 16;
|
||||
const int sprite_screen_width = (scalex * gfx->width() + 0x8000) >> 16;
|
||||
if (sprite_screen_width && sprite_screen_height)
|
||||
{
|
||||
/* compute sprite increment per screen pixel */
|
||||
int dx = (gfx->width()<<16)/sprite_screen_width;
|
||||
int dy = (gfx->height()<<16)/sprite_screen_height;
|
||||
int dx = (gfx->width() << 16) / sprite_screen_width;
|
||||
int dy = (gfx->height() << 16) / sprite_screen_height;
|
||||
|
||||
int ex = sx+sprite_screen_width;
|
||||
int ey = sy+sprite_screen_height;
|
||||
int ex = sx + sprite_screen_width;
|
||||
int ey = sy + sprite_screen_height;
|
||||
|
||||
int x_index_base;
|
||||
int y_index;
|
||||
|
||||
if( flipx )
|
||||
if (flipx)
|
||||
{
|
||||
x_index_base = (sprite_screen_width-1)*dx;
|
||||
x_index_base = (sprite_screen_width - 1) * dx;
|
||||
dx = -dx;
|
||||
}
|
||||
else
|
||||
@ -77,9 +77,9 @@ void namcos2_sprite_device::zdrawgfxzoom(
|
||||
x_index_base = 0;
|
||||
}
|
||||
|
||||
if( flipy )
|
||||
if (flipy)
|
||||
{
|
||||
y_index = (sprite_screen_height-1)*dy;
|
||||
y_index = (sprite_screen_height - 1) * dy;
|
||||
dy = -dy;
|
||||
}
|
||||
else
|
||||
@ -87,58 +87,57 @@ void namcos2_sprite_device::zdrawgfxzoom(
|
||||
y_index = 0;
|
||||
}
|
||||
|
||||
if( sx < clip.min_x)
|
||||
if (sx < clip.min_x)
|
||||
{ /* clip left */
|
||||
int pixels = clip.min_x-sx;
|
||||
int pixels = clip.min_x - sx;
|
||||
sx += pixels;
|
||||
x_index_base += pixels*dx;
|
||||
x_index_base += pixels * dx;
|
||||
}
|
||||
if( sy < clip.min_y )
|
||||
if (sy < clip.min_y)
|
||||
{ /* clip top */
|
||||
int pixels = clip.min_y-sy;
|
||||
int pixels = clip.min_y - sy;
|
||||
sy += pixels;
|
||||
y_index += pixels*dy;
|
||||
y_index += pixels * dy;
|
||||
}
|
||||
if( ex > clip.max_x+1 )
|
||||
if (ex > clip.max_x + 1)
|
||||
{ /* clip right */
|
||||
int pixels = ex-clip.max_x-1;
|
||||
int pixels = ex - clip.max_x - 1;
|
||||
ex -= pixels;
|
||||
}
|
||||
if( ey > clip.max_y+1 )
|
||||
if (ey > clip.max_y + 1)
|
||||
{ /* clip bottom */
|
||||
int pixels = ey-clip.max_y-1;
|
||||
int pixels = ey - clip.max_y - 1;
|
||||
ey -= pixels;
|
||||
}
|
||||
|
||||
if( ex>sx )
|
||||
if (ex > sx)
|
||||
{ /* skip if inner loop doesn't draw anything */
|
||||
int y;
|
||||
bitmap_ind8 &priority_bitmap = screen.priority();
|
||||
if( priority_bitmap.valid() )
|
||||
if (priority_bitmap.valid())
|
||||
{
|
||||
for( y=sy; y<ey; y++ )
|
||||
for (int y = sy; y < ey; y++)
|
||||
{
|
||||
const uint8_t *source = source_base + (y_index>>16) * gfx->rowbytes();
|
||||
uint16_t *dest = &dest_bmp.pix16(y);
|
||||
uint8_t *pri = &priority_bitmap.pix8(y);
|
||||
int x, x_index = x_index_base;
|
||||
const u8 *source = source_base + (y_index>>16) * gfx->rowbytes();
|
||||
u16 *dest = &dest_bmp.pix16(y);
|
||||
u8 *pri = &priority_bitmap.pix8(y);
|
||||
int x_index = x_index_base;
|
||||
/* this code was previously shared with the c355 where this was needed
|
||||
if( m_palxor )
|
||||
if (m_palxor)
|
||||
{
|
||||
for( x=sx; x<ex; x++ )
|
||||
for (int x = sx; x < ex; x++)
|
||||
{
|
||||
int c = source[x_index>>16];
|
||||
if( c != 0xff )
|
||||
const u8 c = source[x_index >> 16];
|
||||
if (c != 0xff)
|
||||
{
|
||||
if( pri[x]<=zpos )
|
||||
if (pri[x] <= zpos)
|
||||
{
|
||||
switch( c )
|
||||
switch(c)
|
||||
{
|
||||
case 0:
|
||||
dest[x] = 0x4000|(dest[x]&0x1fff);
|
||||
dest[x] = 0x4000 | (dest[x] & 0x1fff);
|
||||
break;
|
||||
case 1:
|
||||
dest[x] = 0x6000|(dest[x]&0x1fff);
|
||||
dest[x] = 0x6000 | (dest[x] & 0x1fff);
|
||||
break;
|
||||
default:
|
||||
dest[x] = pal[c];
|
||||
@ -154,14 +153,14 @@ void namcos2_sprite_device::zdrawgfxzoom(
|
||||
else
|
||||
*/
|
||||
{
|
||||
for( x=sx; x<ex; x++ )
|
||||
for (int x = sx; x < ex; x++)
|
||||
{
|
||||
int c = source[x_index>>16];
|
||||
if( c != 0xff )
|
||||
const u8 c = source[x_index >> 16];
|
||||
if (c != 0xff)
|
||||
{
|
||||
if( pri[x]<=zpos )
|
||||
if (pri[x] <= zpos)
|
||||
{
|
||||
if( color == 0xf && c==0xfe && shadow_offset )
|
||||
if (color == 0xf && c==0xfe && shadow_offset)
|
||||
{
|
||||
dest[x] |= shadow_offset;
|
||||
}
|
||||
@ -187,21 +186,20 @@ void namcos2_sprite_device::zdrawgfxzoom(
|
||||
void namcos2_sprite_device::zdrawgfxzoom(
|
||||
screen_device &screen,
|
||||
bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx,
|
||||
uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy,
|
||||
int scalex, int scaley, int zpos )
|
||||
u32 code,u32 color,bool flipx,bool flipy,int sx,int sy,
|
||||
int scalex, int scaley, int zpos)
|
||||
{
|
||||
/* nop */
|
||||
}
|
||||
|
||||
void namcos2_sprite_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control )
|
||||
void namcos2_sprite_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control)
|
||||
{
|
||||
int offset = (control & 0x000f) * (128*4);
|
||||
int loop;
|
||||
if( pri==0 )
|
||||
int offset = (control & 0x000f) * (128 * 4);
|
||||
if (pri == 0)
|
||||
{
|
||||
screen.priority().fill(0, cliprect );
|
||||
screen.priority().fill(0, cliprect);
|
||||
}
|
||||
for( loop=0; loop < 128; loop++ )
|
||||
for (int loop = 0; loop < 128; loop++)
|
||||
{
|
||||
/****************************************
|
||||
* word#0
|
||||
@ -211,8 +209,7 @@ void namcos2_sprite_device::draw_sprites(screen_device &screen, bitmap_ind16 &bi
|
||||
*
|
||||
* word#1
|
||||
* Sprite Quadrant D00-D01
|
||||
* Sprite Number D02-D12
|
||||
* Sprite ROM Bank select D13
|
||||
* Sprite Number D02-D13
|
||||
* Sprite flip X D14
|
||||
* Sprite flip Y D15
|
||||
*
|
||||
@ -224,35 +221,34 @@ void namcos2_sprite_device::draw_sprites(screen_device &screen, bitmap_ind16 &bi
|
||||
* Sprite colour index D04-D07
|
||||
* Sprite Size X D10-D15
|
||||
*/
|
||||
int word3 = m_spriteram[offset+(loop*4)+3];
|
||||
if( (word3&0xf)==pri )
|
||||
const u16 word3 = m_spriteram[offset + (loop * 4) + 3];
|
||||
if ((word3 & 0xf) == pri)
|
||||
{
|
||||
int word0 = m_spriteram[offset+(loop*4)+0];
|
||||
int word1 = m_spriteram[offset+(loop*4)+1];
|
||||
int offset4 = m_spriteram[offset+(loop*4)+2];
|
||||
const u16 word0 = m_spriteram[offset + (loop * 4) + 0];
|
||||
const u16 word1 = m_spriteram[offset + (loop * 4) + 1];
|
||||
const u16 offset4 = m_spriteram[offset + (loop * 4) + 2];
|
||||
|
||||
int sizey=((word0>>10)&0x3f)+1;
|
||||
int sizex=(word3>>10)&0x3f;
|
||||
const int sizey = ((word0 >> 10) & 0x003f) + 1;
|
||||
int sizex = (word3 >> 10) & 0x003f;
|
||||
|
||||
if((word0&0x0200)==0) sizex>>=1;
|
||||
if ((word0 & 0x0200) == 0) sizex >>= 1;
|
||||
|
||||
if((sizey-1) && sizex )
|
||||
if ((sizey - 1) && sizex)
|
||||
{
|
||||
int color = (word3>>4)&0x000f;
|
||||
int sprn = (word1>>2)&0x7ff;
|
||||
int rgn = (word1&0x2000)?1:0;
|
||||
int ypos = (0x1ff-(word0&0x01ff))-0x50+0x02;
|
||||
int xpos = (offset4&0x03ff)-0x50+0x07;
|
||||
int flipy = word1&0x8000;
|
||||
int flipx = word1&0x4000;
|
||||
int scalex = (sizex<<16)/((word0&0x0200)?0x20:0x10);
|
||||
int scaley = (sizey<<16)/((word0&0x0200)?0x20:0x10);
|
||||
if(scalex && scaley)
|
||||
const u32 color = (word3 >> 4) & 0x000f;
|
||||
const u32 sprn = (word1 >> 2) & 0x0fff;
|
||||
const int ypos = (0x1ff - (word0 & 0x01ff)) - 0x50 + 0x02;
|
||||
const int xpos = (offset4 & 0x03ff) - 0x50 + 0x07;
|
||||
const bool flipy = word1 & 0x8000;
|
||||
const bool flipx = word1 & 0x4000;
|
||||
const int scalex = (sizex << 16) / ((word0 & 0x0200) ? 0x20 : 0x10);
|
||||
const int scaley = (sizey << 16) / ((word0 & 0x0200) ? 0x20 : 0x10);
|
||||
if (scalex && scaley)
|
||||
{
|
||||
gfx_element *gfx = m_gfxdecode->gfx(rgn);
|
||||
gfx_element *gfx = m_gfxdecode->gfx(0);
|
||||
|
||||
if( (word0&0x0200)==0 )
|
||||
gfx->set_source_clip((word1&0x0001) ? 16 : 0, 16, (word1&0x0002) ? 16 : 0, 16);
|
||||
if ((word0 & 0x0200) == 0)
|
||||
gfx->set_source_clip((word1 & 0x0001) ? 16 : 0, 16, (word1 & 0x0002) ? 16 : 0, 16);
|
||||
else
|
||||
gfx->set_source_clip(0, 32, 0, 32);
|
||||
|
||||
@ -266,14 +262,14 @@ void namcos2_sprite_device::draw_sprites(screen_device &screen, bitmap_ind16 &bi
|
||||
flipx,flipy,
|
||||
xpos,ypos,
|
||||
scalex,scaley,
|
||||
loop );
|
||||
loop);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* namcos2_draw_sprites */
|
||||
} /* draw_sprites */
|
||||
|
||||
void namcos2_sprite_device::draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri )
|
||||
void namcos2_sprite_device::draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri)
|
||||
{
|
||||
/**
|
||||
* word#0
|
||||
@ -282,8 +278,7 @@ void namcos2_sprite_device::draw_sprites_metalhawk(screen_device &screen, bitmap
|
||||
* -------xxxxxxxxx screeny
|
||||
*
|
||||
* word#1
|
||||
* --x------------- bank
|
||||
* ----xxxxxxxxxxxx tile
|
||||
* --xxxxxxxxxxxxxx tile
|
||||
*
|
||||
* word#2 (unused)
|
||||
*
|
||||
@ -305,62 +300,52 @@ void namcos2_sprite_device::draw_sprites_metalhawk(screen_device &screen, bitmap
|
||||
* --------xxxx---- color
|
||||
* x--------------- unknown
|
||||
*/
|
||||
const uint16_t *pSource = m_spriteram;
|
||||
int loop;
|
||||
if( pri==0 )
|
||||
const u16 *pSource = m_spriteram;
|
||||
if (pri == 0)
|
||||
{
|
||||
screen.priority().fill(0, cliprect );
|
||||
screen.priority().fill(0, cliprect);
|
||||
}
|
||||
for( loop=0; loop < 128; loop++ )
|
||||
for (int loop=0; loop < 128; loop++)
|
||||
{
|
||||
int ypos = pSource[0];
|
||||
int tile = pSource[1];
|
||||
int xpos = pSource[3];
|
||||
int flags = pSource[6];
|
||||
int attrs = pSource[7];
|
||||
int sizey = ((ypos>>10)&0x3f)+1;
|
||||
int sizex = (xpos>>10)&0x3f;
|
||||
int sprn = (tile>>2)&0x7ff;
|
||||
const u16 ypos = pSource[0];
|
||||
const u16 tile = pSource[1];
|
||||
const u16 xpos = pSource[3];
|
||||
const u16 flags = pSource[6];
|
||||
const u16 attrs = pSource[7];
|
||||
const int sizey = ((ypos >> 10) & 0x003f) + 1;
|
||||
const int sizex = (xpos >> 10) & 0x003f;
|
||||
const u32 sprn = (tile >> 2) & 0x0fff;
|
||||
|
||||
if( tile&0x2000 )
|
||||
if ((sizey - 1) && sizex && (attrs & 0xf) == pri)
|
||||
{
|
||||
sprn&=0x3ff;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprn|=0x400;
|
||||
}
|
||||
|
||||
if( (sizey-1) && sizex && (attrs&0xf)==pri )
|
||||
{
|
||||
int bBigSprite = (flags&8);
|
||||
int color = (attrs>>4)&0xf;
|
||||
int sx = (xpos&0x03ff)-0x50+0x07;
|
||||
int sy = (0x1ff-(ypos&0x01ff))-0x50+0x02;
|
||||
int flipx = flags&2;
|
||||
int flipy = flags&4;
|
||||
int scalex = (sizex<<16)/(0x20);//(sizex<<16)/(bBigSprite?0x20:0x10); correct formula?
|
||||
int scaley = (sizey<<16)/(bBigSprite?0x20:0x10);
|
||||
const bool bBigSprite = flags & 0x0008;
|
||||
const u32 color = (attrs >> 4) & 0x000f;
|
||||
int sx = (xpos & 0x03ff) - 0x50 + 0x07;
|
||||
int sy = (0x1ff - (ypos & 0x01ff)) - 0x50 + 0x02;
|
||||
const bool flipx = flags & 0x0002;
|
||||
const bool flipy = flags & 0x0004;
|
||||
const int scalex = (sizex << 16) / (0x20);//(sizex << 16) / (bBigSprite ? 0x20 : 0x10); correct formula?
|
||||
const int scaley = (sizey << 16) / (bBigSprite ? 0x20 : 0x10);
|
||||
|
||||
/* swap xy */
|
||||
int rgn = (flags&0x01);
|
||||
const int rgn = (flags & 0x0001);
|
||||
|
||||
gfx_element *gfx = m_gfxdecode->gfx(rgn);
|
||||
|
||||
if( bBigSprite )
|
||||
if (bBigSprite)
|
||||
{
|
||||
if( sizex < 0x20 )
|
||||
if (sizex < 0x20)
|
||||
{
|
||||
sx -= (0x20-sizex)/0x8;
|
||||
sx -= (0x20 - sizex) / 0x8;
|
||||
}
|
||||
if( sizey < 0x20 )
|
||||
if (sizey < 0x20)
|
||||
{
|
||||
sy += (0x20-sizey)/0xC;
|
||||
sy += (0x20 - sizey) / 0xC;
|
||||
}
|
||||
gfx->set_source_clip(0, 32, 0, 32);
|
||||
}
|
||||
else
|
||||
gfx->set_source_clip((tile&0x0001) ? 16 : 0, 16, (tile&0x0002) ? 16 : 0, 16);
|
||||
gfx->set_source_clip((tile & 0x0001) ? 16 : 0, 16, (tile & 0x0002) ? 16 : 0, 16);
|
||||
|
||||
zdrawgfxzoom(
|
||||
screen,
|
||||
@ -371,8 +356,8 @@ void namcos2_sprite_device::draw_sprites_metalhawk(screen_device &screen, bitmap
|
||||
flipx,flipy,
|
||||
sx,sy,
|
||||
scalex, scaley,
|
||||
loop );
|
||||
loop);
|
||||
}
|
||||
pSource += 8;
|
||||
}
|
||||
} /* namcos2_draw_sprites_metalhawk */
|
||||
} /* draw_sprites_metalhawk */
|
||||
|
@ -27,16 +27,15 @@ protected:
|
||||
|
||||
private:
|
||||
// general
|
||||
void zdrawgfxzoom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos);
|
||||
void zdrawgfxzoom(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos);
|
||||
void zdrawgfxzoom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, int scalex, int scaley, int zpos);
|
||||
void zdrawgfxzoom(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, int scalex, int scaley, int zpos);
|
||||
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
|
||||
required_shared_ptr<uint16_t> m_spriteram;
|
||||
required_shared_ptr<u16> m_spriteram;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(NAMCOS2_SPRITE, namcos2_sprite_device)
|
||||
|
||||
#endif // MAME_VIDEO_NAMCOS2_SPRITE_H
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user