From acc735396760c6459959c3c8160e9a74d229dd3b Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 13 Nov 2022 19:49:06 +0100 Subject: namcos22: add poly alpha pen mask --- src/mame/namco/namcos22.cpp | 25 ++++++++++++++----------- src/mame/namco/namcos22.h | 17 ++++++++++------- src/mame/namco/namcos22_v.cpp | 38 ++++++++++++++++++++++++++------------ 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/mame/namco/namcos22.cpp b/src/mame/namco/namcos22.cpp index 77d372e8978..3e332a7021b 100644 --- a/src/mame/namco/namcos22.cpp +++ b/src/mame/namco/namcos22.cpp @@ -41,8 +41,7 @@ TODO: + testmode looks wrong, spot_data high bits is 0 here (2 in dirtdash) - PDP command 0xfff9, used in alpinr2b to modify titlescreen logo animation in pointram (should show a snow melting effect) - alpha blended sprite/poly with priority over alpha blended text doesn't work right -- alpines sprites on selection screen should not be fully alpha blended, only the drop shadow should -- ss22 poly translucency is probably more limited than currently emulated, not supporting stacked layers +- ss22 poly alpha is probably more limited than currently emulated, not supporting stacked layers - there's a sprite limit per scanline, eg. timecris submarine explosion smoke partially erases sprites on real hardware - cybrcycc speed dial needle polygon is missing - global offset is wrong in non-super22 servicemode video test, and above that, it flickers in acedrive, victlap @@ -56,6 +55,7 @@ TODO: - lots of smaller issues *********************************************************************************************************** + Input - input ports require manual calibration through built-in diagnostics (or canned EEPROM) @@ -135,6 +135,7 @@ System Super22 - "PDP" device, for automated block memory transfers (dsp ram, point ram) *********************************************************************************************************** + SYSTEM22 Known Custom Chips CPU PCB: @@ -3634,7 +3635,6 @@ void namcos22_state::machine_start() // register for savestates, stuff that isn't done in video_start() // note: namcos22_renderer class doesn't need saving, it is refreshed every frame - save_item(NAME(m_poly_translucency)); save_item(NAME(m_mixer_flags)); save_item(NAME(m_fog_r)); save_item(NAME(m_fog_g)); @@ -3648,6 +3648,9 @@ void namcos22_state::machine_start() save_item(NAME(m_poly_fade_g)); save_item(NAME(m_poly_fade_b)); save_item(NAME(m_poly_fade_enabled)); + save_item(NAME(m_poly_alpha_color)); + save_item(NAME(m_poly_alpha_pen)); + save_item(NAME(m_poly_alpha_factor)); save_item(NAME(m_syscontrol)); save_item(NAME(m_dsp_irq_enabled)); @@ -3782,8 +3785,8 @@ void namcos22_state::namcos22(machine_config &config) SPEAKER(config, "rspeaker").front_right(); C352(config, m_c352, 49.152_MHz_XTAL/2, 288); - m_c352->add_route(0, "lspeaker", 1.00); - m_c352->add_route(1, "rspeaker", 1.00); + m_c352->add_route(0, "lspeaker", 1.0); + m_c352->add_route(1, "rspeaker", 1.0); } void namcos22_state::cybrcomm(machine_config &config) @@ -3793,8 +3796,8 @@ void namcos22_state::cybrcomm(machine_config &config) SPEAKER(config, "rear_left").rear_left(); SPEAKER(config, "rear_right").rear_right(); - m_c352->add_route(2, "rear_left", 1.00); - m_c352->add_route(3, "rear_right", 1.00); + m_c352->add_route(2, "rear_left", 1.0); + m_c352->add_route(3, "rear_right", 1.0); } // System Super22 @@ -3861,7 +3864,7 @@ void namcos22s_state::cybrcycc(machine_config &config) namcos22s(config); SPEAKER(config, "tank", 0.0, 0.0, 0.0); - m_c352->add_route(2, "tank", 1.00); + m_c352->add_route(2, "tank", 1.0); } void namcos22s_state::dirtdash(machine_config &config) @@ -3869,7 +3872,7 @@ void namcos22s_state::dirtdash(machine_config &config) namcos22s(config); SPEAKER(config, "road", 0.0, 0.0, 0.0); - m_c352->add_route(3, "road", 1.00); + m_c352->add_route(3, "road", 0.5); } void timecris_state::timecris(machine_config &config) @@ -3886,8 +3889,8 @@ void namcos22s_state::tokyowar(machine_config &config) SPEAKER(config, "vibration").seat(); SPEAKER(config, "seat").headrest_center(); - m_c352->add_route(2, "vibration", 0.50); // to "bass shaker" - m_c352->add_route(3, "seat", 1.00); + m_c352->add_route(2, "vibration", 0.5); // to "bass shaker" + m_c352->add_route(3, "seat", 1.0); } void propcycl_state::propcycl(machine_config &config) diff --git a/src/mame/namco/namcos22.h b/src/mame/namco/namcos22.h index fd18dd49b9a..f2ac968573c 100644 --- a/src/mame/namco/namcos22.h +++ b/src/mame/namco/namcos22.h @@ -47,8 +47,8 @@ enum struct namcos22_polyvertex { float x, y, z; - int u, v; /* 0..0xfff */ - int bri; /* 0..0xff */ + int u, v; // 0..0xfff + int bri; // 0..0xff }; enum namcos22_scenenode_type @@ -98,7 +98,7 @@ struct namcos22_scenenode int cx_min, cx_max; int cy_min, cy_max; int sizex, sizey; - int translucency; + int alpha; int cz; } sprite; } data; @@ -107,7 +107,7 @@ struct namcos22_scenenode struct namcos22_object_data { - /* poly / sprites */ + // poly / sprites rgbaint_t fogcolor; rgbaint_t fadecolor; rgbaint_t polycolor; @@ -125,10 +125,11 @@ struct namcos22_object_data int cz_adjust; int cz_sdelta; const u8 *czram; + int alpha; + bool alpha_enabled; - /* sprites */ + // sprites const u8 *source; - int alpha; int line_modulo; int flipx; int flipy; @@ -232,7 +233,6 @@ public: void init_ridgeraj(); // renderer - int m_poly_translucency; u16 *m_texture_tilemap; std::unique_ptr m_texture_tileattr; u8 *m_texture_tiledata; @@ -247,6 +247,9 @@ public: int m_poly_fade_r; int m_poly_fade_g; int m_poly_fade_b; + int m_poly_alpha_color; + int m_poly_alpha_pen; + int m_poly_alpha_factor; u32 m_fog_colormask; int m_fog_r; int m_fog_g; diff --git a/src/mame/namco/namcos22_v.cpp b/src/mame/namco/namcos22_v.cpp index 16d9810a657..daa05599c4a 100644 --- a/src/mame/namco/namcos22_v.cpp +++ b/src/mame/namco/namcos22_v.cpp @@ -44,7 +44,9 @@ void namcos22_renderer::renderscanline_uvi_full(int32_t scanline, const extent_t int zfog_enabled = extra.zfog_enabled; int fogfactor = 0xff - extra.fogfactor; int fadefactor = 0xff - extra.fadefactor; - int alphafactor = 0xff - m_state.m_poly_translucency; + int alphafactor = 0xff - extra.alpha; + bool alpha_enabled = extra.alpha_enabled; + u8 alpha_pen = m_state.m_poly_alpha_pen; rgbaint_t fogcolor = extra.fogcolor; rgbaint_t fadecolor = extra.fadecolor; rgbaint_t polycolor = extra.polycolor; @@ -121,7 +123,7 @@ void namcos22_renderer::renderscanline_uvi_full(int32_t scanline, const extent_t rgb.blend(fadecolor, fadefactor); } - if (alphafactor != 0xff) + if (alphafactor != 0xff && (alpha_enabled || pen == alpha_pen)) { rgb.blend(rgbaint_t(dest[x]), alphafactor); } @@ -190,6 +192,8 @@ void namcos22_renderer::renderscanline_sprite(int32_t scanline, const extent_t & const pen_t *pal = extra.pens; int prioverchar = extra.prioverchar; int alphafactor = extra.alpha; + bool alpha_enabled = extra.alpha_enabled; + u8 alpha_pen = m_state.m_poly_alpha_pen; int fogfactor = 0xff - extra.fogfactor; int fadefactor = 0xff - extra.fadefactor; rgbaint_t fogcolor(extra.fogcolor); @@ -215,7 +219,7 @@ void namcos22_renderer::renderscanline_sprite(int32_t scanline, const extent_t & rgb.blend(fadecolor, fadefactor); } - if (alphafactor != 0xff) + if (alphafactor != 0xff && (alpha_enabled || pen == alpha_pen)) { rgb.blend(rgbaint_t(dest[x]), alphafactor); } @@ -326,6 +330,10 @@ void namcos22_renderer::poly3d_drawquad(screen_device &screen, bitmap_rgb32 &bit extra.pfade_enabled = m_state.m_poly_fade_enabled; extra.polycolor.set(0, m_state.m_poly_fade_r, m_state.m_poly_fade_g, m_state.m_poly_fade_b); + // alpha + extra.alpha = m_state.m_poly_alpha_factor; + extra.alpha_enabled = (color & 0x7f) != m_state.m_poly_alpha_color; + // poly fog if (~color & 0x80) { @@ -428,7 +436,6 @@ void namcos22_renderer::poly3d_drawsprite( extra.flags = 0; extra.destbase = &dest_bmp; - extra.alpha = alpha; extra.prioverchar = 2 | prioverchar; extra.line_modulo = gfx->rowbytes(); extra.flipx = flipx; @@ -468,6 +475,10 @@ void namcos22_renderer::poly3d_drawsprite( extra.fogcolor.set(0, m_state.m_fog_r, m_state.m_fog_g, m_state.m_fog_b); } + // alpha + extra.alpha = alpha; + extra.alpha_enabled = (color & 0x7f) != m_state.m_poly_alpha_color; + render_triangle_fan<2>(m_cliprect, render_delegate(&namcos22_renderer::renderscanline_sprite, this), 4, vert); } } @@ -504,7 +515,7 @@ void namcos22_renderer::render_sprite(screen_device &screen, bitmap_rgb32 &bitma node->data.sprite.cz, node->data.sprite.prioverchar, node->data.sprite.fade_enabled, - 0xff - node->data.sprite.translucency + 0xff - node->data.sprite.alpha ); offset++; } @@ -1481,8 +1492,8 @@ void namcos22_state::draw_sprite_group(const u32 *src, const u32 *attr, int num_ src[3] xxxx.xxxx.xxxx.xxxx | ----.----.----.---- tile number - ----.----.----.---- | xxxx.xxxx.----.---- translucency - ----.----.----.---- | ----.----.xxxx.xxxx no function(?) - set in timecris when increasing translucency, it's probably not 16bit + ----.----.----.---- | xxxx.xxxx.----.---- alpha + ----.----.----.---- | ----.----.xxxx.xxxx no function(?) - set in timecris when increasing alpha, it's probably not 16bit attr[0] xxxx.xxxx.----.---- | ----.----.----.---- unused @@ -1506,7 +1517,7 @@ void namcos22_state::draw_sprite_group(const u32 *src, const u32 *attr, int num_ int cols = (src[2] >> 4) & 0x7; u32 code = src[3]; int tile = code >> 16; - int translucency = (code & 0xff00) >> 8; + int alpha = (code & 0xff00) >> 8; u32 zcoord = attr[0] & 0x00ffffff; int color = attr[1] >> 16 & 0xff; @@ -1573,7 +1584,7 @@ void namcos22_state::draw_sprite_group(const u32 *src, const u32 *attr, int num_ node->data.sprite.cy_max = cy_max; node->data.sprite.sizex = sizex; node->data.sprite.sizey = sizey; - node->data.sprite.translucency = translucency; + node->data.sprite.alpha = alpha; node->data.sprite.color = color; node->data.sprite.cz = cz; node->data.sprite.prioverchar = prioverchar; @@ -2294,6 +2305,7 @@ void namcos22_state::update_mixer() { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 14 18 1c +00824000: ffffff00 00000000 0000007f 00ff006f fe00eded 0f700000 0000037f 00010007 // alpine surfer 00824000: ffffff00 00000000 0000007f 00ff0000 1000ff00 0f000000 00ff007f 00010007 // time crisis 00824000: ffffff00 00000000 1830407f 00800000 0000007f 0f000000 0000037f 00010007 // trans sprite 00824000: ffffff00 00000000 3040307f 00000000 0080007f 0f000000 0000037f 00010007 // trans poly @@ -2308,8 +2320,8 @@ void namcos22_state::update_mixer() 0b 0c 0d,0e spot factor - 0f - 10 + 0f polygon alpha color mask + 10 polygon alpha pen mask 11 global polygon alpha factor 12,13 textlayer alpha pen comparison 14 textlayer alpha pen mask? @@ -2330,7 +2342,9 @@ void namcos22_state::update_mixer() m_fog_g = nthbyte(m_mixer, 0x06); m_fog_b = nthbyte(m_mixer, 0x07); m_spot_factor = nthbyte(m_mixer, 0x0e) << 8 | nthbyte(m_mixer, 0x0d); - m_poly_translucency = nthbyte(m_mixer, 0x11); + m_poly_alpha_color = nthbyte(m_mixer, 0x0f); + m_poly_alpha_pen = nthbyte(m_mixer, 0x10); + m_poly_alpha_factor = nthbyte(m_mixer, 0x11); m_screen_fade_r = nthbyte(m_mixer, 0x16); m_screen_fade_g = nthbyte(m_mixer, 0x17); m_screen_fade_b = nthbyte(m_mixer, 0x18); -- cgit v1.2.3