diff --git a/crates/bevy_render/Cargo.toml b/crates/bevy_render/Cargo.toml index 1cd40a8e94406..d345b6ee9f04e 100644 --- a/crates/bevy_render/Cargo.toml +++ b/crates/bevy_render/Cargo.toml @@ -38,7 +38,7 @@ downcast-rs = "1.2.0" thiserror = "1.0" anyhow = "1.0" hex = "0.4.2" -hexasphere = "2.0.0" +hexasphere = "2.1.0" parking_lot = "0.11.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] diff --git a/crates/bevy_render/src/mesh/shape.rs b/crates/bevy_render/src/mesh/shape.rs index c29323d9979f8..ed58bdb85ca53 100644 --- a/crates/bevy_render/src/mesh/shape.rs +++ b/crates/bevy_render/src/mesh/shape.rs @@ -1,7 +1,7 @@ use super::{Indices, Mesh}; use crate::pipeline::PrimitiveTopology; use bevy_math::*; -use hexasphere::Hexasphere; +use hexasphere::shapes::IcoSphere; pub struct Cube { pub size: f32, @@ -273,15 +273,17 @@ impl Default for Icosphere { impl From for Mesh { fn from(sphere: Icosphere) -> Self { if sphere.subdivisions >= 80 { - let temp_sphere = Hexasphere::new(sphere.subdivisions, |_| ()); + // https://oeis.org/A005901 + let subdivisions = sphere.subdivisions + 1; + let number_of_resulting_points = (subdivisions * subdivisions * 10) + 2; panic!( "Cannot create an icosphere of {} subdivisions due to there being too many vertices being generated: {} (Limited to 65535 vertices or 79 subdivisions)", sphere.subdivisions, - temp_sphere.raw_points().len() + number_of_resulting_points ); } - let hexasphere = Hexasphere::new(sphere.subdivisions, |point| { + let generated = IcoSphere::new(sphere.subdivisions, |point| { let inclination = point.z.acos(); let azumith = point.y.atan2(point.x); @@ -291,7 +293,7 @@ impl From for Mesh { [norm_inclination, norm_azumith] }); - let raw_points = hexasphere.raw_points(); + let raw_points = generated.raw_points(); let points = raw_points .iter() @@ -304,12 +306,12 @@ impl From for Mesh { .map(Into::into) .collect::>(); - let uvs = hexasphere.raw_data().to_owned(); + let uvs = generated.raw_data().to_owned(); - let mut indices = Vec::with_capacity(hexasphere.indices_per_main_triangle() * 20); + let mut indices = Vec::with_capacity(generated.indices_per_main_triangle() * 20); for i in 0..20 { - hexasphere.get_indices(i, &mut indices); + generated.get_indices(i, &mut indices); } let indices = Indices::U32(indices);