pub struct Window { /* private fields */ }
Expand description
Desktop window representation. Stores it’s own GPU context and render loop.
Implementations§
Source§impl Window
impl Window
Sourcepub fn render_step(&mut self, frame_ctx: &FrameContext<'_>)
pub fn render_step(&mut self, frame_ctx: &FrameContext<'_>)
Step through render loop once.
Sourcepub fn set_render_loop(
&mut self,
func: impl FnMut(&mut GpuCtx, &FrameContext<'_>) + 'static,
)
pub fn set_render_loop( &mut self, func: impl FnMut(&mut GpuCtx, &FrameContext<'_>) + 'static, )
Define closure that will be called each time the window is rendered
Examples found in repository?
examples/hello_triangle/main.rs (lines 29-40)
5pub fn main() -> Result<(), Box<dyn Error>> {
6 //Create app and main window.
7 let mut app = Tridify::new();
8 let window = app.create_window()?;
9
10 //Stores WGPU context and devices. Must be used in most GPU functions.
11 let gpu_ctx = window.ctx();
12
13 //Create brush to draw the shapes.
14 let mut brush = Brush::from_source(
15 BrushDesc::default(),
16 gpu_ctx,
17 include_str!("shader.wgsl").to_string(),
18 )?;
19
20 //Create a shape batch, add a triangle to it and create a GPU buffer with mesh data.
21 let buffer = ShapeBatch::new()
22 .add_triangle([
23 vertex!(-0.5, -0.5, 0.0, Color::SILVER),
24 vertex!(0.5, -0.5, 0.0, Color::SILVER),
25 vertex!(0.0, 0.5, 0.0, Color::SILVER),
26 ])
27 .bake_buffers(gpu_ctx);
28
29 window.set_render_loop(move |gpu, _| {
30 //Create a render pass builder which we will use to define multiple render passes (In this case, only one).
31 let mut pass_builder = gpu.create_render_builder();
32
33 //Build a render pass which will take care of the brush and shapes to draw them and binding it with the GPU.
34 let mut render_pass = pass_builder.build_render_pass(RenderOptions::default());
35 render_pass.render_shapes(gpu, &mut brush, &buffer);
36 render_pass.finish();
37
38 //Execute all drawing commands from all render passes and render into screen.
39 pass_builder.finish_render(gpu);
40 });
41
42 //Start program logic cycle.
43 app.start(());
44}
More examples
examples/texture_cube/main.rs (lines 47-60)
6fn main() -> Result<(), Box<dyn Error>> {
7 //Create app and main window.
8 let mut app = Tridify::new();
9 let window = app.create_window()?;
10 let gpu_ctx = window.ctx();
11
12 //Load texture from path.
13 let texture = Texture::from_path(gpu_ctx, Path::new(r#"examples/texture_cube/texture.png"#));
14
15 //Sampler defines how the texture will be rendered in shapes.
16 let sampler = Sampler::new_default(gpu_ctx);
17
18 let camera = Camera::new(
19 Transform::from_look_at(Vec3::NEG_Z * 10.0 + Vec3::Y * 10.0, Vec3::ZERO, Vec3::Y),
20 Projection::default(),
21 );
22 let mut camera_buf = camera.build_buffer(gpu_ctx);
23
24 //Create brush to draw the shapes.
25 let mut brush = Brush::from_source(
26 BrushDesc::default(),
27 gpu_ctx,
28 include_str!("shader.wgsl").to_string(),
29 )?;
30 //Bind camera, sampler and texture to the brush. Make sure group_index and loc_index are the same as
31 //in the shader.
32 brush.bind(0, 0, camera_buf.clone());
33 brush.bind(1, 0, texture);
34 brush.bind(1, 1, sampler);
35
36 //Create and bake a shape batch with a cube in it.
37 let shape_buffer = ShapeBatch::new()
38 .add_cube(
39 Vec3::ZERO,
40 Quat::from_rotation_x(35.) * Quat::from_rotation_y(35.),
41 Vec3::ONE * 5.,
42 Color::WHITE,
43 )
44 .bake_buffers(gpu_ctx);
45
46 //Setup the window render loop.
47 window.set_render_loop(move |gpu, frame_ctx| {
48 let model = Mat4::from_rotation_y(frame_ctx.elapsed_time as f32);
49 let mvp = camera.build_camera_matrix() * model;
50
51 //Updating the gpu buffer will update all brushes binded as well.
52 camera_buf.write(gpu, bytemuck::cast_slice(&mvp.to_cols_array()));
53
54 //Render frame as usual.
55 let mut pass_builder = gpu.create_render_builder();
56 let mut render_pass = pass_builder.build_render_pass(RenderOptions::default());
57 render_pass.render_shapes(gpu, &mut brush, &shape_buffer);
58 render_pass.finish();
59 pass_builder.finish_render(gpu);
60 });
61
62 // Start program.
63 app.start(());
64}
Sourcepub fn ctx(&self) -> &GpuCtx
pub fn ctx(&self) -> &GpuCtx
Examples found in repository?
examples/hello_triangle/main.rs (line 11)
5pub fn main() -> Result<(), Box<dyn Error>> {
6 //Create app and main window.
7 let mut app = Tridify::new();
8 let window = app.create_window()?;
9
10 //Stores WGPU context and devices. Must be used in most GPU functions.
11 let gpu_ctx = window.ctx();
12
13 //Create brush to draw the shapes.
14 let mut brush = Brush::from_source(
15 BrushDesc::default(),
16 gpu_ctx,
17 include_str!("shader.wgsl").to_string(),
18 )?;
19
20 //Create a shape batch, add a triangle to it and create a GPU buffer with mesh data.
21 let buffer = ShapeBatch::new()
22 .add_triangle([
23 vertex!(-0.5, -0.5, 0.0, Color::SILVER),
24 vertex!(0.5, -0.5, 0.0, Color::SILVER),
25 vertex!(0.0, 0.5, 0.0, Color::SILVER),
26 ])
27 .bake_buffers(gpu_ctx);
28
29 window.set_render_loop(move |gpu, _| {
30 //Create a render pass builder which we will use to define multiple render passes (In this case, only one).
31 let mut pass_builder = gpu.create_render_builder();
32
33 //Build a render pass which will take care of the brush and shapes to draw them and binding it with the GPU.
34 let mut render_pass = pass_builder.build_render_pass(RenderOptions::default());
35 render_pass.render_shapes(gpu, &mut brush, &buffer);
36 render_pass.finish();
37
38 //Execute all drawing commands from all render passes and render into screen.
39 pass_builder.finish_render(gpu);
40 });
41
42 //Start program logic cycle.
43 app.start(());
44}
More examples
examples/texture_cube/main.rs (line 10)
6fn main() -> Result<(), Box<dyn Error>> {
7 //Create app and main window.
8 let mut app = Tridify::new();
9 let window = app.create_window()?;
10 let gpu_ctx = window.ctx();
11
12 //Load texture from path.
13 let texture = Texture::from_path(gpu_ctx, Path::new(r#"examples/texture_cube/texture.png"#));
14
15 //Sampler defines how the texture will be rendered in shapes.
16 let sampler = Sampler::new_default(gpu_ctx);
17
18 let camera = Camera::new(
19 Transform::from_look_at(Vec3::NEG_Z * 10.0 + Vec3::Y * 10.0, Vec3::ZERO, Vec3::Y),
20 Projection::default(),
21 );
22 let mut camera_buf = camera.build_buffer(gpu_ctx);
23
24 //Create brush to draw the shapes.
25 let mut brush = Brush::from_source(
26 BrushDesc::default(),
27 gpu_ctx,
28 include_str!("shader.wgsl").to_string(),
29 )?;
30 //Bind camera, sampler and texture to the brush. Make sure group_index and loc_index are the same as
31 //in the shader.
32 brush.bind(0, 0, camera_buf.clone());
33 brush.bind(1, 0, texture);
34 brush.bind(1, 1, sampler);
35
36 //Create and bake a shape batch with a cube in it.
37 let shape_buffer = ShapeBatch::new()
38 .add_cube(
39 Vec3::ZERO,
40 Quat::from_rotation_x(35.) * Quat::from_rotation_y(35.),
41 Vec3::ONE * 5.,
42 Color::WHITE,
43 )
44 .bake_buffers(gpu_ctx);
45
46 //Setup the window render loop.
47 window.set_render_loop(move |gpu, frame_ctx| {
48 let model = Mat4::from_rotation_y(frame_ctx.elapsed_time as f32);
49 let mvp = camera.build_camera_matrix() * model;
50
51 //Updating the gpu buffer will update all brushes binded as well.
52 camera_buf.write(gpu, bytemuck::cast_slice(&mvp.to_cols_array()));
53
54 //Render frame as usual.
55 let mut pass_builder = gpu.create_render_builder();
56 let mut render_pass = pass_builder.build_render_pass(RenderOptions::default());
57 render_pass.render_shapes(gpu, &mut brush, &shape_buffer);
58 render_pass.finish();
59 pass_builder.finish_render(gpu);
60 });
61
62 // Start program.
63 app.start(());
64}
pub fn view_mut(&mut self) -> &mut GpuCtx
Auto Trait Implementations§
impl !Freeze for Window
impl !RefUnwindSafe for Window
impl !Send for Window
impl !Sync for Window
impl Unpin for Window
impl !UnwindSafe for Window
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
Mutably borrows from an owned value. Read more
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>
Converts
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>
Converts
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