removed refcell

This commit is contained in:
Ben Wallis 2021-06-22 20:25:04 +01:00
parent 5fc224f109
commit ae35db731d
6 changed files with 23 additions and 9 deletions

View File

@ -144,4 +144,7 @@ pub trait PlayState {
/// Draw the play state. /// Draw the play state.
fn render<'a>(&'a self, drawer: &mut Drawer<'a>, settings: &Settings); fn render<'a>(&'a self, drawer: &mut Drawer<'a>, settings: &Settings);
/// Determines whether egui will be rendered for this play state
fn egui_enabled(&self) -> bool;
} }

View File

@ -20,7 +20,6 @@ pub struct CharSelectionState {
char_selection_ui: CharSelectionUi, char_selection_ui: CharSelectionUi,
client: Rc<RefCell<Client>>, client: Rc<RefCell<Client>>,
scene: Scene, scene: Scene,
need_shadow_clear: RefCell<bool>,
} }
impl CharSelectionState { impl CharSelectionState {
@ -37,7 +36,6 @@ impl CharSelectionState {
char_selection_ui, char_selection_ui,
client, client,
scene, scene,
need_shadow_clear: RefCell::new(false),
} }
} }
@ -75,7 +73,7 @@ impl PlayState for CharSelectionState {
.set_scale_mode(global_state.settings.interface.ui_scale); .set_scale_mode(global_state.settings.interface.ui_scale);
// Clear shadow textures since we don't render to them here // Clear shadow textures since we don't render to them here
*self.need_shadow_clear.borrow_mut() = true; global_state.window.clear_shadows_next_frame = true;
} }
fn tick(&mut self, global_state: &mut GlobalState, events: Vec<WinEvent>) -> PlayStateResult { fn tick(&mut self, global_state: &mut GlobalState, events: Vec<WinEvent>) -> PlayStateResult {
@ -237,11 +235,6 @@ impl PlayState for CharSelectionState {
fn globals_bind_group(&self) -> &GlobalsBindGroup { self.scene.global_bind_group() } fn globals_bind_group(&self) -> &GlobalsBindGroup { self.scene.global_bind_group() }
fn render<'a>(&'a self, drawer: &mut Drawer<'a>, _: &Settings) { fn render<'a>(&'a self, drawer: &mut Drawer<'a>, _: &Settings) {
if *self.need_shadow_clear.borrow() {
drawer.clear_shadows();
*self.need_shadow_clear.borrow_mut() = false;
}
let client = self.client.borrow(); let client = self.client.borrow();
let (humanoid_body, loadout) = let (humanoid_body, loadout) =
Self::get_humanoid_body_inventory(&self.char_selection_ui, &client); Self::get_humanoid_body_inventory(&self.char_selection_ui, &client);
@ -263,4 +256,6 @@ impl PlayState for CharSelectionState {
self.char_selection_ui.render(&mut ui_drawer); self.char_selection_ui.render(&mut ui_drawer);
}; };
} }
fn egui_enabled(&self) -> bool { false }
} }

View File

@ -332,6 +332,8 @@ impl PlayState for MainMenuState {
self.main_menu_ui.render(&mut ui_drawer); self.main_menu_ui.render(&mut ui_drawer);
}; };
} }
fn egui_enabled(&self) -> bool { false }
} }
fn get_client_msg_error( fn get_client_msg_error(

View File

@ -179,19 +179,28 @@ fn handle_main_events_cleared(
span!(guard, "Render"); span!(guard, "Render");
// Render the screen using the global renderer // Render the screen using the global renderer
let clear_shadows = global_state.window.clear_shadows_next_frame;
if let Some(mut drawer) = global_state if let Some(mut drawer) = global_state
.window .window
.renderer_mut() .renderer_mut()
.start_recording_frame(last.globals_bind_group()) .start_recording_frame(last.globals_bind_group())
.expect("Unrecoverable render error when starting a new frame!") .expect("Unrecoverable render error when starting a new frame!")
{ {
if clear_shadows {
drawer.clear_shadows();
}
last.render(&mut drawer, &global_state.settings); last.render(&mut drawer, &global_state.settings);
#[cfg(feature = "egui-ui")] #[cfg(feature = "egui-ui")]
if global_state.settings.interface.toggle_debug { if last.egui_enabled() && global_state.settings.interface.toggle_debug {
span!(guard, "Draw egui");
drawer.draw_egui(&mut global_state.egui_state.platform, scale_factor); drawer.draw_egui(&mut global_state.egui_state.platform, scale_factor);
} }
}; };
if clear_shadows {
global_state.window.clear_shadows_next_frame = false;
}
drop(guard); drop(guard);
} }

View File

@ -1460,6 +1460,8 @@ impl PlayState for SessionState {
self.hud.render(&mut ui_drawer); self.hud.render(&mut ui_drawer);
}; // Note: this semicolon is needed for the third_pass borrow to be dropped before it's lifetime ends }; // Note: this semicolon is needed for the third_pass borrow to be dropped before it's lifetime ends
} }
fn egui_enabled(&self) -> bool { true }
} }
/// Max distance an entity can be "targeted" /// Max distance an entity can be "targeted"

View File

@ -544,6 +544,8 @@ pub struct Window {
message_receiver: channel::Receiver<String>, message_receiver: channel::Receiver<String>,
// Used for screenshots & fullscreen toggle to deduplicate/postpone to after event handler // Used for screenshots & fullscreen toggle to deduplicate/postpone to after event handler
take_screenshot: bool, take_screenshot: bool,
// Used to clear the shadow textures when entering a PlayState that doesn't utilise shadows
pub clear_shadows_next_frame: bool,
toggle_fullscreen: bool, toggle_fullscreen: bool,
pub key_layout: Option<KeyLayout>, pub key_layout: Option<KeyLayout>,
} }
@ -640,6 +642,7 @@ impl Window {
message_sender, message_sender,
message_receiver, message_receiver,
take_screenshot: false, take_screenshot: false,
clear_shadows_next_frame: false,
toggle_fullscreen: false, toggle_fullscreen: false,
key_layout, key_layout,
}; };