texture_cube/
main.rs

1use glam::{Mat4, Quat, Vec3};
2use tridify_rs::*;
3
4use std::{error::Error, path::Path};
5
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}