Skip to main content

easy_gpu/assets/
texture.rs

1use wgpu::{Extent3d, FilterMode, 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 Default for TextureBuilder {
26    fn default() -> Self {
27        Self::new()
28    }
29}
30
31impl TextureBuilder{
32    pub fn new()->Self{
33        Self{
34            size: Extent3d {
35                width: 128,
36                height: 128,
37                depth_or_array_layers: 1,
38            },
39            dimension: TextureDimension::D2,
40            format: TextureFormat::Rgba8Unorm,
41            usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST,
42        }
43    }
44
45    pub fn size(mut self, size: Extent3d) -> Self{
46        self.size = size;
47        self
48    }
49
50    pub fn dimension_3d(mut self) -> Self{
51        self.dimension = TextureDimension::D3;
52        self
53    }
54
55    pub fn usage(mut self, usage: TextureUsages) -> Self{
56        self.usage = usage;
57        self
58    }
59
60    pub fn format(mut self, format: TextureFormat) -> Self{
61        self.format = format;
62        self
63    }
64
65    pub fn build(&self,renderer: &mut Renderer) -> Handle<Texture>{
66        let tex = renderer.device.create_texture(&wgpu::TextureDescriptor{
67            label: Some("texture"),
68            size: self.size,
69            mip_level_count: 1,
70            sample_count: 1,
71            dimension: self.dimension,
72            format: self.format,
73            usage: self.usage,
74            view_formats: &[],
75        });
76        let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
77
78        renderer.asset_manager.textures.insert(Texture::new(tex,view))
79    }
80}
81
82pub struct SamplerBuilder{
83    mag_filter: FilterMode,
84}
85impl Default for SamplerBuilder {
86    fn default() -> Self {
87        Self::new()
88    }
89}
90
91impl SamplerBuilder{
92    pub fn new()-> Self{
93        Self{
94            mag_filter: FilterMode::Linear,
95        }
96    }
97
98    pub fn filter_mode(mut self,filter_mode: FilterMode)-> Self{
99        self.mag_filter = filter_mode;
100        self
101    }
102    pub fn build(&self,renderer: &mut Renderer) -> Handle<Sampler>{
103        let sampler = renderer.device.create_sampler(&wgpu::SamplerDescriptor{
104            label: Some("sampler"),
105            address_mode_u: Default::default(),
106            address_mode_v: Default::default(),
107            address_mode_w: Default::default(),
108            mag_filter: self.mag_filter,
109            min_filter: Default::default(),
110            mipmap_filter: Default::default(),
111            lod_min_clamp: 0.0,
112            lod_max_clamp: 0.0,
113            compare: None,
114            anisotropy_clamp: 1,
115            border_color: None,
116        });
117        renderer.asset_manager.samplers.insert(Sampler{sampler})
118    }
119}
120
121pub struct Sampler{
122    pub(crate) sampler: wgpu::Sampler
123}