From 6b25722627f4ab53988de33c8945951d13e975e7 Mon Sep 17 00:00:00 2001 From: numzero Date: Wed, 20 Nov 2024 21:34:20 +0300 Subject: [PATCH] Pre-generate normals, for smooth look --- src/bin/wireframe/meshes.rs | 34 +++++++++-------------- src/bin/wireframe/scene.rs | 54 +++++++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/bin/wireframe/meshes.rs b/src/bin/wireframe/meshes.rs index c439334..634bb60 100644 --- a/src/bin/wireframe/meshes.rs +++ b/src/bin/wireframe/meshes.rs @@ -4,6 +4,8 @@ use bytemuck::{bytes_of, cast_slice, Pod, Zeroable}; use glam::{Vec3, Vec4}; use wgpu::util::DeviceExt as _; +use crate::scene::Face; + #[repr(C)] #[derive(Copy, Clone, Debug, Pod, Zeroable)] struct Vertex { @@ -11,6 +13,15 @@ struct Vertex { pub normal: [f32; 3], } +impl From for Vertex { + fn from(value: crate::scene::Vertex) -> Self { + Vertex { + position: value.position.into(), + normal: value.normal.into(), + } + } +} + #[repr(C)] #[derive(Copy, Clone, Pod, Zeroable)] struct PushConsts { @@ -37,27 +48,8 @@ pub struct Mesh { } impl Mesh { - pub fn new_list(device: &wgpu::Device, attrs: Attrs, tris: Vec<[Vec3; 3]>) -> Self { - let data: Vec = tris - .into_iter() - .flat_map(|[a, b, c]| { - let n = (b - a).cross(c - a).normalize(); - [ - Vertex { - position: a.into(), - normal: n.into(), - }, - Vertex { - position: b.into(), - normal: n.into(), - }, - Vertex { - position: c.into(), - normal: n.into(), - }, - ] - }) - .collect(); + pub fn new_list(device: &wgpu::Device, attrs: Attrs, tris: Vec) -> Self { + let data: Vec = tris.into_iter().flat_map(|face| face.map(Into::into)).collect(); let buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Mesh Vertex Buffer"), contents: cast_slice(&data), diff --git a/src/bin/wireframe/scene.rs b/src/bin/wireframe/scene.rs index 009a9aa..e91bcbb 100644 --- a/src/bin/wireframe/scene.rs +++ b/src/bin/wireframe/scene.rs @@ -17,7 +17,12 @@ pub struct FancyLine { pub pts: Vec, } -pub type Face = [Vec3; 3]; +pub struct Vertex { + pub position: Vec3, + pub normal: Vec3, +} + +pub type Face = [Vertex; 3]; pub enum Mesh { List(Vec), @@ -160,29 +165,44 @@ impl Renderable for Tube { let d = Vec2::from_angle(k as f32 * step); vec3(d.x, 0., d.y) }; + let side = vec3(0., self.external_halflength, 0.); let r1 = self.inner_radius; let r2 = self.outer_radius; + + let vertex = |k, r, h| { + let n = dir(k); + Vertex { + position: r * n + h * side, + normal: n, + } + }; let inner = (0..sides).flat_map(|k| { - let a = r1 * dir(k); - let b = r1 * dir(k + 1); - [[a - side, b - side, a + side], [b - side, b + side, a + side]] + [ + [vertex(k, -r1, -1.), vertex(k, -r1, 1.), vertex(k + 1, -r1, -1.)], + [vertex(k + 1, -r1, -1.), vertex(k, -r1, 1.), vertex(k + 1, -r1, 1.)], + ] }); let outer = (0..sides).flat_map(|k| { - let a = r2 * dir(k); - let b = r2 * dir(k + 1); - [[a - side, b - side, a + side], [b - side, b + side, a + side]] - }); - let cap = (0..sides).flat_map(|k| { - let a = r1 * dir(k); - let b = r1 * dir(k + 1); - let c = r2 * dir(k + 1); - let d = r2 * dir(k); [ - [a - side, b - side, c - side], - [a - side, c - side, d - side], - [a + side, b + side, c + side], - [a + side, c + side, d + side], + [vertex(k, r2, -1.), vertex(k + 1, r2, -1.), vertex(k, r2, 1.)], + [vertex(k + 1, r2, -1.), vertex(k + 1, r2, 1.), vertex(k, r2, 1.)], + ] + }); + + let vertex = |k, r, h| { + let n = dir(k); + Vertex { + position: r * n + h * side, + normal: h * Vec3::Y, + } + }; + let cap = (0..sides).flat_map(|k| { + [ + [vertex(k, r1, -1.), vertex(k + 1, r1, -1.), vertex(k + 1, r2, -1.)], + [vertex(k, r1, -1.), vertex(k + 1, r2, -1.), vertex(k, r2, -1.)], + [vertex(k, r1, 1.), vertex(k + 1, r1, 1.), vertex(k + 1, r2, 1.)], + [vertex(k, r1, 1.), vertex(k + 1, r2, 1.), vertex(k, r2, 1.)], ] }); chain!(inner, outer, cap).collect()