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<()> {
let mut vertices = Vec::new();
let mut triangles = Vec::new();
mesh.vertices(&mut vertices);
let triangles = mesh.triangles();
mesh.triangles(&mut triangles);
let mesh = threemf::Mesh {
vertices: threemf::model::Vertices {

View File

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

View File

@ -191,7 +191,9 @@ impl Renderer {
let mut indices = 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 {
let triangle = triangle.map(|index| {
let mut mesh_vertices = Vec::new();