Skip to main content

screenshot/
screenshot.rs

1use std::f32::consts::FRAC_PI_2;
2
3use sge::prelude::*;
4
5#[main("Screenshot")]
6async fn main() -> anyhow::Result<()> {
7    start_coroutine(draw_pattern());
8
9    let mut textures = vec![];
10
11    loop {
12        if key_pressed(KeyCode::Space) {
13            let screenshot = take_screenshot();
14            textures.push(screenshot);
15            info!("Screenshot taken");
16        }
17
18        draw_screenshots(&textures);
19
20        if should_quit() {
21            break;
22        }
23
24        next_frame().await;
25    }
26
27    Ok(())
28}
29
30// can ignore this if you only care about screenshots
31
32fn draw_screenshots(screenshots: &[TextureRef]) {
33    use ui::*;
34
35    let gap = min_window_dimension() / 50.0;
36    let ui = Padding::all(
37        gap,
38        Grid::with_gap(
39            4,
40            4,
41            gap,
42            screenshots
43                .iter()
44                .map(|t| {
45                    AspectRatio::new(
46                        t.normalized_dimensions.x / t.normalized_dimensions.y,
47                        ImageNode::from_texture(*t),
48                    )
49                })
50                .collect::<Vec<_>>(),
51        ),
52    );
53
54    draw_ui_in_area(ui, window_area());
55}
56
57async fn draw_pattern() {
58    let mut hue = 0.0;
59    let mut offset = vec2(0.0, 0.0);
60
61    loop {
62        hue += 20.0 * delta_time();
63        hue %= 360.0;
64        let color = Color::from_oklch(0.727, 0.1219, hue);
65        let alt_color = color.darken_oklch(0.05);
66
67        offset -= vec2(0.5, 0.25) * delta_time();
68
69        draw_sdf(
70            Sdf::rect_tl(vec2(0.0, 0.0), window_size())
71                .with_fill(color, alt_color, FRAC_PI_2, 5.0, SdfFill::Truchet)
72                .with_fill_offset(offset),
73        );
74
75        let r = min_window_dimension() / 5.0;
76
77        draw_circle(window_center(), r, Color::BLACK);
78        push_scissor(Area::new(vec2(window_center().x, 0.0), window_size()).to_rect());
79        draw_circle(window_center(), r, Color::WHITE);
80        pop_scissor();
81
82        next_frame().await;
83    }
84}