3d_cube_volume_rainbow/
3d-cube-volume-rainbow.rs

1use blinksy::{
2    layout::{Layout3d, Shape3d, Vec3},
3    patterns::rainbow::{Rainbow, RainbowParams},
4    util::map_range,
5    ControlBuilder,
6};
7use blinksy_desktop::{
8    driver::{Desktop, DesktopError},
9    time::elapsed_in_ms,
10};
11use std::{iter, thread::sleep, time::Duration};
12
13struct CubeVolumeLayout;
14
15impl Layout3d for CubeVolumeLayout {
16    const PIXEL_COUNT: usize = 10 * 10 * 10;
17
18    fn shapes() -> impl Iterator<Item = Shape3d> {
19        let mut index: usize = 0;
20
21        fn map(n: usize) -> f32 {
22            map_range(n as f32, 0., 9., -1., 1.)
23        }
24
25        iter::from_fn(move || {
26            if index >= 10 * 10 * 10 {
27                return None;
28            }
29
30            let x = map(index % 10);
31            let z = map(index / 10 % 10);
32            let y = map(index / 10 / 10);
33
34            index += 1;
35
36            Some(Shape3d::Point(Vec3::new(x, y, z)))
37        })
38    }
39}
40
41fn main() {
42    Desktop::new_3d::<CubeVolumeLayout>().start(|driver| {
43        let mut control = ControlBuilder::new_3d()
44            .with_layout::<CubeVolumeLayout, { CubeVolumeLayout::PIXEL_COUNT }>()
45            .with_pattern::<Rainbow>(RainbowParams::default())
46            .with_driver(driver)
47            .with_frame_buffer_size::<{ CubeVolumeLayout::PIXEL_COUNT }>()
48            .build();
49
50        loop {
51            if let Err(DesktopError::WindowClosed) = control.tick(elapsed_in_ms()) {
52                break;
53            }
54
55            sleep(Duration::from_millis(16));
56        }
57    });
58}