veloren_voxygen/ui/
egui.rs1use 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}