jsb-gravity/src/gen.rs
2024-01-13 17:39:33 +01:00

42 lines
1.2 KiB
Rust

use bevy::{prelude::*, render::render_resource::PrimitiveTopology};
use opensimplex_noise_rs::OpenSimplexNoise;
use rand::Rng;
/// Générer une planète
pub fn planet() -> Mesh {
// Initialiser l'aléatoire
let mut rng = rand::thread_rng();
let simplex = OpenSimplexNoise::new(Some(rng.gen()));
// Créer un mesh vide
let mut mesh = Mesh::new(PrimitiveTopology::TriangleList);
let perimeter: u32 = 1000;
// Ajouter des points dans le mesh
mesh.insert_attribute(
Mesh::ATTRIBUTE_POSITION,
(0..perimeter)
.map(|i| {
// Rayon
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;
// Angle
let a = std::f32::consts::TAU * i as f32 / perimeter as f32;
// Coordonnées du point
[r * a.cos(), r * a.sin(), 0.]
})
.chain([[0., 0., 0.]])
.collect::<Vec<_>>(),
);
// Ajouter des triangles en indiquant quels points (de ceux définis juste avant) doivent être reliés
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
}