55 lines
1.7 KiB
Rust
55 lines
1.7 KiB
Rust
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)),
|
|
);
|
|
}
|
|
_ => {}
|
|
}
|
|
}
|
|
}
|