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