Skip to main content

rpfm_lib/files/rigidmodel/materials/
projected_decal.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
17/// Projected decal materials of version 6 RigidModels: the decal's texture path, a flag, and since `ProjectedDecalV2`,
18/// the box the decal is projected in.
19impl Material {
20    pub fn read_projected_decal<R: ReadBytes>(data: &mut R, version: u32, mtype: MaterialType) -> Result<Self> {
21        let mut material = Self {
22            name: read_padded_string(data, version, PADDED_SIZE_256)?,
23            ..Default::default()
24        };
25
26        if mtype != MaterialType::ProjectedDecal {
27            material.decal_center = Vector3::new(data.read_f32()?, data.read_f32()?, data.read_f32()?);
28            material.decal_size = Vector3::new(data.read_f32()?, data.read_f32()?, data.read_f32()?);
29        }
30
31        material.uk_1 = data.read_u32()?;
32
33        if mtype != MaterialType::ProjectedDecal {
34            material.uk_2 = data.read_u32()?;
35            material.uk_3 = data.read_u32()?;
36        }
37
38        if mtype == MaterialType::ProjectedDecalV3 {
39            material.uk_4 = data.read_u32()?;
40        }
41
42        Ok(material)
43    }
44
45    pub fn write_projected_decal<W: WriteBytes>(&self, data: &mut W, version: u32, mtype: MaterialType) -> Result<()> {
46        write_padded_string(data, version, self.name(), PADDED_SIZE_256)?;
47
48        if mtype != MaterialType::ProjectedDecal {
49            data.write_f32(self.decal_center.x)?;
50            data.write_f32(self.decal_center.y)?;
51            data.write_f32(self.decal_center.z)?;
52            data.write_f32(self.decal_size.x)?;
53            data.write_f32(self.decal_size.y)?;
54            data.write_f32(self.decal_size.z)?;
55        }
56
57        data.write_u32(self.uk_1)?;
58
59        if mtype != MaterialType::ProjectedDecal {
60            data.write_u32(self.uk_2)?;
61            data.write_u32(self.uk_3)?;
62        }
63
64        if mtype == MaterialType::ProjectedDecalV3 {
65            data.write_u32(self.uk_4)?;
66        }
67
68        Ok(())
69    }
70}