diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-12 19:51:45 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-12 19:51:45 +0100 |
commit | 40032198a2167f81de37dba31b7e4f98c6270be7 (patch) | |
tree | e7f20fa86deb3d0b526d1e2d843a126f77f958ff /client | |
parent | 7121bb7c49fcf5b24795c77100cb1ff46097ecb6 (diff) | |
download | weareserver-40032198a2167f81de37dba31b7e4f98c6270be7.tar weareserver-40032198a2167f81de37dba31b7e4f98c6270be7.tar.bz2 weareserver-40032198a2167f81de37dba31b7e4f98c6270be7.tar.zst |
parallel prepare threads and dither alpha
Diffstat (limited to 'client')
-rw-r--r-- | client/src/renderer.rs | 9 | ||||
-rw-r--r-- | client/src/scene_prepare.rs | 23 | ||||
-rw-r--r-- | client/src/shader.wgsl | 5 | ||||
-rw-r--r-- | client/src/ui.rs | 2 |
4 files changed, 26 insertions, 13 deletions
diff --git a/client/src/renderer.rs b/client/src/renderer.rs index 473349d..3359b4e 100644 --- a/client/src/renderer.rs +++ b/client/src/renderer.rs @@ -115,12 +115,15 @@ impl<'a> Renderer<'a> { }); let depth = depth.create_view(&TextureViewDescriptor::default()); - { + for _ in 0..2 { let scene_prepare = scene_prepare.clone(); + let downloader = downloader.clone(); spawn(move || { loop { - scene_prepare.update(&downloader).unwrap(); - sleep(Duration::from_millis(50)); + let ndone = scene_prepare.update(&downloader).unwrap(); + if ndone == 0 { + sleep(Duration::from_millis(50)); + } } }); } diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index 57d44b0..cf94bbf 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -114,7 +114,8 @@ impl ScenePreparer { queue, } } - pub fn update(&self, dls: &Downloader) -> Result<()> { + pub fn update(&self, dls: &Downloader) -> Result<usize> { + let mut num_done = 0; for pres in self.prefabs.needed() { if let Some(prefab) = dls.try_get(pres.clone())? { let mut rprefab = RPrefab(Vec::new()); @@ -126,6 +127,7 @@ impl ScenePreparer { if rprefab.0.len() == prefab.mesh.len() { self.prefabs.insert(pres.clone(), Arc::new(rprefab)); debug!("prefab created ({pres})"); + num_done += 1; } } } @@ -151,6 +153,7 @@ impl ScenePreparer { buf.len() / size_of::<u32>(), start.elapsed(), ); + num_done += 1; } } for pres in self.vertex_buffers.needed() { @@ -174,6 +177,7 @@ impl ScenePreparer { buf.len() / size_of::<f32>(), start.elapsed() ); + num_done += 1; } } for pres in self.textures.needed() { @@ -182,15 +186,15 @@ impl ScenePreparer { let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; let image = image.decode()?; let dims = (image.width(), image.height()); - let image = image.to_rgba8(); - let image_raw = image.to_vec(); + let image = image.into_rgba8(); + let image = image.into_vec(); let tex_bg = create_texture( &self.device, &self.queue, &self.texture_bgl, - &image_raw, - image.width(), - image.height(), + &image, + dims.0, + dims.1, ); self.textures.insert(pres.clone(), tex_bg); debug!( @@ -198,7 +202,8 @@ impl ScenePreparer { dims.0, dims.1, start.elapsed() - ) + ); + num_done += 1; } } for variant in self.placeholder_textures.needed() { @@ -212,6 +217,7 @@ impl ScenePreparer { 1, ); self.placeholder_textures.insert(variant, tex_bg); + num_done += 1; } for pres in self.mesh_parts.needed() { let start = Instant::now(); @@ -286,11 +292,12 @@ impl ScenePreparer { tex_normal, }), ); + num_done += 1; } } } } - Ok(()) + Ok(num_done) } } diff --git a/client/src/shader.wgsl b/client/src/shader.wgsl index 7ed6c0e..993c9b5 100644 --- a/client/src/shader.wgsl +++ b/client/src/shader.wgsl @@ -50,5 +50,8 @@ fn fs_main(vo: VertexOut) -> @location(0) vec4<f32> { let color = t_albedo.rgb * lighting; // let color = vo.normal + t_normal.rgb; - return vec4(color, alpha); + if fract(dot(sin(vo.clip * 123.) * 1213., vec4(3., 2., 1., 4.))) > alpha { + discard; + } + return vec4(color, 1.); } diff --git a/client/src/ui.rs b/client/src/ui.rs index a5ff775..aa062fe 100644 --- a/client/src/ui.rs +++ b/client/src/ui.rs @@ -131,7 +131,7 @@ impl UiRenderer { depth_stencil: Some(DepthStencilState { format: TextureFormat::Depth32Float, depth_write_enabled: false, - depth_compare: CompareFunction::Always, + depth_compare: CompareFunction::LessEqual, stencil: Default::default(), bias: Default::default(), }), |