summaryrefslogtreecommitdiff
path: root/client/src/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/renderer.rs')
-rw-r--r--client/src/renderer.rs31
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,
);