Skip to main content

easy_gpu/assets/
texture.rs

1use wgpu::{Extent3d, FilterMode, Sampler, TextureDimension, TextureFormat, TextureUsages};
2use crate::assets_manager::Handle;
3use crate::Renderer;
4
5pub struct Texture {
6    pub(crate) texture: wgpu::Texture,
7    pub(crate) view: wgpu::TextureView,
8}
9
10impl Texture{
11    pub(crate) fn new(texture: wgpu::Texture,view: wgpu::TextureView) -> Self{
12        Self{
13            texture,
14            view,
15        }
16    }
17}
18
19pub struct TextureBuilder{
20    size: Extent3d,
21    dimension: TextureDimension,
22    format: TextureFormat,
23    usage: TextureUsages,
24}
25impl TextureBuilder{
26    pub fn new()->Self{
27        Self{
28            size: Extent3d {
29                width: 128,
30                height: 128,
31                depth_or_array_layers: 1,
32            },
33            dimension: TextureDimension::D2,
34            format: TextureFormat::Rgba8Unorm,
35            usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST,
36        }
37    }
38
39    pub fn size(mut self, size: Extent3d) -> Self{
40        self.size = size;
41        self
42    }
43
44    pub fn dimension_3d(mut self) -> Self{
45        self.dimension = TextureDimension::D3;
46        self
47    }
48
49    pub fn usage(mut self, usage: TextureUsages) -> Self{
50        self.usage = usage;
51        self
52    }
53
54    pub fn format(mut self, format: TextureFormat) -> Self{
55        self.format = format;
56        self
57    }
58
59    pub fn build(self,renderer: &mut Renderer) -> Handle<Texture>{
60        let tex = renderer.device.create_texture(&wgpu::TextureDescriptor{
61            label: Some("texture"),
62            size: self.size,
63            mip_level_count: 1,
64            sample_count: 1,
65            dimension: self.dimension,
66            format: self.format,
67            usage: self.usage,
68            view_formats: &[],
69        });
70        let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
71
72        renderer.asset_manager.textures.insert(Texture::new(tex,view))
73    }
74}
75
76pub struct SamplerBuilder{
77    mag_filter: FilterMode,
78}
79impl SamplerBuilder{
80    pub fn new()-> Self{
81        Self{
82            mag_filter: FilterMode::Linear,
83        }
84    }
85
86    pub fn filter_mode(mut self,filter_mode: FilterMode)-> Self{
87        self.mag_filter = filter_mode;
88        self
89    }
90    pub fn build(self,renderer: &mut Renderer) -> Handle<Sampler>{
91        let sampler = renderer.device.create_sampler(&wgpu::SamplerDescriptor{
92            label: Some("sampler"),
93            address_mode_u: Default::default(),
94            address_mode_v: Default::default(),
95            address_mode_w: Default::default(),
96            mag_filter: self.mag_filter,
97            min_filter: Default::default(),
98            mipmap_filter: Default::default(),
99            lod_min_clamp: 0.0,
100            lod_max_clamp: 0.0,
101            compare: None,
102            anisotropy_clamp: 1,
103            border_color: None,
104        });
105        renderer.asset_manager.samplers.insert(sampler)
106    }
107}