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