From cbaa544bc6c8aef868a3b825f50aeea2b1561d7d Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 21 Nov 2024 18:56:33 +0100 Subject: [PATCH] Prepare for drawing vertices --- experiments/2024-10-30/src/render/geometry.rs | 43 +++++++++++++++++++ experiments/2024-10-30/src/render/renderer.rs | 37 +--------------- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/experiments/2024-10-30/src/render/geometry.rs b/experiments/2024-10-30/src/render/geometry.rs index e85fa90ca..c515d7290 100644 --- a/experiments/2024-10-30/src/render/geometry.rs +++ b/experiments/2024-10-30/src/render/geometry.rs @@ -1,5 +1,8 @@ +use glam::Vec3; use wgpu::util::DeviceExt; +use crate::geometry::Operation; + use super::shaders::TrianglesVertex; pub struct Geometry { @@ -9,6 +12,46 @@ pub struct Geometry { } impl Geometry { + pub fn triangles( + device: &wgpu::Device, + operation: &impl Operation, + ) -> Self { + let mut mesh_triangles = Vec::new(); + operation.triangles(&mut mesh_triangles); + + let mut indices = Vec::new(); + let mut vertices = Vec::new(); + + for triangle in &mesh_triangles { + let triangle = triangle.vertices.map(|vertex| { + Vec3::from( + vertex.point.coords.map(|coord| coord.value() as f32), + ) + }); + let normal = { + let [a, b, c] = triangle; + + let ab = b - a; + let ac = c - a; + + ab.cross(ac) + }; + + for point in triangle { + let index = vertices.len() as u32; + let vertex = TrianglesVertex { + position: point.into(), + normal: normal.into(), + }; + + indices.push(index); + vertices.push(vertex); + } + } + + Self::new(device, &vertices, &indices) + } + pub fn new( device: &wgpu::Device, vertices: &[TrianglesVertex], diff --git a/experiments/2024-10-30/src/render/renderer.rs b/experiments/2024-10-30/src/render/renderer.rs index 406501c5c..8d0de4fd5 100644 --- a/experiments/2024-10-30/src/render/renderer.rs +++ b/experiments/2024-10-30/src/render/renderer.rs @@ -10,7 +10,7 @@ use crate::geometry::Operation; use super::{ geometry::Geometry, pipeline::Pipeline, - shaders::{Shaders, TrianglesVertex, Uniforms}, + shaders::{Shaders, Uniforms}, }; pub struct Renderer { @@ -94,40 +94,7 @@ impl Renderer { } pub fn render(&self, operation: &impl Operation) { - let mut mesh_triangles = Vec::new(); - operation.triangles(&mut mesh_triangles); - - let mut indices = Vec::new(); - let mut vertices = Vec::new(); - - for triangle in &mesh_triangles { - let triangle = triangle.vertices.map(|vertex| { - Vec3::from( - vertex.point.coords.map(|coord| coord.value() as f32), - ) - }); - let normal = { - let [a, b, c] = triangle; - - let ab = b - a; - let ac = c - a; - - ab.cross(ac) - }; - - for point in triangle { - let index = vertices.len() as u32; - let vertex = TrianglesVertex { - position: point.into(), - normal: normal.into(), - }; - - indices.push(index); - vertices.push(vertex); - } - } - - let triangles = Geometry::new(&self.device, &vertices, &indices); + let triangles = Geometry::triangles(&self.device, operation); let mut encoder = self .device