tufa 0.1.0

A wgpu abstraction layer.
Documentation
use wgpu::{AddressMode, BindingType, FilterMode, SamplerBindingType, SamplerDescriptor};

use crate::{gpu::Gpu, misc::ids::SamplerId};

use super::{Bindable, BindableResourceId};

pub struct Sampler {
    gpu: Gpu,

    pub(crate) id: SamplerId,
}

impl Gpu {
    pub fn create_sampler(&self) -> Sampler {
        let sampler = self.device.create_sampler(&SamplerDescriptor {
            label: None,
            address_mode_u: AddressMode::Repeat,
            address_mode_v: AddressMode::Repeat,
            address_mode_w: AddressMode::Repeat,
            mag_filter: FilterMode::Linear,
            min_filter: FilterMode::Linear,
            mipmap_filter: FilterMode::Linear,
            lod_min_clamp: 0.0,
            lod_max_clamp: 0.0,
            compare: None,
            anisotropy_clamp: 1,
            border_color: None,
        });

        let id = SamplerId::new();
        self.binding_manager.add_resource(id, sampler);

        Sampler {
            gpu: self.clone(),
            id,
        }
    }
}

impl Bindable for Sampler {
    fn resource_id(&self) -> BindableResourceId {
        BindableResourceId::Sampler(self.id)
    }

    fn binding_type(&self) -> BindingType {
        BindingType::Sampler(SamplerBindingType::Filtering)
    }
}

impl Drop for Sampler {
    fn drop(&mut self) {
        self.gpu.binding_manager.remove_resource(self.id);
    }
}