1 #include "xr_scene_objects.h"
2 #include "xr_scene.h"
3 #include "xr_obj_motion.h"
4 #include "xr_reader.h"
5 #include "xr_writer.h"
6 #include "xr_utils.h"
7 
8 using namespace xray_re;
9 
xr_custom_object(xr_scene & scene,tools_class_id class_id)10 xr_custom_object::xr_custom_object(xr_scene& scene, tools_class_id class_id):
11 	m_scene(scene), m_class_id(class_id),
12 	m_flags(COF_VISIBLE), m_motion(0), m_time(0)
13 {
14 	m_position.set();
15 	m_rotation.set();
16 	m_scale.set(1.f, 1.f, 1.f);
17 }
18 
~xr_custom_object()19 xr_custom_object::~xr_custom_object()
20 {
21 	delete m_motion;
22 }
23 
load(xr_reader & r)24 void xr_custom_object::load(xr_reader& r)
25 {
26 	if (r.r_chunk(CUSTOMOBJECT_CHUNK_FLAGS, m_flags)) {
27 		if (!r.find_chunk(CUSTOMOBJECT_CHUNK_NAME))
28 			xr_not_expected();
29 		r.r_sz(m_name);
30 		r.debug_find_chunk();
31 	} else if (r.find_chunk(CUSTOMOBJECT_CHUNK_PARAMS)) {
32 		m_flags = 0;
33 		uint16_t flag = r.r_u16();
34 		if (flag)
35 			m_flags |= COF_SELECTED;
36 		flag = r.r_u16();
37 		if (flag)
38 			m_flags |= COF_VISIBLE;
39 		r.r_sz(m_name);
40 		r.debug_find_chunk();
41 
42 		if (r.r_chunk(CUSTOMOBJECT_CHUNK_f902, flag) && flag)
43 			m_flags |= COF_LOCKED;
44 	} else {
45 		xr_not_expected();
46 	}
47 	if (r.find_chunk(CUSTOMOBJECT_CHUNK_XFORM)) {
48 		r.r_fvector3(m_position);
49 		r.r_fvector3(m_rotation);
50 		r.r_fvector3(m_scale);
51 		r.debug_find_chunk();
52 	}
53 	if (r.find_chunk(CUSTOMOBJECT_CHUNK_MOTION)) {
54 		m_motion = new xr_obj_motion();
55 		m_motion->load(r);
56 		r.debug_find_chunk();
57 	}
58 	if (r.r_chunk(CUSTOMOBJECT_CHUNK_TIME, m_time)) {
59 		xr_assert(m_motion);
60 	}
61 }
62 
save_v12(xr_ini_writer * w) const63 void xr_custom_object::save_v12(xr_ini_writer* w) const
64 {
65 	w->write("clsid", m_class_id);
66 	w->write("co_flags", m_flags);
67 	w->write("flags", 0);
68 	w->write("name", m_name, false);
69 	w->write("position", m_position);
70 	w->write("rotation", m_rotation);
71 	w->write("scale", m_scale);
72 }
73 
save(xr_writer & w) const74 void xr_custom_object::save(xr_writer& w) const
75 {
76 	w.w_chunk(CUSTOMOBJECT_CHUNK_FLAGS, m_flags);
77 	w.w_chunk(CUSTOMOBJECT_CHUNK_NAME, m_name);
78 
79 	w.open_chunk(CUSTOMOBJECT_CHUNK_XFORM);
80 	w.w_fvector3(m_position);
81 	w.w_fvector3(m_rotation);
82 	w.w_fvector3(m_scale);
83 	w.close_chunk();
84 
85 	if (m_flags & COF_MOTIONABLE) {
86 		xr_assert(m_motion);
87 		w.open_chunk(CUSTOMOBJECT_CHUNK_MOTION);
88 		m_motion->save(w);
89 		w.close_chunk();
90 
91 		w.w_chunk<float>(CUSTOMOBJECT_CHUNK_TIME, m_time);
92 	}
93 }
94 
95 ////////////////////////////////////////////////////////////////////////////////
96 
xr_scene_objects(xr_scene & scene,const char * file_name,scene_chunk_id chunk_id)97 xr_scene_objects::xr_scene_objects(xr_scene& scene, const char* file_name, scene_chunk_id chunk_id):
98 	xr_scene_part(scene, file_name, chunk_id) {}
99 
~xr_scene_objects()100 xr_scene_objects::~xr_scene_objects()
101 {
102 	delete_elements(m_objects);
103 }
104 
load(xr_reader & r)105 void xr_scene_objects::load(xr_reader& r)
106 {
107 	revision().load(r);
108 	if (!r.find_chunk(TOOLS_CHUNK_COUNT))
109 		xr_not_expected();
110 	size_t num_objects = r.r_u32();
111 	r.debug_find_chunk();
112 
113 	scene().load_objects(r, TOOLS_CHUNK_OBJECTS, m_objects);
114 	xr_assert(num_objects == m_objects.size());
115 }
116 
save(xr_writer & w) const117 void xr_scene_objects::save(xr_writer& w) const
118 {
119 	revision().save(w);
120 	w.open_chunk(TOOLS_CHUNK_COUNT);
121 	w.w_size_u32(m_objects.size());
122 	w.close_chunk();
123 
124 	scene().save_objects(w, TOOLS_CHUNK_OBJECTS, m_objects);
125 }
126 
save_v12(xr_ini_writer * w) const127 void xr_scene_objects::save_v12(xr_ini_writer* w) const
128 {
129 	scene().save_objects(w, m_objects);
130 }
131