diff --git a/src/mesh.rs b/src/mesh.rs index 414d4b2..f76145d 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -7,7 +7,7 @@ pub struct Mesh { pub faces: Vec<[usize; 3]>, } -pub fn generate(shape: &crate::ShapeArgs) -> Mesh { +pub fn shell(shape: &crate::ShapeArgs) -> Mesh { let mut vertices = Vec::::new(); let mut faces = Vec::<[usize; 3]>::new(); @@ -24,10 +24,6 @@ pub fn generate(shape: &crate::ShapeArgs) -> Mesh { let incline = height / (top_y - bottom_y); let elevation = -height / 2. - incline * bottom_y; - let base = vertices.len(); - for side in 0..(sides - 2) { - faces.push([base + sides - 1, base + side + 1, base + side]); - } for layer in 0..=layers { let angle = (PI / sides as f32) * (layer as f32 - base_layer as f32); let x = radius; @@ -42,17 +38,27 @@ pub fn generate(shape: &crate::ShapeArgs) -> Mesh { } } for layer in 0..layers { - let base = base + sides * layer; + let base = sides * layer; for side in 0..sides { let index = |layer, offset| base + sides * layer + (side + offset) % sides; faces.push([index(0, 0), index(0, 1), index(1, 0)]); faces.push([index(0, 1), index(1, 1), index(1, 0)]); } } - let base = vertices.len() - sides; - for side in 0..(sides - 2) { - faces.push([base + sides - 1, base + side, base + side + 1]); - } Mesh { vertices, faces } } + +pub fn solid(shape: &crate::ShapeArgs) -> Mesh { + let mut mesh = shell(shape); + let sides = shape.sides as usize; + for side in 0..(sides - 2) { + mesh.faces.push([sides - 1, side + 1, side]); + } + let base = mesh.vertices.len() - sides; + for side in 0..(sides - 2) { + mesh.faces + .push([base + sides - 1, base + side, base + side + 1]); + } + mesh +}