summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/model1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/model1.cpp')
-rw-r--r--src/mame/video/model1.cpp1322
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)