Failed attempt to refactor playstate rendering

This commit is contained in:
Ben Wallis
2021-06-20 21:57:42 +01:00
parent b636d7c9f9
commit ff57cb93bc
5 changed files with 37 additions and 48 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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() {

View File

@ -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);
}

View File

@ -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", "<Session as PlayState>::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);
}
}
}