use super::super::types::BlendedIblViews;
use super::SkinnedMeshPass;
impl SkinnedMeshPass {
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);
}
}
pub fn update_ibl_textures_blended_for_world(&mut self, world_id: u64, views: BlendedIblViews) {
if let Some(world_state) = self.world_states.get_mut(&world_id) {
world_state.ibl_brdf_lut_view = Some(views.brdf_lut);
world_state.ibl_irradiance_view = Some(views.irradiance_a);
world_state.ibl_prefiltered_view = Some(views.prefiltered_a);
world_state.ibl_irradiance_b_view = Some(views.irradiance_b);
world_state.ibl_prefiltered_b_view = Some(views.prefiltered_b);
world_state.ibl_blend_factor = views.blend_factor;
}
}
pub fn set_ibl_textures(
&mut self,
brdf_lut_view: wgpu::TextureView,
irradiance_map_view: wgpu::TextureView,
prefiltered_env_view: wgpu::TextureView,
) {
self.brdf_lut_view = Some(brdf_lut_view);
self.irradiance_map_view = Some(irradiance_map_view);
self.prefiltered_env_view = Some(prefiltered_env_view);
}
pub fn update_point_shadow_cubemap(&mut self, view: wgpu::TextureView) {
self.point_shadow_cubemap_view = view;
}
pub fn cleanup_stale_world_states(&mut self) {
const STALE_THRESHOLD_FRAMES: u64 = 300;
let current_frame = self.frame_counter;
self.world_states.retain(|world_id, state| {
let is_current = *world_id == self.current_world_id;
let is_recent =
current_frame.saturating_sub(state.last_used_frame) < STALE_THRESHOLD_FRAMES;
is_current || is_recent
});
}
pub fn resize_oit_textures(&mut self, device: &wgpu::Device, width: u32, height: u32) {
if self.oit_texture_size == (width, height) || width == 0 || height == 0 {
return;
}
self.oit_accum_texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Skinned Mesh OIT Accum 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_accum_view = self
.oit_accum_texture
.create_view(&wgpu::TextureViewDescriptor::default());
self.oit_reveal_texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Skinned Mesh 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::R16Float,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
view_formats: &[],
});
self.oit_reveal_view = self
.oit_reveal_texture
.create_view(&wgpu::TextureViewDescriptor::default());
self.oit_texture_size = (width, height);
}
}