diff options
Diffstat (limited to 'src/mame/video/model1.cpp')
-rw-r--r-- | src/mame/video/model1.cpp | 1322 |
1 files changed, 661 insertions, 661 deletions
diff --git a/src/mame/video/model1.cpp b/src/mame/video/model1.cpp index 2c90eaceb25..2a4a192d039 100644 --- a/src/mame/video/model1.cpp +++ b/src/mame/video/model1.cpp @@ -36,7 +36,7 @@ void model1_state::view_t::transform_point(point_t *p) const { point_t q = *p; float xx = translation[0] * q.x + translation[3] * q.y + translation[6] * q.z + translation[ 9] + vxx; - p->y = translation[1] * q.x + translation[4] * q.y + translation[7] * q.z + translation[10] + vyy; + p->y = translation[1] * q.x + translation[4] * q.y + translation[7] * q.z + translation[10] + vyy; float zz = translation[2] * q.x + translation[5] * q.y + translation[8] * q.z + translation[11] + vzz; p->x = ayyc * xx - ayys * zz; p->z = ayys * xx + ayyc * zz; @@ -592,7 +592,7 @@ void model1_state::fclip_clip_right(view_t *view, point_t *pt, point_t *p1, poin void model1_state::fclip_push_quad_next(int level, quad_t& q, point_t *p1, point_t *p2, point_t *p3, point_t *p4) { - quad_t cquad(q.col, q.z, p1, p2, p3, p4); + quad_t cquad(q.col, q.z, p1, p2, p3, p4); fclip_push_quad(level+1, cquad); } @@ -757,445 +757,445 @@ float model1_state::compute_specular(glm::vec3& normal, glm::vec3& light, float void model1_state::push_object(UINT32 tex_adr, UINT32 poly_adr, UINT32 size) { #if 0 - int dump; + int dump; #endif - float *poly_data; - if (poly_adr & 0x800000) - poly_data = (float *)m_poly_ram.get(); - else - poly_data = (float *)m_poly_rom; + float *poly_data; + if (poly_adr & 0x800000) + poly_data = (float *)m_poly_ram.get(); + else + poly_data = (float *)m_poly_rom; - poly_adr &= 0x7fffff; + poly_adr &= 0x7fffff; #if 0 - dump = poly_adr == 0x944ea; - dump = 0; + dump = poly_adr == 0x944ea; + dump = 0; #endif #if 0 - if (poly_adr < 0x10000 || poly_adr >= 0x80000) - return; + if (poly_adr < 0x10000 || poly_adr >= 0x80000) + return; - if (poly_adr < 0x40000 || poly_adr >= 0x50000) - return; + if (poly_adr < 0x40000 || poly_adr >= 0x50000) + return; - if (poly_adr == 0x4c7db || poly_adr == 0x4cdaa || poly_adr == 0x4d3e7) - return; + if (poly_adr == 0x4c7db || poly_adr == 0x4cdaa || poly_adr == 0x4d3e7) + return; - if (poly_adr != 0x483e5) - return; + if (poly_adr != 0x483e5) + return; #endif - if (true) { - LOG_TGP(("XVIDEO: draw object (%x, %x, %x)\n", tex_adr, poly_adr, size)); - } - - if (!size) - size = 0xffffffff; - - point_t *old_p0 = m_pointpt++; - point_t *old_p1 = m_pointpt++; - - old_p0->x = poly_data[poly_adr + 0]; - old_p0->y = poly_data[poly_adr + 1]; - old_p0->z = poly_data[poly_adr + 2]; - old_p1->x = poly_data[poly_adr + 3]; - old_p1->y = poly_data[poly_adr + 4]; - old_p1->z = poly_data[poly_adr + 5]; - m_view->transform_point(old_p0); - m_view->transform_point(old_p1); - - if (old_p0->z > 0) - { - m_view->project_point(old_p0); - } - else - { - old_p0->s.x = old_p0->s.y = 0; - } - - if (old_p1->z > 0) - { - m_view->project_point(old_p1); - } - else - { - old_p1->s.x = old_p1->s.y = 0; - } - - float old_z = 0; - - poly_adr += 6; - - for (int i = 0; i < size; i++) - { + if (true) { + LOG_TGP(("XVIDEO: draw object (%x, %x, %x)\n", tex_adr, poly_adr, size)); + } + + if (!size) + size = 0xffffffff; + + point_t *old_p0 = m_pointpt++; + point_t *old_p1 = m_pointpt++; + + old_p0->x = poly_data[poly_adr + 0]; + old_p0->y = poly_data[poly_adr + 1]; + old_p0->z = poly_data[poly_adr + 2]; + old_p1->x = poly_data[poly_adr + 3]; + old_p1->y = poly_data[poly_adr + 4]; + old_p1->z = poly_data[poly_adr + 5]; + m_view->transform_point(old_p0); + m_view->transform_point(old_p1); + + if (old_p0->z > 0) + { + m_view->project_point(old_p0); + } + else + { + old_p0->s.x = old_p0->s.y = 0; + } + + if (old_p1->z > 0) + { + m_view->project_point(old_p1); + } + else + { + old_p1->s.x = old_p1->s.y = 0; + } + + float old_z = 0; + + poly_adr += 6; + + for (int i = 0; i < size; i++) + { #if 0 - LOG_TGP(("VIDEO: %08x (%f, %f, %f) (%f, %f, %f) (%f, %f, %f)\n", - *(UINT32 *)(poly_data + poly_adr) & ~(0x01800303), - poly_data[poly_adr + 1], poly_data[poly_adr + 2], poly_data[poly_adr + 3], - poly_data[poly_adr + 4], poly_data[poly_adr + 5], poly_data[poly_adr + 6], - poly_data[poly_adr + 7], poly_data[poly_adr + 8], poly_data[poly_adr + 9])); + LOG_TGP(("VIDEO: %08x (%f, %f, %f) (%f, %f, %f) (%f, %f, %f)\n", + *(UINT32 *)(poly_data + poly_adr) & ~(0x01800303), + poly_data[poly_adr + 1], poly_data[poly_adr + 2], poly_data[poly_adr + 3], + poly_data[poly_adr + 4], poly_data[poly_adr + 5], poly_data[poly_adr + 6], + poly_data[poly_adr + 7], poly_data[poly_adr + 8], poly_data[poly_adr + 9])); #endif - UINT32 flags = *reinterpret_cast<UINT32*>(poly_data + poly_adr); - - int type = flags & 3; - if (!type) - break; - - if (flags & 0x00001000) - tex_adr++; - int lightmode = (flags >> 17) & 15; - - point_t *p0 = m_pointpt++; - point_t *p1 = m_pointpt++; - - glm::vec3 vn(poly_data[poly_adr + 1], poly_data[poly_adr + 2], poly_data[poly_adr + 3]); - p0->x = poly_data[poly_adr + 4]; - p0->y = poly_data[poly_adr + 5]; - p0->z = poly_data[poly_adr + 6]; - p1->x = poly_data[poly_adr + 7]; - p1->y = poly_data[poly_adr + 8]; - p1->z = poly_data[poly_adr + 9]; - - int link = (flags >> 8) & 3; - - m_view->transform_vector(vn); - - m_view->transform_point(p0); - m_view->transform_point(p1); - if (p0->z > 0) - { - m_view->project_point(p0); - } - else - { - p0->s.x = p0->s.y = 0; - } - - if (p1->z > 0) - { - m_view->project_point(p1); - } - else - { - p1->s.x = p1->s.y = 0; - } + UINT32 flags = *reinterpret_cast<UINT32*>(poly_data + poly_adr); + + int type = flags & 3; + if (!type) + break; + + if (flags & 0x00001000) + tex_adr++; + int lightmode = (flags >> 17) & 15; + + point_t *p0 = m_pointpt++; + point_t *p1 = m_pointpt++; + + glm::vec3 vn(poly_data[poly_adr + 1], poly_data[poly_adr + 2], poly_data[poly_adr + 3]); + p0->x = poly_data[poly_adr + 4]; + p0->y = poly_data[poly_adr + 5]; + p0->z = poly_data[poly_adr + 6]; + p1->x = poly_data[poly_adr + 7]; + p1->y = poly_data[poly_adr + 8]; + p1->z = poly_data[poly_adr + 9]; + + int link = (flags >> 8) & 3; + + m_view->transform_vector(vn); + + m_view->transform_point(p0); + m_view->transform_point(p1); + if (p0->z > 0) + { + m_view->project_point(p0); + } + else + { + p0->s.x = p0->s.y = 0; + } + + if (p1->z > 0) + { + m_view->project_point(p1); + } + else + { + p1->s.x = p1->s.y = 0; + } #if 0 - if (dump) - LOG_TGP(("VIDEO: %08x (%f, %f, %f) (%f, %f, %f)\n", - *(UINT32 *)(poly_data + poly_adr), - p0->x, p0->y, p0->z, - p1->x, p1->y, p1->z)); + if (dump) + LOG_TGP(("VIDEO: %08x (%f, %f, %f) (%f, %f, %f)\n", + *(UINT32 *)(poly_data + poly_adr), + p0->x, p0->y, p0->z, + p1->x, p1->y, p1->z)); #endif #if 0 - if (true || dump) { - LOG_TGP(("VIDEO: %08x (%d, %d) (%d, %d) (%d, %d) (%d, %d)\n", - *(UINT32 *)(poly_data + poly_adr), - old_p0->s.x, old_p0->s.y, - old_p1->s.x, old_p1->s.y, - p0->s.x, p0->s.y, - p1->s.x, p1->s.y)); - } + if (true || dump) { + LOG_TGP(("VIDEO: %08x (%d, %d) (%d, %d) (%d, %d) (%d, %d)\n", + *(UINT32 *)(poly_data + poly_adr), + old_p0->s.x, old_p0->s.y, + old_p1->s.x, old_p1->s.y, + p0->s.x, p0->s.y, + p1->s.x, p1->s.y)); + } #endif - quad_t cquad; - - if (!link) - goto next; - - if (!(flags & 0x00004000) && view_determinant(old_p1, old_p0, p0) > 0) - goto next; - - vn = glm::normalize(vn); - - cquad.p[0] = old_p1; - cquad.p[1] = old_p0; - cquad.p[2] = p0; - cquad.p[3] = p1; - - switch ((flags >> 10) & 3) - { - case 0: - cquad.z = old_z; - break; - case 1: - cquad.z = old_z = min4f(old_p1->z, old_p0->z, p0->z, p1->z); - break; - case 2: - cquad.z = old_z = max4f(old_p1->z, old_p0->z, p0->z, p1->z); - break; - case 3: - default: - cquad.z = 0.0; - break; - } - - { + quad_t cquad; + + if (!link) + goto next; + + if (!(flags & 0x00004000) && view_determinant(old_p1, old_p0, p0) > 0) + goto next; + + vn = glm::normalize(vn); + + cquad.p[0] = old_p1; + cquad.p[1] = old_p0; + cquad.p[2] = p0; + cquad.p[3] = p1; + + switch ((flags >> 10) & 3) + { + case 0: + cquad.z = old_z; + break; + case 1: + cquad.z = old_z = min4f(old_p1->z, old_p0->z, p0->z, p1->z); + break; + case 2: + cquad.z = old_z = max4f(old_p1->z, old_p0->z, p0->z, p1->z); + break; + case 3: + default: + cquad.z = 0.0; + break; + } + + { #if 0 - float dif = mult_vector(&vn, &view->light); - float ln = view->lightparams[lightmode].a + view->lightparams[lightmode].d*MAX(0.0, dif); - cquad.col = scale_color(machine().pens[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)], MIN(1.0, ln)); - cquad.col = scale_color(machine().pens[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)], MIN(1.0, ln)); + float dif = mult_vector(&vn, &view->light); + float ln = view->lightparams[lightmode].a + view->lightparams[lightmode].d*MAX(0.0, dif); + cquad.col = scale_color(machine().pens[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)], MIN(1.0, ln)); + cquad.col = scale_color(machine().pens[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)], MIN(1.0, ln)); #endif - float dif = glm::dot(vn, m_view->light); - float spec = compute_specular(vn, m_view->light, dif, lightmode); - float ln = m_view->lightparams[lightmode].a + m_view->lightparams[lightmode].d * MAX(0.0f, dif) + spec; - int lumval = 255.0f * MIN(1.0f, ln); - int color = m_paletteram16[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)]; - int r = (color >> 0x0) & 0x1f; - int g = (color >> 0x5) & 0x1f; - int b = (color >> 0xA) & 0x1f; - - lumval >>= 2; //there must be a luma translation table somewhere - if (lumval > 0x3f) - lumval = 0x3f; - else if (lumval < 0) - lumval = 0; - - r = (m_color_xlat[(r << 8) | lumval | 0x0] >> 3) & 0x1f; - g = (m_color_xlat[(g << 8) | lumval | 0x2000] >> 3) & 0x1f; - b = (m_color_xlat[(b << 8) | lumval | 0x4000] >> 3) & 0x1f; - cquad.col = (pal5bit(r) << 16) | (pal5bit(g) << 8) | (pal5bit(b) << 0); - } - - if (flags & 0x00002000) - cquad.col |= MOIRE; - - fclip_push_quad(0, cquad); - - next: - poly_adr += 10; - switch (link) { - case 0: - case 2: - old_p0 = p0; - old_p1 = p1; - break; - case 1: - old_p1 = p0; - break; - case 3: - old_p0 = p1; - break; - } - } + float dif = glm::dot(vn, m_view->light); + float spec = compute_specular(vn, m_view->light, dif, lightmode); + float ln = m_view->lightparams[lightmode].a + m_view->lightparams[lightmode].d * MAX(0.0f, dif) + spec; + int lumval = 255.0f * MIN(1.0f, ln); + int color = m_paletteram16[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)]; + int r = (color >> 0x0) & 0x1f; + int g = (color >> 0x5) & 0x1f; + int b = (color >> 0xA) & 0x1f; + + lumval >>= 2; //there must be a luma translation table somewhere + if (lumval > 0x3f) + lumval = 0x3f; + else if (lumval < 0) + lumval = 0; + + r = (m_color_xlat[(r << 8) | lumval | 0x0] >> 3) & 0x1f; + g = (m_color_xlat[(g << 8) | lumval | 0x2000] >> 3) & 0x1f; + b = (m_color_xlat[(b << 8) | lumval | 0x4000] >> 3) & 0x1f; + cquad.col = (pal5bit(r) << 16) | (pal5bit(g) << 8) | (pal5bit(b) << 0); + } + + if (flags & 0x00002000) + cquad.col |= MOIRE; + + fclip_push_quad(0, cquad); + + next: + poly_adr += 10; + switch (link) { + case 0: + case 2: + old_p0 = p0; + old_p1 = p1; + break; + case 1: + old_p1 = p0; + break; + case 3: + old_p0 = p1; + break; + } + } } UINT16 *model1_state::push_direct(UINT16 *list) { - UINT32 tex_adr = readi(list); - // v1 = readi(list+2); - // v2 = readi(list+10); - - point_t *old_p0 = m_pointpt++; - point_t *old_p1 = m_pointpt++; - - old_p0->x = readf(list + 4); - old_p0->y = readf(list + 6); - old_p0->z = readf(list + 8); - old_p1->x = readf(list + 12); - old_p1->y = readf(list + 14); - old_p1->z = readf(list + 16); - - LOG_TGP(("VIDEOD start direct\n")); - LOG_TGP(("VIDEOD (%f, %f, %f) (%f, %f, %f)\n", - old_p0->x, old_p0->y, old_p0->z, - old_p1->x, old_p1->y, old_p1->z)); - - //m_view-transform_point(old_p0); - //m_view->transform_point(old_p1); - if (old_p0->z > 0) - { - m_view->project_point_direct(old_p0); - } - else - { - old_p0->s.x = old_p0->s.y = 0; - } - - if (old_p1->z > 0) - { - m_view->project_point_direct(old_p1); - } - else - { - old_p1->s.x = old_p1->s.y = 0; - } - - list += 18; - - for (;;) { - UINT32 flags = readi(list); - - int type = flags & 3; - if (!type) - break; - - if (flags & 0x00001000) - tex_adr++; - - // list+2 is luminosity - // list+4 is 0? - // list+12 is z? - - point_t *p0 = m_pointpt++; - point_t *p1 = m_pointpt++; - - UINT32 lum = readi(list + 2); - // v1 = readi(list+4); - - float z = 0; - if (type == 2) - { - p0->x = readf(list + 6); - p0->y = readf(list + 8); - p0->z = readf(list + 10); - z = p0->z; - LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f)\n", - flags, lum, - p0->x, p0->y, p0->z)); - *p1 = *p0; - list += 12; - } - else - { - p0->x = readf(list + 6); - p0->y = readf(list + 8); - p0->z = readf(list + 10); - p1->x = readf(list + 14); - p1->y = readf(list + 16); - p1->z = readf(list + 18); - z = readf(list + 12); - LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f) (%f, %f, %f)\n", - flags, lum, - p0->x, p0->y, p0->z, - p1->x, p1->y, p1->z)); - list += 20; - } - - int link = (flags >> 8) & 3; - - //m_view->transform_point(p0); - //m_view->transform_point(p1); - if (p0->z > 0) - { - m_view->project_point_direct(p0); - } - if (p1->z > 0) - { - m_view->project_point_direct(p1); - } + UINT32 tex_adr = readi(list); + // v1 = readi(list+2); + // v2 = readi(list+10); + + point_t *old_p0 = m_pointpt++; + point_t *old_p1 = m_pointpt++; + + old_p0->x = readf(list + 4); + old_p0->y = readf(list + 6); + old_p0->z = readf(list + 8); + old_p1->x = readf(list + 12); + old_p1->y = readf(list + 14); + old_p1->z = readf(list + 16); + + LOG_TGP(("VIDEOD start direct\n")); + LOG_TGP(("VIDEOD (%f, %f, %f) (%f, %f, %f)\n", + old_p0->x, old_p0->y, old_p0->z, + old_p1->x, old_p1->y, old_p1->z)); + + //m_view-transform_point(old_p0); + //m_view->transform_point(old_p1); + if (old_p0->z > 0) + { + m_view->project_point_direct(old_p0); + } + else + { + old_p0->s.x = old_p0->s.y = 0; + } + + if (old_p1->z > 0) + { + m_view->project_point_direct(old_p1); + } + else + { + old_p1->s.x = old_p1->s.y = 0; + } + + list += 18; + + for (;;) { + UINT32 flags = readi(list); + + int type = flags & 3; + if (!type) + break; + + if (flags & 0x00001000) + tex_adr++; + + // list+2 is luminosity + // list+4 is 0? + // list+12 is z? + + point_t *p0 = m_pointpt++; + point_t *p1 = m_pointpt++; + + UINT32 lum = readi(list + 2); + // v1 = readi(list+4); + + float z = 0; + if (type == 2) + { + p0->x = readf(list + 6); + p0->y = readf(list + 8); + p0->z = readf(list + 10); + z = p0->z; + LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f)\n", + flags, lum, + p0->x, p0->y, p0->z)); + *p1 = *p0; + list += 12; + } + else + { + p0->x = readf(list + 6); + p0->y = readf(list + 8); + p0->z = readf(list + 10); + p1->x = readf(list + 14); + p1->y = readf(list + 16); + p1->z = readf(list + 18); + z = readf(list + 12); + LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f) (%f, %f, %f)\n", + flags, lum, + p0->x, p0->y, p0->z, + p1->x, p1->y, p1->z)); + list += 20; + } + + int link = (flags >> 8) & 3; + + //m_view->transform_point(p0); + //m_view->transform_point(p1); + if (p0->z > 0) + { + m_view->project_point_direct(p0); + } + if (p1->z > 0) + { + m_view->project_point_direct(p1); + } #if 1 - if (old_p0 && old_p1) - LOG_TGP(("VIDEOD: %08x (%d, %d) (%d, %d) (%d, %d) (%d, %d)\n", - flags, - old_p0->s.x, old_p0->s.y, - old_p1->s.x, old_p1->s.y, - p0->s.x, p0->s.y, - p1->s.x, p1->s.y)); - else - LOG_TGP(("VIDEOD: %08x (%d, %d) (%d, %d)\n", - flags, - p0->s.x, p0->s.y, - p1->s.x, p1->s.y)); + if (old_p0 && old_p1) + LOG_TGP(("VIDEOD: %08x (%d, %d) (%d, %d) (%d, %d) (%d, %d)\n", + flags, + old_p0->s.x, old_p0->s.y, + old_p1->s.x, old_p1->s.y, + p0->s.x, p0->s.y, + p1->s.x, p1->s.y)); + else + LOG_TGP(("VIDEOD: %08x (%d, %d) (%d, %d)\n", + flags, + p0->s.x, p0->s.y, + p1->s.x, p1->s.y)); #endif - quad_t cquad; - if (!link) - goto next; - - cquad.p[0] = old_p1; - cquad.p[1] = old_p0; - cquad.p[2] = p0; - cquad.p[3] = p1; - cquad.z = z; - { - int lumval = ((float)(lum >> 24)) * 2.0f; - int color = m_paletteram16[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)]; - int r = (color >> 0x0) & 0x1f; - int g = (color >> 0x5) & 0x1f; - int b = (color >> 0xA) & 0x1f; - lumval >>= 2; //there must be a luma translation table somewhere - if (lumval>0x3f) lumval = 0x3f; - else if (lumval<0) lumval = 0; - r = (m_color_xlat[(r << 8) | lumval | 0x0] >> 3) & 0x1f; - g = (m_color_xlat[(g << 8) | lumval | 0x2000] >> 3) & 0x1f; - b = (m_color_xlat[(b << 8) | lumval | 0x4000] >> 3) & 0x1f; - cquad.col = (pal5bit(r) << 16) | (pal5bit(g) << 8) | (pal5bit(b) << 0); - } - //cquad.col = scale_color(machine().pens[0x1000|(m_tgp_ram[tex_adr-0x40000] & 0x3ff)],((float) (lum>>24)) / 128.0); - if (flags & 0x00002000) - cquad.col |= MOIRE; - - fclip_push_quad(0, cquad); - - next: - switch (link) { - case 0: - case 2: - old_p0 = p0; - old_p1 = p1; - break; - case 1: - old_p1 = p0; - break; - case 3: - old_p0 = p1; - break; - } - } - return list + 2; + quad_t cquad; + if (!link) + goto next; + + cquad.p[0] = old_p1; + cquad.p[1] = old_p0; + cquad.p[2] = p0; + cquad.p[3] = p1; + cquad.z = z; + { + int lumval = ((float)(lum >> 24)) * 2.0f; + int color = m_paletteram16[0x1000 | (m_tgp_ram[tex_adr - 0x40000] & 0x3ff)]; + int r = (color >> 0x0) & 0x1f; + int g = (color >> 0x5) & 0x1f; + int b = (color >> 0xA) & 0x1f; + lumval >>= 2; //there must be a luma translation table somewhere + if (lumval>0x3f) lumval = 0x3f; + else if (lumval<0) lumval = 0; + r = (m_color_xlat[(r << 8) | lumval | 0x0] >> 3) & 0x1f; + g = (m_color_xlat[(g << 8) | lumval | 0x2000] >> 3) & 0x1f; + b = (m_color_xlat[(b << 8) | lumval | 0x4000] >> 3) & 0x1f; + cquad.col = (pal5bit(r) << 16) | (pal5bit(g) << 8) | (pal5bit(b) << 0); + } + //cquad.col = scale_color(machine().pens[0x1000|(m_tgp_ram[tex_adr-0x40000] & 0x3ff)],((float) (lum>>24)) / 128.0); + if (flags & 0x00002000) + cquad.col |= MOIRE; + + fclip_push_quad(0, cquad); + + next: + switch (link) { + case 0: + case 2: + old_p0 = p0; + old_p1 = p1; + break; + case 1: + old_p1 = p0; + break; + case 3: + old_p0 = p1; + break; + } + } + return list + 2; } UINT16* model1_state::skip_direct(UINT16 *list) const { - list += 18; + list += 18; - while (true) { - UINT32 flags = readi(list); + while (true) { + UINT32 flags = readi(list); - int type = flags & 3; - if (!type) - break; + int type = flags & 3; + if (!type) + break; - if (type == 2) - list += 12; - else - list += 20; - } - return list + 2; + if (type == 2) + list += 12; + else + list += 20; + } + return list + 2; } void model1_state::draw_objects(bitmap_rgb32 &bitmap, const rectangle &cliprect) { - if (m_quadpt != m_quaddb) - { - LOG_TGP(("VIDEO: sort&draw\n")); - sort_quads(); - draw_quads(bitmap, cliprect); - } - - m_quadpt = m_quaddb; - m_pointpt = m_pointdb; + if (m_quadpt != m_quaddb) + { + LOG_TGP(("VIDEO: sort&draw\n")); + sort_quads(); + draw_quads(bitmap, cliprect); + } + + m_quadpt = m_quaddb; + m_pointpt = m_pointdb; } UINT16 *model1_state::draw_direct(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 *list) { - LOG_TGP(("VIDEO: draw direct %x\n", readi(list))); + LOG_TGP(("VIDEO: draw direct %x\n", readi(list))); - draw_objects(bitmap, cliprect); - UINT16 *res = push_direct(list); - unsort_quads(); - draw_quads(bitmap, cliprect); + draw_objects(bitmap, cliprect); + UINT16 *res = push_direct(list); + unsort_quads(); + draw_quads(bitmap, cliprect); - m_quadpt = m_quaddb; - m_pointpt = m_pointdb; - return res; + m_quadpt = m_quaddb; + m_pointpt = m_pointdb; + return res; } UINT16 *model1_state::get_list() @@ -1234,38 +1234,38 @@ WRITE16_MEMBER(model1_state::model1_listctl_w) void model1_state::view_t::init_translation_matrix() { - memset(translation, 0, sizeof(translation)); - translation[0] = 1.0; - translation[4] = 1.0; - translation[8] = 1.0; + memset(translation, 0, sizeof(translation)); + translation[0] = 1.0; + translation[4] = 1.0; + translation[8] = 1.0; } void model1_state::view_t::set_viewport(float xcenter, float ycenter, float xl, float xr, float yb, float yt) { - xc = xcenter; - yc = ycenter; - x1 = xl; - x2 = xr; - y1 = yb; - y2 = yt; - - recompute_frustum(); + xc = xcenter; + yc = ycenter; + x1 = xl; + x2 = xr; + y1 = yb; + y2 = yt; + + recompute_frustum(); } void model1_state::view_t::set_lightparam(int index, float diffuse, float ambient, float specular, int power) { - lightparams[index].d = diffuse; - lightparams[index].a = ambient; - lightparams[index].s = specular; - lightparams[index].p = power; + lightparams[index].d = diffuse; + lightparams[index].a = ambient; + lightparams[index].s = specular; + lightparams[index].p = power; } void model1_state::view_t::set_zoom(float x, float y) { - zoomx = x; - zoomy = y; + zoomx = x; + zoomy = y; - recompute_frustum(); + recompute_frustum(); } void model1_state::view_t::set_light_direction(float x, float y, float z) @@ -1275,272 +1275,272 @@ void model1_state::view_t::set_light_direction(float x, float y, float z) void model1_state::view_t::set_translation_matrix(float* mat) { - for (int i = 0; i < 12; i++) - { - translation[i] = mat[i]; - } + for (int i = 0; i < 12; i++) + { + translation[i] = mat[i]; + } } void model1_state::view_t::set_view_translation(float x, float y) { - viewx = x; - viewy = y; + viewx = x; + viewy = y; - recompute_frustum(); + recompute_frustum(); } void model1_state::tgp_render(bitmap_rgb32 &bitmap, const rectangle &cliprect) { - m_render_done = 1; - if ((m_listctl[1] & 0x1f) == 0x1f) - { - UINT16 *list = get_list(); - int zz = 0; - LOG_TGP(("VIDEO: render list %d\n", get_list_number())); - - m_view->init_translation_matrix(); - - for (;;) { - int type = (list[1] << 16) | list[0]; - m_glist = list; - switch (type & 15) - { - case 0: - list += 2; - break; - case 1: - // 1 = plane 1 - // 2 = ?? draw object (413d3, 17c4c, e) - // 3 = plane 2 - // 4 = ?? draw object (408a8, a479, 9) - // 5 = decor - // 6 = ?? draw object (57bd4, 387460, 2ad) - - if (true || zz >= 666) - push_object(readi(list + 2), readi(list + 4), readi(list + 6)); - list += 8; - break; - case 2: - list = draw_direct(bitmap, cliprect, list + 2); - break; - case 3: - { - LOG_TGP(("VIDEO: viewport (%d, %d, %d, %d, %d, %d, %d)\n", - readi(list + 2), - readi16(list + 4), readi16(list + 6), readi16(list + 8), - readi16(list + 10), readi16(list + 12), readi16(list + 14))); - - draw_objects(bitmap, cliprect); - - float xc = readi16(list + 4); - float yc = 383 - (readi16(list + 6) - 39); - float x1 = readi16(list + 8); - float y2 = 383 - (readi16(list + 10) - 39); - float x2 = readi16(list + 12); - float y1 = 383 - (readi16(list + 14) - 39); - - m_view->set_viewport(xc, yc, x1, x2, y1, y2); - - list += 16; - break; - } - case 4: - { - int adr = readi(list + 2); - int len = readi(list + 4) + 1; - LOG_TGP(("ZVIDEO: color write, adr=%x, len=%x\n", adr, len)); - for (int i = 0; i < len; i++) - { - m_tgp_ram[adr - 0x40000 + i] = list[6 + 2 * i]; - } - list += 6 + len * 2; - break; - } - case 5: - { - int adr = readi(list + 2); - int len = readi(list + 4); - for (int i = 0; i < len; i++) - { - m_poly_ram[adr - 0x800000 + i] = readi(list + 2 * i + 6); - } - list += 6 + len * 2; - break; - } - case 6: - { - int adr = readi(list + 2); - int len = readi(list + 4); - LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len)); - for (int i = 0; i < len; i++) - { - int v = readi(list + 6 + i * 2); - float diffuse = (float(v & 0xff)) / 255.0f; - float ambient = (float((v >> 8) & 0xff)) / 255.0f; - float specular = (float((v >> 16) & 0xff)) / 255.0f; - int power = (v >> 24) & 0xff; - m_view->set_lightparam(i + adr, diffuse, ambient, specular, power); - } - list += 6 + len * 2; - break; - } - case 7: - LOG_TGP(("VIDEO: code 7 (%d)\n", readi(list + 2))); - zz++; - list += 4; - break; - case 8: - LOG_TGP(("VIDEO: select mode %08x\n", readi(list + 2))); - list += 4; - break; - case 9: - LOG_TGP(("VIDEO: zoom (%f, %f)\n", readf(list + 2), readf(list + 4))); - m_view->set_zoom(readf(list + 2) * 4, readf(list + 4) * 4); - list += 6; - break; - case 0xa: - LOG_TGP(("VIDEO: light vector (%f, %f, %f)\n", readf(list + 2), readf(list + 4), readf(list + 6))); - m_view->set_light_direction(readf(list + 2), readf(list + 4), readf(list + 6)); - list += 8; - break; - case 0xb: - { - LOG_TGP(("VIDEO: matrix (%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f)\n", - readf(list + 2), readf(list + 4), readf(list + 6), - readf(list + 8), readf(list + 10), readf(list + 12), - readf(list + 14), readf(list + 16), readf(list + 18), - readf(list + 20), readf(list + 22), readf(list + 24))); - float mat[12]; - for (int i = 0; i < 12; i++) - { - mat[i] = readf(list + 2 + 2 * i); - } - m_view->set_translation_matrix(mat); - list += 26; - break; - } - case 0xc: - LOG_TGP(("VIDEO: trans (%f, %f)\n", readf(list + 2), readf(list + 4))); - m_view->set_view_translation(readf(list + 2), readf(list + 4)); - list += 6; - break; - case 0xf: - //case -1: - goto end; - default: - LOG_TGP(("VIDEO: unknown type %d\n", type)); - goto end; - } - } - end: - draw_objects(bitmap, cliprect); - } + m_render_done = 1; + if ((m_listctl[1] & 0x1f) == 0x1f) + { + UINT16 *list = get_list(); + int zz = 0; + LOG_TGP(("VIDEO: render list %d\n", get_list_number())); + + m_view->init_translation_matrix(); + + for (;;) { + int type = (list[1] << 16) | list[0]; + m_glist = list; + switch (type & 15) + { + case 0: + list += 2; + break; + case 1: + // 1 = plane 1 + // 2 = ?? draw object (413d3, 17c4c, e) + // 3 = plane 2 + // 4 = ?? draw object (408a8, a479, 9) + // 5 = decor + // 6 = ?? draw object (57bd4, 387460, 2ad) + + if (true || zz >= 666) + push_object(readi(list + 2), readi(list + 4), readi(list + 6)); + list += 8; + break; + case 2: + list = draw_direct(bitmap, cliprect, list + 2); + break; + case 3: + { + LOG_TGP(("VIDEO: viewport (%d, %d, %d, %d, %d, %d, %d)\n", + readi(list + 2), + readi16(list + 4), readi16(list + 6), readi16(list + 8), + readi16(list + 10), readi16(list + 12), readi16(list + 14))); + + draw_objects(bitmap, cliprect); + + float xc = readi16(list + 4); + float yc = 383 - (readi16(list + 6) - 39); + float x1 = readi16(list + 8); + float y2 = 383 - (readi16(list + 10) - 39); + float x2 = readi16(list + 12); + float y1 = 383 - (readi16(list + 14) - 39); + + m_view->set_viewport(xc, yc, x1, x2, y1, y2); + + list += 16; + break; + } + case 4: + { + int adr = readi(list + 2); + int len = readi(list + 4) + 1; + LOG_TGP(("ZVIDEO: color write, adr=%x, len=%x\n", adr, len)); + for (int i = 0; i < len; i++) + { + m_tgp_ram[adr - 0x40000 + i] = list[6 + 2 * i]; + } + list += 6 + len * 2; + break; + } + case 5: + { + int adr = readi(list + 2); + int len = readi(list + 4); + for (int i = 0; i < len; i++) + { + m_poly_ram[adr - 0x800000 + i] = readi(list + 2 * i + 6); + } + list += 6 + len * 2; + break; + } + case 6: + { + int adr = readi(list + 2); + int len = readi(list + 4); + LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len)); + for (int i = 0; i < len; i++) + { + int v = readi(list + 6 + i * 2); + float diffuse = (float(v & 0xff)) / 255.0f; + float ambient = (float((v >> 8) & 0xff)) / 255.0f; + float specular = (float((v >> 16) & 0xff)) / 255.0f; + int power = (v >> 24) & 0xff; + m_view->set_lightparam(i + adr, diffuse, ambient, specular, power); + } + list += 6 + len * 2; + break; + } + case 7: + LOG_TGP(("VIDEO: code 7 (%d)\n", readi(list + 2))); + zz++; + list += 4; + break; + case 8: + LOG_TGP(("VIDEO: select mode %08x\n", readi(list + 2))); + list += 4; + break; + case 9: + LOG_TGP(("VIDEO: zoom (%f, %f)\n", readf(list + 2), readf(list + 4))); + m_view->set_zoom(readf(list + 2) * 4, readf(list + 4) * 4); + list += 6; + break; + case 0xa: + LOG_TGP(("VIDEO: light vector (%f, %f, %f)\n", readf(list + 2), readf(list + 4), readf(list + 6))); + m_view->set_light_direction(readf(list + 2), readf(list + 4), readf(list + 6)); + list += 8; + break; + case 0xb: + { + LOG_TGP(("VIDEO: matrix (%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f)\n", + readf(list + 2), readf(list + 4), readf(list + 6), + readf(list + 8), readf(list + 10), readf(list + 12), + readf(list + 14), readf(list + 16), readf(list + 18), + readf(list + 20), readf(list + 22), readf(list + 24))); + float mat[12]; + for (int i = 0; i < 12; i++) + { + mat[i] = readf(list + 2 + 2 * i); + } + m_view->set_translation_matrix(mat); + list += 26; + break; + } + case 0xc: + LOG_TGP(("VIDEO: trans (%f, %f)\n", readf(list + 2), readf(list + 4))); + m_view->set_view_translation(readf(list + 2), readf(list + 4)); + list += 6; + break; + case 0xf: + //case -1: + goto end; + default: + LOG_TGP(("VIDEO: unknown type %d\n", type)); + goto end; + } + } + end: + draw_objects(bitmap, cliprect); + } } void model1_state::tgp_scan() { #if 0 - if (machine().input().code_pressed_once(KEYCODE_F)) { - FILE *fp; - fp = fopen("tgp-ram.bin", "w+b"); - if (fp) { - fwrite(m_tgp_ram, (0x100000 - 0x40000) * 2, 1, fp); - fclose(fp); - } - exit(0); - } + if (machine().input().code_pressed_once(KEYCODE_F)) { + FILE *fp; + fp = fopen("tgp-ram.bin", "w+b"); + if (fp) { + fwrite(m_tgp_ram, (0x100000 - 0x40000) * 2, 1, fp); + fclose(fp); + } + exit(0); + } #endif - if (!m_render_done && (m_listctl[1] & 0x1f) == 0x1f) - { - UINT16 *list = get_list(); - // Skip everything but the data uploads - LOG_TGP(("VIDEO: scan list %d\n", get_list_number())); - for (;;) - { - int type = (list[1] << 16) | list[0]; - switch (type) { - case 0: - list += 2; - break; - case 1: - list += 8; - break; - case 2: - list = skip_direct(list + 2); - break; - case 3: - list += 16; - break; - case 4: - { - int adr = readi(list + 2); - int len = readi(list + 4) + 1; - LOG_TGP(("ZVIDEO: scan color write, adr=%x, len=%x\n", adr, len)); - for (int i = 0; i<len; i++) - { - m_tgp_ram[adr - 0x40000 + i] = list[6 + 2 * i]; - } - list += 6 + len * 2; - break; - } - case 5: - { - int adr = readi(list + 2); - int len = readi(list + 4); - for (int i = 0; i < len; i++) - { - m_poly_ram[adr - 0x800000 + i] = readi(list + 2 * i + 6); - } - list += 6 + len * 2; - break; - } - case 6: - { - int adr = readi(list + 2); - int len = readi(list + 4); - //LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len)); - for (int i = 0; i<len; i++) - { - int v = readi(list + 6 + i * 2); - m_view->lightparams[i + adr].d = (float(v & 0xff)) / 255.0f; - m_view->lightparams[i + adr].a = (float((v >> 8) & 0xff)) / 255.0f; - m_view->lightparams[i + adr].s = (float((v >> 16) & 0xff)) / 255.0f; - m_view->lightparams[i + adr].p = (v >> 24) & 0xff; - //LOG_TGP((" %02X\n",v)); - } - list += 6 + len * 2; - break; - } - case 7: - list += 4; - break; - case 8: - list += 4; - break; - case 9: - list += 6; - break; - case 0xa: - list += 8; - break; - case 0xb: - list += 26; - break; - case 0xc: - list += 6; - break; - case 0xf: - case -1: - goto end; - default: - LOG_TGP(("VIDEO: unknown type %d\n", type)); - goto end; - } - } - end: - ; - } - m_render_done = 0; + if (!m_render_done && (m_listctl[1] & 0x1f) == 0x1f) + { + UINT16 *list = get_list(); + // Skip everything but the data uploads + LOG_TGP(("VIDEO: scan list %d\n", get_list_number())); + for (;;) + { + int type = (list[1] << 16) | list[0]; + switch (type) { + case 0: + list += 2; + break; + case 1: + list += 8; + break; + case 2: + list = skip_direct(list + 2); + break; + case 3: + list += 16; + break; + case 4: + { + int adr = readi(list + 2); + int len = readi(list + 4) + 1; + LOG_TGP(("ZVIDEO: scan color write, adr=%x, len=%x\n", adr, len)); + for (int i = 0; i<len; i++) + { + m_tgp_ram[adr - 0x40000 + i] = list[6 + 2 * i]; + } + list += 6 + len * 2; + break; + } + case 5: + { + int adr = readi(list + 2); + int len = readi(list + 4); + for (int i = 0; i < len; i++) + { + m_poly_ram[adr - 0x800000 + i] = readi(list + 2 * i + 6); + } + list += 6 + len * 2; + break; + } + case 6: + { + int adr = readi(list + 2); + int len = readi(list + 4); + //LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len)); + for (int i = 0; i<len; i++) + { + int v = readi(list + 6 + i * 2); + m_view->lightparams[i + adr].d = (float(v & 0xff)) / 255.0f; + m_view->lightparams[i + adr].a = (float((v >> 8) & 0xff)) / 255.0f; + m_view->lightparams[i + adr].s = (float((v >> 16) & 0xff)) / 255.0f; + m_view->lightparams[i + adr].p = (v >> 24) & 0xff; + //LOG_TGP((" %02X\n",v)); + } + list += 6 + len * 2; + break; + } + case 7: + list += 4; + break; + case 8: + list += 4; + break; + case 9: + list += 6; + break; + case 0xa: + list += 8; + break; + case 0xb: + list += 26; + break; + case 0xc: + list += 6; + break; + case 0xf: + case -1: + goto end; + default: + LOG_TGP(("VIDEO: unknown type %d\n", type)); + goto end; + } + } + end: + ; + } + m_render_done = 0; } VIDEO_START_MEMBER(model1_state, model1) |