From 81e98ebbf0ea74992ef16fc782162c7ab15d5546 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 21 Jan 2025 20:20:20 +0100 Subject: [PATCH] Add `Solid` --- experiments/2024-12-09/src/geometry/shape.rs | 4 --- experiments/2024-12-09/src/model.rs | 20 ++++------- experiments/2024-12-09/src/topology/mod.rs | 3 +- experiments/2024-12-09/src/topology/solid.rs | 35 ++++++++++++++++++++ 4 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 experiments/2024-12-09/src/topology/solid.rs diff --git a/experiments/2024-12-09/src/geometry/shape.rs b/experiments/2024-12-09/src/geometry/shape.rs index 4173f5606..b542cd8a8 100644 --- a/experiments/2024-12-09/src/geometry/shape.rs +++ b/experiments/2024-12-09/src/geometry/shape.rs @@ -77,8 +77,4 @@ impl<'r, NewOps, T> ShapeExtender<'r, NewOps, T> { new_ops: self.new_ops.push_right(op), } } - - pub fn get_added(self) -> NewOps { - self.new_ops - } } diff --git a/experiments/2024-12-09/src/model.rs b/experiments/2024-12-09/src/model.rs index 67669785a..ea73aac4a 100644 --- a/experiments/2024-12-09/src/model.rs +++ b/experiments/2024-12-09/src/model.rs @@ -4,7 +4,7 @@ use crate::{ geometry::{Shape, Sketch}, math::{Bivector, Plane, Point, Vector}, storage::Stores, - topology::Face, + topology::{Face, Solid}, }; pub fn model(shape: &mut Shape) { @@ -26,12 +26,6 @@ pub fn model(shape: &mut Shape) { }; let bottom = top.flip(stores.get()).translate([0., 0., -1.], &mut stores); - let (bottom, top) = shape - .extend_with(stores.get::()) - .add(bottom) - .add(top) - .get_added(); - let [a, b, c, d] = bottom.vertices().collect_array().unwrap(); let [e, f, g, h] = top.vertices().collect_array().unwrap(); @@ -45,10 +39,10 @@ pub fn model(shape: &mut Shape) { }, ); - shape - .extend_with(stores.get::()) - .add(left) - .add(right) - .add(front) - .add(back); + let solid = Solid::new( + [bottom, top, left, right, front, back] + .map(|face| stores.get().insert(face)), + ); + + shape.extend_with(stores.get::()).add(solid); } diff --git a/experiments/2024-12-09/src/topology/mod.rs b/experiments/2024-12-09/src/topology/mod.rs index cb43fbfad..a0d29f96d 100644 --- a/experiments/2024-12-09/src/topology/mod.rs +++ b/experiments/2024-12-09/src/topology/mod.rs @@ -1,4 +1,5 @@ mod face; +mod solid; mod vertex; -pub use self::{face::Face, vertex::Vertex}; +pub use self::{face::Face, solid::Solid, vertex::Vertex}; diff --git a/experiments/2024-12-09/src/topology/solid.rs b/experiments/2024-12-09/src/topology/solid.rs new file mode 100644 index 000000000..6a6634db0 --- /dev/null +++ b/experiments/2024-12-09/src/topology/solid.rs @@ -0,0 +1,35 @@ +use crate::geometry::{AnyOp, Handle, Operation, TriMesh}; + +use super::Face; + +pub struct Solid { + faces: Vec>, +} + +impl Solid { + pub fn new(faces: impl IntoIterator>) -> Self { + Self { + faces: faces.into_iter().collect(), + } + } +} + +impl Operation for Solid { + fn label(&self) -> &'static str { + "Solid" + } + + fn tri_mesh(&self) -> TriMesh { + let mut tri_mesh = TriMesh::new(); + + for face in &self.faces { + tri_mesh = tri_mesh.merge(face.tri_mesh()); + } + + tri_mesh + } + + fn children(&self) -> Vec { + self.faces.iter().map(|face| face.to_any()).collect() + } +}