pub struct TextureBuilder<'a> { /* private fields */ }Implementations§
Source§impl<'a> TextureBuilder<'a>
impl<'a> TextureBuilder<'a>
Sourcepub fn set_file_data(self, data: &'a [u8]) -> Self
pub fn set_file_data(self, data: &'a [u8]) -> Self
Sets the texture data from a file byte data.
Sourcepub fn set_raw_image(
self,
data: &'a [u8],
size: Point2,
format: TextureFormat,
) -> Self
pub fn set_raw_image( self, data: &'a [u8], size: Point2, format: TextureFormat, ) -> Self
Initializes a texture with raw image data.
Examples found in repository?
61fn main() {
62 let mut runner = est_render::runner::new().expect("Failed to create runner");
63 let mut window = runner
64 .create_window("Engine Example", Point2::new(800, 600))
65 .build()
66 .expect("Failed to create window");
67
68 let mut gpu = est_render::gpu::new(Some(&mut window))
69 .build()
70 .expect("Failed to create GPU");
71
72 let mut msaa_texture = gpu
73 .create_texture()
74 .set_render_target(Point2::new(800, 600), None)
75 .set_sample_count(SampleCount::SampleCount4)
76 .build()
77 .expect("Failed to create MSAA texture");
78
79 let blank_texture = gpu
80 .create_texture()
81 .set_raw_image(
82 &[255u8; 4],
83 Point2::new(1, 1),
84 TextureFormat::Bgra8Unorm,
85 )
86 .set_usage(TextureUsage::Sampler)
87 .build()
88 .expect("Failed to create blank texture");
89
90 let shader = gpu
91 .create_graphics_shader()
92 .set_vertex_code(VERTEX_DRAWING_SHADER)
93 .set_fragment_code(FRAGMENT_DRAWING_SHADER)
94 .build()
95 .expect("Failed to create graphics shader");
96
97 let compute_shader = gpu
98 .create_compute_shader()
99 .set_source(COMPUTE_NOOP_SHADER)
100 .build()
101 .expect("Failed to create compute shader");
102
103 let pipeline = gpu
104 .create_render_pipeline()
105 .set_shader(Some(&shader))
106 .set_blend(Some(&BlendState::ALPHA_BLEND))
107 .set_attachment_texture(0, 0, Some(&blank_texture))
108 .set_attachment_sampler(0, 1, Some(&TextureSampler::DEFAULT))
109 .build()
110 .expect("Failed to create render pipeline");
111
112 let compute_pipeline = gpu
113 .create_compute_pipeline()
114 .set_shader(Some(&compute_shader))
115 .build()
116 .expect("Failed to create compute pipeline");
117
118 // Triangle vertices
119 let vertices = vec![
120 Vertex {
121 position: Vector3::new(-0.5, -0.5, 0.0),
122 color: Color::new(1.0, 0.0, 0.0, 1.0),
123 texcoord: Vector2::new(0.0, 1.0),
124 },
125 Vertex {
126 position: Vector3::new(0.5, -0.5, 0.0),
127 color: Color::new(0.0, 1.0, 0.0, 1.0),
128 texcoord: Vector2::new(1.0, 1.0),
129 },
130 Vertex {
131 position: Vector3::new(0.0, 0.5, 0.0),
132 color: Color::new(0.0, 0.0, 1.0, 1.0),
133 texcoord: Vector2::new(0.5, 0.0),
134 },
135 ];
136
137 let indexes = vec![0u16, 1u16, 2u16];
138
139 let vbo = gpu
140 .create_buffer()
141 .set_data_vec(vertices)
142 .set_usage(BufferUsage::VERTEX)
143 .build()
144 .expect("Failed to create vertex buffer");
145
146 let ibo = gpu
147 .create_buffer()
148 .set_data_vec(indexes)
149 .set_usage(BufferUsage::INDEX)
150 .build()
151 .expect("Failed to create index buffer");
152
153 while runner.pool_events(PollMode::WaitDraw) {
154 for event in runner.get_events() {
155 match event {
156 Event::KeyboardInput {
157 window_id,
158 key,
159 pressed,
160 } => {
161 if *window_id == window.id() && key == "Escape" && *pressed {
162 window.quit();
163 }
164 }
165 Event::WindowResized { window_id: _, size } => {
166 if size.x <= 0 || size.y <= 0 {
167 continue; // Skip invalid sizes
168 }
169
170 msaa_texture = gpu
171 .create_texture()
172 .set_render_target(Point2::new(size.x as u32, size.y as u32), None)
173 .set_sample_count(SampleCount::SampleCount4)
174 .build()
175 .expect("Failed to resize MSAA texture");
176 }
177 Event::RedrawRequested { window_id: _ } => {
178 if let Ok(mut cmd) = gpu.begin_command() {
179 if let Ok(mut cm) = cmd.begin_computepass() {
180 cm.set_pipeline(Some(&compute_pipeline));
181 cm.dispatch(1, 1, 1);
182 }
183
184 if let Ok(mut rp) = cmd.begin_renderpass() {
185 rp.set_clear_color(Color::BLACK);
186 rp.push_msaa_texture(&msaa_texture);
187
188 rp.set_pipeline(Some(&pipeline));
189 rp.set_gpu_buffer(Some(&vbo), Some(&ibo));
190 rp.draw_indexed(0..3, 0, 1);
191 }
192 }
193
194 window.request_redraw();
195 }
196 _ => {}
197 }
198 }
199 }
200}Sourcepub fn set_render_target(
self,
size: Point2,
format: Option<TextureFormat>,
) -> Self
pub fn set_render_target( self, size: Point2, format: Option<TextureFormat>, ) -> Self
Initializes a texture as a render target.
This method sets the texture as a render target with the specified size and format. The size must be non-zero, and the format can be specified or defaulted to the swapchain format or RGBA8_UNORM_SRGB if the swapchain format is not available.
Examples found in repository?
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7 let mut window = runner
8 .create_window("Engine Example", Point2::new(800, 600))
9 .build()
10 .expect("Failed to create window");
11
12 let mut gpu = est_render::gpu::new(Some(&mut window))
13 .build()
14 .expect("Failed to create GPU");
15
16 let mut msaa_texture = Some(
17 gpu.create_texture()
18 .set_render_target(Point2::new(800, 600), None)
19 .set_usage(TextureUsage::Sampler)
20 .set_sample_count(SampleCount::SampleCount4)
21 .build()
22 .expect("Failed to create MSAA texture"),
23 );
24
25 let mut msaa_count = SampleCount::SampleCount4;
26 let mut window_size = Point2::new(800, 600);
27
28 while runner.pool_events(None) {
29 for event in runner.get_events() {
30 match event {
31 Event::WindowClosed { .. } => {
32 return;
33 }
34 Event::KeyboardInput { key, pressed, .. } => {
35 if !*pressed {
36 continue;
37 }
38
39 let mut need_recreate = false;
40 if *key == "1" {
41 msaa_count = SampleCount::SampleCount1;
42 need_recreate = true;
43 }
44
45 if *key == "2" {
46 msaa_count = SampleCount::SampleCount2;
47 need_recreate = true;
48 }
49
50 if *key == "3" {
51 msaa_count = SampleCount::SampleCount4;
52 need_recreate = true;
53 }
54
55 if *key == "4" {
56 msaa_count = SampleCount::SampleCount8;
57 need_recreate = true;
58 }
59
60 if need_recreate {
61 if msaa_count == SampleCount::SampleCount1 {
62 msaa_texture = None;
63 } else {
64 msaa_texture = Some(
65 gpu.create_texture()
66 .set_render_target(
67 Point2::new(window_size.x, window_size.y),
68 None,
69 )
70 .set_usage(TextureUsage::Sampler)
71 .set_sample_count(msaa_count)
72 .build()
73 .expect("Failed to recreate MSAA texture"),
74 );
75 }
76 }
77 }
78 Event::WindowResized { size, .. } => {
79 if size.x <= 0 || size.y <= 0 {
80 eprintln!("Invalid window size: {:?}", size);
81 continue;
82 }
83
84 window_size = *size;
85
86 // Resize the MSAA texture to match the new window size
87 msaa_texture = Some(
88 gpu.create_texture()
89 .set_render_target(Point2::new(size.x, size.y), None)
90 .set_usage(TextureUsage::Sampler)
91 .set_sample_count(msaa_count)
92 .build()
93 .expect("Failed to resize MSAA texture"),
94 );
95 }
96 _ => {}
97 }
98 }
99
100 if let Ok(mut cmd) = gpu.begin_command() {
101 if let Ok(mut rp) = cmd.begin_renderpass() {
102 rp.set_clear_color(Color::BLACK);
103 if let Some(texture) = msaa_texture.as_ref() {
104 rp.push_msaa_texture(texture);
105 }
106
107 if let Some(mut drawing) = rp.begin_drawing() {
108 let pos1 = Vector2::new(0.0, 0.0);
109 let pos2 = Vector2::new(800.0, 0.0);
110 let pos3 = Vector2::new(400.0, 600.0);
111
112 // Draw a full triangle covering the window
113 drawing.draw_triangle_filled(pos1, pos2, pos3, Color::BLUE);
114 }
115 }
116 }
117 }
118}More examples
61fn main() {
62 let mut runner = est_render::runner::new().expect("Failed to create runner");
63 let mut window = runner
64 .create_window("Engine Example", Point2::new(800, 600))
65 .build()
66 .expect("Failed to create window");
67
68 let mut gpu = est_render::gpu::new(Some(&mut window))
69 .build()
70 .expect("Failed to create GPU");
71
72 let mut msaa_texture = gpu
73 .create_texture()
74 .set_render_target(Point2::new(800, 600), None)
75 .set_sample_count(SampleCount::SampleCount4)
76 .build()
77 .expect("Failed to create MSAA texture");
78
79 let blank_texture = gpu
80 .create_texture()
81 .set_raw_image(
82 &[255u8; 4],
83 Point2::new(1, 1),
84 TextureFormat::Bgra8Unorm,
85 )
86 .set_usage(TextureUsage::Sampler)
87 .build()
88 .expect("Failed to create blank texture");
89
90 let shader = gpu
91 .create_graphics_shader()
92 .set_vertex_code(VERTEX_DRAWING_SHADER)
93 .set_fragment_code(FRAGMENT_DRAWING_SHADER)
94 .build()
95 .expect("Failed to create graphics shader");
96
97 let compute_shader = gpu
98 .create_compute_shader()
99 .set_source(COMPUTE_NOOP_SHADER)
100 .build()
101 .expect("Failed to create compute shader");
102
103 let pipeline = gpu
104 .create_render_pipeline()
105 .set_shader(Some(&shader))
106 .set_blend(Some(&BlendState::ALPHA_BLEND))
107 .set_attachment_texture(0, 0, Some(&blank_texture))
108 .set_attachment_sampler(0, 1, Some(&TextureSampler::DEFAULT))
109 .build()
110 .expect("Failed to create render pipeline");
111
112 let compute_pipeline = gpu
113 .create_compute_pipeline()
114 .set_shader(Some(&compute_shader))
115 .build()
116 .expect("Failed to create compute pipeline");
117
118 // Triangle vertices
119 let vertices = vec![
120 Vertex {
121 position: Vector3::new(-0.5, -0.5, 0.0),
122 color: Color::new(1.0, 0.0, 0.0, 1.0),
123 texcoord: Vector2::new(0.0, 1.0),
124 },
125 Vertex {
126 position: Vector3::new(0.5, -0.5, 0.0),
127 color: Color::new(0.0, 1.0, 0.0, 1.0),
128 texcoord: Vector2::new(1.0, 1.0),
129 },
130 Vertex {
131 position: Vector3::new(0.0, 0.5, 0.0),
132 color: Color::new(0.0, 0.0, 1.0, 1.0),
133 texcoord: Vector2::new(0.5, 0.0),
134 },
135 ];
136
137 let indexes = vec![0u16, 1u16, 2u16];
138
139 let vbo = gpu
140 .create_buffer()
141 .set_data_vec(vertices)
142 .set_usage(BufferUsage::VERTEX)
143 .build()
144 .expect("Failed to create vertex buffer");
145
146 let ibo = gpu
147 .create_buffer()
148 .set_data_vec(indexes)
149 .set_usage(BufferUsage::INDEX)
150 .build()
151 .expect("Failed to create index buffer");
152
153 while runner.pool_events(PollMode::WaitDraw) {
154 for event in runner.get_events() {
155 match event {
156 Event::KeyboardInput {
157 window_id,
158 key,
159 pressed,
160 } => {
161 if *window_id == window.id() && key == "Escape" && *pressed {
162 window.quit();
163 }
164 }
165 Event::WindowResized { window_id: _, size } => {
166 if size.x <= 0 || size.y <= 0 {
167 continue; // Skip invalid sizes
168 }
169
170 msaa_texture = gpu
171 .create_texture()
172 .set_render_target(Point2::new(size.x as u32, size.y as u32), None)
173 .set_sample_count(SampleCount::SampleCount4)
174 .build()
175 .expect("Failed to resize MSAA texture");
176 }
177 Event::RedrawRequested { window_id: _ } => {
178 if let Ok(mut cmd) = gpu.begin_command() {
179 if let Ok(mut cm) = cmd.begin_computepass() {
180 cm.set_pipeline(Some(&compute_pipeline));
181 cm.dispatch(1, 1, 1);
182 }
183
184 if let Ok(mut rp) = cmd.begin_renderpass() {
185 rp.set_clear_color(Color::BLACK);
186 rp.push_msaa_texture(&msaa_texture);
187
188 rp.set_pipeline(Some(&pipeline));
189 rp.set_gpu_buffer(Some(&vbo), Some(&ibo));
190 rp.draw_indexed(0..3, 0, 1);
191 }
192 }
193
194 window.request_redraw();
195 }
196 _ => {}
197 }
198 }
199 }
200}Sourcepub fn set_sample_count(self, sample_count: SampleCount) -> Self
pub fn set_sample_count(self, sample_count: SampleCount) -> Self
Sets the sample count for the texture.
This method allows you to specify the sample count for the texture. The default is 1. NOTE: Will panic in WASM (not supported atm) which only support 1x and 4x.
Examples found in repository?
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7 let mut window = runner
8 .create_window("Engine Example", Point2::new(800, 600))
9 .build()
10 .expect("Failed to create window");
11
12 let mut gpu = est_render::gpu::new(Some(&mut window))
13 .build()
14 .expect("Failed to create GPU");
15
16 let mut msaa_texture = Some(
17 gpu.create_texture()
18 .set_render_target(Point2::new(800, 600), None)
19 .set_usage(TextureUsage::Sampler)
20 .set_sample_count(SampleCount::SampleCount4)
21 .build()
22 .expect("Failed to create MSAA texture"),
23 );
24
25 let mut msaa_count = SampleCount::SampleCount4;
26 let mut window_size = Point2::new(800, 600);
27
28 while runner.pool_events(None) {
29 for event in runner.get_events() {
30 match event {
31 Event::WindowClosed { .. } => {
32 return;
33 }
34 Event::KeyboardInput { key, pressed, .. } => {
35 if !*pressed {
36 continue;
37 }
38
39 let mut need_recreate = false;
40 if *key == "1" {
41 msaa_count = SampleCount::SampleCount1;
42 need_recreate = true;
43 }
44
45 if *key == "2" {
46 msaa_count = SampleCount::SampleCount2;
47 need_recreate = true;
48 }
49
50 if *key == "3" {
51 msaa_count = SampleCount::SampleCount4;
52 need_recreate = true;
53 }
54
55 if *key == "4" {
56 msaa_count = SampleCount::SampleCount8;
57 need_recreate = true;
58 }
59
60 if need_recreate {
61 if msaa_count == SampleCount::SampleCount1 {
62 msaa_texture = None;
63 } else {
64 msaa_texture = Some(
65 gpu.create_texture()
66 .set_render_target(
67 Point2::new(window_size.x, window_size.y),
68 None,
69 )
70 .set_usage(TextureUsage::Sampler)
71 .set_sample_count(msaa_count)
72 .build()
73 .expect("Failed to recreate MSAA texture"),
74 );
75 }
76 }
77 }
78 Event::WindowResized { size, .. } => {
79 if size.x <= 0 || size.y <= 0 {
80 eprintln!("Invalid window size: {:?}", size);
81 continue;
82 }
83
84 window_size = *size;
85
86 // Resize the MSAA texture to match the new window size
87 msaa_texture = Some(
88 gpu.create_texture()
89 .set_render_target(Point2::new(size.x, size.y), None)
90 .set_usage(TextureUsage::Sampler)
91 .set_sample_count(msaa_count)
92 .build()
93 .expect("Failed to resize MSAA texture"),
94 );
95 }
96 _ => {}
97 }
98 }
99
100 if let Ok(mut cmd) = gpu.begin_command() {
101 if let Ok(mut rp) = cmd.begin_renderpass() {
102 rp.set_clear_color(Color::BLACK);
103 if let Some(texture) = msaa_texture.as_ref() {
104 rp.push_msaa_texture(texture);
105 }
106
107 if let Some(mut drawing) = rp.begin_drawing() {
108 let pos1 = Vector2::new(0.0, 0.0);
109 let pos2 = Vector2::new(800.0, 0.0);
110 let pos3 = Vector2::new(400.0, 600.0);
111
112 // Draw a full triangle covering the window
113 drawing.draw_triangle_filled(pos1, pos2, pos3, Color::BLUE);
114 }
115 }
116 }
117 }
118}More examples
61fn main() {
62 let mut runner = est_render::runner::new().expect("Failed to create runner");
63 let mut window = runner
64 .create_window("Engine Example", Point2::new(800, 600))
65 .build()
66 .expect("Failed to create window");
67
68 let mut gpu = est_render::gpu::new(Some(&mut window))
69 .build()
70 .expect("Failed to create GPU");
71
72 let mut msaa_texture = gpu
73 .create_texture()
74 .set_render_target(Point2::new(800, 600), None)
75 .set_sample_count(SampleCount::SampleCount4)
76 .build()
77 .expect("Failed to create MSAA texture");
78
79 let blank_texture = gpu
80 .create_texture()
81 .set_raw_image(
82 &[255u8; 4],
83 Point2::new(1, 1),
84 TextureFormat::Bgra8Unorm,
85 )
86 .set_usage(TextureUsage::Sampler)
87 .build()
88 .expect("Failed to create blank texture");
89
90 let shader = gpu
91 .create_graphics_shader()
92 .set_vertex_code(VERTEX_DRAWING_SHADER)
93 .set_fragment_code(FRAGMENT_DRAWING_SHADER)
94 .build()
95 .expect("Failed to create graphics shader");
96
97 let compute_shader = gpu
98 .create_compute_shader()
99 .set_source(COMPUTE_NOOP_SHADER)
100 .build()
101 .expect("Failed to create compute shader");
102
103 let pipeline = gpu
104 .create_render_pipeline()
105 .set_shader(Some(&shader))
106 .set_blend(Some(&BlendState::ALPHA_BLEND))
107 .set_attachment_texture(0, 0, Some(&blank_texture))
108 .set_attachment_sampler(0, 1, Some(&TextureSampler::DEFAULT))
109 .build()
110 .expect("Failed to create render pipeline");
111
112 let compute_pipeline = gpu
113 .create_compute_pipeline()
114 .set_shader(Some(&compute_shader))
115 .build()
116 .expect("Failed to create compute pipeline");
117
118 // Triangle vertices
119 let vertices = vec![
120 Vertex {
121 position: Vector3::new(-0.5, -0.5, 0.0),
122 color: Color::new(1.0, 0.0, 0.0, 1.0),
123 texcoord: Vector2::new(0.0, 1.0),
124 },
125 Vertex {
126 position: Vector3::new(0.5, -0.5, 0.0),
127 color: Color::new(0.0, 1.0, 0.0, 1.0),
128 texcoord: Vector2::new(1.0, 1.0),
129 },
130 Vertex {
131 position: Vector3::new(0.0, 0.5, 0.0),
132 color: Color::new(0.0, 0.0, 1.0, 1.0),
133 texcoord: Vector2::new(0.5, 0.0),
134 },
135 ];
136
137 let indexes = vec![0u16, 1u16, 2u16];
138
139 let vbo = gpu
140 .create_buffer()
141 .set_data_vec(vertices)
142 .set_usage(BufferUsage::VERTEX)
143 .build()
144 .expect("Failed to create vertex buffer");
145
146 let ibo = gpu
147 .create_buffer()
148 .set_data_vec(indexes)
149 .set_usage(BufferUsage::INDEX)
150 .build()
151 .expect("Failed to create index buffer");
152
153 while runner.pool_events(PollMode::WaitDraw) {
154 for event in runner.get_events() {
155 match event {
156 Event::KeyboardInput {
157 window_id,
158 key,
159 pressed,
160 } => {
161 if *window_id == window.id() && key == "Escape" && *pressed {
162 window.quit();
163 }
164 }
165 Event::WindowResized { window_id: _, size } => {
166 if size.x <= 0 || size.y <= 0 {
167 continue; // Skip invalid sizes
168 }
169
170 msaa_texture = gpu
171 .create_texture()
172 .set_render_target(Point2::new(size.x as u32, size.y as u32), None)
173 .set_sample_count(SampleCount::SampleCount4)
174 .build()
175 .expect("Failed to resize MSAA texture");
176 }
177 Event::RedrawRequested { window_id: _ } => {
178 if let Ok(mut cmd) = gpu.begin_command() {
179 if let Ok(mut cm) = cmd.begin_computepass() {
180 cm.set_pipeline(Some(&compute_pipeline));
181 cm.dispatch(1, 1, 1);
182 }
183
184 if let Ok(mut rp) = cmd.begin_renderpass() {
185 rp.set_clear_color(Color::BLACK);
186 rp.push_msaa_texture(&msaa_texture);
187
188 rp.set_pipeline(Some(&pipeline));
189 rp.set_gpu_buffer(Some(&vbo), Some(&ibo));
190 rp.draw_indexed(0..3, 0, 1);
191 }
192 }
193
194 window.request_redraw();
195 }
196 _ => {}
197 }
198 }
199 }
200}Sourcepub fn set_depth_stencil(
self,
size: Point2,
format: Option<TextureFormat>,
) -> Self
pub fn set_depth_stencil( self, size: Point2, format: Option<TextureFormat>, ) -> Self
Initializes a texture as a depth stencil texture.
Sourcepub fn set_mip_level_count(self, mip_level_count: u32) -> Self
pub fn set_mip_level_count(self, mip_level_count: u32) -> Self
Sets the number of mip levels for the texture.
Sourcepub fn set_usage(self, usage: TextureUsage) -> Self
pub fn set_usage(self, usage: TextureUsage) -> Self
Sets the usage of the texture.
This method allows you to specify the usage of the texture. However it cannot set the texture as
a render target, as that must be done using the with_render_target method.
Examples found in repository?
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7 let mut window = runner
8 .create_window("Engine Example", Point2::new(800, 600))
9 .build()
10 .expect("Failed to create window");
11
12 let mut gpu = est_render::gpu::new(Some(&mut window))
13 .build()
14 .expect("Failed to create GPU");
15
16 let mut msaa_texture = Some(
17 gpu.create_texture()
18 .set_render_target(Point2::new(800, 600), None)
19 .set_usage(TextureUsage::Sampler)
20 .set_sample_count(SampleCount::SampleCount4)
21 .build()
22 .expect("Failed to create MSAA texture"),
23 );
24
25 let mut msaa_count = SampleCount::SampleCount4;
26 let mut window_size = Point2::new(800, 600);
27
28 while runner.pool_events(None) {
29 for event in runner.get_events() {
30 match event {
31 Event::WindowClosed { .. } => {
32 return;
33 }
34 Event::KeyboardInput { key, pressed, .. } => {
35 if !*pressed {
36 continue;
37 }
38
39 let mut need_recreate = false;
40 if *key == "1" {
41 msaa_count = SampleCount::SampleCount1;
42 need_recreate = true;
43 }
44
45 if *key == "2" {
46 msaa_count = SampleCount::SampleCount2;
47 need_recreate = true;
48 }
49
50 if *key == "3" {
51 msaa_count = SampleCount::SampleCount4;
52 need_recreate = true;
53 }
54
55 if *key == "4" {
56 msaa_count = SampleCount::SampleCount8;
57 need_recreate = true;
58 }
59
60 if need_recreate {
61 if msaa_count == SampleCount::SampleCount1 {
62 msaa_texture = None;
63 } else {
64 msaa_texture = Some(
65 gpu.create_texture()
66 .set_render_target(
67 Point2::new(window_size.x, window_size.y),
68 None,
69 )
70 .set_usage(TextureUsage::Sampler)
71 .set_sample_count(msaa_count)
72 .build()
73 .expect("Failed to recreate MSAA texture"),
74 );
75 }
76 }
77 }
78 Event::WindowResized { size, .. } => {
79 if size.x <= 0 || size.y <= 0 {
80 eprintln!("Invalid window size: {:?}", size);
81 continue;
82 }
83
84 window_size = *size;
85
86 // Resize the MSAA texture to match the new window size
87 msaa_texture = Some(
88 gpu.create_texture()
89 .set_render_target(Point2::new(size.x, size.y), None)
90 .set_usage(TextureUsage::Sampler)
91 .set_sample_count(msaa_count)
92 .build()
93 .expect("Failed to resize MSAA texture"),
94 );
95 }
96 _ => {}
97 }
98 }
99
100 if let Ok(mut cmd) = gpu.begin_command() {
101 if let Ok(mut rp) = cmd.begin_renderpass() {
102 rp.set_clear_color(Color::BLACK);
103 if let Some(texture) = msaa_texture.as_ref() {
104 rp.push_msaa_texture(texture);
105 }
106
107 if let Some(mut drawing) = rp.begin_drawing() {
108 let pos1 = Vector2::new(0.0, 0.0);
109 let pos2 = Vector2::new(800.0, 0.0);
110 let pos3 = Vector2::new(400.0, 600.0);
111
112 // Draw a full triangle covering the window
113 drawing.draw_triangle_filled(pos1, pos2, pos3, Color::BLUE);
114 }
115 }
116 }
117 }
118}More examples
61fn main() {
62 let mut runner = est_render::runner::new().expect("Failed to create runner");
63 let mut window = runner
64 .create_window("Engine Example", Point2::new(800, 600))
65 .build()
66 .expect("Failed to create window");
67
68 let mut gpu = est_render::gpu::new(Some(&mut window))
69 .build()
70 .expect("Failed to create GPU");
71
72 let mut msaa_texture = gpu
73 .create_texture()
74 .set_render_target(Point2::new(800, 600), None)
75 .set_sample_count(SampleCount::SampleCount4)
76 .build()
77 .expect("Failed to create MSAA texture");
78
79 let blank_texture = gpu
80 .create_texture()
81 .set_raw_image(
82 &[255u8; 4],
83 Point2::new(1, 1),
84 TextureFormat::Bgra8Unorm,
85 )
86 .set_usage(TextureUsage::Sampler)
87 .build()
88 .expect("Failed to create blank texture");
89
90 let shader = gpu
91 .create_graphics_shader()
92 .set_vertex_code(VERTEX_DRAWING_SHADER)
93 .set_fragment_code(FRAGMENT_DRAWING_SHADER)
94 .build()
95 .expect("Failed to create graphics shader");
96
97 let compute_shader = gpu
98 .create_compute_shader()
99 .set_source(COMPUTE_NOOP_SHADER)
100 .build()
101 .expect("Failed to create compute shader");
102
103 let pipeline = gpu
104 .create_render_pipeline()
105 .set_shader(Some(&shader))
106 .set_blend(Some(&BlendState::ALPHA_BLEND))
107 .set_attachment_texture(0, 0, Some(&blank_texture))
108 .set_attachment_sampler(0, 1, Some(&TextureSampler::DEFAULT))
109 .build()
110 .expect("Failed to create render pipeline");
111
112 let compute_pipeline = gpu
113 .create_compute_pipeline()
114 .set_shader(Some(&compute_shader))
115 .build()
116 .expect("Failed to create compute pipeline");
117
118 // Triangle vertices
119 let vertices = vec![
120 Vertex {
121 position: Vector3::new(-0.5, -0.5, 0.0),
122 color: Color::new(1.0, 0.0, 0.0, 1.0),
123 texcoord: Vector2::new(0.0, 1.0),
124 },
125 Vertex {
126 position: Vector3::new(0.5, -0.5, 0.0),
127 color: Color::new(0.0, 1.0, 0.0, 1.0),
128 texcoord: Vector2::new(1.0, 1.0),
129 },
130 Vertex {
131 position: Vector3::new(0.0, 0.5, 0.0),
132 color: Color::new(0.0, 0.0, 1.0, 1.0),
133 texcoord: Vector2::new(0.5, 0.0),
134 },
135 ];
136
137 let indexes = vec![0u16, 1u16, 2u16];
138
139 let vbo = gpu
140 .create_buffer()
141 .set_data_vec(vertices)
142 .set_usage(BufferUsage::VERTEX)
143 .build()
144 .expect("Failed to create vertex buffer");
145
146 let ibo = gpu
147 .create_buffer()
148 .set_data_vec(indexes)
149 .set_usage(BufferUsage::INDEX)
150 .build()
151 .expect("Failed to create index buffer");
152
153 while runner.pool_events(PollMode::WaitDraw) {
154 for event in runner.get_events() {
155 match event {
156 Event::KeyboardInput {
157 window_id,
158 key,
159 pressed,
160 } => {
161 if *window_id == window.id() && key == "Escape" && *pressed {
162 window.quit();
163 }
164 }
165 Event::WindowResized { window_id: _, size } => {
166 if size.x <= 0 || size.y <= 0 {
167 continue; // Skip invalid sizes
168 }
169
170 msaa_texture = gpu
171 .create_texture()
172 .set_render_target(Point2::new(size.x as u32, size.y as u32), None)
173 .set_sample_count(SampleCount::SampleCount4)
174 .build()
175 .expect("Failed to resize MSAA texture");
176 }
177 Event::RedrawRequested { window_id: _ } => {
178 if let Ok(mut cmd) = gpu.begin_command() {
179 if let Ok(mut cm) = cmd.begin_computepass() {
180 cm.set_pipeline(Some(&compute_pipeline));
181 cm.dispatch(1, 1, 1);
182 }
183
184 if let Ok(mut rp) = cmd.begin_renderpass() {
185 rp.set_clear_color(Color::BLACK);
186 rp.push_msaa_texture(&msaa_texture);
187
188 rp.set_pipeline(Some(&pipeline));
189 rp.set_gpu_buffer(Some(&vbo), Some(&ibo));
190 rp.draw_indexed(0..3, 0, 1);
191 }
192 }
193
194 window.request_redraw();
195 }
196 _ => {}
197 }
198 }
199 }
200}Sourcepub fn build(self) -> Result<Texture, TextureError>
pub fn build(self) -> Result<Texture, TextureError>
Examples found in repository?
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7 let mut window = runner
8 .create_window("Engine Example", Point2::new(800, 600))
9 .build()
10 .expect("Failed to create window");
11
12 let mut gpu = est_render::gpu::new(Some(&mut window))
13 .build()
14 .expect("Failed to create GPU");
15
16 let mut msaa_texture = Some(
17 gpu.create_texture()
18 .set_render_target(Point2::new(800, 600), None)
19 .set_usage(TextureUsage::Sampler)
20 .set_sample_count(SampleCount::SampleCount4)
21 .build()
22 .expect("Failed to create MSAA texture"),
23 );
24
25 let mut msaa_count = SampleCount::SampleCount4;
26 let mut window_size = Point2::new(800, 600);
27
28 while runner.pool_events(None) {
29 for event in runner.get_events() {
30 match event {
31 Event::WindowClosed { .. } => {
32 return;
33 }
34 Event::KeyboardInput { key, pressed, .. } => {
35 if !*pressed {
36 continue;
37 }
38
39 let mut need_recreate = false;
40 if *key == "1" {
41 msaa_count = SampleCount::SampleCount1;
42 need_recreate = true;
43 }
44
45 if *key == "2" {
46 msaa_count = SampleCount::SampleCount2;
47 need_recreate = true;
48 }
49
50 if *key == "3" {
51 msaa_count = SampleCount::SampleCount4;
52 need_recreate = true;
53 }
54
55 if *key == "4" {
56 msaa_count = SampleCount::SampleCount8;
57 need_recreate = true;
58 }
59
60 if need_recreate {
61 if msaa_count == SampleCount::SampleCount1 {
62 msaa_texture = None;
63 } else {
64 msaa_texture = Some(
65 gpu.create_texture()
66 .set_render_target(
67 Point2::new(window_size.x, window_size.y),
68 None,
69 )
70 .set_usage(TextureUsage::Sampler)
71 .set_sample_count(msaa_count)
72 .build()
73 .expect("Failed to recreate MSAA texture"),
74 );
75 }
76 }
77 }
78 Event::WindowResized { size, .. } => {
79 if size.x <= 0 || size.y <= 0 {
80 eprintln!("Invalid window size: {:?}", size);
81 continue;
82 }
83
84 window_size = *size;
85
86 // Resize the MSAA texture to match the new window size
87 msaa_texture = Some(
88 gpu.create_texture()
89 .set_render_target(Point2::new(size.x, size.y), None)
90 .set_usage(TextureUsage::Sampler)
91 .set_sample_count(msaa_count)
92 .build()
93 .expect("Failed to resize MSAA texture"),
94 );
95 }
96 _ => {}
97 }
98 }
99
100 if let Ok(mut cmd) = gpu.begin_command() {
101 if let Ok(mut rp) = cmd.begin_renderpass() {
102 rp.set_clear_color(Color::BLACK);
103 if let Some(texture) = msaa_texture.as_ref() {
104 rp.push_msaa_texture(texture);
105 }
106
107 if let Some(mut drawing) = rp.begin_drawing() {
108 let pos1 = Vector2::new(0.0, 0.0);
109 let pos2 = Vector2::new(800.0, 0.0);
110 let pos3 = Vector2::new(400.0, 600.0);
111
112 // Draw a full triangle covering the window
113 drawing.draw_triangle_filled(pos1, pos2, pos3, Color::BLUE);
114 }
115 }
116 }
117 }
118}More examples
61fn main() {
62 let mut runner = est_render::runner::new().expect("Failed to create runner");
63 let mut window = runner
64 .create_window("Engine Example", Point2::new(800, 600))
65 .build()
66 .expect("Failed to create window");
67
68 let mut gpu = est_render::gpu::new(Some(&mut window))
69 .build()
70 .expect("Failed to create GPU");
71
72 let mut msaa_texture = gpu
73 .create_texture()
74 .set_render_target(Point2::new(800, 600), None)
75 .set_sample_count(SampleCount::SampleCount4)
76 .build()
77 .expect("Failed to create MSAA texture");
78
79 let blank_texture = gpu
80 .create_texture()
81 .set_raw_image(
82 &[255u8; 4],
83 Point2::new(1, 1),
84 TextureFormat::Bgra8Unorm,
85 )
86 .set_usage(TextureUsage::Sampler)
87 .build()
88 .expect("Failed to create blank texture");
89
90 let shader = gpu
91 .create_graphics_shader()
92 .set_vertex_code(VERTEX_DRAWING_SHADER)
93 .set_fragment_code(FRAGMENT_DRAWING_SHADER)
94 .build()
95 .expect("Failed to create graphics shader");
96
97 let compute_shader = gpu
98 .create_compute_shader()
99 .set_source(COMPUTE_NOOP_SHADER)
100 .build()
101 .expect("Failed to create compute shader");
102
103 let pipeline = gpu
104 .create_render_pipeline()
105 .set_shader(Some(&shader))
106 .set_blend(Some(&BlendState::ALPHA_BLEND))
107 .set_attachment_texture(0, 0, Some(&blank_texture))
108 .set_attachment_sampler(0, 1, Some(&TextureSampler::DEFAULT))
109 .build()
110 .expect("Failed to create render pipeline");
111
112 let compute_pipeline = gpu
113 .create_compute_pipeline()
114 .set_shader(Some(&compute_shader))
115 .build()
116 .expect("Failed to create compute pipeline");
117
118 // Triangle vertices
119 let vertices = vec![
120 Vertex {
121 position: Vector3::new(-0.5, -0.5, 0.0),
122 color: Color::new(1.0, 0.0, 0.0, 1.0),
123 texcoord: Vector2::new(0.0, 1.0),
124 },
125 Vertex {
126 position: Vector3::new(0.5, -0.5, 0.0),
127 color: Color::new(0.0, 1.0, 0.0, 1.0),
128 texcoord: Vector2::new(1.0, 1.0),
129 },
130 Vertex {
131 position: Vector3::new(0.0, 0.5, 0.0),
132 color: Color::new(0.0, 0.0, 1.0, 1.0),
133 texcoord: Vector2::new(0.5, 0.0),
134 },
135 ];
136
137 let indexes = vec![0u16, 1u16, 2u16];
138
139 let vbo = gpu
140 .create_buffer()
141 .set_data_vec(vertices)
142 .set_usage(BufferUsage::VERTEX)
143 .build()
144 .expect("Failed to create vertex buffer");
145
146 let ibo = gpu
147 .create_buffer()
148 .set_data_vec(indexes)
149 .set_usage(BufferUsage::INDEX)
150 .build()
151 .expect("Failed to create index buffer");
152
153 while runner.pool_events(PollMode::WaitDraw) {
154 for event in runner.get_events() {
155 match event {
156 Event::KeyboardInput {
157 window_id,
158 key,
159 pressed,
160 } => {
161 if *window_id == window.id() && key == "Escape" && *pressed {
162 window.quit();
163 }
164 }
165 Event::WindowResized { window_id: _, size } => {
166 if size.x <= 0 || size.y <= 0 {
167 continue; // Skip invalid sizes
168 }
169
170 msaa_texture = gpu
171 .create_texture()
172 .set_render_target(Point2::new(size.x as u32, size.y as u32), None)
173 .set_sample_count(SampleCount::SampleCount4)
174 .build()
175 .expect("Failed to resize MSAA texture");
176 }
177 Event::RedrawRequested { window_id: _ } => {
178 if let Ok(mut cmd) = gpu.begin_command() {
179 if let Ok(mut cm) = cmd.begin_computepass() {
180 cm.set_pipeline(Some(&compute_pipeline));
181 cm.dispatch(1, 1, 1);
182 }
183
184 if let Ok(mut rp) = cmd.begin_renderpass() {
185 rp.set_clear_color(Color::BLACK);
186 rp.push_msaa_texture(&msaa_texture);
187
188 rp.set_pipeline(Some(&pipeline));
189 rp.set_gpu_buffer(Some(&vbo), Some(&ibo));
190 rp.draw_indexed(0..3, 0, 1);
191 }
192 }
193
194 window.request_redraw();
195 }
196 _ => {}
197 }
198 }
199 }
200}Auto Trait Implementations§
impl<'a> Freeze for TextureBuilder<'a>
impl<'a> !RefUnwindSafe for TextureBuilder<'a>
impl<'a> !Send for TextureBuilder<'a>
impl<'a> !Sync for TextureBuilder<'a>
impl<'a> Unpin for TextureBuilder<'a>
impl<'a> !UnwindSafe for TextureBuilder<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more