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 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}