diff --git a/Cargo.lock b/Cargo.lock index f964a89..0482e7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2377,8 +2377,6 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "allocator-api2", - "equivalent", "foldhash", ] @@ -2710,6 +2708,15 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "maybe_parallel_iterator" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5069b219d51d2ba2d9388623bd7eead5d4e7974bc8ff3ec9edbe36b09c0ef477" +dependencies = [ + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -2892,7 +2899,7 @@ dependencies = [ "bevy", "bevy_vello", "rand 0.9.0", - "spade", + "voronator", ] [[package]] @@ -3684,12 +3691,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" -[[package]] -name = "robust" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf4a6aa5f6d6888f39e980649f3ad6b666acdce1d78e95b8a2cb076e687ae30" - [[package]] name = "rodio" version = "0.19.0" @@ -3963,18 +3964,6 @@ dependencies = [ "serde", ] -[[package]] -name = "spade" -version = "2.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ece03ff43cd2a9b57ebf776ea5e78bd30b3b4185a619f041079f4109f385034" -dependencies = [ - "hashbrown 0.15.2", - "num-traits", - "robust", - "smallvec", -] - [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -4517,6 +4506,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "voronator" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07d8e6fe4b9b3b443f2e4ada327cf4b08ab5cdd27a42cd5c9f38dd29092c10ee" +dependencies = [ + "maybe_parallel_iterator", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index 5efcb09..d6f24d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 3 bevy = "0.15.3" bevy_vello = "0.7.1" rand = "0.9.0" -spade = "2.13.1" +voronator = "0.2.1" diff --git a/src/main.rs b/src/main.rs index 25fb154..a318d6f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,11 @@ use bevy::prelude::*; -use bevy_vello::{prelude::*, vello::kurbo::{Point, Stroke}, VelloPlugin}; +use bevy_vello::{ + VelloPlugin, + prelude::*, + vello::kurbo::{PathEl, Point}, +}; use rand::Rng; -use spade::{DelaunayTriangulation, Point2, Triangulation, handles::VoronoiVertex}; +use voronator::VoronoiDiagram; use std::ops::DerefMut; const JITTER: f64 = 0.5; @@ -23,33 +27,41 @@ fn setup_vector_graphics(mut commands: Commands) { fn draw_map(mut query_scene: Single<(&mut Transform, &mut VelloScene)>) { let (transform, scene) = query_scene.deref_mut(); scene.reset(); - transform.scale = Vec3::ONE * 25.0; + transform.scale = Vec3::ONE * 30.0; - let mut triangulation: DelaunayTriangulation<_> = DelaunayTriangulation::new(); let mut rng = rand::rng(); + let mut points = Vec::new(); for x in -20..=20 { for y in -10..=10 { - triangulation.insert(Point2::new( + points.push(( (x as f64) + rng.random_range(-JITTER..=JITTER), (y as f64) + rng.random_range(-JITTER..=JITTER), - )).unwrap(); + )); } } + let diagram = VoronoiDiagram::::from_tuple(&(-20.0, -10.0), &(20.0, 10.0), &points).unwrap(); - for edge in triangulation.undirected_voronoi_edges() { - match edge.vertices() { - [VoronoiVertex::Inner(from), VoronoiVertex::Inner(to)] => { - let from = from.circumcenter(); - let to = to.circumcenter(); - scene.stroke( - &Stroke::new(0.1), - kurbo::Affine::default(), - peniko::Color::WHITE, - None, - &kurbo::Line::new(Point::new(from.x, from.y), Point::new(to.x, to.y)), - ); + for cell in diagram.cells() { + let mut first = true; + let mut path = Vec::new(); + for point in cell.points() { + let point = Point::new(point.x, point.y); + if first { + first = false; + path.push(PathEl::MoveTo(point)); + } else { + path.push(PathEl::LineTo(point)); } - _ => {} } + let r = rng.random_range(0..=255); + let g = rng.random_range(0..=255); + let b = rng.random_range(0..=255); + scene.fill( + peniko::Fill::NonZero, + kurbo::Affine::default(), + peniko::Color::from_rgb8(r, g, b), + None, + &kurbo::BezPath::from_vec(path), + ); } }