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