From ff57cb93bc39630c74ac0ff841a57a40ecb7c6a8 Mon Sep 17 00:00:00 2001 From: Ben Wallis Date: Sun, 20 Jun 2021 21:57:42 +0100 Subject: [PATCH] Failed attempt to refactor playstate rendering --- voxygen/src/lib.rs | 5 ++++- voxygen/src/menu/char_selection/mod.rs | 15 ++++---------- voxygen/src/menu/main/mod.rs | 19 +++++++----------- voxygen/src/run.rs | 19 ++++++++++++++++-- voxygen/src/session/mod.rs | 27 +++++--------------------- 5 files changed, 37 insertions(+), 48 deletions(-) diff --git a/voxygen/src/lib.rs b/voxygen/src/lib.rs index e6b882130a..39b73d482f 100644 --- a/voxygen/src/lib.rs +++ b/voxygen/src/lib.rs @@ -43,6 +43,7 @@ use crate::ui::egui::EguiState; use crate::{ audio::AudioFrontend, profile::Profile, + render::{Drawer, GlobalsBindGroup, Renderer}, settings::Settings, window::{Event, Window}, }; @@ -139,6 +140,8 @@ pub trait PlayState { /// Determines whether the play state should have an enforced FPS cap fn capped_fps(&self) -> bool; + fn globals_bind_group(&self) -> &GlobalsBindGroup; + /// Draw the play state. - fn render(&mut self, global_state: &mut GlobalState); + fn render<'a>(&'a mut self, drawer: &mut Drawer<'a>, settings: &Settings); } diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index 3dc71b6bd4..cca8cc4202 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -1,8 +1,10 @@ mod ui; use crate::{ + render::{Drawer, GlobalsBindGroup, Renderer}, scene::simple::{self as scene, Scene}, session::SessionState, + settings::Settings, window::Event as WinEvent, Direction, GlobalState, PlayState, PlayStateResult, }; @@ -232,18 +234,9 @@ impl PlayState for CharSelectionState { fn capped_fps(&self) -> bool { true } - fn render(&mut self, global_state: &mut GlobalState) { - let renderer = global_state.window.renderer_mut(); - - let mut drawer = match renderer - .start_recording_frame(self.scene.global_bind_group()) - .expect("Unrecoverable render error when starting a new frame!") - { - Some(d) => d, - // Couldn't get swap chain texture this fime - None => return, - }; + fn globals_bind_group(&self) -> &GlobalsBindGroup { self.scene.global_bind_group() } + fn render<'a>(&'a mut self, mut drawer: &mut Drawer<'a>, _: &Settings) { if self.need_shadow_clear { drawer.clear_shadows(); self.need_shadow_clear = false; diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 1d8ecde8c1..764b050e6d 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -6,7 +6,11 @@ use super::char_selection::CharSelectionState; #[cfg(feature = "singleplayer")] use crate::singleplayer::Singleplayer; use crate::{ - i18n::LocalizationHandle, window::Event, Direction, GlobalState, PlayState, PlayStateResult, + i18n::LocalizationHandle, + render::{Drawer, GlobalsBindGroup, Renderer}, + settings::Settings, + window::Event, + Direction, GlobalState, PlayState, PlayStateResult, }; #[cfg(feature = "singleplayer")] use client::{ @@ -319,18 +323,9 @@ impl PlayState for MainMenuState { fn capped_fps(&self) -> bool { true } - fn render(&mut self, global_state: &mut GlobalState) { - let renderer = global_state.window.renderer_mut(); - - let mut drawer = match renderer - .start_recording_frame(self.scene.global_bind_group()) - .expect("Unrecoverable render error when starting a new frame!") - { - Some(d) => d, - // Couldn't get swap chain texture this frame - None => return, - }; + fn globals_bind_group(&self) -> &GlobalsBindGroup { self.scene.global_bind_group() } + fn render<'a>(&'a mut self, mut drawer: &mut Drawer<'a>, _: &Settings) { // Draw the UI to the screen. let mut third_pass = drawer.third_pass(); if let Some(mut ui_drawer) = third_pass.draw_ui() { diff --git a/voxygen/src/run.rs b/voxygen/src/run.rs index 1a4c60753c..78364aea6c 100644 --- a/voxygen/src/run.rs +++ b/voxygen/src/run.rs @@ -170,10 +170,25 @@ fn handle_main_events_cleared( drop(guard); if let Some(last) = states.last_mut() { + capped_fps = last.capped_fps(); + span!(guard, "Render"); // Render the screen using the global renderer - last.render(global_state); - capped_fps = last.capped_fps(); + + if let Some(mut drawer) = global_state + .window + .renderer_mut() + .start_recording_frame(last.globals_bind_group()) + .expect("Unrecoverable render error when starting a new frame!") + { + last.render(&mut drawer, &global_state.settings); + + #[cfg(feature = "egui-ui")] + if global_state.settings.interface.toggle_debug { + let scale_factor = global_state.window.window().scale_factor() as f32; + drawer.draw_egui(&mut global_state.egui_state.platform, scale_factor); + } + }; drop(guard); } diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 78cfb0b943..1f23714eef 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -38,7 +38,9 @@ use crate::{ hud::{Event as HudEvent, Hud, HudInfo, LootMessage, PromptDialogSettings}, key_state::KeyState, menu::char_selection::CharSelectionState, + render::{Drawer, GlobalsBindGroup, Renderer}, scene::{camera, terrain::Interaction, CameraMode, DebugShapeId, Scene, SceneData}, + settings::Settings, window::{AnalogGameInput, Event, GameInput}, Direction, Error, GlobalState, PlayState, PlayStateResult, }; @@ -1406,25 +1408,13 @@ impl PlayState for SessionState { fn capped_fps(&self) -> bool { false } + fn globals_bind_group(&self) -> &GlobalsBindGroup { self.scene.global_bind_group() } + /// Render the session to the screen. /// /// This method should be called once per frame. - fn render(&mut self, global_state: &mut GlobalState) { - #[cfg(feature = "egui-ui")] - let scale_factor = global_state.window.window().scale_factor() as f32; - - let renderer = global_state.window.renderer_mut(); - let settings = &global_state.settings; - + fn render<'a>(&'a mut self, mut drawer: &mut Drawer<'a>, settings: &Settings) { span!(_guard, "render", "::render"); - let mut drawer = match renderer - .start_recording_frame(self.scene.global_bind_group()) - .expect("Unrecoverable render error when starting a new frame!") - { - Some(d) => d, - // Couldn't get swap chain texture this frame - None => return, - }; // Render world { @@ -1469,13 +1459,6 @@ impl PlayState for SessionState { if let Some(mut ui_drawer) = third_pass.draw_ui() { self.hud.render(&mut ui_drawer); }; // Note: this semicolon is needed for the third_pass borrow to be dropped before it's lifetime ends - - drop(third_pass); - - #[cfg(feature = "egui-ui")] - if global_state.settings.interface.toggle_debug { - drawer.draw_egui(&mut global_state.egui_state.platform, scale_factor); - } } }