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