rectangles/
rectangles.rs

1use bottomless_pit::colour::Colour;
2use bottomless_pit::engine_handle::{Engine, EngineBuilder};
3use bottomless_pit::input::{Key, MouseKey};
4use bottomless_pit::material::{Material, MaterialBuilder};
5use bottomless_pit::render::RenderHandle;
6use bottomless_pit::resource::LoadingOp;
7use bottomless_pit::texture::Texture;
8use bottomless_pit::vec2;
9use bottomless_pit::vectors::Vec2;
10use bottomless_pit::Game;
11
12fn main() {
13    let mut engine = EngineBuilder::new().build().unwrap();
14
15    let texture = Texture::new(&mut engine, "examples/bplogo.png", LoadingOp::Blocking);
16
17    let texture_material = MaterialBuilder::new()
18        .add_texture(texture)
19        .build(&mut engine);
20    let regular_material = MaterialBuilder::new().build(&mut engine);
21
22    let pos = Position {
23        pos: vec2! { 0.0 },
24        regular_material,
25        texture_material,
26        state: false,
27    };
28
29    engine.run(pos);
30}
31
32struct Position {
33    pos: Vec2<f32>,
34    regular_material: Material,
35    texture_material: Material,
36    state: bool,
37}
38
39impl Game for Position {
40    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
41        let mut render_handle = render.begin_pass(Colour::BLACK);
42
43        let defualt_size = vec2! { 50.0 };
44        self.regular_material.add_rectangle(
45            vec2! { 0.0 },
46            defualt_size,
47            Colour::RED,
48            &render_handle,
49        );
50        self.regular_material
51            .add_rectangle(self.pos, vec2! { 100.0 }, Colour::RED, &render_handle);
52        self.texture_material.add_rectangle(
53            vec2! { 0.0, 50.0 },
54            defualt_size,
55            Colour::WHITE,
56            &render_handle,
57        );
58        self.texture_material.add_rectangle_with_uv(
59            Vec2 { x: 0.0, y: 100.0 },
60            defualt_size,
61            vec2! { 311.0 },
62            vec2! { 311.0 },
63            Colour::WHITE,
64            &render_handle,
65        );
66        self.regular_material.add_rectangle_with_rotation(
67            Vec2 { x: 0.0, y: 150.0 },
68            defualt_size,
69            Colour::GREEN,
70            45.0,
71            &render_handle,
72        );
73
74        let points = [
75            Vec2 { x: 0.0, y: 300.0 },
76            Vec2 { x: 80.0, y: 290.0 },
77            Vec2 { x: 100.0, y: 400.0 },
78            Vec2 { x: 60.0, y: 400.0 },
79        ];
80        let uvs = [
81            vec2! { 0.0 },
82            Vec2 { x: 1.0, y: 0.0 },
83            vec2! { 1.0 },
84            Vec2 { x: 0.0, y: 1.0 },
85        ];
86
87        self.regular_material
88            .add_custom(points, uvs, 0.0, Colour::RED, &render_handle);
89
90        self.regular_material.add_screenspace_rectangle(
91            vec2!(0.0, 0.0),
92            vec2!(1.0),
93            Colour::YELLOW,
94            &render_handle,
95        );
96
97        if self.state {
98            self.regular_material.add_rectangle(
99                vec2!(300.0),
100                vec2!(100.0),
101                Colour::GREEN,
102                &render_handle,
103            );
104        }
105
106        self.texture_material.draw(&mut render_handle);
107        self.regular_material.draw(&mut render_handle);
108    }
109
110    fn update(&mut self, engine_handle: &mut Engine) {
111        let dt = engine_handle.get_frame_delta_time();
112        self.pos.x += 100.0 * dt;
113        if engine_handle.is_mouse_key_pressed(MouseKey::Left) {
114            let new_texture = Texture::new(
115                engine_handle,
116                "examples/eggshark.png",
117                LoadingOp::Background,
118            );
119            self.texture_material.change_texture(new_texture);
120        }
121
122        self.state = engine_handle.is_key_down(Key::Space);
123    }
124}