Beat my head into a wall some more on twisty_torus

This commit is contained in:
Chris Hodapp 2020-04-20 18:18:18 -04:00
parent e0baea62cc
commit 270435c4d6

View File

@ -139,17 +139,17 @@ pub fn twist(f: f32, subdiv: usize) -> Rule<()> {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct TorusCtxt { pub struct TorusCtxt {
xform1: Transform, init: bool,
xform2: Transform, stack: [Transform; 3],
} }
pub fn twisty_torus() -> Rule<TorusCtxt> { pub fn twisty_torus() -> Rule<TorusCtxt> {
let subdiv = 8; let subdiv = 8;
let seed = vec![ let seed = vec![
vertex(-0.5, -0.5, 1.0), vertex(-0.5, -0.5, 0.0),
vertex(-0.5, 0.5, 1.0), vertex(-0.5, 0.5, 0.0),
vertex( 0.5, 0.5, 1.0), vertex( 0.5, 0.5, 0.0),
vertex( 0.5, -0.5, 1.0), vertex( 0.5, -0.5, 0.0),
]; ];
let seed = util::subdivide_cycle(&seed, subdiv); let seed = util::subdivide_cycle(&seed, subdiv);
@ -161,68 +161,68 @@ pub fn twisty_torus() -> Rule<TorusCtxt> {
faces: faces, faces: faces,
}); });
let rad = 4.0; let rad = 1.0;
let rad2 = 5.0;
let dx0 = 2.0; let dx0 = 2.0;
let ang = 0.1; let ang = 0.1;
let recur = move |self_: Rc<Rule<TorusCtxt>>| -> RuleEval<TorusCtxt> { let recur = move |self_: Rc<Rule<TorusCtxt>>| -> RuleEval<TorusCtxt> {
let y = &Vector3::y_axis(); //let y = &Vector3::y_axis();
let z = &Vector3::z_axis(); let z = &Vector3::z_axis();
let xf1 = self_.ctxt.xform1; let stack = self_.ctxt.stack;
let xf2 = self_.ctxt.xform2;
let next_rule = Rule { let next_rule = Rule {
eval: self_.eval.clone(), eval: self_.eval.clone(),
ctxt: TorusCtxt { ctxt: TorusCtxt {
xform1: xf1.rotate(y, 0.1), init: false,
xform2: xf2.rotate(z, ang), stack: [
stack[0],
Transform::new().rotate(z, 0.05) * stack[1],
Transform::new().translate(0.0, 0.0, 0.1) * stack[2],
],
}, },
}; };
let xf = xf1 * xf2; let xf = stack.iter().fold(Transform::new(), |acc,m| acc * (*m));
RuleEval { if self_.ctxt.init {
geom: Rc::new(geom.transform(&xf)), let mut s2 = seed.clone();
final_geom: Rc::new(final_geom.transform(&xf)), let (centroid, f) = util::connect_convex(&s2, false);
children: vec![ s2.push(centroid);
Child { let n2 = s2.len();
rule: Rc::new(next_rule), let g = OpenMesh { verts: s2, faces: f };
xf: Transform::new(), RuleEval {
vmap: (0..n).collect(), geom: Rc::new(g.transform(&xf)),
}, final_geom: Rc::new(prim::empty_mesh()),
], children: vec![
} Child {
}; rule: Rc::new(next_rule),
xf: Transform::new(),
let start = move |self_: Rc<Rule<TorusCtxt>>| -> RuleEval<TorusCtxt> { vmap: (0..n2).collect(),
let xf1 = self_.ctxt.xform1; },
let xf2 = self_.ctxt.xform2; ],
let xf = xf1 * xf2; }
} else {
let mut s2 = seed.clone(); RuleEval {
let (centroid, f) = util::connect_convex(&s2, false); geom: Rc::new(geom.transform(&xf)),
s2.push(centroid); final_geom: Rc::new(final_geom.transform(&xf)),
let n2 = s2.len(); children: vec![
let g = OpenMesh { verts: s2, faces: f }; Child {
let fg = prim::empty_mesh(); rule: Rc::new(next_rule),
RuleEval { xf: Transform::new(),
geom: Rc::new(g.transform(&xf)), vmap: (0..n).collect(),
final_geom: Rc::new(fg), },
children: vec![ ],
Child { }
rule: Rc::new(Rule {
eval: Rc::new(recur.clone()),
ctxt: self_.ctxt,
}),
xf: Transform::new(),
vmap: (0..n2).collect(),
},
],
} }
}; };
Rule { Rule {
eval: Rc::new(start), eval: Rc::new(recur),
ctxt: TorusCtxt { ctxt: TorusCtxt {
xform1: Transform::new().translate(rad, 0.0, 0.0), init: true,
xform2: Transform::new().translate(dx0, 0.0, 0.0), stack: [
Transform::new().translate(0.0, rad2, 0.0),
Transform::new().translate(rad, 0.0, 0.0),
Transform::new(), // .translate(dx0, 0.0, 0.0),
],
}, },
} }
} }