nightshade 0.13.1

A cross-platform data-oriented game engine.
Documentation
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;
    }
}