1 #include "xr_level_env_mod.h"
2 #include "xr_file_system.h"
3 #include "xr_utils.h"
4
5 using namespace xray_re;
6
~xr_level_env_mod()7 xr_level_env_mod::~xr_level_env_mod()
8 {
9 delete_elements(m_env_mods);
10 }
11
load(xr_reader & r)12 void xr_level_env_mod::load(xr_reader& r)
13 {
14 if (r.find_chunk(ENV_MOD_CHUNK_VERSION) == sizeof(uint32_t)) {
15 m_version = r.r_u32();
16 xr_assert(m_version == ENV_MOD_VERSION_23);
17 } else {
18 m_version = ENV_MOD_VERSION_0;
19 }
20 // compiler will optimize this, so no explicit (id = version) trick.
21 uint32_t id = (m_version == ENV_MOD_VERSION_0) ? 0 : 1;
22 for (xr_reader* s; (s = r.open_chunk(id)); ++id) {
23 env_mod_data* em = new env_mod_data;
24 m_env_mods.push_back(em);
25 r.r_fvector3(em->position);
26 em->radius = r.r_float();
27 em->power = r.r_float();
28 em->far_plane = r.r_float();
29 r.r_fvector3(em->fog_color);
30 em->fog_density = r.r_float();
31 r.r_fvector3(em->ambient_color);
32 r.r_fvector3(em->sky_color);
33 r.r_fvector3(em->hemi_color);
34 em->extra = (m_version == ENV_MOD_VERSION_0) ? 0xffff : r.r_u16();
35 }
36 }
37
save(xr_writer & w) const38 void xr_level_env_mod::save(xr_writer& w) const
39 {
40 uint32_t id;
41 if (m_version == ENV_MOD_VERSION_0) {
42 id = 0;
43 } else {
44 id = 1;
45 w.w_chunk(ENV_MOD_CHUNK_VERSION, m_version);
46 }
47 for (env_mod_data_vec_cit it = m_env_mods.begin(), end = m_env_mods.end();
48 it != end; ++it, ++id) {
49 const env_mod_data* em = *it;
50 w.open_chunk(id);
51 w.w_fvector3(em->position);
52 w.w_float(em->radius);
53 w.w_float(em->power);
54 w.w_float(em->far_plane);
55 w.w_fvector3(em->fog_color);
56 w.w_float(em->fog_density);
57 w.w_fvector3(em->ambient_color);
58 w.w_fvector3(em->sky_color);
59 w.w_fvector3(em->hemi_color);
60 if (m_version != ENV_MOD_VERSION_0)
61 w.w_u16(em->extra);
62 w.close_chunk();
63 }
64 }
65
load(const char * path,const char * name)66 bool xr_level_env_mod::load(const char* path, const char* name)
67 {
68 xr_file_system& fs = xr_file_system::instance();
69 xr_reader* r = fs.r_open(path, name);
70 if (r == 0)
71 return false;
72 load(*r);
73 fs.r_close(r);
74 return true;
75 }
76
save(const char * path,const char * name)77 bool xr_level_env_mod::save(const char* path, const char* name)
78 {
79 xr_file_system& fs = xr_file_system::instance();
80 xr_writer* w = fs.w_open(path, name);
81 if (w == 0)
82 return false;
83 save(*w);
84 fs.w_close(w);
85 return true;
86 }
87