summaryrefslogtreecommitdiff
path: root/src/renderer/instances.rs
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-09-09 22:29:14 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-09-10 19:11:27 -0700
commit054c967e4a06bbbf79359bae701e1b467625839c (patch)
treeb03cacbfbca32fc0b55772cd269422fa65e9803e /src/renderer/instances.rs
parentba59c1a12f2c1ee39b32736953844e6158282c88 (diff)
lightingHEADmaster
Diffstat (limited to 'src/renderer/instances.rs')
-rw-r--r--src/renderer/instances.rs140
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,