summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-12 19:51:45 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-12 19:51:45 +0100
commit40032198a2167f81de37dba31b7e4f98c6270be7 (patch)
treee7f20fa86deb3d0b526d1e2d843a126f77f958ff /client
parent7121bb7c49fcf5b24795c77100cb1ff46097ecb6 (diff)
downloadweareserver-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.rs9
-rw-r--r--client/src/scene_prepare.rs23
-rw-r--r--client/src/shader.wgsl5
-rw-r--r--client/src/ui.rs2
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(),
}),