void TR_Level::read_tr3_room(SDL_RWops * const src, tr5_room_t & room) { bitu32 num_data_words; bitu32 i; int pos; // read and change coordinate system room.offset.x = (float)read_bit32(src); room.offset.y = 0; room.offset.z = (float)-read_bit32(src); room.y_bottom = (float)-read_bit32(src); room.y_top = (float)-read_bit32(src); num_data_words = read_bitu32(src); pos = SDL_RWseek(src, 0, SEEK_CUR); room.num_layers = 0; room.num_vertices = read_bitu16(src); room.vertices.resize(room.num_vertices); for (i = 0; i < room.num_vertices; i++) read_tr3_room_vertex(src, room.vertices[i]); room.num_rectangles = read_bitu16(src); room.rectangles.resize(room.num_rectangles); for (i = 0; i < room.num_rectangles; i++) read_tr_face4(src, room.rectangles[i]); room.num_triangles = read_bitu16(src); room.triangles.resize(room.num_triangles); for (i = 0; i < room.num_triangles; i++) read_tr_face3(src, room.triangles[i]); room.num_sprites = read_bitu16(src); room.sprites.resize(room.num_sprites); for (i = 0; i < room.num_sprites; i++) read_tr_room_sprite(src, room.sprites[i]); // set to the right position in case that there is some unused data SDL_RWseek(src, pos + (num_data_words * 2), SEEK_SET); room.num_portals = read_bitu16(src); room.portals.resize(room.num_portals); for (i = 0; i < room.num_portals; i++) read_tr_room_portal(src, room.portals[i]); room.num_zsectors = read_bitu16(src); room.num_xsectors = read_bitu16(src); room.sector_list.resize(room.num_zsectors * room.num_xsectors); for (i = 0; i < (bitu32)(room.num_zsectors * room.num_xsectors); i++) read_tr_room_sector(src, room.sector_list[i]); room.intensity1 = read_bit16(src); room.intensity2 = read_bit16(src); // only in TR2 room.light_mode = 0; room.num_lights = read_bitu16(src); room.lights.resize(room.num_lights); for (i = 0; i < room.num_lights; i++) read_tr2_room_light(src, room.lights[i]); room.num_static_meshes = read_bitu16(src); room.static_meshes.resize(room.num_static_meshes); for (i = 0; i < room.num_static_meshes; i++) read_tr3_room_staticmesh(src, room.static_meshes[i]); room.alternate_room = read_bit16(src); room.flags = read_bitu16(src); // only in TR3-TR4 read_tr_colour(src, room.fog_colour); room.light_colour.r = room.intensity1 / 32767.0f; room.light_colour.g = room.intensity1 / 32767.0f; room.light_colour.b = room.intensity1 / 32767.0f; room.light_colour.a = 1.0f; }
void TR_Level::read_tr3_room(SDL_RWops * const src, tr5_room_t & room) { uint32_t num_data_words; uint32_t i; int64_t pos; // read and change coordinate system room.offset.x = (float)read_bit32(src); room.offset.y = 0; room.offset.z = (float)-read_bit32(src); room.y_bottom = (float)-read_bit32(src); room.y_top = (float)-read_bit32(src); num_data_words = read_bitu32(src); pos = SDL_RWseek(src, 0, RW_SEEK_CUR); room.num_layers = 0; room.num_vertices = read_bitu16(src); room.vertices = (tr5_room_vertex_t*)calloc(room.num_vertices, sizeof(tr5_room_vertex_t)); for (i = 0; i < room.num_vertices; i++) read_tr3_room_vertex(src, room.vertices[i]); room.num_rectangles = read_bitu16(src); room.rectangles = (tr4_face4_t*)malloc(room.num_rectangles * sizeof(tr4_face4_t)); for (i = 0; i < room.num_rectangles; i++) read_tr_face4(src, room.rectangles[i]); room.num_triangles = read_bitu16(src); room.triangles = (tr4_face3_t*)malloc(room.num_triangles * sizeof(tr4_face3_t)); for (i = 0; i < room.num_triangles; i++) read_tr_face3(src, room.triangles[i]); room.num_sprites = read_bitu16(src); room.sprites = (tr_room_Sprite*)malloc(room.num_sprites * sizeof(tr_room_Sprite)); for (i = 0; i < room.num_sprites; i++) read_tr_room_sprite(src, room.sprites[i]); // set to the right position in case that there is some unused data SDL_RWseek(src, pos + (num_data_words * 2), RW_SEEK_SET); room.num_portals = read_bitu16(src); room.portals = (tr_room_portal_t*)malloc(room.num_portals * sizeof(tr_room_portal_t)); for (i = 0; i < room.num_portals; i++) read_tr_room_portal(src, room.portals[i]); room.num_zsectors = read_bitu16(src); room.num_xsectors = read_bitu16(src); room.sector_list = (tr_room_sector_t*)malloc(room.num_zsectors * room.num_xsectors * sizeof(tr_room_sector_t)); for (i = 0; i < (uint32_t)(room.num_zsectors * room.num_xsectors); i++) read_tr_room_sector(src, room.sector_list[i]); room.intensity1 = read_bit16(src); room.intensity2 = read_bit16(src); // only in TR2 room.light_mode = 0; room.num_lights = read_bitu16(src); room.lights = (tr5_room_light_t*)malloc(room.num_lights * sizeof(tr5_room_light_t)); for (i = 0; i < room.num_lights; i++) read_tr2_room_light(src, room.lights[i]); room.num_static_meshes = read_bitu16(src); room.static_meshes = (tr2_room_staticmesh_t*)malloc(room.num_static_meshes * sizeof(tr2_room_staticmesh_t)); for (i = 0; i < room.num_static_meshes; i++) read_tr3_room_staticmesh(src, room.static_meshes[i]); room.alternate_room = read_bit16(src); room.alternate_group = 0; // Doesn't exist in TR1-3 room.flags = read_bitu16(src); if(room.flags & 0x0080) { room.flags |= 0x0002; // Move quicksand flag to another bit to avoid confusion with NL flag. room.flags ^= 0x0080; } // Only in TR3-5 room.water_scheme = read_bitu8(src); room.reverb_info = read_bitu8(src); SDL_RWseek(src, 1, SEEK_CUR); // Alternate_group override? room.light_colour.r = room.intensity1 / 65534.0f; room.light_colour.g = room.intensity1 / 65534.0f; room.light_colour.b = room.intensity1 / 65534.0f; room.light_colour.a = 1.0f; }