this repo has no description
3
fork

Configure Feed

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

♻️ Finish moving examples out of the library

+117 -191
+7
Cargo.lock
··· 4670 4670 ] 4671 4671 4672 4672 [[package]] 4673 + name = "specimen" 4674 + version = "0.1.0" 4675 + dependencies = [ 4676 + "shapemaker", 4677 + ] 4678 + 4679 + [[package]] 4673 4680 name = "spki" 4674 4681 version = "0.7.3" 4675 4682 source = "registry+https://github.com/rust-lang/crates.io-index"
+1 -1
Cargo.toml
··· 10 10 description = "An experimental WASM-capable, generative SVG-based video rendering engine that reacts to MIDI or audio data" 11 11 12 12 [workspace] 13 - members = [ "examples/dna-analysis-machine","xtask"] 13 + members = [ "examples/dna-analysis-machine", "examples/specimen","xtask"] 14 14 15 15 [lib] 16 16 crate-type = ["cdylib", "lib"]
+2 -5
Justfile
··· 30 30 RUST_BACKTRACE=full ./shapemaker video --colors examples/colorschemes/palenight.css {{out}} --sync-with examples/schedule-hell.midi --audio examples/schedule-hell.flac --grid-size 16x10 --resolution 480 {{args}} 31 31 32 32 paper: 33 - just 34 33 # just analyze_times disabled because it needs manual adjustements in the render loop pipeline diagram 35 - ./shapemaker examples dna-analysis-machine --resolution 1920 paper/dna-analysis-machine.png 36 - ./shapemaker examples shapeshed --resolution 1920 paper/shapeshed.svg 37 - ./shapemaker examples colors-shed --resolution 1920 paper/colorshed.svg 38 - ./shapemaker examples grid --resolution 1920 paper/grid.svg 34 + cd paper; cargo run --package specimen 35 + cd paper; cargo run --package dna-analysis-machine 39 36 typstyle format-all paper 40 37 typst compile --root . paper/main.typ 41 38
+7
examples/specimen/Cargo.toml
··· 1 + [package] 2 + name = "specimen" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + shapemaker = { version = "1.2.2", path = "../.." }
+81
examples/specimen/src/main.rs
··· 1 + use shapemaker::*; 2 + 3 + pub fn shapes_shed() -> Canvas { 4 + let mut canvas = Canvas::new(vec![]); 5 + 6 + canvas.set_grid_size(3, 3); 7 + canvas.set_background(Color::White); 8 + 9 + canvas.layer("root").add_objects([ 10 + Object::BigCircle(Point(0, 0)).colored(Color::Black), 11 + Object::CurveOutward(Point(1, 1), Point(2, 0), 5.0).colored(Color::Black), 12 + Object::CurveInward(Point(2, 1), Point(3, 0), 5.0).colored(Color::Black), 13 + Object::SmallCircle(Point(0, 1)).colored(Color::Black), 14 + Object::Line(Point(1, 1), Point(2, 2), 5.0).colored(Color::Black), 15 + Object::Rectangle(Point(0, 2), Point(0, 2)).colored(Color::Black), 16 + Object::Dot(Point(2, 3)).colored(Color::Black), 17 + Object::Polygon( 18 + Point(2, 1), 19 + vec![ 20 + LineSegment::Straight(Point(3, 1)), 21 + LineSegment::Straight(Point(3, 2)), 22 + ], 23 + ) 24 + .colored(Color::Black), 25 + ]); 26 + 27 + canvas 28 + } 29 + 30 + pub fn colors_shed() -> Canvas { 31 + let mut canvas = Canvas::new(vec!["circles"]); 32 + canvas.set_grid_size(3, 3); 33 + canvas.canvas_outter_padding = 0; 34 + canvas.set_background(Color::White); 35 + 36 + let all_colors = vec![ 37 + Color::Blue, 38 + Color::Cyan, 39 + Color::Yellow, 40 + Color::Orange, 41 + Color::Red, 42 + Color::Brown, 43 + Color::Purple, 44 + Color::Pink, 45 + Color::Green, 46 + ]; 47 + 48 + for (color, point) in std::iter::zip(all_colors, canvas.world_region) { 49 + Object::Rectangle(point, point) 50 + .colored(color) 51 + .add_to(canvas.root()); 52 + } 53 + 54 + canvas 55 + } 56 + 57 + pub fn grid() -> Canvas { 58 + let mut canvas = Canvas::new(vec![]); 59 + canvas.set_grid_size(3, 3); 60 + canvas.set_background(Color::White); 61 + 62 + for point in canvas.world_region { 63 + Object::Dot(point) 64 + .colored(Color::Black) 65 + .add_to(canvas.root()); 66 + } 67 + 68 + canvas 69 + } 70 + 71 + fn main() { 72 + grid() 73 + .render_to_svg_file("grid.svg") 74 + .expect("Failed to render grid"); 75 + colors_shed() 76 + .render_to_svg_file("colorshed.svg") 77 + .expect("Failed to render colors_shed"); 78 + shapes_shed() 79 + .render_to_svg_file("shapeshed.svg") 80 + .expect("Failed to render shapes_shed"); 81 + }
+2 -8
src/cli/mod.rs
··· 15 15 █▄▄▄█▄██▄█▄██▄█░████▄▄▄█▄███▄█▄██▄█▄█▄█▄▄▄█▄█▄▄█ 16 16 ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀v?.?.?▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 17 17 18 - Usage: shapemaker (image|video) [options] [--color <mapping>...] <file> 18 + Usage: shapemaker test-video [options] [--color <mapping>...] <file> 19 19 shapemaker beacon start [options] [--color <mapping>...] <file> 20 20 shapemaker examples (dna-analysis-machine|shapeshed|colors-shed|grid) [options] <file> 21 21 shapemaker new <name> ··· 81 81 82 82 #[derive(Debug, Deserialize)] 83 83 pub struct Args { 84 - pub cmd_image: bool, 85 - pub cmd_video: bool, 84 + pub cmd_test_video: bool, 86 85 pub cmd_beacon: bool, 87 86 pub cmd_start: bool, 88 - pub cmd_examples: bool, 89 - pub cmd_dna_analysis_machine: bool, 90 - pub cmd_shapeshed: bool, 91 - pub cmd_colors_shed: bool, 92 - pub cmd_grid: bool, 93 87 pub cmd_new: bool, 94 88 pub cmd_watch: bool, 95 89 pub arg_directory: String,
-139
src/examples.rs
··· 1 - use crate::*; 2 - use std::iter; 3 - 4 - pub fn shapes_shed() -> Canvas { 5 - let mut canvas = Canvas::new(vec![]); 6 - 7 - canvas.set_grid_size(3, 3); 8 - canvas.set_background(Color::White); 9 - 10 - canvas.layer("root").add_objects([ 11 - Object::BigCircle(Point(0, 0)).colored(Color::Black), 12 - Object::CurveOutward(Point(1, 1), Point(2, 0), 5.0).colored(Color::Black), 13 - Object::CurveInward(Point(2, 1), Point(3, 0), 5.0).colored(Color::Black), 14 - Object::SmallCircle(Point(0, 1)).colored(Color::Black), 15 - Object::Line(Point(1, 1), Point(2, 2), 5.0).colored(Color::Black), 16 - Object::Rectangle(Point(0, 2), Point(0, 2)).colored(Color::Black), 17 - Object::Dot(Point(2, 3)).colored(Color::Black), 18 - Object::Polygon( 19 - Point(2, 1), 20 - vec![ 21 - LineSegment::Straight(Point(3, 1)), 22 - LineSegment::Straight(Point(3, 2)), 23 - ], 24 - ) 25 - .colored(Color::Black), 26 - ]); 27 - 28 - canvas 29 - } 30 - 31 - pub fn colors_shed() -> Canvas { 32 - let mut canvas = Canvas::new(vec!["circles"]); 33 - canvas.set_grid_size(3, 3); 34 - canvas.canvas_outter_padding = 0; 35 - canvas.set_background(Color::White); 36 - 37 - let all_colors = vec![ 38 - Color::Blue, 39 - Color::Cyan, 40 - Color::Yellow, 41 - Color::Orange, 42 - Color::Red, 43 - Color::Brown, 44 - Color::Purple, 45 - Color::Pink, 46 - Color::Green, 47 - ]; 48 - 49 - for (color, point) in iter::zip(all_colors, canvas.world_region) { 50 - canvas 51 - .root() 52 - .add(Object::Rectangle(point, point).colored(color)); 53 - } 54 - 55 - canvas 56 - } 57 - 58 - pub fn grid() -> Canvas { 59 - let mut canvas = Canvas::new(vec![]); 60 - canvas.set_grid_size(3, 3); 61 - canvas.set_background(Color::White); 62 - 63 - for point in canvas.world_region { 64 - canvas.root().add(Object::Dot(point).colored(Color::Black)); 65 - } 66 - 67 - canvas 68 - } 69 - 70 - pub fn dna_analysis_machine() -> Canvas { 71 - let mut canvas = Canvas::with_colors(ColorMapping { 72 - black: "#000000".into(), 73 - white: "#ffffff".into(), 74 - red: "#cf0a2b".into(), 75 - green: "#22e753".into(), 76 - blue: "#2734e6".into(), 77 - yellow: "#f8e21e".into(), 78 - orange: "#f05811".into(), 79 - purple: "#6a24ec".into(), 80 - brown: "#a05634".into(), 81 - pink: "#e92e76".into(), 82 - gray: "#81a0a8".into(), 83 - cyan: "#4fecec".into(), 84 - }); 85 - 86 - canvas.set_grid_size(16, 9); 87 - canvas.set_background(Color::Black); 88 - 89 - let draw_in = canvas.world_region.resized(-2, -2); 90 - 91 - // Strands 92 - 93 - let strands_in = 94 - Region::from_bottomleft(draw_in.bottomleft().translated(2, -1), (3, 3)) 95 - .unwrap(); 96 - 97 - canvas.add_layer(canvas.n_random_curves_within(&strands_in, 30, "strands")); 98 - 99 - for (i, obj) in canvas.layer("strands").objects.values_mut().enumerate() { 100 - obj.recolor(if i % 2 == 0 { Color::Cyan } else { Color::Pink }); 101 - obj.filter(Filter::glow(4.0)); 102 - } 103 - 104 - // Red dot 105 - 106 - let red_dot = Object::BigCircle( 107 - Region::from_topright(draw_in.topright().translated(-3, 0), (4, 3)) 108 - .unwrap() 109 - .random_point(), 110 - ) 111 - .colored(Color::Red) 112 - .filtered(Filter::glow(5.0)); 113 - 114 - canvas.new_layer("red dot").add(red_dot.clone()); 115 - 116 - // Hatched circles & squares 117 - 118 - let hatches = canvas.new_layer("hatches"); 119 - 120 - for (i, point) in draw_in.except(&strands_in).enumerate() { 121 - if red_dot.region().contains(&point) { 122 - continue; 123 - } 124 - if rand::random() { 125 - Object::BigCircle(point) 126 - } else { 127 - Object::Rectangle(point, point) 128 - } 129 - .filled(Fill::Hatches( 130 - Color::White, 131 - Angle(45.0), 132 - (i + 5) as f32 / 10.0, 133 - 0.25, 134 - )) 135 - .add_to(hatches); 136 - } 137 - 138 - canvas 139 - }
-1
src/lib.rs
··· 2 2 3 3 pub mod cli; 4 4 pub use cli::ui; 5 - pub mod examples; 6 5 pub mod geometry; 7 6 pub mod graphics; 8 7 pub mod random;
+2 -37
src/main.rs
··· 37 37 return Ok(()); 38 38 } 39 39 40 - let mut canvas = canvas_from_cli(&args); 41 - if args.cmd_examples { 42 - canvas = if args.cmd_dna_analysis_machine { 43 - examples::dna_analysis_machine() 44 - } else if args.cmd_shapeshed { 45 - examples::shapes_shed() 46 - } else if args.cmd_colors_shed { 47 - examples::colors_shed() 48 - } else if args.cmd_grid { 49 - examples::grid() 50 - } else { 51 - panic!("Specify the example to use") 52 - }; 40 + let canvas = canvas_from_cli(&args); 53 41 54 - if args.arg_file.ends_with(".svg") { 55 - std::fs::write( 56 - args.arg_file, 57 - canvas 58 - .render_to_svg( 59 - canvas.colormap.clone(), 60 - canvas.cell_size, 61 - canvas.object_sizes, 62 - "", 63 - )? 64 - .to_string(), 65 - ) 66 - .unwrap(); 67 - } else { 68 - match canvas.render_to_png( 69 - &args.arg_file, 70 - args.flag_resolution.unwrap_or(1000), 71 - ) { 72 - Ok(_) => println!("Image saved to {}", args.arg_file), 73 - Err(e) => println!("Error saving image: {}", e), 74 - } 75 - } 76 - Ok(()) 77 - } else if args.cmd_video { 42 + if args.cmd_test_video { 78 43 run_video(args, canvas) 79 44 } else if args.cmd_beacon && args.cmd_start { 80 45 run_beacon_start(args, canvas)
+15
src/rendering/canvas.rs
··· 136 136 pixmap_to_png_data(pixmap).and_then(|data| write_png_data(data, at)) 137 137 }) 138 138 } 139 + 140 + pub fn render_to_svg_file(&mut self, at: &str) -> anyhow::Result<()> { 141 + debug_time!("render_to_svg_file"); 142 + 143 + let rendered = self.render_to_svg( 144 + self.colormap.clone(), 145 + self.cell_size, 146 + self.object_sizes, 147 + "", 148 + )?; 149 + 150 + std::fs::write(at, rendered.to_string())?; 151 + 152 + Ok(()) 153 + } 139 154 } 140 155 141 156 fn svg_to_usvg_tree(