diff options
Diffstat (limited to 'src/renderer/instances.rs')
| -rw-r--r-- | src/renderer/instances.rs | 140 |
1 files changed, 119 insertions, 21 deletions
diff --git a/src/renderer/instances.rs b/src/renderer/instances.rs index 1292b99..7454bc7 100644 --- a/src/renderer/instances.rs +++ b/src/renderer/instances.rs @@ -38,18 +38,89 @@ struct RendererInstance { _padding: u32, } +fn create_instance_bind_group( + device: &wgpu::Device, + layout: &wgpu::BindGroupLayout, + camera_uniform_buffer: &wgpu::Buffer, + palette_buffer: &wgpu::Buffer, + instance_buffer: &wgpu::Buffer, + cell_buffer: &wgpu::Buffer, + lighting_texture: &wgpu::TextureView, + sampler: &wgpu::Sampler, + lighting_uniform_buffer: &wgpu::Buffer, +) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Some("Instance bind group"), + layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: camera_uniform_buffer.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: palette_buffer.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: instance_buffer.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 3, + resource: cell_buffer.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 4, + resource: wgpu::BindingResource::TextureView(lighting_texture), + }, + wgpu::BindGroupEntry { + binding: 5, + resource: wgpu::BindingResource::Sampler(sampler), + }, + wgpu::BindGroupEntry { + binding: 6, + resource: lighting_uniform_buffer.as_entire_binding(), + }, + ], + }) +} + pub struct InstancesRendererState { instance_pipeline: wgpu::RenderPipeline, + instance_bind_group_layout: wgpu::BindGroupLayout, + camera_uniform_buffer: wgpu::Buffer, + palette_buffer: wgpu::Buffer, instance_buffer: wgpu::Buffer, cell_buffer: wgpu::Buffer, instance_bind_group: wgpu::BindGroup, entity_capacity: usize, + sampler: wgpu::Sampler, renderer_entities: FxHashMap<EntityId, usize>, instances_count: usize, } impl InstancesRendererState { + /// Rebind the lighting resources, needed whenever the lighting texture is recreated. + pub fn rebuild_bind_group( + &mut self, + device: &wgpu::Device, + lighting_texture: &wgpu::TextureView, + lighting_uniform_buffer: &wgpu::Buffer, + ) { + self.instance_bind_group = create_instance_bind_group( + device, + &self.instance_bind_group_layout, + &self.camera_uniform_buffer, + &self.palette_buffer, + &self.instance_buffer, + &self.cell_buffer, + lighting_texture, + &self.sampler, + lighting_uniform_buffer, + ); + } + pub fn update_buffers( &mut self, device: &wgpu::Device, @@ -185,6 +256,8 @@ impl InstancesRendererState { surface_config: &wgpu::SurfaceConfiguration, camera_uniform_buffer: &wgpu::Buffer, palette_buffer: &wgpu::Buffer, + lighting_texture: &wgpu::TextureView, + lighting_uniform_buffer: &wgpu::Buffer, ) -> Self { let instance_shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { label: Some("Instance shader"), @@ -239,6 +312,35 @@ impl InstancesRendererState { count: None, visibility: wgpu::ShaderStages::FRAGMENT, }, + // lighting + wgpu::BindGroupLayoutEntry { + ty: wgpu::BindingType::Texture { + multisampled: false, + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + view_dimension: wgpu::TextureViewDimension::D2Array, + }, + binding: 4, + count: None, + visibility: wgpu::ShaderStages::FRAGMENT, + }, + // sampler + wgpu::BindGroupLayoutEntry { + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + binding: 5, + count: None, + visibility: wgpu::ShaderStages::FRAGMENT, + }, + // lighting uniform + wgpu::BindGroupLayoutEntry { + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + binding: 6, + count: None, + visibility: wgpu::ShaderStages::FRAGMENT, + }, ], }); @@ -288,35 +390,31 @@ impl InstancesRendererState { let cell_buffer = create_cell_buffer(&device, entity_capacity + CHUNK_SLOTS); - let instance_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - label: None, - layout: &instance_bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: camera_uniform_buffer.as_entire_binding(), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: palette_buffer.as_entire_binding(), - }, - wgpu::BindGroupEntry { - binding: 2, - resource: instance_buffer.as_entire_binding(), - }, - wgpu::BindGroupEntry { - binding: 3, - resource: cell_buffer.as_entire_binding(), - }, - ], + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + ..Default::default() }); + let instance_bind_group = create_instance_bind_group( + device, + &instance_bind_group_layout, + camera_uniform_buffer, + palette_buffer, + &instance_buffer, + &cell_buffer, + lighting_texture, + &sampler, + lighting_uniform_buffer, + ); InstancesRendererState { instance_pipeline, + instance_bind_group_layout, + camera_uniform_buffer: camera_uniform_buffer.clone(), + palette_buffer: palette_buffer.clone(), instance_buffer, cell_buffer, instance_bind_group, entity_capacity, + sampler, renderer_entities: FxHashMap::default(), instances_count: 0, |
