diff --git a/Cargo.lock b/Cargo.lock index 8829e8d..f964a89 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2377,6 +2377,8 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", ] @@ -2890,6 +2892,7 @@ dependencies = [ "bevy", "bevy_vello", "rand 0.9.0", + "spade", ] [[package]] @@ -3681,6 +3684,12 @@ 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" @@ -3954,6 +3963,18 @@ 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" diff --git a/Cargo.toml b/Cargo.toml index e8494d3..5efcb09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,3 +15,4 @@ opt-level = 3 bevy = "0.15.3" bevy_vello = "0.7.1" rand = "0.9.0" +spade = "2.13.1" diff --git a/src/main.rs b/src/main.rs index 97a0a7f..25fb154 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use bevy::prelude::*; -use bevy_vello::{VelloPlugin, prelude::*, vello::kurbo::Point}; +use bevy_vello::{prelude::*, vello::kurbo::{Point, Stroke}, VelloPlugin}; use rand::Rng; +use spade::{DelaunayTriangulation, Point2, Triangulation, handles::VoronoiVertex}; use std::ops::DerefMut; const JITTER: f64 = 0.5; @@ -21,25 +22,34 @@ 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(); - // Reset scene every frame scene.reset(); + transform.scale = Vec3::ONE * 25.0; + let mut triangulation: DelaunayTriangulation<_> = DelaunayTriangulation::new(); let mut rng = rand::rng(); for x in -20..=20 { for y in -10..=10 { - let point = Point::new( + triangulation.insert(Point2::new( (x as f64) + rng.random_range(-JITTER..=JITTER), (y as f64) + rng.random_range(-JITTER..=JITTER), - ); - scene.fill( - peniko::Fill::NonZero, - kurbo::Affine::default(), - peniko::Color::WHITE, - None, - &kurbo::Circle::new(point, 0.1), - ); + )).unwrap(); } } - transform.scale = Vec3::ONE * 25.0; + 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)), + ); + } + _ => {} + } + } }