diff --git a/src/lib.rs b/src/lib.rs index 294edfd..7fdbe13 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,8 @@ use std::error::Error; use glam::{UVec2, Vec4, vec4}; +mod mesh; + const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth16Unorm; const OUTPUT_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb; diff --git a/src/mesh.rs b/src/mesh.rs new file mode 100644 index 0000000..f7e29db --- /dev/null +++ b/src/mesh.rs @@ -0,0 +1,57 @@ +use std::f32::consts::PI; + +use glam::{Mat2, Vec3, vec2, vec3}; + +pub struct Mesh { + pub vertices: Vec, + pub faces: Vec<[usize; 3]>, +} + +pub fn generate() -> Mesh { + let mut vertices = Vec::::new(); + let mut faces = Vec::<[usize; 3]>::new(); + + let sides: usize = 24; + let layers = 12; + let base_layer = 4; + let diameter = 36.0; + let radius = diameter / 2.; + let height = 120.; + let bottom_angle = (PI / sides as f32) * -(base_layer as f32); + let top_angle = (PI / sides as f32) * (layers as f32 - base_layer as f32); + let bottom_y = radius * bottom_angle.tan(); + let top_y = radius * top_angle.tan(); + let incline = height / (top_y - 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; + let y = angle.tan() * x; + let z = incline * y; + for side in 0..sides { + let angle = (2. * PI / sides as f32) * side as f32; + let rot = Mat2::from_angle(angle); + let xy = rot * vec2(x, y); + let v = vec3(xy.x, xy.y, z); + vertices.push(v); + } + } + for layer in 0..layers { + let base = 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 } +}