use bevy::prelude::*; 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; fn main() { App::new() .add_plugins(DefaultPlugins) .add_plugins(VelloPlugin::default()) .add_systems(Startup, setup_vector_graphics) .add_systems(PostStartup, draw_map) .run(); } fn setup_vector_graphics(mut commands: Commands) { commands.spawn((Camera2d, VelloView)); commands.spawn(VelloScene::new()); } 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; let mut triangulation: DelaunayTriangulation<_> = DelaunayTriangulation::new(); let mut rng = rand::rng(); for x in -20..=20 { for y in -10..=10 { triangulation.insert(Point2::new( (x as f64) + rng.random_range(-JITTER..=JITTER), (y as f64) + rng.random_range(-JITTER..=JITTER), )).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)), ); } _ => {} } } }