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