1 #include "xr_ai_graph.h"
2 #include "xr_reader.h"
3 #include "xr_writer.h"
4
5 using namespace xray_re;
6
operator ()(gg_level & level,xr_reader & r) const7 void gg_level2215_io::operator()(gg_level& level, xr_reader& r) const
8 {
9 r.r_sz(level.name);
10 r.r_fvector3(level.offset);
11 level.level_id = r.r_u32();
12 r.r_sz(level.section);
13 level.guid.load(r);
14 }
15
operator ()(const gg_level & level,xr_writer & w) const16 void gg_level2215_io::operator()(const gg_level& level, xr_writer& w) const
17 {
18 w.w_sz(level.name);
19 w.w_fvector3(level.offset);
20 w.w_u32(level.level_id);
21 w.w_sz(level.section);
22 level.guid.save(w);
23 }
24
operator ()(gg_vertex & vert,xr_reader & r) const25 void gg_vertex2215_io::operator()(gg_vertex& vert, xr_reader& r) const
26 {
27 r.r_fvector3(vert.local_point);
28 r.r_fvector3(vert.global_point);
29 vert.level_id = r.r_u8();
30 vert.node_id = r.r_u24();
31 r.r_cseq(4, vert.vertex_types);
32 vert.neighbour_count = r.r_u8();
33 unsigned edge_offset = r.r_u24();
34 vert.edge_index = (edge_offset - edge_base)/sizeof(gg_edge_2215);
35 vert.death_point_count = r.r_u8();
36 unsigned point_offset = r.r_u24();
37 if (vert.death_point_count != 0)
38 vert.point_index = (point_offset - death_point_base)/sizeof(gg_level_point);
39 }
40
operator ()(const gg_vertex & vert,xr_writer & w) const41 void gg_vertex2215_io::operator()(const gg_vertex& vert, xr_writer& w) const {
42 w.w_fvector3(vert.local_point);
43 w.w_fvector3(vert.global_point);
44 w.w_u8(vert.level_id);
45 w.w_u24(vert.node_id);
46 w.w_cseq(4, vert.vertex_types);
47 w.w_u8(vert.neighbour_count);
48 w.w_u24(edge_base + vert.edge_index*sizeof(gg_edge_2215));
49 w.w_u8(vert.death_point_count);
50 if (vert.death_point_count == 0)
51 w.w_u24(0);
52 else
53 w.w_u24(death_point_base + vert.point_index*sizeof(gg_level_point));
54 }
55
operator ()(gg_edge & edge,xr_reader & r) const56 void gg_edge2215_io::operator()(gg_edge& edge, xr_reader& r) const
57 {
58 edge.vertex_id = r.r_u32();
59 edge.distance = r.r_float();
60 }
61
operator ()(const gg_edge & edge,xr_writer & w) const62 void gg_edge2215_io::operator()(const gg_edge& edge, xr_writer& w) const
63 {
64 w.w_u32(edge.vertex_id);
65 w.w_float(edge.distance);
66 }
67
operator ()(gg_level & level,xr_reader & r) const68 void gg_level_io::operator()(gg_level& level, xr_reader& r) const
69 {
70 r.r_sz(level.name);
71 r.r_fvector3(level.offset);
72 level.level_id = r.r_u8();
73 r.r_sz(level.section);
74 level.guid.load(r);
75 }
76
operator ()(const gg_level & level,xr_writer & w) const77 void gg_level_io::operator()(const gg_level& level, xr_writer& w) const
78 {
79 w.w_sz(level.name);
80 w.w_fvector3(level.offset);
81 w.w_u8(uint8_t(level.level_id));
82 w.w_sz(level.section);
83 level.guid.save(w);
84 }
85
operator ()(gg_vertex & vert,xr_reader & r) const86 void gg_vertex_io::operator()(gg_vertex& vert, xr_reader& r) const
87 {
88 r.r_fvector3(vert.local_point);
89 r.r_fvector3(vert.global_point);
90 vert.level_id = r.r_u8();
91 vert.node_id = r.r_u24();
92 r.r_cseq(4, vert.vertex_types);
93 unsigned edge_offset = r.r_u32();
94 unsigned point_offset = r.r_u32();
95 vert.neighbour_count = r.r_u8();
96 vert.death_point_count = r.r_u8();
97 xr_assert((edge_offset - edge_base)%sizeof(gg_edge_2947) == 0);
98 vert.edge_index = (edge_offset - edge_base)/sizeof(gg_edge_2947);
99 if (vert.death_point_count != 0) {
100 xr_assert((point_offset - death_point_base)%sizeof(gg_level_point) == 0);
101 vert.point_index = (point_offset - death_point_base)/sizeof(gg_level_point);
102 }
103 }
104
operator ()(const gg_vertex & vert,xr_writer & w) const105 void gg_vertex_io::operator()(const gg_vertex& vert, xr_writer& w) const
106 {
107 w.w_fvector3(vert.local_point);
108 w.w_fvector3(vert.global_point);
109 w.w_u8(vert.level_id);
110 w.w_u24(vert.node_id);
111 w.w_cseq(4, vert.vertex_types);
112 w.w_u32(edge_base + vert.edge_index*sizeof(gg_edge_2947));
113 if (vert.death_point_count == 0)
114 w.w_u32(0);
115 else
116 w.w_u32(death_point_base + vert.point_index*sizeof(gg_level_point));
117 w.w_u8(vert.neighbour_count);
118 w.w_u8(vert.death_point_count);
119 }
120
operator ()(gg_edge & edge,xr_reader & r) const121 void gg_edge_io::operator()(gg_edge& edge, xr_reader& r) const
122 {
123 edge.vertex_id = r.r_u16();
124 edge.distance = r.r_float();
125 }
126
operator ()(const gg_edge & edge,xr_writer & w) const127 void gg_edge_io::operator()(const gg_edge& edge, xr_writer& w) const
128 {
129 w.w_u16(uint16_t(edge.vertex_id));
130 w.w_float(edge.distance);
131 }
132
operator ()(gg_level_point & point,xr_reader & r) const133 void gg_level_point_io::operator()(gg_level_point& point, xr_reader& r) const
134 {
135 r.r_fvector3(point.point);
136 point.node_id = r.r_u32();
137 point.distance = r.r_float();
138 }
139
operator ()(const gg_level_point & point,xr_writer & w) const140 void gg_level_point_io::operator()(const gg_level_point& point, xr_writer& w) const
141 {
142 w.w_fvector3(point.point);
143 w.w_u32(point.node_id);
144 w.w_float(point.distance);
145 }
146