Skip to main content

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}