this repo has no description
3
fork

Configure Feed

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

🎨 Format code

authored by

gwennlbh and committed by
github-actions[bot]
374bd614 fae55823

+176 -176
+174 -174
examples/schedule-hell/src/scenes/intro.rs
··· 1 - use crate::State; 2 - use itertools::Itertools; 3 - use shapemaker::*; 4 - 5 - pub fn intro() -> Scene<State> { 6 - Scene::<State>::new("intro") 7 - .init(&|canvas, _| { 8 - canvas.clear(); 9 - canvas.set_background(Color::Black); 10 - 11 - let mut kicks = Layer::new("anchor kick"); 12 - 13 - let circle_at = |x: usize, y: usize| Object::SmallCircle(Point(x, y)); 14 - 15 - let (end_x, end_y) = { 16 - let Point(x, y) = canvas.world_region.end; 17 - (x - 2, y - 2) 18 - }; 19 - kicks.set("top left", circle_at(1, 1)); 20 - kicks.set("top right", circle_at(end_x, 1)); 21 - kicks.set("bottom left", circle_at(1, end_y)); 22 - kicks.set("bottom right", circle_at(end_x, end_y)); 23 - canvas.add_or_replace_layer(kicks); 24 - 25 - let mut ch = Layer::new("ch"); 26 - ch.set("0", Object::Dot(Point(0, 0))); 27 - canvas.add_or_replace_layer(ch); 28 - 29 - Ok(()) 30 - }) 31 - .on_note("anchor kick", &|canvas, ctx| { 32 - canvas 33 - .layer("anchor kick") 34 - .paint_all_objects(Fill::Translucent(ctx.extra.kick_color, 1.0)); 35 - 36 - ctx.animate_layer("anchor kick", 200, &|t, layer, _| { 37 - layer.objects.values_mut().for_each( 38 - |ColoredObject { fill, .. }| { 39 - *fill = fill.opacify(1.0 - t); 40 - }, 41 - ); 42 - Ok(()) 43 - }); 44 - 45 - Ok(()) 46 - }) 47 - .on_note("bass", &|canvas, ctx| { 48 - let pitch = ctx 49 - .notes_of_stem("bass") 50 - .find(|note| note.is_on()) 51 - .map(|note| note.pitch); 52 - 53 - let area = (2, 2); 54 - let bounds = canvas.world_region.resized(-2, -2); 55 - ctx.extra.bass_pattern_at = match pitch { 56 - Some(32 | 33 | 34) => bounds.starting_from_topleft(area), 57 - Some(39) => bounds.starting_from_topright(area), 58 - Some(35) => bounds.starting_from_bottomleft(area), 59 - Some(42 | 41) => bounds.starting_from_bottomright(area), 60 - _ => bounds.starting_from_bottomleft(area), 61 - } 62 - .unwrap(); 63 - 64 - let mut bass = canvas.random_layer_within( 65 - &mut ctx.extra.rng, 66 - "bass", 67 - &ctx.extra.bass_pattern_at, 68 - ); 69 - 70 - bass.paint_all_objects(Fill::Solid(Color::White)); 71 - canvas.add_or_replace_layer(bass); 72 - 73 - Ok(()) 74 - }) 75 - .on_note("powerful clap hit, clap, perclap", &|canvas, ctx| { 76 - let mut claps = canvas.random_layer_within( 77 - &mut ctx.extra.rng, 78 - "claps", 79 - &ctx.extra.bass_pattern_at.translated(2, 0), 80 - ); 81 - claps.paint_all_objects(Fill::Solid(Color::Red)); 82 - canvas.add_or_replace_layer(claps); 83 - Ok(()) 84 - }) 85 - .on_note( 86 - "rimshot, glitchy percs, hitting percs, glitchy percs", 87 - &|canvas, ctx| { 88 - let mut foley = canvas.random_layer_within( 89 - &mut ctx.extra.rng, 90 - "percs", 91 - &ctx.extra.bass_pattern_at.translated(2, 0), 92 - ); 93 - foley.paint_all_objects(Fill::Translucent(Color::Red, 0.5)); 94 - canvas.add_or_replace_layer(foley); 95 - Ok(()) 96 - }, 97 - ) 98 - .on_note("qanda", &|canvas, ctx| { 99 - let canvas_line_width = canvas.object_sizes.default_line_width; 100 - let mut qanda = canvas.random_curves_within( 101 - &mut ctx.extra.rng, 102 - "qanda", 103 - &ctx.extra.bass_pattern_at.translated(-1, -1).enlarged(1, 1), 104 - 3..=5, 105 - ); 106 - qanda.paint_all_objects(Fill::Solid(Color::Orange)); 107 - qanda.object_sizes.default_line_width = 108 - canvas_line_width * 4.0 * ctx.stem("qanda").velocity_relative(); 109 - 110 - canvas.add_or_replace_layer(qanda); 111 - Ok(()) 112 - }) 113 - .on_note("brokenup", &|canvas, ctx| { 114 - let canvas_line_width = canvas.object_sizes.default_line_width; 115 - let mut brokenup = canvas.random_curves_within( 116 - &mut ctx.extra.rng, 117 - "brokenup", 118 - &ctx.extra.bass_pattern_at.translated(0, -2), 119 - 3..=5, 120 - ); 121 - brokenup.paint_all_objects(Fill::Solid(Color::Yellow)); 122 - brokenup.object_sizes.default_line_width = canvas_line_width 123 - * 4.0 124 - * ctx.stem("brokenup").velocity_relative(); 125 - 126 - canvas.add_or_replace_layer(brokenup); 127 - Ok(()) 128 - }) 129 - .on_note("goup", &|canvas, ctx| { 130 - let canvas_line_width = canvas.object_sizes.default_line_width; 131 - let mut goup = canvas.random_curves_within( 132 - &mut ctx.extra.rng, 133 - "goup", 134 - &ctx.extra.bass_pattern_at.translated(0, 2), 135 - 3..=5, 136 - ); 137 - goup.paint_all_objects(Fill::Solid(Color::Green)); 138 - goup.object_sizes.default_line_width = 139 - canvas_line_width * 4.0 * ctx.stem("goup").velocity_relative(); 140 - 141 - canvas.add_or_replace_layer(goup); 142 - Ok(()) 143 - }) 144 - .on_note("ch", &|canvas, ctx| { 145 - let world = canvas.world_region.clone(); 146 - 147 - // keep only the last 2 dots 148 - let dots_to_keep = canvas 149 - .layer("ch") 150 - .objects 151 - .iter() 152 - .sorted_by_key(|(name, _)| name.parse::<usize>().unwrap()) 153 - .rev() 154 - .take(2) 155 - .map(|(name, _)| name.clone()) 156 - .collect::<Vec<_>>(); 157 - 158 - let layer = canvas.layer("ch"); 159 - layer.object_sizes.empty_shape_stroke_width = 2.0; 160 - layer.objects.retain(|name, _| dots_to_keep.contains(name)); 161 - 162 - let object_name = format!("{}", ctx.ms); 163 - layer.set( 164 - &object_name, 165 - Object::Dot( 166 - world.resized(-1, -1).random_point(&mut ctx.extra.rng), 167 - ) 168 - .colored(Color::Cyan), 169 - ); 170 - 171 - canvas.put_layer_on_top("ch"); 172 - Ok(()) 173 - }) 174 - } 1 + use crate::State; 2 + use itertools::Itertools; 3 + use shapemaker::*; 4 + 5 + pub fn intro() -> Scene<State> { 6 + Scene::<State>::new("intro") 7 + .init(&|canvas, _| { 8 + canvas.clear(); 9 + canvas.set_background(Color::Black); 10 + 11 + let mut kicks = Layer::new("anchor kick"); 12 + 13 + let circle_at = |x: usize, y: usize| Object::SmallCircle(Point(x, y)); 14 + 15 + let (end_x, end_y) = { 16 + let Point(x, y) = canvas.world_region.end; 17 + (x - 2, y - 2) 18 + }; 19 + kicks.set("top left", circle_at(1, 1)); 20 + kicks.set("top right", circle_at(end_x, 1)); 21 + kicks.set("bottom left", circle_at(1, end_y)); 22 + kicks.set("bottom right", circle_at(end_x, end_y)); 23 + canvas.add_or_replace_layer(kicks); 24 + 25 + let mut ch = Layer::new("ch"); 26 + ch.set("0", Object::Dot(Point(0, 0))); 27 + canvas.add_or_replace_layer(ch); 28 + 29 + Ok(()) 30 + }) 31 + .on_note("anchor kick", &|canvas, ctx| { 32 + canvas 33 + .layer("anchor kick") 34 + .paint_all_objects(Fill::Translucent(ctx.extra.kick_color, 1.0)); 35 + 36 + ctx.animate_layer("anchor kick", 200, &|t, layer, _| { 37 + layer.objects.values_mut().for_each( 38 + |ColoredObject { fill, .. }| { 39 + *fill = fill.opacify(1.0 - t); 40 + }, 41 + ); 42 + Ok(()) 43 + }); 44 + 45 + Ok(()) 46 + }) 47 + .on_note("bass", &|canvas, ctx| { 48 + let pitch = ctx 49 + .notes_of_stem("bass") 50 + .find(|note| note.is_on()) 51 + .map(|note| note.pitch); 52 + 53 + let area = (2, 2); 54 + let bounds = canvas.world_region.resized(-2, -2); 55 + ctx.extra.bass_pattern_at = match pitch { 56 + Some(32 | 33 | 34) => bounds.starting_from_topleft(area), 57 + Some(39) => bounds.starting_from_topright(area), 58 + Some(35) => bounds.starting_from_bottomleft(area), 59 + Some(42 | 41) => bounds.starting_from_bottomright(area), 60 + _ => bounds.starting_from_bottomleft(area), 61 + } 62 + .unwrap(); 63 + 64 + let mut bass = canvas.random_layer_within( 65 + &mut ctx.extra.rng, 66 + "bass", 67 + &ctx.extra.bass_pattern_at, 68 + ); 69 + 70 + bass.paint_all_objects(Fill::Solid(Color::White)); 71 + canvas.add_or_replace_layer(bass); 72 + 73 + Ok(()) 74 + }) 75 + .on_note("powerful clap hit, clap, perclap", &|canvas, ctx| { 76 + let mut claps = canvas.random_layer_within( 77 + &mut ctx.extra.rng, 78 + "claps", 79 + &ctx.extra.bass_pattern_at.translated(2, 0), 80 + ); 81 + claps.paint_all_objects(Fill::Solid(Color::Red)); 82 + canvas.add_or_replace_layer(claps); 83 + Ok(()) 84 + }) 85 + .on_note( 86 + "rimshot, glitchy percs, hitting percs, glitchy percs", 87 + &|canvas, ctx| { 88 + let mut foley = canvas.random_layer_within( 89 + &mut ctx.extra.rng, 90 + "percs", 91 + &ctx.extra.bass_pattern_at.translated(2, 0), 92 + ); 93 + foley.paint_all_objects(Fill::Translucent(Color::Red, 0.5)); 94 + canvas.add_or_replace_layer(foley); 95 + Ok(()) 96 + }, 97 + ) 98 + .on_note("qanda", &|canvas, ctx| { 99 + let canvas_line_width = canvas.object_sizes.default_line_width; 100 + let mut qanda = canvas.random_curves_within( 101 + &mut ctx.extra.rng, 102 + "qanda", 103 + &ctx.extra.bass_pattern_at.translated(-1, -1).enlarged(1, 1), 104 + 3..=5, 105 + ); 106 + qanda.paint_all_objects(Fill::Solid(Color::Orange)); 107 + qanda.object_sizes.default_line_width = 108 + canvas_line_width * 4.0 * ctx.stem("qanda").velocity_relative(); 109 + 110 + canvas.add_or_replace_layer(qanda); 111 + Ok(()) 112 + }) 113 + .on_note("brokenup", &|canvas, ctx| { 114 + let canvas_line_width = canvas.object_sizes.default_line_width; 115 + let mut brokenup = canvas.random_curves_within( 116 + &mut ctx.extra.rng, 117 + "brokenup", 118 + &ctx.extra.bass_pattern_at.translated(0, -2), 119 + 3..=5, 120 + ); 121 + brokenup.paint_all_objects(Fill::Solid(Color::Yellow)); 122 + brokenup.object_sizes.default_line_width = canvas_line_width 123 + * 4.0 124 + * ctx.stem("brokenup").velocity_relative(); 125 + 126 + canvas.add_or_replace_layer(brokenup); 127 + Ok(()) 128 + }) 129 + .on_note("goup", &|canvas, ctx| { 130 + let canvas_line_width = canvas.object_sizes.default_line_width; 131 + let mut goup = canvas.random_curves_within( 132 + &mut ctx.extra.rng, 133 + "goup", 134 + &ctx.extra.bass_pattern_at.translated(0, 2), 135 + 3..=5, 136 + ); 137 + goup.paint_all_objects(Fill::Solid(Color::Green)); 138 + goup.object_sizes.default_line_width = 139 + canvas_line_width * 4.0 * ctx.stem("goup").velocity_relative(); 140 + 141 + canvas.add_or_replace_layer(goup); 142 + Ok(()) 143 + }) 144 + .on_note("ch", &|canvas, ctx| { 145 + let world = canvas.world_region.clone(); 146 + 147 + // keep only the last 2 dots 148 + let dots_to_keep = canvas 149 + .layer("ch") 150 + .objects 151 + .iter() 152 + .sorted_by_key(|(name, _)| name.parse::<usize>().unwrap()) 153 + .rev() 154 + .take(2) 155 + .map(|(name, _)| name.clone()) 156 + .collect::<Vec<_>>(); 157 + 158 + let layer = canvas.layer("ch"); 159 + layer.object_sizes.empty_shape_stroke_width = 2.0; 160 + layer.objects.retain(|name, _| dots_to_keep.contains(name)); 161 + 162 + let object_name = format!("{}", ctx.ms); 163 + layer.set( 164 + &object_name, 165 + Object::Dot( 166 + world.resized(-1, -1).random_point(&mut ctx.extra.rng), 167 + ) 168 + .colored(Color::Cyan), 169 + ); 170 + 171 + canvas.put_layer_on_top("ch"); 172 + Ok(()) 173 + }) 174 + }
+1 -1
src/geometry/angle.rs
··· 16 16 /// Creates an angle given an amount, and what a full turn is equal to 17 17 /// ``` 18 18 /// use shapemaker::geometry::Angle; 19 - /// 19 + /// 20 20 /// assert_eq!(Angle::from_ratio(0.5, 1.0).degrees() as usize, 180); 21 21 /// assert_eq!(Angle::from_radians(std::f32::consts::TAU).degrees() as usize, 360); 22 22 /// ```
+1 -1
src/lib.rs
··· 40 40 pub use rendering::{ 41 41 CSSRenderable, SVGAttributesRenderable, SVGRenderable, fonts, 42 42 }; 43 + pub use synchronization::audio::MusicalDurationUnit::*; 43 44 pub use video::{ 44 45 Animation, AttachHooks, Scene, Timestamp, Video, animation, context, 45 46 }; 46 - pub use synchronization::audio::MusicalDurationUnit::*; 47 47 48 48 trait Toggleable { 49 49 fn toggle(&mut self);