use super::{CachedOitState, MeshPass};
impl MeshPass {
pub fn resize(&mut self, device: &wgpu::Device, width: u32, height: u32) {
if self.oit_texture_size == (width, height) || width == 0 || height == 0 {
return;
}
self.resize_full_rebuild_pending = true;
let old_size = self.oit_texture_size;
self.cached_oit_states.insert(
old_size,
CachedOitState {
oit_accum_texture: self.oit_accum_texture.clone(),
oit_accum_view: self.oit_accum_view.clone(),
oit_reveal_texture: self.oit_reveal_texture.clone(),
oit_reveal_view: self.oit_reveal_view.clone(),
oit_composite_bind_group: self.oit_composite_bind_group.clone(),
overlay_depth_texture: self.overlay_depth_texture.clone(),
overlay_depth_view: self.overlay_depth_view.clone(),
},
);
self.oit_texture_size = (width, height);
if let Some(cached) = self.cached_oit_states.remove(&(width, height)) {
self.oit_accum_texture = cached.oit_accum_texture;
self.oit_accum_view = cached.oit_accum_view;
self.oit_reveal_texture = cached.oit_reveal_texture;
self.oit_reveal_view = cached.oit_reveal_view;
self.oit_composite_bind_group = cached.oit_composite_bind_group;
self.overlay_depth_texture = cached.overlay_depth_texture;
self.overlay_depth_view = cached.overlay_depth_view;
if let Some(world_state) = self.world_states.get_mut(&self.current_world_id)
&& let Some(gpu) = world_state.gpu_buffers.as_mut()
{
gpu.culling_bind_group = None;
gpu.phase1_culling_bind_group = None;
}
if !self.preserve_hiz {
self.hiz_pass.resize(device, width, height);
}
return;
}
self.oit_accum_texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("OIT Accumulation Texture"),
size: wgpu::Extent3d {
width,
height,
depth_or_array_layers: 1,
},
mip_level_count: 1,
sample_count: 1,
dimension: wgpu::TextureDimension::D2,
format: wgpu::TextureFormat::Rgba16Float,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
view_formats: &[],
});
self.oit_reveal_texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("OIT Reveal Texture"),
size: wgpu::Extent3d {
width,
height,
depth_or_array_layers: 1,
},
mip_level_count: 1,
sample_count: 1,
dimension: wgpu::TextureDimension::D2,
format: wgpu::TextureFormat::R8Unorm,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
view_formats: &[],
});
self.oit_accum_view = self
.oit_accum_texture
.create_view(&wgpu::TextureViewDescriptor::default());
self.oit_reveal_view = self
.oit_reveal_texture
.create_view(&wgpu::TextureViewDescriptor::default());
self.overlay_depth_texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Overlay Depth Texture"),
size: wgpu::Extent3d {
width,
height,
depth_or_array_layers: 1,
},
mip_level_count: 1,
sample_count: 1,
dimension: wgpu::TextureDimension::D2,
format: wgpu::TextureFormat::Depth32Float,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
view_formats: &[],
});
self.overlay_depth_view = self
.overlay_depth_texture
.create_view(&wgpu::TextureViewDescriptor::default());
self.oit_composite_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
label: Some("OIT Composite Bind Group"),
layout: &self.oit_composite_bind_group_layout,
entries: &[
wgpu::BindGroupEntry {
binding: 0,
resource: wgpu::BindingResource::TextureView(&self.oit_accum_view),
},
wgpu::BindGroupEntry {
binding: 1,
resource: wgpu::BindingResource::Sampler(&self.oit_sampler),
},
wgpu::BindGroupEntry {
binding: 2,
resource: wgpu::BindingResource::TextureView(&self.oit_reveal_view),
},
wgpu::BindGroupEntry {
binding: 3,
resource: wgpu::BindingResource::Sampler(&self.oit_sampler),
},
],
});
if let Some(world_state) = self.world_states.get_mut(&self.current_world_id)
&& let Some(gpu) = world_state.gpu_buffers.as_mut()
{
gpu.culling_bind_group = None;
gpu.phase1_culling_bind_group = None;
}
if !self.preserve_hiz {
self.hiz_pass.resize(device, width, height);
}
}
pub fn update_ibl_textures(
&mut self,
brdf_lut_view: wgpu::TextureView,
irradiance_view: wgpu::TextureView,
prefiltered_view: wgpu::TextureView,
) {
self.brdf_lut_view = brdf_lut_view.clone();
self.irradiance_view = irradiance_view.clone();
self.prefiltered_view = prefiltered_view.clone();
if let Some(world_state) = self.world_states.get_mut(&self.current_world_id) {
world_state.ibl_brdf_lut_view = Some(brdf_lut_view);
world_state.ibl_irradiance_view = Some(irradiance_view);
world_state.ibl_prefiltered_view = Some(prefiltered_view);
world_state.ibl_dirty = true;
}
}
pub fn update_ibl_textures_blended(
&mut self,
brdf_lut_view: wgpu::TextureView,
irradiance_a: wgpu::TextureView,
prefiltered_a: wgpu::TextureView,
irradiance_b: wgpu::TextureView,
prefiltered_b: wgpu::TextureView,
blend_factor: f32,
) {
self.brdf_lut_view = brdf_lut_view.clone();
self.irradiance_view = irradiance_a.clone();
self.prefiltered_view = prefiltered_a.clone();
self.irradiance_b_view = irradiance_b.clone();
self.prefiltered_b_view = prefiltered_b.clone();
if let Some(world_state) = self.world_states.get_mut(&self.current_world_id) {
world_state.ibl_brdf_lut_view = Some(brdf_lut_view);
world_state.ibl_irradiance_view = Some(irradiance_a);
world_state.ibl_prefiltered_view = Some(prefiltered_a);
world_state.ibl_irradiance_b_view = Some(irradiance_b);
world_state.ibl_prefiltered_b_view = Some(prefiltered_b);
world_state.ibl_blend_factor = blend_factor;
world_state.ibl_dirty = true;
}
}
pub fn update_ibl_textures_for_world(
&mut self,
world_id: u64,
brdf_lut_view: wgpu::TextureView,
irradiance_view: wgpu::TextureView,
prefiltered_view: wgpu::TextureView,
) {
if let Some(world_state) = self.world_states.get_mut(&world_id) {
world_state.ibl_brdf_lut_view = Some(brdf_lut_view);
world_state.ibl_irradiance_view = Some(irradiance_view);
world_state.ibl_prefiltered_view = Some(prefiltered_view);
world_state.ibl_dirty = true;
}
}
pub fn update_point_shadow_cubemap(&mut self, view: wgpu::TextureView) {
self.point_shadow_cubemap_view = view;
}
}