Skip to main content

rpfm_lib/files/rigidmodel/materials/
cloth.rs

1//---------------------------------------------------------------------------//
2// Copyright (c) 2017-2026 Ismael Gutiérrez González. All rights reserved.
3//
4// This file is part of the Rusted PackFile Manager (RPFM) project,
5// which can be found here: https://github.com/Frodo45127/rpfm.
6//
7// This file is licensed under the MIT license, which can be found here:
8// https://github.com/Frodo45127/rpfm/blob/master/LICENSE.
9//---------------------------------------------------------------------------//
10
11use super::*;
12
13//---------------------------------------------------------------------------//
14//                            Implementation
15//---------------------------------------------------------------------------//
16
17impl 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        // Attachment points.
72        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        // Textures
88        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        // Extra material params.
98        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        // These have a ton of extra data here.
115        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}