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::>(), ); 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 }