add meshgen
This commit is contained in:
parent
25c1e7a909
commit
ee6167b298
|
|
@ -2,6 +2,8 @@ use std::error::Error;
|
||||||
|
|
||||||
use glam::{UVec2, Vec4, vec4};
|
use glam::{UVec2, Vec4, vec4};
|
||||||
|
|
||||||
|
mod mesh;
|
||||||
|
|
||||||
const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth16Unorm;
|
const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth16Unorm;
|
||||||
const OUTPUT_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;
|
const OUTPUT_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;
|
||||||
|
|
||||||
|
|
|
||||||
57
src/mesh.rs
Normal file
57
src/mesh.rs
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
|
use glam::{Mat2, Vec3, vec2, vec3};
|
||||||
|
|
||||||
|
pub struct Mesh {
|
||||||
|
pub vertices: Vec<Vec3>,
|
||||||
|
pub faces: Vec<[usize; 3]>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate() -> Mesh {
|
||||||
|
let mut vertices = Vec::<Vec3>::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 }
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user