30 lines
994 B
Rust
30 lines
994 B
Rust
|
use bevy::{prelude::*, render::render_resource::PrimitiveTopology};
|
||
|
use opensimplex_noise_rs::OpenSimplexNoise;
|
||
|
use rand::Rng;
|
||
|
|
||
|
pub fn planet() -> Mesh {
|
||
|
let mut rng = rand::thread_rng();
|
||
|
let simplex = OpenSimplexNoise::new(Some(rng.gen()));
|
||
|
let mut mesh = Mesh::new(PrimitiveTopology::TriangleList);
|
||
|
let perimeter: u32 = 1000;
|
||
|
mesh.insert_attribute(
|
||
|
Mesh::ATTRIBUTE_POSITION,
|
||
|
(0..perimeter)
|
||
|
.map(|i| {
|
||
|
let mut r = simplex.eval_2d(i as f64 * 0.02, 0.) as f32 * 20.0 + 100.0;
|
||
|
r += simplex.eval_2d(i as f64 * 0.05, 10.) as f32 * 10.0;
|
||
|
r += simplex.eval_2d(i as f64 * 0.2, 10.) as f32 * 4.0;
|
||
|
let a = std::f32::consts::TAU * i as f32 / perimeter as f32;
|
||
|
[r * a.cos(), r * a.sin(), 0.]
|
||
|
})
|
||
|
.chain([[0., 0., 0.]].into_iter())
|
||
|
.collect::<Vec<_>>(),
|
||
|
);
|
||
|
let mut triangles = Vec::new();
|
||
|
for i in 0..perimeter {
|
||
|
triangles.extend_from_slice(&[i, perimeter, (i + 1) % perimeter]);
|
||
|
}
|
||
|
mesh.set_indices(Some(bevy::render::mesh::Indices::U32(triangles)));
|
||
|
mesh
|
||
|
}
|