diff --git a/experiments/2024-10-30/src/export.rs b/experiments/2024-10-30/src/export.rs index 470b19b77..95c8d67f3 100644 --- a/experiments/2024-10-30/src/export.rs +++ b/experiments/2024-10-30/src/export.rs @@ -3,7 +3,9 @@ use std::fs::File; use crate::geometry::{Mesh, Operation, Vertex}; pub fn export(mesh: &Mesh) -> anyhow::Result<()> { - let vertices = mesh.vertices(); + let mut vertices = Vec::new(); + + mesh.vertices(&mut vertices); let triangles = mesh.triangles(); let mesh = threemf::Mesh { diff --git a/experiments/2024-10-30/src/geometry.rs b/experiments/2024-10-30/src/geometry.rs index 511d006be..a6707781d 100644 --- a/experiments/2024-10-30/src/geometry.rs +++ b/experiments/2024-10-30/src/geometry.rs @@ -18,8 +18,8 @@ impl Mesh { } impl Operation for Mesh { - fn vertices(&self) -> Vec { - self.vertices.clone() + fn vertices(&self, vertices: &mut Vec) { + vertices.extend(self.vertices.iter().copied()); } fn triangles(&self) -> Vec { @@ -33,8 +33,8 @@ pub struct Vertex { } impl Operation for Vertex { - fn vertices(&self) -> Vec { - vec![*self] + fn vertices(&self, vertices: &mut Vec) { + vertices.push(*self); } fn triangles(&self) -> Vec { @@ -46,7 +46,7 @@ pub type Index = u32; pub type Triangle = [Index; 3]; pub trait Operation { - fn vertices(&self) -> Vec; + fn vertices(&self, vertices: &mut Vec); fn triangles(&self) -> Vec; } @@ -56,15 +56,15 @@ pub struct OperationInSequence { } impl Operation for OperationInSequence { - fn vertices(&self) -> Vec { - let mut vertices = self - .previous - .as_ref() - .map(|op| op.vertices.clone()) - .unwrap_or_default(); + fn vertices(&self, vertices: &mut Vec) { + vertices.extend( + self.previous + .as_ref() + .map(|op| op.vertices.clone()) + .into_iter() + .flatten(), + ); vertices.extend(self.operation.vertices.clone()); - - vertices } fn triangles(&self) -> Vec { diff --git a/experiments/2024-10-30/src/render.rs b/experiments/2024-10-30/src/render.rs index 90f88ed49..6368713d9 100644 --- a/experiments/2024-10-30/src/render.rs +++ b/experiments/2024-10-30/src/render.rs @@ -193,7 +193,8 @@ impl Renderer { for triangle in mesh.triangles() { let triangle = triangle.map(|index| { - let mesh_vertices = mesh.vertices(); + let mut mesh_vertices = Vec::new(); + mesh.vertices(&mut mesh_vertices); Vec3::from( mesh_vertices