3d_cube_volume_rainbow/
3d-cube-volume-rainbow.rs1use 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}