veloren_voxygen/settings/
graphics.rs1use 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#[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}