This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

🚧 Continue Schedule Hell

+181 -4
+5
examples/schedule-hell/src/main.rs
··· 66 66 video = video 67 67 .sync_audio_with("schedule-hell.midi") 68 68 .sync_audio_with("schedule-hell.wav") 69 + .with_scene(scenes::starry_sky()) 69 70 .with_init_scene(scenes::intro()) 70 71 .with_marked_scene(scenes::first_break()) 72 + .on("end of first break", &|_, ctx| { 73 + ctx.switch_scene("starry sky"); 74 + Ok(()) 75 + }) 71 76 .when_remaining(10, &|canvas, _| { 72 77 let world = canvas.world_region; 73 78 canvas.root().set(
+88 -4
examples/schedule-hell/src/scenes/first_break.rs
··· 1 1 use crate::State; 2 2 use shapemaker::*; 3 3 4 + fn random_shape(at: Point) -> ColoredObject { 5 + let thickness = 7.0; 6 + match rand::random_range(1..=5) { 7 + 1 => Object::BigCircle(at), 8 + 2 => Object::CurveInward(at, at.translated(1, 1), thickness), 9 + 3 => Object::CurveOutward(at, at.translated(1, 1), thickness), 10 + 4 => Object::Line(at, at.translated(1, 1), thickness), 11 + 5 => Object::Line(at.translated(0, 1), at.translated(1, 0), thickness), 12 + _ => panic!("souhldn't happend, update rand:: call"), 13 + } 14 + .colored(Color::Black) 15 + } 16 + 4 17 pub fn first_break() -> Scene<State> { 5 - Scene::<State>::new("first break").init(&|canvas, _| { 6 - canvas.set_background(Color::Black); 7 - Ok(()) 8 - }) 18 + Scene::<State>::new("first break") 19 + .init(&|canvas, _| { 20 + canvas.colormap = ColorMapping { 21 + black: "#676E95".to_string(), 22 + white: "#ffffff".to_string(), 23 + red: "#ff5572".to_string(), 24 + green: "#a9c77d".to_string(), 25 + blue: "#82AAFF".to_string(), 26 + yellow: "#FFCB6B".to_string(), 27 + orange: "#FFCB6B".to_string(), 28 + purple: "#C792EA".to_string(), 29 + brown: "#ff5572".to_string(), 30 + pink: "#C792EA".to_string(), 31 + gray: "#ffffff".to_string(), 32 + cyan: "#89DDFF".to_string(), 33 + }; 34 + 35 + canvas.clear(); 36 + 37 + let world = canvas.world_region.clone(); 38 + let shapes_area = world.resized(-4, -4); 39 + let mut tiling = Layer::new("tiling"); 40 + let mut shapes = Layer::new("shapes"); 41 + 42 + for (i, point) in world.iter().enumerate() { 43 + let bgcolor = 44 + Color::random_except(&mut rand::rng(), Color::Black); 45 + 46 + tiling.add( 47 + format!("tile{i}"), 48 + Object::Rectangle(point, point).colored(bgcolor), 49 + ); 50 + 51 + if shapes_area.contains(&point) { 52 + shapes.add(format!("shape{i}"), random_shape(point)); 53 + } 54 + } 55 + 56 + canvas.add_layer(shapes); 57 + canvas.add_layer(tiling); 58 + 59 + canvas.reorder_layers(vec!["shapes", "tiling", "root"]); 60 + Ok(()) 61 + }) 62 + .on_note("goup", &|canvas, _| { 63 + let world = canvas.world_region.clone(); 64 + let shapes = &mut canvas.layer("shapes").objects; 65 + 66 + for (i, point) in world.iter().enumerate() { 67 + let shape = shapes.get_mut(&format!("shape{i}")); 68 + 69 + if let Some(shape) = shape { 70 + *shape = random_shape(point); 71 + } 72 + } 73 + 74 + Ok(()) 75 + }) 76 + .on_note("bass", &|canvas, _| { 77 + let world = canvas.world_region.clone(); 78 + 79 + for (i, _) in world.iter().enumerate() { 80 + canvas 81 + .layer("tiling") 82 + .objects 83 + .get_mut(&format!("tile{i}")) 84 + .unwrap() 85 + .recolor(Color::random_except( 86 + &mut rand::rng(), 87 + Color::Black, 88 + )); 89 + } 90 + 91 + Ok(()) 92 + }) 9 93 }
+2
examples/schedule-hell/src/scenes/mod.rs
··· 2 2 pub use intro::intro; 3 3 pub mod first_break; 4 4 pub use first_break::first_break; 5 + pub mod starry_sky; 6 + pub use starry_sky::starry_sky;
+86
examples/schedule-hell/src/scenes/starry_sky.rs
··· 1 + use shapemaker::{synchronization::audio::MusicalDurationUnit, *}; 2 + 3 + use crate::State; 4 + 5 + pub fn starry_sky() -> Scene<State> { 6 + Scene::new("starry sky") 7 + .init(&|canvas, _| { 8 + canvas.clear(); 9 + sky(Angle::default(), canvas); 10 + Ok(()) 11 + }) 12 + .every(1.0, MusicalDurationUnit::Eighths, &|canvas, ctx| { 13 + canvas.clear(); 14 + sky( 15 + Angle::from_degrees(ctx.scene_started_at_ms.unwrap() as _), 16 + canvas, 17 + ); 18 + Ok(()) 19 + }) 20 + } 21 + 22 + fn sky(theta: Angle, canvas: &mut Canvas) -> () { 23 + canvas.colormap = ColorMapping { 24 + black: "#000000".to_string(), 25 + white: "#FFFFFF".to_string(), 26 + ..Default::default() 27 + }; 28 + 29 + canvas.set_background(Color::Black); 30 + canvas.set_grid_size(16 * 4, 9 * 4); 31 + 32 + let draw_in = canvas.world_region.clone().resized(-8, -14); 33 + let (leftside, rightside) = draw_in.split(Axis::Vertical); 34 + let (lefttopside, leftbottomside) = leftside.split(Axis::Horizontal); 35 + 36 + canvas.add_layer(cluster( 37 + draw_in, 38 + theta, 39 + lefttopside.translated(4, 0).center(), 40 + )); 41 + canvas.add_layer(cluster(draw_in, theta, leftbottomside.center())); 42 + canvas.add_layer(cluster(draw_in, theta, draw_in.center().translated(2, -2))); 43 + canvas.add_layer(cluster(draw_in, theta, draw_in.center().translated(-2, 2))); 44 + canvas.add_layer(cluster( 45 + draw_in, 46 + theta, 47 + rightside.translated(0, 4).center(), 48 + )); 49 + 50 + let background_stars_in = canvas.world_region.clone().enlarged(1, 1); 51 + 52 + for point in background_stars_in { 53 + canvas 54 + .root() 55 + .add_anon(Object::Dot(point).filled(Fill::Translucent( 56 + Color::White, 57 + rand::random_range(if rand::random_bool(0.01) { 58 + 0.8..=1.0 59 + } else { 60 + 0.0..=0.3 61 + }), 62 + ))); 63 + } 64 + } 65 + 66 + fn cluster(world: Region, rotation: Angle, at: Point) -> Layer { 67 + let mut layer = Layer::new(format!("cluster{}", rand::random::<u32>())); 68 + 69 + for _ in 1..=rand::random_range(2..=5) { 70 + layer.add_anon( 71 + Object::random( 72 + &mut rand::rng(), 73 + &Region::from_center_and_size( 74 + at.rotated(&world.center(), rotation), 75 + (2, 2), 76 + ) 77 + .unwrap(), 78 + 5.0, 79 + 3..6, 80 + ) 81 + .colored(Color::White), 82 + ); 83 + } 84 + 85 + layer 86 + }