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