easy_gpu/assets/
texture.rs1use 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}