veloren_voxygen/ui/
egui.rs

1use crate::{
2    scene::{DebugShape, DebugShapeId, Scene},
3    session::settings_change::{Graphics, SettingsChange},
4    settings::Settings,
5    window::Window,
6};
7use client::Client;
8use egui::FontDefinitions;
9use egui_winit_platform::{Platform, PlatformDescriptor};
10use voxygen_egui::{EguiAction, EguiDebugInfo, EguiDebugShapeAction, EguiInnerState};
11
12pub struct EguiState {
13    pub platform: Platform,
14    egui_inner_state: EguiInnerState,
15    new_debug_shape_id: Option<u64>,
16}
17
18impl EguiState {
19    pub fn new(window: &Window) -> Self {
20        let inner_size = window.window().inner_size();
21        let platform = Platform::new(PlatformDescriptor {
22            physical_width: inner_size.width,
23            physical_height: inner_size.height,
24            scale_factor: window.scale_factor(),
25            font_definitions: FontDefinitions::default(),
26            style: Default::default(),
27        });
28
29        Self {
30            platform,
31            egui_inner_state: EguiInnerState::default(),
32            new_debug_shape_id: None,
33        }
34    }
35
36    pub fn maintain(
37        &mut self,
38        client: &mut Client,
39        scene: &mut Scene,
40        debug_info: Option<EguiDebugInfo>,
41        settings: &Settings,
42    ) -> Option<SettingsChange> {
43        use crate::render::ExperimentalShader;
44        use strum::IntoEnumIterator;
45        let experimental_shaders = ExperimentalShader::iter()
46            .map(|s| {
47                (
48                    s.to_string(),
49                    settings
50                        .graphics
51                        .render_mode
52                        .experimental_shaders
53                        .contains(&s),
54                )
55            })
56            .collect();
57
58        let egui_actions = voxygen_egui::maintain(
59            &mut self.platform,
60            &mut self.egui_inner_state,
61            client,
62            debug_info,
63            self.new_debug_shape_id.take(),
64            experimental_shaders,
65        );
66
67        let mut new_render_mode = None;
68
69        egui_actions
70            .actions
71            .into_iter()
72            .for_each(|action| match action {
73                EguiAction::ChatCommand { cmd, args } => {
74                    client.send_command(cmd.keyword().into(), args);
75                },
76                EguiAction::DebugShape(debug_shape_action) => match debug_shape_action {
77                    EguiDebugShapeAction::AddCylinder { height, radius } => {
78                        let shape_id = scene
79                            .debug
80                            .add_shape(DebugShape::Cylinder { height, radius });
81                        self.new_debug_shape_id = Some(shape_id.0);
82                    },
83                    EguiDebugShapeAction::RemoveShape(debug_shape_id) => {
84                        scene.debug.remove_shape(DebugShapeId(debug_shape_id));
85                    },
86                    EguiDebugShapeAction::SetPosAndColor { id, pos, color } => {
87                        let identity_ori = [0.0, 0.0, 0.0, 1.0];
88                        scene
89                            .debug
90                            .set_context(DebugShapeId(id), pos, color, identity_ori);
91                    },
92                },
93                EguiAction::SetExperimentalShader(shader, enabled) => {
94                    if let Ok(shader) = ExperimentalShader::try_from(shader.as_str()) {
95                        let shaders = &mut new_render_mode
96                            .get_or_insert_with(|| settings.graphics.render_mode.clone())
97                            .experimental_shaders;
98
99                        if enabled {
100                            shaders.insert(shader);
101                        } else {
102                            shaders.remove(&shader);
103                        }
104                    }
105                },
106                EguiAction::SetShowDebugVector(enabled) => {
107                    scene.debug_vectors_enabled = enabled;
108                },
109            });
110
111        new_render_mode.map(|rm| SettingsChange::Graphics(Graphics::ChangeRenderMode(Box::new(rm))))
112    }
113}