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