From f6fa92e62f0c5ec2150ae22fcfb54c7dc49e5d9b Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 19 Jan 2025 16:55:16 +0100 Subject: client: labels and linear normal maps --- client/src/scene_prepare.rs | 47 ++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 16 deletions(-) (limited to 'client') diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index 4cf6c87..ad0f5e4 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -88,7 +88,7 @@ pub struct ScenePreparer { queue: Arc, texture_bgl: BindGroupLayout, - textures: DemandMap>, (Arc, Arc)>, + textures: DemandMap<(Resource>, bool), (Arc, Arc)>, placeholder_textures: DemandMap, Arc)>, index_buffers: DemandMap>, (Arc, u32)>, vertex_buffers: DemandMap>, Arc>, @@ -174,8 +174,8 @@ impl ScenePreparer { let start = Instant::now(); if let Some(buf) = dls.try_get(pres.clone())? { let buffer = self.device.create_buffer_init(&BufferInitDescriptor { + label: Some("index"), contents: bytemuck::cast_slice(buf.as_slice()), - label: None, usage: BufferUsages::INDEX | BufferUsages::COPY_DST, }); self.index_buffers.insert( @@ -196,7 +196,7 @@ impl ScenePreparer { if let Some(buf) = dls.try_get(pres.clone())? { let buffer = self.device.create_buffer_init(&BufferInitDescriptor { contents: bytemuck::cast_slice(buf.as_slice()), - label: None, + label: Some("vertex attribute"), usage: BufferUsages::VERTEX | BufferUsages::COPY_DST, }); self.vertex_buffers @@ -209,7 +209,7 @@ impl ScenePreparer { num_done += 1; } } - for pres in self.textures.needed() { + for (pres, linear) in self.textures.needed() { let start = Instant::now(); if let Some(buf) = dls.try_get(pres.clone())? { let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; @@ -224,8 +224,10 @@ impl ScenePreparer { &image, dims.0, dims.1, + linear, ); - self.textures.insert(pres.clone(), tex_bg, image.len()); + self.textures + .insert((pres.clone(), linear), tex_bg, image.len()); debug!( "texture created (res={}x{}, took {:?})", dims.0, @@ -236,11 +238,19 @@ impl ScenePreparer { } } for kind in self.placeholder_textures.needed() { - let color = match kind { - TextureIdentityKind::Normal => [128, 128, 255, 255], - TextureIdentityKind::Multiply => [255, 255, 255, 255], + let (linear, color) = match kind { + TextureIdentityKind::Normal => (true, [128, 128, 255, 255]), + TextureIdentityKind::Multiply => (false, [255, 255, 255, 255]), }; - let tex_bg = create_texture(&self.device, &self.queue, &self.texture_bgl, &color, 1, 1); + let tex_bg = create_texture( + &self.device, + &self.queue, + &self.texture_bgl, + &color, + 1, + 1, + linear, + ); self.placeholder_textures.insert(kind, tex_bg, 4); num_done += 1; } @@ -252,7 +262,7 @@ impl ScenePreparer { ) { let tangents = generate_tangents(&index, &position, &texcoord); let buffer = self.device.create_buffer_init(&BufferInitDescriptor { - label: None, + label: Some("generated tangent"), usage: BufferUsages::COPY_DST | BufferUsages::VERTEX, contents: bytemuck::cast_slice(tangents.as_slice()), }); @@ -270,7 +280,7 @@ impl ScenePreparer { ) { let normals = generate_normals(&index, &position); let buffer = self.device.create_buffer_init(&BufferInitDescriptor { - label: None, + label: Some("generated normal"), usage: BufferUsages::COPY_DST | BufferUsages::VERTEX, contents: bytemuck::cast_slice(normals.as_slice()), }); @@ -288,7 +298,7 @@ impl ScenePreparer { ) { let texcoords = generate_texcoords(&index, &position); let buffer = self.device.create_buffer_init(&BufferInitDescriptor { - label: None, + label: Some("generated texcoord"), usage: BufferUsages::COPY_DST | BufferUsages::VERTEX, contents: bytemuck::cast_slice(texcoords.as_slice()), }); @@ -337,7 +347,7 @@ impl ScenePreparer { let mut tex_albedo = None; if let Some(albedores) = part.tex_albedo { - if let Some((_tex, bg)) = self.textures.try_get(albedores) { + if let Some((_tex, bg)) = self.textures.try_get((albedores, false)) { tex_albedo = Some(bg) } } else { @@ -349,8 +359,8 @@ impl ScenePreparer { } } let mut tex_normal = None; - if let Some(albedores) = part.tex_normal { - if let Some((_tex, bg)) = self.textures.try_get(albedores) { + if let Some(normalres) = part.tex_normal { + if let Some((_tex, bg)) = self.textures.try_get((normalres, true)) { tex_normal = Some(bg) } } else { @@ -406,6 +416,7 @@ fn create_texture( data: &[u8], width: u32, height: u32, + linear: bool, ) -> (Arc, Arc) { let texture = device.create_texture_with_data( &queue, @@ -419,7 +430,11 @@ fn create_texture( mip_level_count: 1, sample_count: 1, dimension: TextureDimension::D2, - format: TextureFormat::Rgba8UnormSrgb, + format: if linear { + TextureFormat::Rgba8Unorm + } else { + TextureFormat::Rgba8UnormSrgb + }, usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST, view_formats: &[], }, -- cgit v1.2.3-70-g09d2