pub struct Camera {
pub view: Transform,
pub proj: Projection,
}
Expand description
Representation of camera to simplify matrices calculation
Fields§
§view: Transform
§proj: Projection
Implementations§
Source§impl Camera
impl Camera
Sourcepub fn new(view: Transform, proj: Projection) -> Self
pub fn new(view: Transform, proj: Projection) -> Self
Examples found in repository?
examples/texture_cube/main.rs (lines 18-21)
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 build_camera_matrix(&self) -> Mat4
pub fn build_camera_matrix(&self) -> Mat4
Examples found in repository?
examples/texture_cube/main.rs (line 49)
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}
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Camera
impl RefUnwindSafe for Camera
impl Send for Camera
impl Sync for Camera
impl Unpin for Camera
impl UnwindSafe for Camera
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
Read this value from the supplied reader. Same as
ReadEndian::read_from_little_endian()
.