Merge pull request #1477 from mamehaze/021016_2

make model 1 render list scanning code safer by masking accesses to t…
This commit is contained in:
Olivier Galibert 2016-10-02 20:05:47 +02:00 committed by GitHub
commit cfed90ea81
2 changed files with 228 additions and 207 deletions

View File

@ -405,9 +405,9 @@ private:
std::unique_ptr<UINT32[]> m_poly_ram; std::unique_ptr<UINT32[]> m_poly_ram;
// Rendering helper functions // Rendering helper functions
UINT32 readi(const UINT16 *adr) const; UINT32 readi(int adr) const;
INT16 readi16(const UINT16 *adr) const; INT16 readi16(int adr) const;
float readf(const UINT16 *adr) const; float readf(int adr) const;
void cross_product(point_t* o, const point_t* p, const point_t* q) const; void cross_product(point_t* o, const point_t* p, const point_t* q) const;
float view_determinant(const point_t *p1, const point_t *p2, const point_t *p3) const; float view_determinant(const point_t *p1, const point_t *p2, const point_t *p3) const;
@ -441,18 +441,21 @@ private:
static float max4f(float a, float b, float c, float d); static float max4f(float a, float b, float c, float d);
static float compute_specular(glm::vec3& normal, glm::vec3& light, float diffuse,int lmode); static float compute_specular(glm::vec3& normal, glm::vec3& light, float diffuse,int lmode);
int push_direct(int list_offset);
int draw_direct(bitmap_rgb32 &bitmap, const rectangle &cliprect, int list_offset);
int skip_direct(int list_offset) const;
void push_object(UINT32 tex_adr, UINT32 poly_adr, UINT32 size); void push_object(UINT32 tex_adr, UINT32 poly_adr, UINT32 size);
UINT16* push_direct(UINT16 *list);
UINT16* skip_direct(UINT16 *list) const;
void draw_objects(bitmap_rgb32 &bitmap, const rectangle &cliprect); void draw_objects(bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT16* draw_direct(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 *list);
UINT16* get_list(); void set_current_render_list();
int get_list_number(); int get_list_number();
void end_frame(); void end_frame();
clipper_t m_clipfn[4]; clipper_t m_clipfn[4];
// run-time rendering
UINT16* m_display_list_current;
optional_shared_ptr<UINT16> m_paletteram16; optional_shared_ptr<UINT16> m_paletteram16;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<segas24_tile> m_tiles; required_device<segas24_tile> m_tiles;
@ -461,6 +464,7 @@ private:
UINT16 m_lamp_state; UINT16 m_lamp_state;
optional_ioport_array<8> m_analog_ports; optional_ioport_array<8> m_analog_ports;
required_ioport_array<3> m_digital_ports; required_ioport_array<3> m_digital_ports;
}; };

View File

@ -17,17 +17,17 @@
enum { FRAC_SHIFT = 16 }; enum { FRAC_SHIFT = 16 };
enum { MOIRE = 0x01000000 }; enum { MOIRE = 0x01000000 };
UINT32 model1_state::readi(const UINT16 *adr) const UINT32 model1_state::readi(int adr) const
{ {
return adr[0]|(adr[1] << 16); return m_display_list_current[(adr + 0)&0x7fff] | (m_display_list_current[(adr + 1)&0x7fff] << 16);
} }
INT16 model1_state::readi16(const UINT16 *adr) const INT16 model1_state::readi16(int adr) const
{ {
return adr[0]; return m_display_list_current[(adr + 0)&0x7fff];
} }
float model1_state::readf(const UINT16 *adr) const float model1_state::readf(int adr) const
{ {
return u2f(readi(adr)); return u2f(readi(adr));
} }
@ -985,20 +985,21 @@ void model1_state::push_object(UINT32 tex_adr, UINT32 poly_adr, UINT32 size) {
} }
} }
UINT16 *model1_state::push_direct(UINT16 *list) {
UINT32 tex_adr = readi(list); int model1_state::push_direct(int list_offset) {
// v1 = readi(list+2); UINT32 tex_adr = readi(list_offset + 2);
// v2 = readi(list+10); // v1 = readi(list_offset+2+2);
// v2 = readi(list_offset+2+10);
point_t *old_p0 = m_pointpt++; point_t *old_p0 = m_pointpt++;
point_t *old_p1 = m_pointpt++; point_t *old_p1 = m_pointpt++;
old_p0->x = readf(list + 4); old_p0->x = readf(list_offset + 2 + 4);
old_p0->y = readf(list + 6); old_p0->y = readf(list_offset + 2 + 6);
old_p0->z = readf(list + 8); old_p0->z = readf(list_offset + 2 + 8);
old_p1->x = readf(list + 12); old_p1->x = readf(list_offset + 2 + 12);
old_p1->y = readf(list + 14); old_p1->y = readf(list_offset + 2 + 14);
old_p1->z = readf(list + 16); old_p1->z = readf(list_offset + 2 + 16);
LOG_TGP(("VIDEOD start direct\n")); LOG_TGP(("VIDEOD start direct\n"));
LOG_TGP(("VIDEOD (%f, %f, %f) (%f, %f, %f)\n", LOG_TGP(("VIDEOD (%f, %f, %f) (%f, %f, %f)\n",
@ -1025,10 +1026,10 @@ UINT16 *model1_state::push_direct(UINT16 *list) {
old_p1->s.x = old_p1->s.y = 0; old_p1->s.x = old_p1->s.y = 0;
} }
list += 18; list_offset += 18;
for (;;) { for (;;) {
UINT32 flags = readi(list); UINT32 flags = readi(list_offset + 2);
int type = flags & 3; int type = flags & 3;
if (!type) if (!type)
@ -1037,43 +1038,43 @@ UINT16 *model1_state::push_direct(UINT16 *list) {
if (flags & 0x00001000) if (flags & 0x00001000)
tex_adr++; tex_adr++;
// list+2 is luminosity // list+2+2 is luminosity
// list+4 is 0? // list+2+4 is 0?
// list+12 is z? // list+2+12 is z?
point_t *p0 = m_pointpt++; point_t *p0 = m_pointpt++;
point_t *p1 = m_pointpt++; point_t *p1 = m_pointpt++;
UINT32 lum = readi(list + 2); UINT32 lum = readi(list_offset + 2 + 2);
// v1 = readi(list+4); // v1 = readi(list_offset+2+4);
float z = 0; float z = 0;
if (type == 2) if (type == 2)
{ {
p0->x = readf(list + 6); p0->x = readf(list_offset + 2 + 6);
p0->y = readf(list + 8); p0->y = readf(list_offset + 2 + 8);
p0->z = readf(list + 10); p0->z = readf(list_offset + 2 + 10);
z = p0->z; z = p0->z;
LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f)\n", LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f)\n",
flags, lum, flags, lum,
p0->x, p0->y, p0->z)); p0->x, p0->y, p0->z));
*p1 = *p0; *p1 = *p0;
list += 12; list_offset += 12;
} }
else else
{ {
p0->x = readf(list + 6); p0->x = readf(list_offset + 2 + 6);
p0->y = readf(list + 8); p0->y = readf(list_offset + 2 + 8);
p0->z = readf(list + 10); p0->z = readf(list_offset + 2 + 10);
p1->x = readf(list + 14); p1->x = readf(list_offset + 2 + 14);
p1->y = readf(list + 16); p1->y = readf(list_offset + 2 + 16);
p1->z = readf(list + 18); p1->z = readf(list_offset + 2 + 18);
z = readf(list + 12); z = readf(list_offset + 2 + 12);
LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f) (%f, %f, %f)\n", LOG_TGP(("VIDEOD %08x %08x (%f, %f, %f) (%f, %f, %f)\n",
flags, lum, flags, lum,
p0->x, p0->y, p0->z, p0->x, p0->y, p0->z,
p1->x, p1->y, p1->z)); p1->x, p1->y, p1->z));
list += 20; list_offset += 20;
} }
int link = (flags >> 8) & 3; int link = (flags >> 8) & 3;
@ -1121,8 +1122,8 @@ UINT16 *model1_state::push_direct(UINT16 *list) {
int g = (color >> 0x5) & 0x1f; int g = (color >> 0x5) & 0x1f;
int b = (color >> 0xA) & 0x1f; int b = (color >> 0xA) & 0x1f;
lumval >>= 2; //there must be a luma translation table somewhere lumval >>= 2; //there must be a luma translation table somewhere
if (lumval>0x3f) lumval = 0x3f; if (lumval > 0x3f) lumval = 0x3f;
else if (lumval<0) lumval = 0; else if (lumval < 0) lumval = 0;
r = (m_color_xlat[(r << 8) | lumval | 0x0] >> 3) & 0x1f; r = (m_color_xlat[(r << 8) | lumval | 0x0] >> 3) & 0x1f;
g = (m_color_xlat[(g << 8) | lumval | 0x2000] >> 3) & 0x1f; g = (m_color_xlat[(g << 8) | lumval | 0x2000] >> 3) & 0x1f;
b = (m_color_xlat[(b << 8) | lumval | 0x4000] >> 3) & 0x1f; b = (m_color_xlat[(b << 8) | lumval | 0x4000] >> 3) & 0x1f;
@ -1149,26 +1150,28 @@ UINT16 *model1_state::push_direct(UINT16 *list) {
break; break;
} }
} }
return list + 2; list_offset += 4;
return list_offset;
} }
UINT16* model1_state::skip_direct(UINT16 *list) const int model1_state::skip_direct(int list_offset) const
{ {
list += 18; list_offset += 18;
while (true) { while (true) {
UINT32 flags = readi(list); UINT32 flags = readi(list_offset + 2);
int type = flags & 3; int type = flags & 3;
if (!type) if (!type)
break; break;
if (type == 2) if (type == 2)
list += 12; list_offset += 12;
else else
list += 20; list_offset += 20;
} }
return list + 2; list_offset += 4;
return list_offset;
} }
void model1_state::draw_objects(bitmap_rgb32 &bitmap, const rectangle &cliprect) void model1_state::draw_objects(bitmap_rgb32 &bitmap, const rectangle &cliprect)
@ -1184,25 +1187,30 @@ void model1_state::draw_objects(bitmap_rgb32 &bitmap, const rectangle &cliprect)
m_pointpt = m_pointdb; m_pointpt = m_pointdb;
} }
UINT16 *model1_state::draw_direct(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 *list)
int model1_state::draw_direct(bitmap_rgb32 &bitmap, const rectangle &cliprect, int list_offset)
{ {
LOG_TGP(("VIDEO: draw direct %x\n", readi(list))); LOG_TGP(("VIDEO: draw direct %x\n", readi(list_offset + 2)));
draw_objects(bitmap, cliprect); draw_objects(bitmap, cliprect);
UINT16 *res = push_direct(list);
list_offset = push_direct(list_offset);
unsort_quads(); unsort_quads();
draw_quads(bitmap, cliprect); draw_quads(bitmap, cliprect);
m_quadpt = m_quaddb; m_quadpt = m_quaddb;
m_pointpt = m_pointdb; m_pointpt = m_pointdb;
return res;
return list_offset;
} }
UINT16 *model1_state::get_list()
void model1_state::set_current_render_list()
{ {
if(!(m_listctl[0] & 4)) if(!(m_listctl[0] & 4))
m_listctl[0] = (m_listctl[0] & ~0x40) | (m_listctl[0] & 8 ? 0x40 : 0); m_listctl[0] = (m_listctl[0] & ~0x40) | (m_listctl[0] & 8 ? 0x40 : 0);
return m_listctl[0] & 0x40 ? m_display_list1 : m_display_list0; m_display_list_current = m_listctl[0] & 0x40 ? m_display_list1 : m_display_list0;
} }
int model1_state::get_list_number() int model1_state::get_list_number()
@ -1289,24 +1297,27 @@ void model1_state::view_t::set_view_translation(float x, float y)
recompute_frustum(); recompute_frustum();
} }
void model1_state::tgp_render(bitmap_rgb32 &bitmap, const rectangle &cliprect) void model1_state::tgp_render(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
m_render_done = 1; m_render_done = 1;
if ((m_listctl[1] & 0x1f) == 0x1f) if ((m_listctl[1] & 0x1f) == 0x1f)
{ {
UINT16 *list = get_list(); set_current_render_list();
int zz = 0; int zz = 0;
LOG_TGP(("VIDEO: render list %d\n", get_list_number())); LOG_TGP(("VIDEO: render list %d\n", get_list_number()));
m_view->init_translation_matrix(); m_view->init_translation_matrix();
int list_offset = 0;
for (;;) { for (;;) {
int type = (list[1] << 16) | list[0]; int type = readi(list_offset + 0);
m_glist = list;
switch (type) switch (type)
{ {
case 0: case 0:
list += 2; list_offset += 2;
break; break;
case 1: case 1:
case 0x41: case 0x41:
@ -1318,112 +1329,114 @@ void model1_state::tgp_render(bitmap_rgb32 &bitmap, const rectangle &cliprect)
// 6 = ?? draw object (57bd4, 387460, 2ad) // 6 = ?? draw object (57bd4, 387460, 2ad)
if (true || zz >= 666) if (true || zz >= 666)
push_object(readi(list + 2), readi(list + 4), readi(list + 6)); push_object(readi(list_offset + 2), readi(list_offset + 4), readi(list_offset + 6));
list += 8; list_offset += 8;
break; break;
case 2: case 2:
list = draw_direct(bitmap, cliprect, list + 2); {
list_offset = draw_direct(bitmap, cliprect, list_offset);
break; break;
}
case 3: case 3:
{ {
LOG_TGP(("VIDEO: viewport (%d, %d, %d, %d, %d, %d, %d)\n", LOG_TGP(("VIDEO: viewport (%d, %d, %d, %d, %d, %d, %d)\n",
readi(list + 2), readi(list_offset + 2),
readi16(list + 4), readi16(list + 6), readi16(list + 8), readi16(list_offset + 4), readi16(list_offset + 6), readi16(list_offset + 8),
readi16(list + 10), readi16(list + 12), readi16(list + 14))); readi16(list_offset + 10), readi16(list_offset + 12), readi16(list_offset + 14)));
draw_objects(bitmap, cliprect); draw_objects(bitmap, cliprect);
float xc = readi16(list + 4); float xc = readi16(list_offset + 4);
float yc = 383 - (readi16(list + 6) - 39); float yc = 383 - (readi16(list_offset + 6) - 39);
float x1 = readi16(list + 8); float x1 = readi16(list_offset + 8);
float y2 = 383 - (readi16(list + 10) - 39); float y2 = 383 - (readi16(list_offset + 10) - 39);
float x2 = readi16(list + 12); float x2 = readi16(list_offset + 12);
float y1 = 383 - (readi16(list + 14) - 39); float y1 = 383 - (readi16(list_offset + 14) - 39);
m_view->set_viewport(xc, yc, x1, x2, y1, y2); m_view->set_viewport(xc, yc, x1, x2, y1, y2);
list += 16; list_offset += 16;
break; break;
} }
case 4: case 4:
{ {
int adr = readi(list + 2); int adr = readi(list_offset + 2);
int len = readi(list + 4) + 1; int len = readi(list_offset + 4) + 1;
LOG_TGP(("ZVIDEO: color write, adr=%x, len=%x\n", adr, len)); LOG_TGP(("ZVIDEO: color write, adr=%x, len=%x\n", adr, len));
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
m_tgp_ram[adr - 0x40000 + i] = list[6 + 2 * i]; m_tgp_ram[adr - 0x40000 + i] = readi16(list_offset + 6 + 2 * i);
} }
list += 6 + len * 2; list_offset += 6 + len * 2;
break; break;
} }
case 5: case 5:
{ {
int adr = readi(list + 2); int adr = readi(list_offset + 2);
int len = readi(list + 4); int len = readi(list_offset + 4);
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
m_poly_ram[adr - 0x800000 + i] = readi(list + 2 * i + 6); m_poly_ram[adr - 0x800000 + i] = readi(list_offset + 2 * i + 6);
} }
list += 6 + len * 2; list_offset += 6 + len * 2;
break; break;
} }
case 6: case 6:
{ {
int adr = readi(list + 2); int adr = readi(list_offset + 2);
int len = readi(list + 4); int len = readi(list_offset + 4);
LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len)); LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len));
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
int v = readi(list + 6 + i * 2); int v = readi(list_offset + 6 + i * 2);
float diffuse = (float(v & 0xff)) / 255.0f; float diffuse = (float(v & 0xff)) / 255.0f;
float ambient = (float((v >> 8) & 0xff)) / 255.0f; float ambient = (float((v >> 8) & 0xff)) / 255.0f;
float specular = (float((v >> 16) & 0xff)) / 255.0f; float specular = (float((v >> 16) & 0xff)) / 255.0f;
int power = (v >> 24) & 0xff; int power = (v >> 24) & 0xff;
m_view->set_lightparam(i + adr, diffuse, ambient, specular, power); m_view->set_lightparam(i + adr, diffuse, ambient, specular, power);
} }
list += 6 + len * 2; list_offset += 6 + len * 2;
break; break;
} }
case 7: case 7:
LOG_TGP(("VIDEO: code 7 (%d)\n", readi(list + 2))); LOG_TGP(("VIDEO: code 7 (%d)\n", readi(list_offset + 2)));
zz++; zz++;
list += 4; list_offset += 4;
break; break;
case 8: case 8:
LOG_TGP(("VIDEO: select mode %08x\n", readi(list + 2))); LOG_TGP(("VIDEO: select mode %08x\n", readi(list_offset + 2)));
list += 4; list_offset += 4;
break; break;
case 9: case 9:
LOG_TGP(("VIDEO: zoom (%f, %f)\n", readf(list + 2), readf(list + 4))); LOG_TGP(("VIDEO: zoom (%f, %f)\n", readf(list_offset + 2), readf(list_offset + 4)));
m_view->set_zoom(readf(list + 2) * 4, readf(list + 4) * 4); m_view->set_zoom(readf(list_offset + 2) * 4, readf(list_offset + 4) * 4);
list += 6; list_offset += 6;
break; break;
case 0xa: case 0xa:
LOG_TGP(("VIDEO: light vector (%f, %f, %f)\n", readf(list + 2), readf(list + 4), readf(list + 6))); LOG_TGP(("VIDEO: light vector (%f, %f, %f)\n", readf(list_offset + 2), readf(list_offset + 4), readf(list_offset + 6)));
m_view->set_light_direction(readf(list + 2), readf(list + 4), readf(list + 6)); m_view->set_light_direction(readf(list_offset + 2), readf(list_offset + 4), readf(list_offset + 6));
list += 8; list_offset += 8;
break; break;
case 0xb: case 0xb:
{ {
LOG_TGP(("VIDEO: matrix (%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f)\n", 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_offset + 2), readf(list_offset + 4), readf(list_offset + 6),
readf(list + 8), readf(list + 10), readf(list + 12), readf(list_offset + 8), readf(list_offset + 10), readf(list_offset + 12),
readf(list + 14), readf(list + 16), readf(list + 18), readf(list_offset + 14), readf(list_offset + 16), readf(list_offset + 18),
readf(list + 20), readf(list + 22), readf(list + 24))); readf(list_offset + 20), readf(list_offset + 22), readf(list_offset + 24)));
float mat[12]; float mat[12];
for (int i = 0; i < 12; i++) for (int i = 0; i < 12; i++)
{ {
mat[i] = readf(list + 2 + 2 * i); mat[i] = readf(list_offset + 2 + 2 * i);
} }
m_view->set_translation_matrix(mat); m_view->set_translation_matrix(mat);
list += 26; list_offset += 26;
break; break;
} }
case 0xc: case 0xc:
LOG_TGP(("VIDEO: trans (%f, %f)\n", readf(list + 2), readf(list + 4))); LOG_TGP(("VIDEO: trans (%f, %f)\n", readf(list_offset + 2), readf(list_offset + 4)));
m_view->set_view_translation(readf(list + 2), readf(list + 4)); m_view->set_view_translation(readf(list_offset + 2), readf(list_offset + 4));
list += 6; list_offset += 6;
break; break;
case 0xf: case 0xf:
//case -1: //case -1:
@ -1438,6 +1451,7 @@ void model1_state::tgp_render(bitmap_rgb32 &bitmap, const rectangle &cliprect)
} }
} }
void model1_state::tgp_scan() void model1_state::tgp_scan()
{ {
#if 0 #if 0
@ -1453,83 +1467,86 @@ void model1_state::tgp_scan()
#endif #endif
if (!m_render_done && (m_listctl[1] & 0x1f) == 0x1f) if (!m_render_done && (m_listctl[1] & 0x1f) == 0x1f)
{ {
UINT16 *list = get_list(); set_current_render_list();
// Skip everything but the data uploads // Skip everything but the data uploads
LOG_TGP(("VIDEO: scan list %d\n", get_list_number())); LOG_TGP(("VIDEO: scan list %d\n", get_list_number()));
int list_offset = 0;
for (;;) for (;;)
{ {
int type = (list[1] << 16) | list[0]; int type = readi(list_offset + 0);
switch (type) { switch (type) {
case 0: case 0:
list += 2; list_offset += 2;
break; break;
case 1: case 1:
case 0x41: case 0x41:
list += 8; list_offset += 8;
break; break;
case 2: case 2:
list = skip_direct(list + 2); list_offset = skip_direct(list_offset);
break; break;
case 3: case 3:
list += 16; list_offset += 16;
break; break;
case 4: case 4:
{ {
int adr = readi(list + 2); int adr = readi(list_offset + 2);
int len = readi(list + 4) + 1; int len = readi(list_offset + 4) + 1;
LOG_TGP(("ZVIDEO: scan color write, adr=%x, len=%x\n", adr, len)); LOG_TGP(("ZVIDEO: scan color write, adr=%x, len=%x\n", adr, len));
for (int i = 0; i<len; i++) for (int i = 0; i<len; i++)
{ {
m_tgp_ram[adr - 0x40000 + i] = list[6 + 2 * i]; m_tgp_ram[adr - 0x40000 + i] = readi16(list_offset + 6 + 2 * i);
} }
list += 6 + len * 2; list_offset += 6 + len * 2;
break; break;
} }
case 5: case 5:
{ {
int adr = readi(list + 2); int adr = readi(list_offset + 2);
int len = readi(list + 4); int len = readi(list_offset + 4);
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
m_poly_ram[adr - 0x800000 + i] = readi(list + 2 * i + 6); m_poly_ram[adr - 0x800000 + i] = readi(list_offset + 2 * i + 6);
} }
list += 6 + len * 2; list_offset += 6 + len * 2;
break; break;
} }
case 6: case 6:
{ {
int adr = readi(list + 2); int adr = readi(list_offset + 2);
int len = readi(list + 4); int len = readi(list_offset + 4);
//LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len)); //LOG_TGP(("VIDEO: upload data, adr=%x, len=%x\n", adr, len));
for (int i = 0; i<len; i++) for (int i = 0; i<len; i++)
{ {
int v = readi(list + 6 + i * 2); int v = readi(list_offset + 6 + i * 2);
m_view->lightparams[i + adr].d = (float(v & 0xff)) / 255.0f; 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].a = (float((v >> 8) & 0xff)) / 255.0f;
m_view->lightparams[i + adr].s = (float((v >> 16) & 0xff)) / 255.0f; m_view->lightparams[i + adr].s = (float((v >> 16) & 0xff)) / 255.0f;
m_view->lightparams[i + adr].p = (v >> 24) & 0xff; m_view->lightparams[i + adr].p = (v >> 24) & 0xff;
//LOG_TGP((" %02X\n",v)); //LOG_TGP((" %02X\n",v));
} }
list += 6 + len * 2; list_offset += 6 + len * 2;
break; break;
} }
case 7: case 7:
list += 4; list_offset += 4;
break; break;
case 8: case 8:
list += 4; list_offset += 4;
break; break;
case 9: case 9:
list += 6; list_offset += 6;
break; break;
case 0xa: case 0xa:
list += 8; list_offset += 8;
break; break;
case 0xb: case 0xb:
list += 26; list_offset += 26;
break; break;
case 0xc: case 0xc:
list += 6; list_offset += 6;
break; break;
case 0xf: case 0xf:
case -1: case -1: