mirror of
https://github.com/holub/mame
synced 2025-04-29 03:20:50 +03:00
namcond1.cpp: enabled preliminary ROZ effects in ygv608 core [Angelo Salese]
(out-of-whatsnew: needs testing and references, they are certainly off for e.g. Galaga Arrange Challenge Stages)
This commit is contained in:
parent
7b49234487
commit
502129c5b5
@ -38,7 +38,6 @@
|
|||||||
#define _ENABLE_SCROLLX
|
#define _ENABLE_SCROLLX
|
||||||
#define _ENABLE_SCROLLY
|
#define _ENABLE_SCROLLY
|
||||||
//#define _ENABLE_SCREEN_RESIZE
|
//#define _ENABLE_SCREEN_RESIZE
|
||||||
//#define _ENABLE_ROTATE_ZOOM
|
|
||||||
//#define _SHOW_VIDEO_DEBUG
|
//#define _SHOW_VIDEO_DEBUG
|
||||||
|
|
||||||
#define GFX_8X8_4BIT 0
|
#define GFX_8X8_4BIT 0
|
||||||
@ -831,6 +830,35 @@ static const char *const mode[] = {
|
|||||||
static const char *const psize[] = { "8x8", "16x16", "32x32", "64x64" };
|
static const char *const psize[] = { "8x8", "16x16", "32x32", "64x64" };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
inline void ygv608_device::draw_layer_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *source_tilemap)
|
||||||
|
{
|
||||||
|
int xc, yc;
|
||||||
|
double r, alpha, sin_theta, cos_theta;
|
||||||
|
const rectangle &visarea = screen.visible_area();
|
||||||
|
|
||||||
|
if( m_regs.s.r7 & r7_zron )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* fudge - translate ax,ay to startx, starty each time
|
||||||
|
*/
|
||||||
|
|
||||||
|
xc = m_ax >> 16;
|
||||||
|
yc = m_ay >> 16;
|
||||||
|
r = sqrt( (double)( xc * xc + yc * yc ) );
|
||||||
|
alpha = atan( (double)xc / (double)yc );
|
||||||
|
sin_theta = (double)m_dyx / (double)0x10000;
|
||||||
|
cos_theta = (double)m_dx / (double)0x10000;
|
||||||
|
|
||||||
|
source_tilemap->draw_roz(screen, bitmap, cliprect,
|
||||||
|
( visarea.min_x << 16 ) + m_ax + 0x10000 * r * ( -sin( alpha ) * cos_theta + cos( alpha ) * sin_theta ),
|
||||||
|
( visarea.min_y << 16 ) + m_ay + 0x10000 * r * ( cos( alpha ) * cos_theta + sin( alpha ) * sin_theta ),
|
||||||
|
m_dx, m_dxy, m_dyx, m_dy, true, 0, 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
source_tilemap->draw(screen, bitmap, cliprect, 0, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
#ifdef _SHOW_VIDEO_DEBUG
|
#ifdef _SHOW_VIDEO_DEBUG
|
||||||
@ -838,10 +866,6 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
|
|||||||
#endif
|
#endif
|
||||||
#ifdef _ENABLE_SCROLLY
|
#ifdef _ENABLE_SCROLLY
|
||||||
int col;
|
int col;
|
||||||
#endif
|
|
||||||
#ifdef _ENABLE_ROTATE_ZOOM
|
|
||||||
int xc, yc;
|
|
||||||
double r, alpha, sin_theta, cos_theta;
|
|
||||||
#endif
|
#endif
|
||||||
rectangle finalclip;
|
rectangle finalclip;
|
||||||
const rectangle &visarea = screen.visible_area();
|
const rectangle &visarea = screen.visible_area();
|
||||||
@ -849,11 +873,11 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
|
|||||||
// clip to the current bitmap
|
// clip to the current bitmap
|
||||||
finalclip.set(0, screen.width() - 1, 0, screen.height() - 1);
|
finalclip.set(0, screen.width() - 1, 0, screen.height() - 1);
|
||||||
finalclip &= cliprect;
|
finalclip &= cliprect;
|
||||||
|
bitmap.fill(0, visarea );
|
||||||
|
|
||||||
// punt if not initialized
|
// punt if not initialized
|
||||||
if (m_page_x == 0 || m_page_y == 0)
|
if (m_page_x == 0 || m_page_y == 0)
|
||||||
{
|
{
|
||||||
bitmap.fill(0, finalclip);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,7 +975,6 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
|
|||||||
* now we can render the screen
|
* now we can render the screen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if 1
|
|
||||||
// LBO - need to implement proper pen marking for sprites as well as set aside a non-transparent
|
// LBO - need to implement proper pen marking for sprites as well as set aside a non-transparent
|
||||||
// pen to be used for background fills when plane B is disabled.
|
// pen to be used for background fills when plane B is disabled.
|
||||||
if ((m_regs.s.r7 & r7_md) & MD_1PLANE)
|
if ((m_regs.s.r7 & r7_md) & MD_1PLANE)
|
||||||
@ -961,34 +984,11 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
|
|||||||
// m_work_bitmap.fill(1, *visarea);
|
// m_work_bitmap.fill(1, *visarea);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
{
|
||||||
m_tilemap_B->draw(screen, m_work_bitmap, finalclip, 0, 0 );
|
draw_layer_roz(screen, m_work_bitmap, finalclip, m_tilemap_B);
|
||||||
|
|
||||||
#ifdef _ENABLE_ROTATE_ZOOM
|
copybitmap( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip);
|
||||||
|
}
|
||||||
/*
|
|
||||||
* fudge - translate ax,ay to startx, starty each time
|
|
||||||
*/
|
|
||||||
|
|
||||||
xc = m_ax >> 16;
|
|
||||||
yc = m_ay >> 16;
|
|
||||||
r = sqrt( (double)( xc * xc + yc * yc ) );
|
|
||||||
alpha = atan( (double)xc / (double)yc );
|
|
||||||
sin_theta = (double)m_dyx / (double)0x10000;
|
|
||||||
cos_theta = (double)m_dx / (double)0x10000;
|
|
||||||
|
|
||||||
if( m_regs.s.zron )
|
|
||||||
copyrozbitmap( bitmap, finalclip, &m_work_bitmap,
|
|
||||||
( visarea.min_x << 16 ) +
|
|
||||||
m_ax + 0x10000 * r *
|
|
||||||
( -sin( alpha ) * cos_theta + cos( alpha ) * sin_theta ),
|
|
||||||
( visarea.min_y << 16 ) +
|
|
||||||
m_ay + 0x10000 * r *
|
|
||||||
( cos( alpha ) * cos_theta + sin( alpha ) * sin_theta ),
|
|
||||||
m_dx, m_dxy, m_dyx, m_dy, 0);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
copybitmap( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip);
|
|
||||||
|
|
||||||
// for some reason we can't use an opaque m_tilemap_A
|
// for some reason we can't use an opaque m_tilemap_A
|
||||||
// so use a transparent but clear the work bitmap first
|
// so use a transparent but clear the work bitmap first
|
||||||
@ -999,19 +999,9 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
|
|||||||
(m_regs.s.r11 & r11_prm) == PRM_ASEBDX )
|
(m_regs.s.r11 & r11_prm) == PRM_ASEBDX )
|
||||||
draw_sprites(bitmap, finalclip);
|
draw_sprites(bitmap, finalclip);
|
||||||
|
|
||||||
m_tilemap_A->draw(screen, m_work_bitmap, finalclip, 0, 0 );
|
draw_layer_roz(screen, m_work_bitmap, finalclip, m_tilemap_A);
|
||||||
|
copybitmap_trans( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip, 0);
|
||||||
#ifdef _ENABLE_ROTATE_ZOOM
|
|
||||||
if( m_regs.s.zron )
|
|
||||||
copyrozbitmap_trans( bitmap, finalclip, &m_work_bitmap,
|
|
||||||
m_ax, // + ( visarea.min_x << 16 ),
|
|
||||||
m_ay, // + ( visarea.min_y << 16 ),
|
|
||||||
m_dx, m_dxy, m_dyx, m_dy, 0,
|
|
||||||
0 );
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
copybitmap_trans( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip, 0 );
|
|
||||||
|
|
||||||
if ((m_regs.s.r11 & r11_prm) == PRM_SABDEX ||
|
if ((m_regs.s.r11 & r11_prm) == PRM_SABDEX ||
|
||||||
(m_regs.s.r11 & r11_prm) == PRM_SEABDX)
|
(m_regs.s.r11 & r11_prm) == PRM_SEABDX)
|
||||||
draw_sprites(bitmap,finalclip );
|
draw_sprites(bitmap,finalclip );
|
||||||
|
@ -312,7 +312,8 @@ private:
|
|||||||
void postload();
|
void postload();
|
||||||
void register_state_save();
|
void register_state_save();
|
||||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
|
void draw_layer_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *source_tilemap);
|
||||||
|
|
||||||
uint8_t m_namcond1_gfxbank;
|
uint8_t m_namcond1_gfxbank;
|
||||||
|
|
||||||
tilemap_t *m_tilemap_A_cache_8[3];
|
tilemap_t *m_tilemap_A_cache_8[3];
|
||||||
|
Loading…
Reference in New Issue
Block a user