Small cleanup with util function

This commit is contained in:
Chris Hodapp 2020-04-01 12:57:34 -04:00
parent 84711d67c0
commit bffd8a8d79
2 changed files with 16 additions and 18 deletions

View File

@ -394,11 +394,7 @@ fn twist(f: f32, subdiv: usize) -> Rule {
let seed_next = incr.transform(&seed2); let seed_next = incr.transform(&seed2);
// TODO: Cleanliness fix - utility function to make a zigzag mesh? let geom: OpenMesh = util::zigzag_to_parent(seed_next.clone(), n);
let geom = OpenMesh {
verts: seed_next.clone(),
faces: util::parallel_zigzag_faces(n),
};
// TODO: Cleanliness fix - why not just make these return meshes? // TODO: Cleanliness fix - why not just make these return meshes?
let (vc, faces) = util::connect_convex(&seed_next, true); let (vc, faces) = util::connect_convex(&seed_next, true);
let final_geom = OpenMesh { let final_geom = OpenMesh {
@ -427,16 +423,12 @@ fn twist(f: f32, subdiv: usize) -> Rule {
// TODO: Can a macro do anything to clean up some of the // TODO: Can a macro do anything to clean up some of the
// repetition with HOFs & closures? // repetition with HOFs & closures?
// TODO: so there's incr_inner & incr_outer that I wanted to
// parametrize over. why is it so ugly to do so?
let start = move |_| -> RuleEval { let start = move |_| -> RuleEval {
let xform = |dx, i, ang0, div| -> Transform { let child = |incr, dx, i, ang0, div| -> (OpenMesh, Child) {
Transform::new().rotate(&y, ang0 + (qtr / div * (i as f32))).translate(dx, 0.0, 0.0) let xform = Transform::new().
}; rotate(&y, ang0 + (qtr / div * (i as f32))).
translate(dx, 0.0, 0.0);
let make_child = |incr, xform| -> (OpenMesh, Child) {
let c = Child { let c = Child {
rule: Rc::new(Rule { eval: (recur.clone())(incr) }), rule: Rc::new(Rule { eval: (recur.clone())(incr) }),
@ -453,11 +445,10 @@ fn twist(f: f32, subdiv: usize) -> Rule {
}; };
// Generate 'count' children, shifted/rotated differently: // Generate 'count' children, shifted/rotated differently:
let children_inner = (0..count).map(|i| make_child(incr_inner, xform(dx0, i, 0.0, 1.0))); let inner = (0..count).map(|i| child(incr_inner, dx0, i, 0.0, 1.0));
let children_outer = (0..count).map(|i| make_child(incr_outer, xform(dx0*2.0, i, qtr/2.0, 2.0))); let outer = (0..count).map(|i| child(incr_outer, dx0*2.0, i, qtr/2.0, 2.0));
RuleEval::from_pairs( RuleEval::from_pairs(inner.chain(outer), prim::empty_mesh())
children_inner.chain(children_outer), prim::empty_mesh())
}; };
Rule { eval: Box::new(start) } Rule { eval: Box::new(start) }

View File

@ -1,4 +1,4 @@
use crate::openmesh::{Tag}; use crate::openmesh::{Tag, OpenMesh};
use crate::xform::{Vertex}; use crate::xform::{Vertex};
//use crate::rule::{Rule, Child}; //use crate::rule::{Rule, Child};
@ -31,6 +31,13 @@ pub fn parallel_zigzag_faces(count: usize) -> Vec<Tag> {
}).flatten().collect() }).flatten().collect()
} }
pub fn zigzag_to_parent(verts: Vec<Vertex>, count: usize) -> OpenMesh {
OpenMesh {
verts: verts,
faces: parallel_zigzag_faces(count),
}
}
pub fn connect_convex(verts: &Vec<Vertex>, as_parent: bool) -> (Vertex, Vec<Tag>) { pub fn connect_convex(verts: &Vec<Vertex>, as_parent: bool) -> (Vertex, Vec<Tag>) {
let n = verts.len(); let n = verts.len();
let mut centroid = Vertex::new(0.0, 0.0, 0.0, 0.0); let mut centroid = Vertex::new(0.0, 0.0, 0.0, 0.0);