rpfm_lib/files/rigidmodel/materials/
cloth.rs1use super::*;
12
13impl Material {
18 pub fn read_cloth<R: ReadBytes>(data: &mut R) -> Result<Self> {
19 let mut mat = Self::default();
20
21 mat.vertex_format = VertexFormat::try_from(data.read_u16()?)?;
22 mat.name = data.read_string_u8_0padded(PADDED_SIZE_32)?;
23
24 mat.texture_directory = data.read_string_u8_0padded(PADDED_SIZE_256)?;
25 mat.filters = data.read_string_u8_0padded(PADDED_SIZE_256)?;
26
27 mat.padding_byte0 = data.read_u8()?;
28 mat.padding_byte1 = data.read_u8()?;
29
30 mat.v_pivot = Vector3::new(data.read_f32()?, data.read_f32()?, data.read_f32()?);
31
32 mat.matrix1 = Matrix3x4::new(
33 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
34 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
35 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?
36 );
37 mat.matrix2 = Matrix3x4::new(
38 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
39 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
40 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?
41 );
42 mat.matrix3 = Matrix3x4::new(
43 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
44 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
45 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?
46 );
47
48 mat.i_matrix_index = data.read_i32()?;
49 mat.i_parent_matrix_index = data.read_i32()?;
50
51 let attachment_points_count = data.read_u32()?;
52 mat.attachment_points = Vec::with_capacity(attachment_points_count as usize);
53
54 let texture_count = data.read_u32()?;
55 mat.textures = Vec::with_capacity(texture_count as usize);
56
57 let param_string_count = data.read_u32()?;
58 mat.params_string = Vec::with_capacity(param_string_count as usize);
59
60 let param_f32_count = data.read_u32()?;
61 mat.params_f32 = Vec::with_capacity(param_f32_count as usize);
62
63 let param_i32_count = data.read_u32()?;
64 mat.params_i32 = Vec::with_capacity(param_i32_count as usize);
65
66 let param_vector4df32_count = data.read_u32()?;
67 mat.params_vector4df32 = Vec::with_capacity(param_vector4df32_count as usize);
68
69 mat.sz_padding = data.read_slice(124, false)?;
70
71 for _ in 0..mat.attachment_points.capacity() {
73 let mut entry = AttachmentPointEntry::default();
74
75 entry.name = data.read_string_u8_0padded(PADDED_SIZE_32)?;
76 entry.matrix = Matrix3x4::new(
77 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
78 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?,
79 data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?
80 );
81
82 entry.bone_id = data.read_u32()?;
83
84 mat.attachment_points.push(entry);
85 }
86
87 for _ in 0..mat.textures.capacity() {
89 let mut entry = Texture::default();
90
91 entry.tex_type = TextureType::try_from(data.read_i32()?)?;
92 entry.path = data.read_string_u8_0padded(PADDED_SIZE_256)?;
93
94 mat.textures.push(entry)
95 }
96
97 for _ in 0..mat.params_string.capacity() {
99 mat.params_string.push((data.read_i32()?, data.read_sized_string_u8()?));
100 }
101
102 for _ in 0..mat.params_f32.capacity() {
103 mat.params_f32.push((data.read_i32()?, data.read_f32()?));
104 }
105
106 for _ in 0..mat.params_i32.capacity() {
107 mat.params_i32.push((data.read_i32()?, data.read_i32()?));
108 }
109
110 for _ in 0..mat.params_vector4df32.capacity() {
111 mat.params_vector4df32.push((data.read_i32()?, Vector4::new(data.read_f32()?, data.read_f32()?, data.read_f32()?, data.read_f32()?)));
112 }
113
114 let uk_7_count = data.read_u32()?;
116 mat.uk_7 = Vec::with_capacity(uk_7_count as usize);
117
118 let uk_8_count = data.read_u32()?;
119 mat.uk_8 = Vec::with_capacity(uk_8_count as usize);
120
121 let uk_9_count = data.read_u32()?;
122 mat.uk_9 = Vec::with_capacity(uk_9_count as usize);
123
124 for _ in 0..mat.uk_7.capacity() {
125 let mut uk = Uk7::default();
126
127 uk.uk1 = data.read_i32()?;
128 uk.uk2 = data.read_i32()?;
129 uk.uk3 = data.read_f32()?;
130
131 mat.uk_7.push(uk);
132 }
133
134 for _ in 0..mat.uk_8.capacity() {
135 let mut uk = Uk8::default();
136
137 uk.uk1 = data.read_i32()?;
138
139 mat.uk_8.push(uk);
140 }
141
142 for _ in 0..mat.uk_9.capacity() {
143 let mut uk = Uk9::default();
144
145 uk.uk1 = data.read_i32()?;
146 uk.uk2 = data.read_i32()?;
147 uk.uk3 = data.read_i32()?;
148
149 mat.uk_9.push(uk);
150 }
151
152 Ok(mat)
153 }
154 pub fn write_cloth<W: WriteBytes>(&self, buffer: &mut W) -> Result<()> {
155 buffer.write_u16(u16::from(self.vertex_format))?;
156 buffer.write_string_u8_0padded(self.name(), PADDED_SIZE_32, true)?;
157
158 buffer.write_string_u8_0padded(self.texture_directory(), PADDED_SIZE_256, true)?;
159 buffer.write_string_u8_0padded(self.filters(), PADDED_SIZE_256, true)?;
160
161 buffer.write_u8(self.padding_byte0)?;
162 buffer.write_u8(self.padding_byte1)?;
163
164 buffer.write_f32(self.v_pivot().x)?;
165 buffer.write_f32(self.v_pivot().y)?;
166 buffer.write_f32(self.v_pivot().z)?;
167
168 buffer.write_f32(self.matrix1().m11)?;
169 buffer.write_f32(self.matrix1().m12)?;
170 buffer.write_f32(self.matrix1().m13)?;
171 buffer.write_f32(self.matrix1().m14)?;
172 buffer.write_f32(self.matrix1().m21)?;
173 buffer.write_f32(self.matrix1().m22)?;
174 buffer.write_f32(self.matrix1().m23)?;
175 buffer.write_f32(self.matrix1().m24)?;
176 buffer.write_f32(self.matrix1().m31)?;
177 buffer.write_f32(self.matrix1().m32)?;
178 buffer.write_f32(self.matrix1().m33)?;
179 buffer.write_f32(self.matrix1().m34)?;
180
181 buffer.write_f32(self.matrix2().m11)?;
182 buffer.write_f32(self.matrix2().m12)?;
183 buffer.write_f32(self.matrix2().m13)?;
184 buffer.write_f32(self.matrix2().m14)?;
185 buffer.write_f32(self.matrix2().m21)?;
186 buffer.write_f32(self.matrix2().m22)?;
187 buffer.write_f32(self.matrix2().m23)?;
188 buffer.write_f32(self.matrix2().m24)?;
189 buffer.write_f32(self.matrix2().m31)?;
190 buffer.write_f32(self.matrix2().m32)?;
191 buffer.write_f32(self.matrix2().m33)?;
192 buffer.write_f32(self.matrix2().m34)?;
193
194 buffer.write_f32(self.matrix3().m11)?;
195 buffer.write_f32(self.matrix3().m12)?;
196 buffer.write_f32(self.matrix3().m13)?;
197 buffer.write_f32(self.matrix3().m14)?;
198 buffer.write_f32(self.matrix3().m21)?;
199 buffer.write_f32(self.matrix3().m22)?;
200 buffer.write_f32(self.matrix3().m23)?;
201 buffer.write_f32(self.matrix3().m24)?;
202 buffer.write_f32(self.matrix3().m31)?;
203 buffer.write_f32(self.matrix3().m32)?;
204 buffer.write_f32(self.matrix3().m33)?;
205 buffer.write_f32(self.matrix3().m34)?;
206
207 buffer.write_i32(self.i_matrix_index)?;
208 buffer.write_i32(self.i_parent_matrix_index)?;
209
210 buffer.write_i32(self.attachment_points.len() as i32)?;
211 buffer.write_i32(self.textures.len() as i32)?;
212 buffer.write_i32(self.params_string.len() as i32)?;
213 buffer.write_i32(self.params_f32.len() as i32)?;
214 buffer.write_i32(self.params_i32.len() as i32)?;
215 buffer.write_i32(self.params_vector4df32.len() as i32)?;
216
217 buffer.write_all(self.sz_padding())?;
218
219 for att_point in self.attachment_points() {
220 buffer.write_string_u8_0padded(att_point.name(), PADDED_SIZE_32, true)?;
221
222 buffer.write_f32(att_point.matrix().m11)?;
223 buffer.write_f32(att_point.matrix().m12)?;
224 buffer.write_f32(att_point.matrix().m13)?;
225 buffer.write_f32(att_point.matrix().m14)?;
226 buffer.write_f32(att_point.matrix().m21)?;
227 buffer.write_f32(att_point.matrix().m22)?;
228 buffer.write_f32(att_point.matrix().m23)?;
229 buffer.write_f32(att_point.matrix().m24)?;
230 buffer.write_f32(att_point.matrix().m31)?;
231 buffer.write_f32(att_point.matrix().m32)?;
232 buffer.write_f32(att_point.matrix().m33)?;
233 buffer.write_f32(att_point.matrix().m34)?;
234
235 buffer.write_u32(att_point.bone_id)?;
236 }
237
238 for texture in self.textures() {
239 buffer.write_i32(i32::try_from(texture.tex_type)?)?;
240 buffer.write_string_u8_0padded(texture.path(), PADDED_SIZE_256, true)?;
241 }
242
243 for (key, param) in self.params_string() {
244 buffer.write_i32(*key)?;
245 buffer.write_sized_string_u8(param)?;
246 }
247
248 for (key, param) in self.params_f32() {
249 buffer.write_i32(*key)?;
250 buffer.write_f32(*param)?;
251 }
252
253 for (key, param) in self.params_i32() {
254 buffer.write_i32(*key)?;
255 buffer.write_i32(*param)?;
256 }
257
258 for (key, param) in self.params_vector4df32() {
259 buffer.write_i32(*key)?;
260 buffer.write_f32(param.x)?;
261 buffer.write_f32(param.y)?;
262 buffer.write_f32(param.z)?;
263 buffer.write_f32(param.w)?;
264 }
265
266 buffer.write_i32(self.uk_7.len() as i32)?;
267 buffer.write_i32(self.uk_8.len() as i32)?;
268 buffer.write_i32(self.uk_9.len() as i32)?;
269
270 for uk in self.uk_7() {
271 buffer.write_i32(uk.uk1)?;
272 buffer.write_i32(uk.uk2)?;
273 buffer.write_f32(uk.uk3)?;
274 }
275
276 for uk in self.uk_8() {
277 buffer.write_i32(uk.uk1)?;
278 }
279
280 for uk in self.uk_9() {
281 buffer.write_i32(uk.uk1)?;
282 buffer.write_i32(uk.uk2)?;
283 buffer.write_i32(uk.uk3)?;
284 }
285
286 Ok(())
287 }
288}