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}