1 #include <cstring>
2 #include "xr_packet.h"
3 
4 using namespace xray_re;
5 
xr_ini_packet()6 xr_ini_packet::xr_ini_packet() : m_counter(0)
7 {
8 	w = new xr_ini_writer();
9 }
10 
w_raw(const void * data,size_t size)11 void xr_ini_packet::w_raw(const void *data, size_t size)
12 {
13 	w->w_raw(data, size);
14 }
15 
w_sz(const std::string & value)16 void xr_ini_packet::w_sz(const std::string& value)
17 {
18 	write(value);
19 }
20 
w_u64(uint64_t value)21 inline void xr_ini_packet::w_u64(uint64_t value) { write_number(value); }
w_u32(uint32_t value)22 inline void xr_ini_packet::w_u32(uint32_t value) { write_number(value); }
w_s32(int32_t value)23 inline void xr_ini_packet::w_s32(int32_t value) { write_number(value); }
w_u16(uint16_t value)24 inline void xr_ini_packet::w_u16(uint16_t value) { write_number(value); }
w_s16(int16_t value)25 inline void xr_ini_packet::w_s16(int16_t value) { write_number(value); }
w_u8(uint8_t value)26 inline void xr_ini_packet::w_u8(uint8_t value) { write_number(value); }
w_s8(int8_t value)27 inline void xr_ini_packet::w_s8(int8_t value) { write_number(value); }
w_bool(bool value)28 inline void xr_ini_packet::w_bool(bool value) { write(value ? 1 : 0); }
w_float(float value)29 inline void xr_ini_packet::w_float(float value) { write(value); }
w_float_q8(float value,float min,float max)30 inline void xr_ini_packet::w_float_q8(float value, float min, float max) { w_u8(uint8_t((value - min)*255.f/(max - min))); }
w_vec3(const fvector3 & value)31 inline void xr_ini_packet::w_vec3(const fvector3& value) { write(value); }
32 /*
33 inline void xr_ini_packet::w_vec4(const fvector4& value) { write(value); }
34 inline void xr_ini_packet::w_quat(const fquaternion& value) { write(value); }
35 */
w_size_u32(size_t value)36 inline void xr_ini_packet::w_size_u32(size_t value) { w_u32(static_cast<uint32_t>(value & UINT32_MAX)); }
w_size_u16(size_t value)37 inline void xr_ini_packet::w_size_u16(size_t value) { w_u16(static_cast<uint16_t>(value & UINT16_MAX)); }
w_size_u8(size_t value)38 inline void xr_ini_packet::w_size_u8(size_t value) { w_u8(static_cast<uint8_t>(value & UINT8_MAX)); }
39 
xr_packet()40 xr_packet::xr_packet(): m_w_pos(0), m_r_pos(0)
41 {
42 	std::memset(m_buf, 0, sizeof(m_buf));
43 }
44 
r_raw(void * dest,size_t size)45 void xr_packet::r_raw(void* dest, size_t size)
46 {
47 	xr_assert(m_r_pos + size <= sizeof(m_buf));
48 	std::memmove(dest, m_buf + m_r_pos, size);
49 	m_r_pos += size;
50 }
51 
w_raw(const void * data,size_t size)52 void xr_packet::w_raw(const void* data, size_t size)
53 {
54 	assert(m_w_pos + size <= sizeof(m_buf));
55 	std::memmove(m_buf + m_w_pos, data, size);
56 	m_w_pos += size;
57 }
58 
r_begin(uint16_t & id)59 void xr_packet::r_begin(uint16_t& id)
60 {
61 	m_r_pos = 0;
62 	r_u16(id);
63 }
64 
w_begin(uint16_t id)65 void xr_packet::w_begin(uint16_t id)
66 {
67 	m_w_pos = 0;
68 	w_u16(id);
69 }
70 
skip_sz()71 const char* xr_packet::skip_sz()
72 {
73 	const char* p = reinterpret_cast<const char*>(m_buf + m_r_pos);
74 	while (m_r_pos < sizeof(m_buf)) {
75 		if (m_buf[m_r_pos++] == 0)
76 			return p;
77 	}
78 	// crash in debug mode if no 0 in the packet
79 	xr_assert(m_r_pos < sizeof(m_buf));
80 	return p;
81 }
82 
r_sz(std::string & value)83 void xr_packet::r_sz(std::string& value)
84 {
85 	uint8_t* p = &m_buf[m_r_pos];
86 	while (m_r_pos < sizeof(m_buf)) {
87 		if (m_buf[m_r_pos++] == 0) {
88 			value.assign(p, &m_buf[m_r_pos - 1]);
89 			return;
90 		}
91 	}
92 	// crash in debug mode if no 0 in the packet
93 	assert(m_r_pos < sizeof(m_buf));
94 	value.assign(p, m_buf + m_r_pos);
95 }
96 
r_angle8()97 float xr_packet::r_angle8()
98 {
99 	r_u8();
100 	return 0;
101 }
102 
r_dir(fvector3 & value)103 void xr_packet::r_dir(fvector3& value)
104 {
105 	value.decompress(r_u16());
106 }
107 
r_sdir(fvector3 & value)108 void xr_packet::r_sdir(fvector3& value)
109 {
110 	value.decompress(r_u16());
111 	value.mul(r_float());
112 }
113 
w_sdir(const fvector3 & value)114 void xr_packet::w_sdir(const fvector3& value)
115 {
116 	fvector3 temp;
117 	float m = value.square_magnitude();
118 	if (m < 1e-7f) {
119 		temp.set(0, 0, 0);
120 		m = 0;
121 	} else {
122 		temp.mul(value, 1.f/m);
123 	}
124 	w_u16(temp.compress());
125 	w_float(m);
126 }
127 
w_sz(const std::string & value)128 void xr_packet::w_sz(const std::string& value)
129 {
130 	w_raw(value.data(), value.length() + 1);
131 }
132 
r_matrix(fmatrix & value)133 void xr_packet::r_matrix(fmatrix& value)
134 {
135 	r_vec3(value.i); value._14 = 0;
136 	r_vec3(value.j); value._24 = 0;
137 	r_vec3(value.k); value._34 = 0;
138 	r_vec3(value.c); value._44 = 1.f;
139 }
140 
w_matrix(const fmatrix & value)141 void xr_packet::w_matrix(const fmatrix& value)
142 {
143 	w_vec3(value.i);
144 	w_vec3(value.j);
145 	w_vec3(value.k);
146 	w_vec3(value.c);
147 }
148 
init(const uint8_t * data,size_t size)149 void xr_packet::init(const uint8_t* data, size_t size)
150 {
151 	xr_assert(size < sizeof(m_buf));
152 	m_r_pos = 0;
153 	m_w_pos = size;
154 	std::memmove(m_buf, data, size);
155 }
156