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 weapon_trails_enabled: bool,
42    pub figure_lod_render_distance: u32,
43    pub max_fps: Fps,
44    pub max_background_fps: Fps,
45    pub fov: u16,
46    pub gamma: f32,
47    pub exposure: f32,
48    pub ambiance: f32,
49    pub render_mode: RenderMode,
50    pub window: WindowSettings,
51    pub fullscreen: FullScreenSettings,
52    pub lod_detail: u32,
53}
54
55impl Default for GraphicsSettings {
56    fn default() -> Self {
57        Self {
58            terrain_view_distance: 10,
59            entity_view_distance: client::MAX_SELECTABLE_VIEW_DISTANCE,
60            lod_distance: 200,
61            sprite_render_distance: 100,
62            particles_enabled: true,
63            weapon_trails_enabled: true,
64            figure_lod_render_distance: 300,
65            max_fps: Fps::Max(60),
66            max_background_fps: Fps::Max(30),
67            fov: 70,
68            gamma: 1.0,
69            exposure: 1.0,
70            ambiance: 0.5,
71            render_mode: RenderMode::default(),
72            window: WindowSettings::default(),
73            fullscreen: FullScreenSettings::default(),
74            lod_detail: 250,
75        }
76    }
77}
78
79impl GraphicsSettings {
80    pub fn into_minimal(self) -> Self {
81        use crate::render::*;
82        Self {
83            terrain_view_distance: 4,
84            entity_view_distance: 4,
85            lod_distance: 0,
86            sprite_render_distance: 80,
87            figure_lod_render_distance: 100,
88            lod_detail: 80,
89            render_mode: RenderMode {
90                aa: AaMode::FxUpscale,
91                cloud: CloudMode::Minimal,
92                reflection: ReflectionMode::Low,
93                fluid: FluidMode::Low,
94                lighting: LightingMode::Lambertian,
95                shadow: ShadowMode::None,
96                rain_occlusion: ShadowMapMode { resolution: 0.25 },
97                bloom: BloomMode::Off,
98                point_glow: 0.0,
99                upscale_mode: UpscaleMode { factor: 0.35 },
100                ..self.render_mode
101            },
102            ..self
103        }
104    }
105
106    pub fn into_low(self) -> Self {
107        use crate::render::*;
108        Self {
109            terrain_view_distance: 7,
110            entity_view_distance: 7,
111            lod_distance: 75,
112            sprite_render_distance: 125,
113            figure_lod_render_distance: 200,
114            lod_detail: 200,
115            render_mode: RenderMode {
116                aa: AaMode::FxUpscale,
117                cloud: CloudMode::Low,
118                reflection: ReflectionMode::Medium,
119                fluid: FluidMode::Low,
120                lighting: LightingMode::Lambertian,
121                shadow: ShadowMode::Cheap,
122                rain_occlusion: ShadowMapMode { resolution: 0.25 },
123                bloom: BloomMode::Off,
124                point_glow: 0.2,
125                upscale_mode: UpscaleMode { factor: 0.65 },
126                ..self.render_mode
127            },
128            ..self
129        }
130    }
131
132    pub fn into_medium(self) -> Self {
133        use crate::render::*;
134        Self {
135            terrain_view_distance: 10,
136            entity_view_distance: 10,
137            lod_distance: 150,
138            sprite_render_distance: 250,
139            figure_lod_render_distance: 350,
140            lod_detail: 300,
141            render_mode: RenderMode {
142                aa: AaMode::Fxaa,
143                cloud: CloudMode::Medium,
144                reflection: ReflectionMode::High,
145                fluid: FluidMode::Medium,
146                lighting: LightingMode::BlinnPhong,
147                shadow: ShadowMode::Map(ShadowMapMode { resolution: 0.75 }),
148                rain_occlusion: ShadowMapMode { resolution: 0.25 },
149                bloom: BloomMode::On(BloomConfig {
150                    factor: BloomFactor::Medium,
151                    uniform_blur: false,
152                }),
153                point_glow: 0.2,
154                upscale_mode: UpscaleMode { factor: 0.85 },
155                ..self.render_mode
156            },
157            ..self
158        }
159    }
160
161    pub fn into_high(self) -> Self {
162        use crate::render::*;
163        Self {
164            terrain_view_distance: 16,
165            entity_view_distance: 16,
166            lod_distance: 200,
167            sprite_render_distance: 350,
168            figure_lod_render_distance: 450,
169            lod_detail: 375,
170            render_mode: RenderMode {
171                aa: AaMode::Fxaa,
172                cloud: CloudMode::Medium,
173                reflection: ReflectionMode::High,
174                fluid: FluidMode::Medium,
175                lighting: LightingMode::Ashikhmin,
176                shadow: ShadowMode::Map(ShadowMapMode { resolution: 1.0 }),
177                rain_occlusion: ShadowMapMode { resolution: 0.5 },
178                bloom: BloomMode::On(BloomConfig {
179                    factor: BloomFactor::Medium,
180                    uniform_blur: true,
181                }),
182                point_glow: 0.2,
183                upscale_mode: UpscaleMode { factor: 1.0 },
184                ..self.render_mode
185            },
186            ..self
187        }
188    }
189
190    pub fn into_ultra(self) -> Self {
191        use crate::render::*;
192        Self {
193            terrain_view_distance: 16,
194            entity_view_distance: 16,
195            lod_distance: 450,
196            sprite_render_distance: 800,
197            figure_lod_render_distance: 600,
198            lod_detail: 500,
199            render_mode: RenderMode {
200                aa: AaMode::Fxaa,
201                cloud: CloudMode::High,
202                reflection: ReflectionMode::High,
203                fluid: FluidMode::High,
204                lighting: LightingMode::Ashikhmin,
205                shadow: ShadowMode::Map(ShadowMapMode { resolution: 1.75 }),
206                rain_occlusion: ShadowMapMode { resolution: 0.5 },
207                bloom: BloomMode::On(BloomConfig {
208                    factor: BloomFactor::Medium,
209                    uniform_blur: true,
210                }),
211                point_glow: 0.2,
212                upscale_mode: UpscaleMode { factor: 1.25 },
213                ..self.render_mode
214            },
215            ..self
216        }
217    }
218
219    pub fn view_distances(&self) -> ViewDistances {
220        ViewDistances {
221            terrain: self.terrain_view_distance,
222            entity: self.entity_view_distance,
223        }
224    }
225}