tree/
tree.rs

1use macroquad::prelude::*;
2
3fn tree(gl: &mut QuadGl, time: f64, deep: u32, angle: f32, tall: f32) {
4    if deep >= 8 {
5        return;
6    }
7
8    // we can use normal macroquad drawing API here
9    draw_rectangle(-0.01 / 2., 0., 0.01, tall, DARKGRAY);
10
11    // and we can also modify internal macroquad render state with "gl" reference
12    gl.push_model_matrix(glam::Mat4::from_translation(glam::vec3(0., tall, 0.)));
13
14    // right leaf
15    gl.push_model_matrix(glam::Mat4::from_rotation_z(angle + time.sin() as f32 * 0.1));
16    tree(gl, time, deep + 1, angle * 0.7, tall * 0.8);
17    gl.pop_model_matrix();
18
19    // left leaf
20    gl.push_model_matrix(glam::Mat4::from_rotation_z(
21        -angle - time.cos() as f32 * 0.1,
22    ));
23    tree(gl, time, deep + 1, angle * 0.7, tall * 0.8);
24    gl.pop_model_matrix();
25
26    gl.pop_model_matrix();
27}
28
29#[macroquad::main("Tree")]
30async fn main() {
31    let camera = Camera2D {
32        zoom: vec2(1., 1.),
33        target: vec2(0.0, 0.5),
34        ..Default::default()
35    };
36
37    set_camera(&camera);
38    loop {
39        clear_background(LIGHTGRAY);
40
41        draw_circle(0., 0., 0.03, DARKGRAY);
42        tree(unsafe { get_internal_gl().quad_gl }, get_time(), 0, 1., 0.3);
43
44        next_frame().await
45    }
46}