This commit is contained in:
Hanno Braun 2024-11-06 18:44:38 +01:00
parent 38c79002ac
commit 955d90680d
3 changed files with 16 additions and 19 deletions

View File

@ -4,9 +4,10 @@ use crate::geometry::{Mesh, Operation, Vertex};
pub fn export(mesh: &Mesh) -> anyhow::Result<()> { pub fn export(mesh: &Mesh) -> anyhow::Result<()> {
let mut vertices = Vec::new(); let mut vertices = Vec::new();
let mut triangles = Vec::new();
mesh.vertices(&mut vertices); mesh.vertices(&mut vertices);
let triangles = mesh.triangles(); mesh.triangles(&mut triangles);
let mesh = threemf::Mesh { let mesh = threemf::Mesh {
vertices: threemf::model::Vertices { vertices: threemf::model::Vertices {

View File

@ -22,8 +22,8 @@ impl Operation for Mesh {
vertices.extend(self.vertices.iter().copied()); vertices.extend(self.vertices.iter().copied());
} }
fn triangles(&self) -> Vec<Triangle> { fn triangles(&self, triangles: &mut Vec<Triangle>) {
self.triangles.clone() triangles.extend(&self.triangles);
} }
} }
@ -37,9 +37,7 @@ impl Operation for Vertex {
vertices.push(*self); vertices.push(*self);
} }
fn triangles(&self) -> Vec<Triangle> { fn triangles(&self, _: &mut Vec<Triangle>) {}
vec![]
}
} }
pub type Index = u32; pub type Index = u32;
@ -47,7 +45,7 @@ pub type Triangle = [Index; 3];
pub trait Operation { pub trait Operation {
fn vertices(&self, vertices: &mut Vec<Vertex>); fn vertices(&self, vertices: &mut Vec<Vertex>);
fn triangles(&self) -> Vec<Triangle>; fn triangles(&self, triangles: &mut Vec<Triangle>);
} }
pub struct OperationInSequence { pub struct OperationInSequence {
@ -63,15 +61,11 @@ impl Operation for OperationInSequence {
self.operation.vertices(vertices); self.operation.vertices(vertices);
} }
fn triangles(&self) -> Vec<Triangle> { fn triangles(&self, triangles: &mut Vec<Triangle>) {
let mut triangles = self if let Some(op) = &self.previous {
.previous op.triangles(triangles);
.as_ref() }
.map(|op| op.triangles.clone()) self.operation.triangles(triangles);
.unwrap_or_default();
triangles.extend(self.operation.triangles.clone());
triangles
} }
} }
@ -85,7 +79,7 @@ impl Operation for ClonedOperation {
vertices.extend(self.vertices.iter()); vertices.extend(self.vertices.iter());
} }
fn triangles(&self) -> Vec<Triangle> { fn triangles(&self, triangles: &mut Vec<Triangle>) {
self.triangles.clone() triangles.extend(&self.triangles);
} }
} }

View File

@ -191,7 +191,9 @@ impl Renderer {
let mut indices = Vec::new(); let mut indices = Vec::new();
let mut vertices = Vec::new(); let mut vertices = Vec::new();
let mesh_triangles = mesh.triangles(); let mut mesh_triangles = Vec::new();
mesh.triangles(&mut mesh_triangles);
for triangle in &mesh_triangles { for triangle in &mesh_triangles {
let triangle = triangle.map(|index| { let triangle = triangle.map(|index| {
let mut mesh_vertices = Vec::new(); let mut mesh_vertices = Vec::new();