Skip to main content

veloren_voxygen/settings/
graphics.rs

1use crate::{
2    render::RenderMode,
3    window::{FullScreenSettings, WindowSettings},
4};
5use common::ViewDistances;
6use serde::{Deserialize, Serialize};
7use std::fmt;
8
9#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
10pub enum Fps {
11    Max(u32),
12    Unlimited,
13}
14
15pub fn get_fps(max_fps: Fps) -> u32 {
16    match max_fps {
17        Fps::Max(x) => x,
18        Fps::Unlimited => u32::MAX,
19    }
20}
21
22impl fmt::Display for Fps {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        match *self {
25            Fps::Max(x) => write!(f, "{}", x),
26            Fps::Unlimited => write!(f, "Unlimited"),
27        }
28    }
29}
30
31/// `GraphicsSettings` contains settings related to framerate and in-game
32/// visuals.
33#[derive(Clone, Debug, Serialize, Deserialize)]
34#[serde(default)]
35pub struct GraphicsSettings {
36    pub terrain_view_distance: u32,
37    pub entity_view_distance: u32,
38    pub lod_distance: u32,
39    pub sprite_render_distance: u32,
40    pub particles_enabled: bool,
41    pub particles_chance: f32,
42    pub weapon_trails_enabled: bool,
43    pub figure_lod_render_distance: u32,
44    pub max_fps: Fps,
45    pub max_background_fps: Fps,
46    pub fov: u16,
47    pub gamma: f32,
48    pub exposure: f32,
49    pub ambiance: f32,
50    pub render_mode: RenderMode,
51    pub window: WindowSettings,
52    pub fullscreen: FullScreenSettings,
53    pub lod_detail: u32,
54}
55
56impl Default for GraphicsSettings {
57    fn default() -> Self {
58        Self {
59            terrain_view_distance: 10,
60            entity_view_distance: client::MAX_SELECTABLE_VIEW_DISTANCE,
61            lod_distance: 200,
62            sprite_render_distance: 100,
63            particles_enabled: true,
64            particles_chance: 1.0,
65            weapon_trails_enabled: true,
66            figure_lod_render_distance: 300,
67            max_fps: Fps::Max(60),
68            max_background_fps: Fps::Max(30),
69            fov: 70,
70            gamma: 1.0,
71            exposure: 1.0,
72            ambiance: 0.5,
73            render_mode: RenderMode::default(),
74            window: WindowSettings::default(),
75            fullscreen: FullScreenSettings::default(),
76            lod_detail: 250,
77        }
78    }
79}
80
81impl GraphicsSettings {
82    pub fn into_minimal(self) -> Self {
83        use crate::render::*;
84        Self {
85            terrain_view_distance: 4,
86            entity_view_distance: 4,
87            lod_distance: 0,
88            sprite_render_distance: 80,
89            figure_lod_render_distance: 100,
90            lod_detail: 80,
91            particles_chance: 0.1,
92            render_mode: RenderMode {
93                aa: AaMode::FxUpscale,
94                cloud: CloudMode::Flat,
95                reflection: ReflectionMode::Low,
96                fluid: FluidMode::Low,
97                lighting: LightingMode::Lambertian,
98                shadow: ShadowMode::None,
99                rain_occlusion: ShadowMapMode { resolution: 0.25 },
100                bloom: BloomMode::Off,
101                point_glow: 0.0,
102                upscale_mode: UpscaleMode { factor: 0.35 },
103                ..self.render_mode
104            },
105            ..self
106        }
107    }
108
109    pub fn into_low(self) -> Self {
110        use crate::render::*;
111        Self {
112            terrain_view_distance: 7,
113            entity_view_distance: 7,
114            lod_distance: 75,
115            sprite_render_distance: 125,
116            figure_lod_render_distance: 200,
117            lod_detail: 180,
118            particles_chance: 0.25,
119            render_mode: RenderMode {
120                aa: AaMode::FxUpscale,
121                cloud: CloudMode::Low,
122                reflection: ReflectionMode::Medium,
123                fluid: FluidMode::Low,
124                lighting: LightingMode::Lambertian,
125                shadow: ShadowMode::Cheap,
126                rain_occlusion: ShadowMapMode { resolution: 0.25 },
127                bloom: BloomMode::Off,
128                point_glow: 0.2,
129                upscale_mode: UpscaleMode { factor: 0.65 },
130                ..self.render_mode
131            },
132            ..self
133        }
134    }
135
136    pub fn into_medium(self) -> Self {
137        use crate::render::*;
138        Self {
139            terrain_view_distance: 10,
140            entity_view_distance: 10,
141            lod_distance: 150,
142            sprite_render_distance: 250,
143            figure_lod_render_distance: 350,
144            lod_detail: 250,
145            particles_chance: 0.5,
146            render_mode: RenderMode {
147                aa: AaMode::Fxaa,
148                cloud: CloudMode::Medium,
149                reflection: ReflectionMode::High,
150                fluid: FluidMode::Medium,
151                lighting: LightingMode::BlinnPhong,
152                shadow: ShadowMode::Map(ShadowMapMode { resolution: 0.75 }),
153                rain_occlusion: ShadowMapMode { resolution: 0.25 },
154                bloom: BloomMode::On(BloomConfig {
155                    factor: BloomFactor::Medium,
156                    uniform_blur: false,
157                }),
158                point_glow: 0.2,
159                upscale_mode: UpscaleMode { factor: 0.85 },
160                ..self.render_mode
161            },
162            ..self
163        }
164    }
165
166    pub fn into_high(self) -> Self {
167        use crate::render::*;
168        Self {
169            terrain_view_distance: 16,
170            entity_view_distance: 16,
171            lod_distance: 200,
172            sprite_render_distance: 350,
173            figure_lod_render_distance: 450,
174            lod_detail: 325,
175            particles_chance: 0.75,
176            render_mode: RenderMode {
177                aa: AaMode::Fxaa,
178                cloud: CloudMode::Medium,
179                reflection: ReflectionMode::High,
180                fluid: FluidMode::Medium,
181                lighting: LightingMode::Ashikhmin,
182                shadow: ShadowMode::Map(ShadowMapMode { resolution: 1.0 }),
183                rain_occlusion: ShadowMapMode { resolution: 0.5 },
184                bloom: BloomMode::On(BloomConfig {
185                    factor: BloomFactor::Medium,
186                    uniform_blur: true,
187                }),
188                point_glow: 0.2,
189                upscale_mode: UpscaleMode { factor: 1.0 },
190                ..self.render_mode
191            },
192            ..self
193        }
194    }
195
196    pub fn into_ultra(self) -> Self {
197        use crate::render::*;
198        Self {
199            terrain_view_distance: 16,
200            entity_view_distance: 16,
201            lod_distance: 450,
202            sprite_render_distance: 800,
203            figure_lod_render_distance: 600,
204            lod_detail: 400,
205            particles_chance: 1.0,
206            render_mode: RenderMode {
207                aa: AaMode::Fxaa,
208                cloud: CloudMode::High,
209                reflection: ReflectionMode::High,
210                fluid: FluidMode::High,
211                lighting: LightingMode::Ashikhmin,
212                shadow: ShadowMode::Map(ShadowMapMode { resolution: 1.75 }),
213                rain_occlusion: ShadowMapMode { resolution: 0.5 },
214                bloom: BloomMode::On(BloomConfig {
215                    factor: BloomFactor::Medium,
216                    uniform_blur: true,
217                }),
218                point_glow: 0.2,
219                upscale_mode: UpscaleMode { factor: 1.25 },
220                ..self.render_mode
221            },
222            ..self
223        }
224    }
225
226    pub fn view_distances(&self) -> ViewDistances {
227        ViewDistances {
228            terrain: self.terrain_view_distance,
229            entity: self.entity_view_distance,
230        }
231    }
232}