1 #include "xr_level_version.h" 2 #include "xr_level_portals.h" 3 #include "xr_reader.h" 4 #include "xr_writer.h" 5 #include "xr_utils.h" 6 7 using namespace xray_re; 8 ~xr_level_portals()9xr_level_portals::~xr_level_portals() 10 { 11 delete_elements(m_portals); 12 } 13 operator ()read_portal_v514struct read_portal_v5 { void operator()(portal_data*& _portal, xr_reader& r) const { 15 portal_data* portal = new portal_data; 16 _portal = portal; 17 portal->sector_front = r.r_u16(); 18 portal->sector_back = r.r_u16(); 19 portal->vertices.count = r.r_u32(); 20 for (uint_fast32_t i = 0; i != 6; ++i) 21 r.r_fvector3(portal->vertices.array[i]); 22 }}; 23 load_v5(xr_reader & r)24void xr_level_portals::load_v5(xr_reader& r) 25 { 26 xr_assert(r.size() % sizeof(fsl_portal_v5) == 0); 27 r.r_seq(r.size()/sizeof(fsl_portal_v5), m_portals, read_portal_v5()); 28 } 29 operator ()read_portal_v830struct read_portal_v8 { void operator()(portal_data*& _portal, xr_reader& r) const { 31 portal_data* portal = new portal_data; 32 _portal = portal; 33 portal->sector_front = r.r_u16(); 34 portal->sector_back = r.r_u16(); 35 for (uint_fast32_t i = 0; i != 6; ++i) 36 r.r_fvector3(portal->vertices.array[i]); 37 portal->vertices.count = r.r_u32(); 38 }}; 39 load_v8(xr_reader & r)40void xr_level_portals::load_v8(xr_reader& r) 41 { 42 xr_assert(r.size() % sizeof(fsl_portal_v8) == 0); 43 r.r_seq(r.size()/sizeof(fsl_portal_v8), m_portals, read_portal_v8()); 44 } 45 load(uint32_t xrlc_version,xr_reader & r)46void xr_level_portals::load(uint32_t xrlc_version, xr_reader& r) 47 { 48 xr_reader* s = 0; 49 if (xrlc_version == XRLC_VERSION_5) { 50 s = r.open_chunk(FSL5_PORTALS); 51 if (s) 52 load_v5(*s); 53 } else { 54 if (xrlc_version <= XRLC_VERSION_9) 55 s = r.open_chunk(FSL8_PORTALS); 56 else if (xrlc_version >= XRLC_VERSION_12) 57 s = r.open_chunk(FSL13_PORTALS); 58 if (s) 59 load_v8(*s); 60 } 61 r.close_chunk(s); 62 } 63 save(xr_writer & w) const64void xr_level_portals::save(xr_writer& w) const 65 { 66 } 67