camera/
camera.rs

1use bottomless_pit::camera::Camera;
2use bottomless_pit::colour::Colour;
3use bottomless_pit::engine_handle::{Engine, EngineBuilder};
4use bottomless_pit::input::Key;
5use bottomless_pit::material::{Material, MaterialBuilder};
6use bottomless_pit::render::RenderHandle;
7use bottomless_pit::resource::LoadingOp;
8use bottomless_pit::text::TextMaterial;
9use bottomless_pit::texture::Texture;
10use bottomless_pit::vectors::Vec2;
11use bottomless_pit::{vec2, Game};
12
13fn main() {
14    let mut engine = EngineBuilder::new().build().unwrap();
15
16    let texture = Texture::new(&mut engine, "examples/bplogo.png", LoadingOp::Blocking);
17
18    let material = MaterialBuilder::new()
19        .add_texture(texture)
20        .build(&mut engine);
21
22    let camera = Camera::default();
23
24    let text = TextMaterial::new(
25        "Mouse pos: 0,0 \n Mouse pos: 0, 0",
26        Colour::WHITE,
27        15.0,
28        20.0,
29    );
30
31    let game = CameraExample {
32        material,
33        text,
34        camera,
35    };
36
37    engine.run(game);
38}
39
40struct CameraExample {
41    material: Material,
42    text: TextMaterial,
43    camera: Camera,
44}
45
46impl Game for CameraExample {
47    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
48        let mut render_handle = render.begin_pass(Colour::BLACK);
49
50        self.material.add_rectangle(
51            Vec2 { x: 0.0, y: 0.0 },
52            Vec2 { x: 300.0, y: 300.0 },
53            Colour::WHITE,
54            &render_handle,
55        );
56
57        self.camera.set_active(&mut render_handle);
58        self.material.draw(&mut render_handle);
59
60        render_handle.reset_camera();
61        self.text
62            .add_instance(vec2!(0.0), Colour::WHITE, &render_handle);
63        self.text.draw(&mut render_handle);
64    }
65
66    fn update(&mut self, engine_handle: &mut Engine) {
67        let dt = engine_handle.get_frame_delta_time();
68        let mouse_pos = engine_handle.get_mouse_position();
69        let size = engine_handle.get_window_size();
70
71        let move_factor = 15.0;
72
73        if engine_handle.is_key_down(Key::A) {
74            self.camera.center.x -= move_factor * dt;
75        }
76
77        if engine_handle.is_key_down(Key::D) {
78            self.camera.center.x += move_factor * dt;
79        }
80
81        if engine_handle.is_key_down(Key::W) {
82            self.camera.center.y += move_factor * dt;
83        }
84
85        if engine_handle.is_key_down(Key::S) {
86            self.camera.center.y -= move_factor * dt;
87        }
88
89        if engine_handle.is_key_down(Key::Left) {
90            self.camera.rotation += move_factor * dt;
91        }
92
93        if engine_handle.is_key_down(Key::Right) {
94            self.camera.rotation -= move_factor * dt;
95        }
96
97        if engine_handle.is_key_down(Key::L) {
98            self.camera.scale += vec2!(2.0 * dt, 2.0 * dt);
99        }
100
101        if engine_handle.is_key_down(Key::K) {
102            self.camera.scale -= vec2!(2.0 * dt, 2.0 * dt);
103        }
104
105        if engine_handle.is_key_pressed(Key::Enter) {
106            self.camera.rotation += 45.0;
107        }
108
109        let trans_mouse = self.camera.transform_point(mouse_pos, size);
110
111        self.text.set_text(
112            &format!(
113                "Screen mouse pos: {:.3}, {:.3}\nWorld mouse pos: {:.3}, {:.3}",
114                mouse_pos.x, mouse_pos.y, trans_mouse.x, trans_mouse.y
115            ),
116            Colour::WHITE,
117            engine_handle,
118        );
119
120        self.text.prepare(engine_handle);
121    }
122}