Skip to content

Commit 1b4bd1d

Browse files
authored
sega/model2: tilemap fixes (#14476)
-sega/model2: tilemap fixes : If all three layers (polygon, tilemap A, tilemap B) are transparent, palette entry #0 from tilemap B is shown [Matthew Daniels]
1 parent add9234 commit 1b4bd1d

File tree

3 files changed

+37
-33
lines changed

3 files changed

+37
-33
lines changed

src/mame/sega/model2_v.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,8 +2599,12 @@ u32 model2_state::screen_update_model2(screen_device &screen, bitmap_rgb32 &bitm
25992599
bitmap.fill(m_palette->pen(0), cliprect);
26002600
m_sys24_bitmap.fill(0, cliprect);
26012601

2602-
for(int layer = 3; layer >= 0; layer--)
2603-
m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer<<1, 0, 0);
2602+
// draw tilemap B as opaque
2603+
for (int layer = 3; layer >= 2; layer--)
2604+
m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer << 1, 0, TILEMAP_DRAW_OPAQUE);
2605+
2606+
for (int layer = 1; layer >= 0; layer--)
2607+
m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer << 1, 0, 0);
26042608

26052609
copybitmap_trans(bitmap, m_sys24_bitmap, 0, 0, 0, 0, cliprect, 0);
26062610

src/mame/sega/segaic24.cpp

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void segas24_tile_device::device_start()
102102
}
103103

104104
void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_ind16 &dm, const uint16_t *mask,
105-
uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2)
105+
uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2)
106106
{
107107
const uint16_t *source = &bm.pix(sy, sx);
108108
const uint8_t *trans = &tm.pix(sy, sx);
@@ -141,7 +141,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
141141
if(!m) {
142142
// 1- 128 pixels from this layer
143143
for(int x=0; x<128; x++) {
144-
if(*srct++ == tpri) {
144+
if(*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) {
145145
*dst = *src;
146146
*pr |= lpri;
147147
}
@@ -163,7 +163,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
163163
if(!(m & 0x8000)) {
164164
int xx;
165165
for(xx=0; xx<8; xx++)
166-
if(srct[xx] == tpri) {
166+
if(srct[xx] == tpri || flags & TILEMAP_DRAW_OPAQUE) {
167167
dst[xx] = src[xx];
168168
pr[xx] |= lpri;
169169
}
@@ -182,7 +182,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
182182
if(!m) {
183183
// 1- 128 pixels from this layer
184184
for(int x = cur_x; x<llx1; x++) {
185-
if(*srct++ == tpri) {
185+
if(*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) {
186186
*dst = *src;
187187
*pr |= lpri;
188188
}
@@ -201,7 +201,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
201201
} else {
202202
// 3- 128 pixels from both layers
203203
for(int x=cur_x; x<llx1; x++) {
204-
if(*srct++ == tpri && !(m & (0x8000 >> (x >> 3)))) {
204+
if((*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) && !(m & (0x8000 >> (x >> 3)))) {
205205
*dst = *src;
206206
*pr |= lpri;
207207
}
@@ -229,7 +229,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
229229
// priority_bitmap
230230

231231
void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_rgb32 &dm, const uint16_t *mask,
232-
uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2)
232+
uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2)
233233
{
234234
const uint16_t *source = &bm.pix(sy, sx);
235235
const uint8_t *trans = &tm.pix(sy, sx);
@@ -267,7 +267,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
267267
if(!m) {
268268
// 1- 128 pixels from this layer
269269
for(int x=0; x<128; x++) {
270-
if(*srct++ == tpri)
270+
if(*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE)
271271
*dst = pens[*src];
272272
src++;
273273
dst++;
@@ -284,7 +284,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
284284
for(int x=0; x<128; x+=8) {
285285
if(!(m & 0x8000)) {
286286
for(int xx=0; xx<8; xx++)
287-
if(srct[xx] == tpri)
287+
if(srct[xx] == tpri || flags & TILEMAP_DRAW_OPAQUE)
288288
dst[xx] = pens[src[xx]];
289289
}
290290
src += 8;
@@ -300,7 +300,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
300300
if(!m) {
301301
// 1- 128 pixels from this layer
302302
for(int x = cur_x; x<llx1; x++) {
303-
if(*srct++ == tpri)
303+
if(*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE)
304304
*dst = pens[*src];
305305
src++;
306306
dst++;
@@ -316,7 +316,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit
316316
// 3- 128 pixels from both layers
317317
int x;
318318
for(x=cur_x; x<llx1; x++) {
319-
if(*srct++ == tpri && !(m & (0x8000 >> (x >> 3))))
319+
if((*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) && !(m & (0x8000 >> (x >> 3))))
320320
*dst = pens[*src];
321321

322322
src++;
@@ -380,7 +380,7 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap
380380

381381
h = hscr & 0x1ff;
382382
tile_layer[l1]->set_scrollx(0, -h);
383-
tile_layer[l1]->draw(screen, bitmap, c, tpri, lpri);
383+
tile_layer[l1]->draw(screen, bitmap, c, tpri | flags, lpri);
384384
}
385385
break;
386386
}
@@ -407,8 +407,8 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap
407407

408408
c1.min_y = c1.max_y = c2.min_y = c2.max_y = y;
409409

410-
tile_layer[l1]->draw(screen, bitmap, c1, tpri, lpri);
411-
tile_layer[l1^1]->draw(screen, bitmap, c2, tpri, lpri);
410+
tile_layer[l1]->draw(screen, bitmap, c1, tpri | flags, lpri);
411+
tile_layer[l1^1]->draw(screen, bitmap, c2, tpri | flags, lpri);
412412
}
413413
break;
414414
}
@@ -431,8 +431,8 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap
431431
if(!((-vscr) & 0x200))
432432
layer ^= 1;
433433

434-
tile_layer[layer]->draw(screen, bitmap, c1, tpri, lpri);
435-
tile_layer[layer^1]->draw(screen, bitmap, c2, tpri, lpri);
434+
tile_layer[layer]->draw(screen, bitmap, c1, tpri | flags, lpri);
435+
tile_layer[layer^1]->draw(screen, bitmap, c2, tpri | flags, lpri);
436436
break;
437437
}
438438
case 2: case 3: {
@@ -447,8 +447,8 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap
447447
if(!((+hscr) & 0x200))
448448
layer ^= 1;
449449

450-
tile_layer[layer]->draw(screen, bitmap, c1, tpri, lpri);
451-
tile_layer[layer^1]->draw(screen, bitmap, c2, tpri, lpri);
450+
tile_layer[layer]->draw(screen, bitmap, c1, tpri | flags, lpri);
451+
tile_layer[layer^1]->draw(screen, bitmap, c2, tpri | flags, lpri);
452452
break;
453453
}
454454
}
@@ -469,11 +469,11 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap
469469
hscr = (-hscrtb[y]) & 0x1ff;
470470
if(hscr + 496 <= 512) {
471471
// Horizontal split unnecessary
472-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 496, y+1);
472+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, y, 496, y+1);
473473
} else {
474474
// Horizontal split necessary
475-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 512-hscr, y+1);
476-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, y, 496, y+1);
475+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, y, 512-hscr, y+1);
476+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, vscr, 512-hscr, y, 496, y+1);
477477
}
478478
vscr = (vscr + 1) & 0x1ff;
479479
}
@@ -485,25 +485,25 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap
485485
// Horizontal split unnecessary
486486
if(vscr + 384 <= 512) {
487487
// Vertical split unnecessary
488-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 384);
488+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 496, 384);
489489
} else {
490490
// Vertical split necessary
491-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 512-vscr);
492-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 496, 384);
491+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 496, 512-vscr);
492+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, 0, 0, 512-vscr, 496, 384);
493493

494494
}
495495
} else {
496496
// Horizontal split necessary
497497
if(vscr + 384 <= 512) {
498498
// Vertical split unnecessary
499-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 384);
500-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 384);
499+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 512-hscr, 384);
500+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, vscr, 512-hscr, 0, 496, 384);
501501
} else {
502502
// Vertical split necessary
503-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 512-vscr);
504-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 512-vscr);
505-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 512-hscr, 384);
506-
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, 0, 512-hscr, 512-vscr, 496, 384);
503+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 512-hscr, 512-vscr);
504+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, vscr, 512-hscr, 0, 496, 512-vscr);
505+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, 0, 0, 512-vscr, 512-hscr, 384);
506+
draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, 0, 512-hscr, 512-vscr, 496, 384);
507507
}
508508
}
509509
}

src/mame/sega/segaic24.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ class segas24_tile_device : public device_t, public device_gfx_interface
6565
TILE_GET_INFO_MEMBER(tile_info_1w);
6666

6767
void draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_ind16 &dm, const uint16_t *mask,
68-
uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2);
68+
uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2);
6969
void draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_rgb32 &dm, const uint16_t *mask,
70-
uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2);
70+
uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2);
7171

7272
template<class BitmapClass>
7373
void draw_common(screen_device &screen, BitmapClass &bitmap, const rectangle &cliprect, int layer, int pri, int flags);

0 commit comments

Comments
 (0)