rpfm_lib/files/tile_database/render_params/mod.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
11//! Global rendering parameters for terrain.
12//!
13//! Contains settings that affect how terrain is rendered including
14//! height scales, detail levels, normal mapping, and water properties.
15
16use serde_derive::{Serialize, Deserialize};
17
18use crate::binary::{ReadBytes, WriteBytes};
19use crate::error::{Result, RLibError};
20use crate::files::{Decodeable, EncodeableExtraData, Encodeable};
21
22use super::*;
23
24mod v6;
25
26//---------------------------------------------------------------------------//
27// Enum & Structs
28//---------------------------------------------------------------------------//
29
30/// Global terrain rendering parameters.
31///
32/// Controls various aspects of terrain rendering including height mapping,
33/// detail levels at different distances, normal mapping, and water effects.
34#[derive(Default, PartialEq, Clone, Debug, Getters, MutGetters, Setters, Serialize, Deserialize)]
35#[getset(get = "pub", get_mut = "pub", set = "pub")]
36pub struct RenderParams {
37 /// Serialisation format version.
38 serialise_version: u16,
39
40 /// Low-frequency height scale.
41 lf_height: f32,
42 /// High-frequency height scale.
43 hf_height: f32,
44 /// Pixel scale for blending.
45 blend_pixel_scale: f32,
46 /// World unit scale factor.
47 unit_scale: f32,
48 /// Mid-distance detail texture scale.
49 mid_distance_detail_scale: f32,
50 /// Mid-distance detail intensity.
51 mid_distance_detail_strength: f32,
52 /// Mid-distance normal map intensity.
53 mid_distance_normal_strength: f32,
54 /// Near threshold for mid-distance detail.
55 mid_distance_detail_near: f32,
56 /// Far threshold for mid-distance detail.
57 mid_distance_detail_far: f32,
58 /// Low slope threshold for mid-distance detail.
59 mid_distance_detail_slope_low: f32,
60 /// High slope threshold for mid-distance detail.
61 mid_distance_detail_slope_high: f32,
62 /// Vertical offset for terrain placement.
63 vertical_offset: f32,
64 /// Low-frequency normal scale.
65 normal_lf_scale: f32,
66 /// Tile-level normal scale.
67 normal_tile_scale: f32,
68 /// Overall terrain normal scale.
69 normal_terrain_scale: f32,
70 /// Contrast for blend transitions.
71 blend_contrast: f32,
72 /// Layer exempt from processing (slot 0).
73 layer_exempt_0: String,
74 /// Layer exempt from processing (slot 1).
75 layer_exempt_1: String,
76 /// Layer exempt from processing (slot 2).
77 layer_exempt_2: String,
78 /// Layer exempt from processing (slot 3).
79 layer_exempt_3: String,
80 /// Campaign map sea transparency.
81 campaign_sea_transparency_scale: f32,
82 /// Campaign map sea UV tiling.
83 campaign_sea_uv_scale: f32,
84 /// Campaign map lake transparency.
85 campaign_lake_transparency_scale: f32,
86 /// Distance for near-detail rendering.
87 near_distance_detail_distance: f32,
88 /// Near-distance detail texture scale.
89 near_distance_detail_scale: f32,
90 /// Near-distance detail intensity.
91 near_distance_detail_strength: f32,
92 /// Low-quality near threshold for mid-distance.
93 mid_distance_detail_near_lq: f32,
94}
95
96//---------------------------------------------------------------------------//
97// Implementation of RenderParams
98//---------------------------------------------------------------------------//
99
100impl Decodeable for RenderParams {
101
102 fn decode<R: ReadBytes>(data: &mut R, extra_data: &Option<DecodeableExtraData>) -> Result<Self> {
103 let mut decoded = Self::default();
104 decoded.serialise_version = data.read_u16()?;
105
106 match decoded.serialise_version {
107 6 => decoded.read_v6(data, extra_data)?,
108 _ => return Err(RLibError::DecodingFastBinUnsupportedVersion(String::from("RenderParams"), decoded.serialise_version)),
109 }
110
111 Ok(decoded)
112 }
113}
114
115impl Encodeable for RenderParams {
116
117 fn encode<W: WriteBytes>(&mut self, buffer: &mut W, extra_data: &Option<EncodeableExtraData>) -> Result<()> {
118 buffer.write_u16(self.serialise_version)?;
119
120 match self.serialise_version {
121 6 => self.write_v6(buffer, extra_data)?,
122 _ => return Err(RLibError::EncodingFastBinUnsupportedVersion(String::from("RenderParams"), self.serialise_version)),
123 }
124
125 Ok(())
126 }
127}