diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-10 17:49:37 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-10 17:49:37 +0100 |
commit | 9335f7193ae666c378f5011e1eb90db5721e43fd (patch) | |
tree | 0e45add1360a74012c5aec8f665f2bde94c51d1d /client/src/renderer.rs | |
parent | c4e99ec50b3ac45ff01f902655cad07118835d1c (diff) | |
download | weareserver-9335f7193ae666c378f5011e1eb90db5721e43fd.tar weareserver-9335f7193ae666c378f5011e1eb90db5721e43fd.tar.bz2 weareserver-9335f7193ae666c378f5011e1eb90db5721e43fd.tar.zst |
multithreaded world loading
Diffstat (limited to 'client/src/renderer.rs')
-rw-r--r-- | client/src/renderer.rs | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/client/src/renderer.rs b/client/src/renderer.rs index bb87b6c..a9a2332 100644 --- a/client/src/renderer.rs +++ b/client/src/renderer.rs @@ -15,12 +15,17 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ use crate::{ - camera::Camera, scene_prepare::ScenePreparer, scene_render::ScenePipeline, ui::UiRenderer, + camera::Camera, download::Downloader, scene_prepare::ScenePreparer, + scene_render::ScenePipeline, ui::UiRenderer, }; use anyhow::{Result, anyhow}; use log::{info, warn}; use pollster::FutureExt; -use std::sync::Arc; +use std::{ + sync::Arc, + thread::{sleep, spawn}, + time::Duration, +}; use weareshared::tree::SceneTree; use wgpu::{ Backends, CommandEncoderDescriptor, Device, DeviceDescriptor, Extent3d, Features, Instance, @@ -37,12 +42,12 @@ pub struct Renderer<'a> { surface_configuration: SurfaceConfiguration, scene_pipeline: ScenePipeline, pub ui_renderer: UiRenderer, - pub scene_prepare: ScenePreparer, + pub scene_prepare: Arc<ScenePreparer>, surface_needs_reconfigure: bool, depth: TextureView, } impl<'a> Renderer<'a> { - pub fn new(window: &'a Window) -> Result<Self> { + pub fn new(window: &'a Window, downloader: Arc<Downloader>) -> Result<Self> { info!("wgpu init"); let instance = Instance::new(InstanceDescriptor { backends: Backends::all(), @@ -85,7 +90,11 @@ impl<'a> Renderer<'a> { let (scene_pipeline, texture_bgl) = ScenePipeline::new(&device, surface_configuration.format); - let scene_prepare = ScenePreparer::new(device.clone(), queue.clone(), texture_bgl); + let scene_prepare = Arc::new(ScenePreparer::new( + device.clone(), + queue.clone(), + texture_bgl, + )); let ui_renderer = UiRenderer::new(device.clone(), queue.clone(), surface_configuration.format); @@ -106,6 +115,16 @@ impl<'a> Renderer<'a> { }); let depth = depth.create_view(&TextureViewDescriptor::default()); + { + let scene_prepare = scene_prepare.clone(); + spawn(move || { + loop { + scene_prepare.update(&downloader).unwrap(); + sleep(Duration::from_millis(50)); + } + }); + } + Ok(Self { scene_pipeline, scene_prepare, @@ -170,7 +189,7 @@ impl<'a> Renderer<'a> { &target_view, &self.depth, scene, - &mut self.scene_prepare.prefabs, + &self.scene_prepare.prefabs, projection, ); |